Skip to content

Commit 58902e7

Browse files
authored
Release 5.0.2 with error source fix for some downstream errors (#1980)
This PR fixes error source for 2 errors: - parsing of invalid json response should be downstream error as we expect to receive valid json from zabbix - no host found error should be downstream. We are bumping sdk that includes that fix grafana/grafana-plugin-sdk-go#1246. As you can see - the invalid json parsing is now downstream error <img width="1498" alt="image" src="https://github.com/user-attachments/assets/88028dbe-0f73-47aa-8262-5729059ce12f" />
1 parent d28a715 commit 58902e7

File tree

9 files changed

+84
-26
lines changed

9 files changed

+84
-26
lines changed

CHANGELOG.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,10 @@
11
# Change Log
22

3+
## [5.0.2] - 2025-02-27
4+
5+
- Chore: Fix error source for parsing of invalid json response
6+
- Chore: Update github.com/grafana/grafana-plugin-sdk-go to v0.268.0
7+
38
## [5.0.1] - 2025-02-24
49

510
- Bug fix: Fixed host groups not showing in problems panel

go.mod

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,11 @@ go 1.23.5
55
require (
66
github.com/bitly/go-simplejson v0.5.1
77
github.com/dlclark/regexp2 v1.10.0
8-
github.com/grafana/grafana-plugin-sdk-go v0.266.0
8+
github.com/grafana/grafana-plugin-sdk-go v0.268.0
99
github.com/patrickmn/go-cache v2.1.0+incompatible
1010
github.com/prometheus/client_golang v1.20.5
1111
github.com/stretchr/testify v1.10.0
12-
golang.org/x/net v0.34.0
12+
golang.org/x/net v0.35.0
1313
gotest.tools v2.2.0+incompatible
1414
)
1515

@@ -23,7 +23,7 @@ require (
2323
github.com/chromedp/cdproto v0.0.0-20230914224007-a15a36ccbc2e // indirect
2424
github.com/cpuguy83/go-md2man/v2 v2.0.5 // indirect
2525
github.com/davecgh/go-spew v1.1.1 // indirect
26-
github.com/elazarl/goproxy v1.7.0 // indirect
26+
github.com/elazarl/goproxy v1.7.1 // indirect
2727
github.com/fatih/color v1.15.0 // indirect
2828
github.com/getkin/kin-openapi v0.129.0 // indirect
2929
github.com/go-logr/logr v1.4.2 // indirect
@@ -34,7 +34,7 @@ require (
3434
github.com/gogo/protobuf v1.3.2 // indirect
3535
github.com/golang/protobuf v1.5.4 // indirect
3636
github.com/google/flatbuffers v24.3.25+incompatible // indirect
37-
github.com/google/go-cmp v0.6.0 // indirect
37+
github.com/google/go-cmp v0.7.0 // indirect
3838
github.com/google/uuid v1.6.0 // indirect
3939
github.com/gorilla/mux v1.8.1 // indirect
4040
github.com/grafana/otel-profiling-go v0.5.1 // indirect
@@ -93,13 +93,13 @@ require (
9393
golang.org/x/mod v0.22.0 // indirect
9494
golang.org/x/sync v0.11.0 // indirect
9595
golang.org/x/sys v0.30.0 // indirect
96-
golang.org/x/text v0.21.0 // indirect
96+
golang.org/x/text v0.22.0 // indirect
9797
golang.org/x/tools v0.28.0 // indirect
9898
golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 // indirect
9999
google.golang.org/genproto/googleapis/api v0.0.0-20250115164207-1a7da9e5054f // indirect
100100
google.golang.org/genproto/googleapis/rpc v0.0.0-20250115164207-1a7da9e5054f // indirect
101101
google.golang.org/grpc v1.70.0 // indirect
102-
google.golang.org/protobuf v1.36.4 // indirect
102+
google.golang.org/protobuf v1.36.5 // indirect
103103
gopkg.in/fsnotify/fsnotify.v1 v1.4.7 // indirect
104104
gopkg.in/yaml.v3 v3.0.1 // indirect
105105
)

go.sum

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,8 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c
2929
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
3030
github.com/dlclark/regexp2 v1.10.0 h1:+/GIL799phkJqYW+3YbOd8LCcbHzT0Pbo8zl70MHsq0=
3131
github.com/dlclark/regexp2 v1.10.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8=
32-
github.com/elazarl/goproxy v1.7.0 h1:EXv2nV4EjM60ZtsEVLYJG4oBXhDGutMKperpHsZ/v+0=
33-
github.com/elazarl/goproxy v1.7.0/go.mod h1:X/5W/t+gzDyLfHW4DrMdpjqYjpXsURlBt9lpBDxZZZQ=
32+
github.com/elazarl/goproxy v1.7.1 h1:1P7LPSxbqtNxusFnXclj6O56pjfq1xOQZ6a0mwwKUlY=
33+
github.com/elazarl/goproxy v1.7.1/go.mod h1:82vkLNir0ALaW14Rc399OTTjyNREgmdL2cVoIbS6XaE=
3434
github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk=
3535
github.com/fatih/color v1.15.0 h1:kOqh6YHBtK8aywxGerMG2Eq3H6Qgoqeo13Bk2Mv/nBs=
3636
github.com/fatih/color v1.15.0/go.mod h1:0h5ZqXfHYED7Bhv2ZJamyIOUej9KtShiJESRwBDUSsw=
@@ -62,17 +62,18 @@ github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM=
6262
github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
6363
github.com/google/flatbuffers v24.3.25+incompatible h1:CX395cjN9Kke9mmalRoL3d81AtFUxJM+yDthflgJGkI=
6464
github.com/google/flatbuffers v24.3.25+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8=
65-
github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
6665
github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
66+
github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=
67+
github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=
6768
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
6869
github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
6970
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
7071
github.com/gopherjs/gopherjs v0.0.0-20181103185306-d547d1d9531e h1:JKmoR8x90Iww1ks85zJ1lfDGgIiMDuIptTOhJq+zKyg=
7172
github.com/gopherjs/gopherjs v0.0.0-20181103185306-d547d1d9531e/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
7273
github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY=
7374
github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ=
74-
github.com/grafana/grafana-plugin-sdk-go v0.266.0 h1:YP+iEpXH3HRX9Xo4NHjsrJhN2W7uVTtkLNzMHYbmiLI=
75-
github.com/grafana/grafana-plugin-sdk-go v0.266.0/go.mod h1:bxkXrBQ4QSmOncsWdIOcpgP+M6wajQNMAPXlbWrqAWY=
75+
github.com/grafana/grafana-plugin-sdk-go v0.268.0 h1:N8z+WNgEEqRe+y2ZXzVfJ2FKEK5fuo84ewAOQyJZODY=
76+
github.com/grafana/grafana-plugin-sdk-go v0.268.0/go.mod h1:OuwS4c/JYgn0rr/w5zhJBpLo4gKm/vw15RsfpYAvK9Q=
7677
github.com/grafana/otel-profiling-go v0.5.1 h1:stVPKAFZSa7eGiqbYuG25VcqYksR6iWvF3YH66t4qL8=
7778
github.com/grafana/otel-profiling-go v0.5.1/go.mod h1:ftN/t5A/4gQI19/8MoWurBEtC6gFw8Dns1sJZ9W4Tls=
7879
github.com/grafana/pyroscope-go/godeltaprof v0.1.8 h1:iwOtYXeeVSAeYefJNaxDytgjKtUuKQbJqgAIjlnicKg=
@@ -260,8 +261,8 @@ golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn
260261
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
261262
golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
262263
golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
263-
golang.org/x/net v0.34.0 h1:Mb7Mrk043xzHgnRM88suvJFwzVrRfHEHJEl5/71CKw0=
264-
golang.org/x/net v0.34.0/go.mod h1:di0qlW3YNM5oh6GqDGQr92MyTozJPmybPK4Ev/Gm31k=
264+
golang.org/x/net v0.35.0 h1:T5GQRQb2y08kTAByq9L4/bz8cipCdA8FbRTXewonqY8=
265+
golang.org/x/net v0.35.0/go.mod h1:EglIi67kWsHKlRzzVMUD93VMSWGFOMSZgxFjparz1Qk=
265266
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
266267
golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
267268
golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
@@ -283,8 +284,8 @@ golang.org/x/sys v0.30.0 h1:QjkSwP/36a20jFYWkSue1YwXzLmsV5Gfq7Eiy72C1uc=
283284
golang.org/x/sys v0.30.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
284285
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
285286
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
286-
golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo=
287-
golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ=
287+
golang.org/x/text v0.22.0 h1:bofq7m3/HAFvbF51jz3Q9wLg3jkvSPuiZu/pD1XwgtM=
288+
golang.org/x/text v0.22.0/go.mod h1:YRoo4H8PVmsu+E3Ou7cqLVH8oXWIHVoX0jqUWALQhfY=
288289
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
289290
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
290291
golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
@@ -305,8 +306,8 @@ google.golang.org/genproto/googleapis/rpc v0.0.0-20250115164207-1a7da9e5054f h1:
305306
google.golang.org/genproto/googleapis/rpc v0.0.0-20250115164207-1a7da9e5054f/go.mod h1:+2Yz8+CLJbIfL9z73EW45avw8Lmge3xVElCP9zEKi50=
306307
google.golang.org/grpc v1.70.0 h1:pWFv03aZoHzlRKHWicjsZytKAiYCtNS0dHbXnIdq7jQ=
307308
google.golang.org/grpc v1.70.0/go.mod h1:ofIJqVKDXx/JiXrwr2IG4/zwdH9txy3IlF40RmcJSQw=
308-
google.golang.org/protobuf v1.36.4 h1:6A3ZDJHn/eNqc1i+IdefRzy/9PokBTPvcqMySR7NNIM=
309-
google.golang.org/protobuf v1.36.4/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE=
309+
google.golang.org/protobuf v1.36.5 h1:tPhr+woSbjfYvY6/GPufUoYizxw1cF/yFoxJ2fmpwlM=
310+
google.golang.org/protobuf v1.36.5/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE=
310311
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
311312
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
312313
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "grafana-zabbix",
3-
"version": "5.0.1",
3+
"version": "5.0.2",
44
"description": "Zabbix plugin for Grafana",
55
"homepage": "http://grafana-zabbix.org",
66
"bugs": {

pkg/datasource/datasource.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -117,23 +117,23 @@ func (ds *ZabbixDatasource) QueryData(ctx context.Context, req *backend.QueryDat
117117
query, err := ReadQuery(q)
118118
ds.logger.Debug("DS query", "query", q)
119119
if err != nil {
120-
res.Error = err
120+
res = backend.ErrorResponseWithErrorSource(err)
121121
} else if query.QueryType == MODE_METRICS {
122122
frames, err := zabbixDS.queryNumericItems(ctx, &query)
123123
if err != nil {
124-
res.Error = err
124+
res = backend.ErrorResponseWithErrorSource(err)
125125
} else {
126126
res.Frames = append(res.Frames, frames...)
127127
}
128128
} else if query.QueryType == MODE_ITEMID {
129129
frames, err := zabbixDS.queryItemIdData(ctx, &query)
130130
if err != nil {
131-
res.Error = err
131+
res = backend.ErrorResponseWithErrorSource(err)
132132
} else {
133133
res.Frames = append(res.Frames, frames...)
134134
}
135135
} else {
136-
res.Error = backend.DownstreamError(ErrNonMetricQueryNotSupported)
136+
res = backend.ErrorResponseWithErrorSource(backend.DownstreamError(ErrNonMetricQueryNotSupported))
137137
}
138138
qdr.Responses[q.RefID] = res
139139
}

pkg/datasource/models.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -118,13 +118,13 @@ func ReadQuery(query backend.DataQuery) (QueryModel, error) {
118118
Interval: query.Interval,
119119
}
120120
if err := json.Unmarshal(query.JSON, &model); err != nil {
121-
return model, fmt.Errorf("could not read query: %w", err)
121+
return model, backend.DownstreamError(fmt.Errorf("could not read query: %w", err))
122122
}
123123

124124
if model.QueryType == "" {
125125
queryJSON, err := simplejson.NewJson(query.JSON)
126126
if err != nil {
127-
return model, fmt.Errorf("could not read query JSON: %w", err)
127+
return model, backend.DownstreamError(fmt.Errorf("could not read query JSON: %w", err))
128128
}
129129

130130
queryType, err := queryJSON.Get("queryType").Int64()

pkg/zabbix/zabbix.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,7 @@ func (zabbix *Zabbix) Authenticate(ctx context.Context) error {
125125
}
126126
err = zabbix.api.AuthenticateWithToken(ctx, token)
127127
if err != nil {
128-
zabbix.logger.Error("Zabbix authentication error", "error", err)
128+
zabbix.logger.Error("Zabbix authentication token error", "error", err)
129129
return err
130130
}
131131
zabbix.logger.Debug("Using API token for authentication")

pkg/zabbixapi/zabbix_api.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -196,7 +196,8 @@ func isDeprecatedUserParamError(err error) bool {
196196
func handleAPIResult(response []byte) (*simplejson.Json, error) {
197197
jsonResp, err := simplejson.NewJson([]byte(response))
198198
if err != nil {
199-
return nil, err
199+
// Response is not valid JSON
200+
return nil, backend.DownstreamError(err)
200201
}
201202
if errJSON, isError := jsonResp.CheckGet("error"); isError {
202203
errMessage := fmt.Errorf("%s %s", errJSON.Get("message").MustString(), errJSON.Get("data").MustString())

pkg/zabbixapi/zabbix_api_test.go

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,3 +71,54 @@ func TestZabbixAPI(t *testing.T) {
7171
})
7272
}
7373
}
74+
75+
func TestHandleAPIResult(t *testing.T) {
76+
tests := []struct {
77+
name string
78+
response string
79+
expectedData interface{}
80+
expectedError string
81+
isDownstream bool
82+
}{
83+
{
84+
name: "Valid JSON with result",
85+
response: `{"result": {"data": "test"}}`,
86+
expectedData: map[string]interface{}{"data": "test"},
87+
},
88+
{
89+
name: "Invalid JSON",
90+
response: `{"result": invalid}`,
91+
expectedError: "invalid character 'i' looking for beginning of value",
92+
isDownstream: true,
93+
},
94+
{
95+
name: "API error response",
96+
response: `{"error": {"message": "Authentication failed", "data": "Session terminated"}}`,
97+
expectedError: "Authentication failed Session terminated",
98+
isDownstream: true,
99+
},
100+
{
101+
name: "Empty result",
102+
response: `{"result": []}`,
103+
expectedData: []interface{}{},
104+
},
105+
}
106+
107+
for _, tt := range tests {
108+
t.Run(tt.name, func(t *testing.T) {
109+
result, err := handleAPIResult([]byte(tt.response))
110+
111+
if tt.expectedError != "" {
112+
assert.Error(t, err)
113+
assert.Equal(t, tt.expectedError, err.Error())
114+
if tt.isDownstream {
115+
assert.True(t, backend.IsDownstreamError(err), "error should be a downstream error")
116+
}
117+
return
118+
}
119+
120+
assert.NoError(t, err)
121+
assert.Equal(t, tt.expectedData, result.Interface())
122+
})
123+
}
124+
}

0 commit comments

Comments
 (0)