Handle backend api errors

This commit is contained in:
Alexander Zobnin
2020-05-29 11:09:43 +03:00
parent 3a50146df7
commit efb4d41da5
2 changed files with 40 additions and 8 deletions

View File

@@ -25,11 +25,16 @@ func (ds *ZabbixDatasource) zabbixAPIHandler(rw http.ResponseWriter, req *http.R
body, err := ioutil.ReadAll(req.Body) body, err := ioutil.ReadAll(req.Body)
defer req.Body.Close() defer req.Body.Close()
if err != nil || len(body) == 0 { if err != nil || len(body) == 0 {
rw.WriteHeader(http.StatusBadRequest) WriteError(rw, http.StatusBadRequest, err)
return
} }
var reqData ZabbixAPIResourceRequest var reqData ZabbixAPIResourceRequest
err = json.Unmarshal(body, &reqData) err = json.Unmarshal(body, &reqData)
if err != nil {
WriteError(rw, http.StatusInternalServerError, err)
return
}
pluginCxt := httpadapter.PluginConfigFromContext(req.Context()) pluginCxt := httpadapter.PluginConfigFromContext(req.Context())
ds.logger.Debug("Received Zabbix API call", "ds", pluginCxt.DataSourceInstanceSettings.Name) ds.logger.Debug("Received Zabbix API call", "ds", pluginCxt.DataSourceInstanceSettings.Name)
@@ -39,11 +44,38 @@ func (ds *ZabbixDatasource) zabbixAPIHandler(rw http.ResponseWriter, req *http.R
apiReq := &ZabbixAPIRequest{Method: reqData.Method, Params: reqData.Params} apiReq := &ZabbixAPIRequest{Method: reqData.Method, Params: reqData.Params}
result, err := dsInstance.ZabbixAPIQuery(req.Context(), apiReq) result, err := dsInstance.ZabbixAPIQuery(req.Context(), apiReq)
resultJson, err := json.Marshal(*result) if err != nil {
ds.logger.Debug("Got response", "result", result) WriteError(rw, http.StatusInternalServerError, err)
return
ds.logger.Debug("Received Zabbix API call", "ds", reqData.DatasourceId, "method", reqData.Method, "params", reqData.Params) }
rw.Write(resultJson) WriteResponse(rw, result)
rw.WriteHeader(http.StatusOK) }
func WriteResponse(rw http.ResponseWriter, result *interface{}) {
resultJson, err := json.Marshal(*result)
if err != nil {
WriteError(rw, http.StatusInternalServerError, err)
}
rw.Header().Add("Content-Type", "application/json")
rw.WriteHeader(http.StatusOK)
rw.Write(resultJson)
}
func WriteError(rw http.ResponseWriter, statusCode int, err error) {
data := make(map[string]interface{})
data["error"] = "Internal Server Error"
data["message"] = err.Error()
var b []byte
if b, err = json.Marshal(data); err != nil {
rw.WriteHeader(statusCode)
return
}
rw.Header().Add("Content-Type", "application/json")
rw.WriteHeader(http.StatusInternalServerError)
rw.Write(b)
} }

View File

@@ -37,7 +37,7 @@ func (dsInstance *ZabbixDatasourceInstance) ZabbixAPIQuery(ctx context.Context,
dsInstance.queryCache.Set(HashString(apiReq.String()), result) dsInstance.queryCache.Set(HashString(apiReq.String()), result)
if err != nil { if err != nil {
dsInstance.logger.Debug("ZabbixAPIQuery", "error", err) dsInstance.logger.Debug("ZabbixAPIQuery", "error", err)
return nil, errors.New("ZabbixAPIQuery is not implemented yet") return nil, err
} }
} }