mirror of
https://github.com/VictoriaMetrics/VictoriaMetrics.git
synced 2024-11-21 14:44:00 +00:00
vmalert: fix API to return non-nil values (#4222)
Properly return empty slices instead of nil for `/api/v1/rules` and `/api/v1/alerts` API handlers.
This improves compatibility with Grafana.
https://github.com/VictoriaMetrics/VictoriaMetrics/issues/4221
Signed-off-by: hagen1778 <roman@victoriametrics.com>
(cherry picked from commit 3383f12a4b
)
Signed-off-by: hagen1778 <roman@victoriametrics.com>
This commit is contained in:
parent
2831e6f9ae
commit
01393a112c
3 changed files with 58 additions and 2 deletions
|
@ -197,7 +197,7 @@ func (rh *requestHandler) groups() []APIGroup {
|
||||||
rh.m.groupsMu.RLock()
|
rh.m.groupsMu.RLock()
|
||||||
defer rh.m.groupsMu.RUnlock()
|
defer rh.m.groupsMu.RUnlock()
|
||||||
|
|
||||||
var groups []APIGroup
|
groups := make([]APIGroup, 0)
|
||||||
for _, g := range rh.m.groups {
|
for _, g := range rh.m.groups {
|
||||||
groups = append(groups, g.toAPI())
|
groups = append(groups, g.toAPI())
|
||||||
}
|
}
|
||||||
|
@ -259,6 +259,7 @@ func (rh *requestHandler) listAlerts() ([]byte, error) {
|
||||||
defer rh.m.groupsMu.RUnlock()
|
defer rh.m.groupsMu.RUnlock()
|
||||||
|
|
||||||
lr := listAlertsResponse{Status: "success"}
|
lr := listAlertsResponse{Status: "success"}
|
||||||
|
lr.Data.Alerts = make([]*APIAlert, 0)
|
||||||
for _, g := range rh.m.groups {
|
for _, g := range rh.m.groups {
|
||||||
for _, r := range g.Rules {
|
for _, r := range g.Rules {
|
||||||
a, ok := r.(*AlertingRule)
|
a, ok := r.(*AlertingRule)
|
||||||
|
|
|
@ -127,5 +127,59 @@ func TestHandler(t *testing.T) {
|
||||||
t.Run("/api/v1/1/0/status", func(t *testing.T) {
|
t.Run("/api/v1/1/0/status", func(t *testing.T) {
|
||||||
getResp(ts.URL+"/api/v1/1/0/status", nil, 404)
|
getResp(ts.URL+"/api/v1/1/0/status", nil, 404)
|
||||||
})
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestEmptyResponse(t *testing.T) {
|
||||||
|
rh := &requestHandler{m: &manager{groups: make(map[uint64]*Group)}}
|
||||||
|
ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { rh.handler(w, r) }))
|
||||||
|
defer ts.Close()
|
||||||
|
|
||||||
|
getResp := func(url string, to interface{}, code int) {
|
||||||
|
t.Helper()
|
||||||
|
resp, err := http.Get(url)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("unexpected err %s", err)
|
||||||
|
}
|
||||||
|
if code != resp.StatusCode {
|
||||||
|
t.Errorf("unexpected status code %d want %d", resp.StatusCode, code)
|
||||||
|
}
|
||||||
|
defer func() {
|
||||||
|
if err := resp.Body.Close(); err != nil {
|
||||||
|
t.Errorf("err closing body %s", err)
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
if to != nil {
|
||||||
|
if err = json.NewDecoder(resp.Body).Decode(to); err != nil {
|
||||||
|
t.Errorf("unexpected err %s", err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
t.Run("/api/v1/alerts", func(t *testing.T) {
|
||||||
|
lr := listAlertsResponse{}
|
||||||
|
getResp(ts.URL+"/api/v1/alerts", &lr, 200)
|
||||||
|
if lr.Data.Alerts == nil {
|
||||||
|
t.Errorf("expected /api/v1/alerts response to have non-nil data")
|
||||||
|
}
|
||||||
|
|
||||||
|
lr = listAlertsResponse{}
|
||||||
|
getResp(ts.URL+"/vmalert/api/v1/alerts", &lr, 200)
|
||||||
|
if lr.Data.Alerts == nil {
|
||||||
|
t.Errorf("expected /api/v1/alerts response to have non-nil data")
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
t.Run("/api/v1/rules", func(t *testing.T) {
|
||||||
|
lr := listGroupsResponse{}
|
||||||
|
getResp(ts.URL+"/api/v1/rules", &lr, 200)
|
||||||
|
if lr.Data.Groups == nil {
|
||||||
|
t.Errorf("expected /api/v1/rules response to have non-nil data")
|
||||||
|
}
|
||||||
|
|
||||||
|
lr = listGroupsResponse{}
|
||||||
|
getResp(ts.URL+"/vmalert/api/v1/rules", &lr, 200)
|
||||||
|
if lr.Data.Groups == nil {
|
||||||
|
t.Errorf("expected /api/v1/rules response to have non-nil data")
|
||||||
|
}
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
|
@ -17,6 +17,7 @@ The following tip changes can be tested by building VictoriaMetrics components f
|
||||||
|
|
||||||
* BUGFIX: [vmalert](https://docs.victoriametrics.com/vmalert.html): Properly form path to static assets in WEB UI if `http.pathPrefix` set. See [this issue](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/4349).
|
* BUGFIX: [vmalert](https://docs.victoriametrics.com/vmalert.html): Properly form path to static assets in WEB UI if `http.pathPrefix` set. See [this issue](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/4349).
|
||||||
* BUGFIX: [vmalert](https://docs.victoriametrics.com/vmalert.html): Properly set datasource query params. See [this issue](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/4340). Thanks to @gsakun for [the pull request](https://github.com/VictoriaMetrics/VictoriaMetrics/pull/4341).
|
* BUGFIX: [vmalert](https://docs.victoriametrics.com/vmalert.html): Properly set datasource query params. See [this issue](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/4340). Thanks to @gsakun for [the pull request](https://github.com/VictoriaMetrics/VictoriaMetrics/pull/4341).
|
||||||
|
* BUGFIX: [vmalert](https://docs.victoriametrics.com/vmalert.html): properly return empty slices instead of nil for `/api/v1/rules` and `/api/v1/alerts` API handlers. See [this issue](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/4221).
|
||||||
|
|
||||||
## [v1.79.13](https://github.com/VictoriaMetrics/VictoriaMetrics/releases/tag/v1.79.13)
|
## [v1.79.13](https://github.com/VictoriaMetrics/VictoriaMetrics/releases/tag/v1.79.13)
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue