Handle backend api errors
This commit is contained in:
@@ -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)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user