OpenTSDB: Use refid to support alerting on multiple queries (#77575)

* add refid to responses

* add test for refId
This commit is contained in:
Brendan O'Handley 2023-11-03 10:15:31 -04:00 committed by GitHub
parent f40de8b613
commit ef7b583169
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 43 additions and 6 deletions

View File

@ -70,6 +70,8 @@ func (s *Service) QueryData(ctx context.Context, req *backend.QueryDataRequest)
q := req.Queries[0]
myRefID := q.RefID
tsdbQuery.Start = q.TimeRange.From.UnixNano() / int64(time.Millisecond)
tsdbQuery.End = q.TimeRange.To.UnixNano() / int64(time.Millisecond)
@ -105,7 +107,7 @@ func (s *Service) QueryData(ctx context.Context, req *backend.QueryDataRequest)
}
}()
result, err := s.parseResponse(logger, res)
result, err := s.parseResponse(logger, res, myRefID)
if err != nil {
return &backend.QueryDataResponse{}, err
}
@ -136,7 +138,7 @@ func (s *Service) createRequest(ctx context.Context, logger log.Logger, dsInfo *
return req, nil
}
func (s *Service) parseResponse(logger log.Logger, res *http.Response) (*backend.QueryDataResponse, error) {
func (s *Service) parseResponse(logger log.Logger, res *http.Response, myRefID string) (*backend.QueryDataResponse, error) {
resp := backend.NewQueryDataResponse()
body, err := io.ReadAll(res.Body)
@ -181,9 +183,9 @@ func (s *Service) parseResponse(logger log.Logger, res *http.Response) (*backend
data.NewField("time", nil, timeVector),
data.NewField("value", tags, values)))
}
result := resp.Responses["A"]
result := resp.Responses[myRefID]
result.Frames = frames
resp.Responses["A"] = result
resp.Responses[myRefID] = result
return resp, nil
}

View File

@ -33,7 +33,7 @@ func TestOpenTsdbExecutor(t *testing.T) {
t.Run("Parse response should handle invalid JSON", func(t *testing.T) {
response := `{ invalid }`
result, err := service.parseResponse(logger, &http.Response{Body: io.NopCloser(strings.NewReader(response))})
result, err := service.parseResponse(logger, &http.Response{Body: io.NopCloser(strings.NewReader(response))}, "A")
require.Nil(t, result)
require.Error(t, err)
})
@ -63,7 +63,7 @@ func TestOpenTsdbExecutor(t *testing.T) {
resp := http.Response{Body: io.NopCloser(strings.NewReader(response))}
resp.StatusCode = 200
result, err := service.parseResponse(logger, &resp)
result, err := service.parseResponse(logger, &resp, "A")
require.NoError(t, err)
frame := result.Responses["A"]
@ -73,6 +73,41 @@ func TestOpenTsdbExecutor(t *testing.T) {
}
})
t.Run("ref id is not hard coded", func(t *testing.T) {
myRefid := "reference id"
response := `
[
{
"metric": "test",
"dps": {
"1405544146": 50.0
},
"tags" : {
"env": "prod",
"app": "grafana"
}
}
]`
testFrame := data.NewFrame("test",
data.NewField("time", nil, []time.Time{
time.Date(2014, 7, 16, 20, 55, 46, 0, time.UTC),
}),
data.NewField("value", map[string]string{"env": "prod", "app": "grafana"}, []float64{
50}),
)
resp := http.Response{Body: io.NopCloser(strings.NewReader(response))}
resp.StatusCode = 200
result, err := service.parseResponse(logger, &resp, myRefid)
require.NoError(t, err)
if diff := cmp.Diff(testFrame, result.Responses[myRefid].Frames[0], data.FrameTestCompareOptions()...); diff != "" {
t.Errorf("Result mismatch (-want +got):\n%s", diff)
}
})
t.Run("Build metric with downsampling enabled", func(t *testing.T) {
query := backend.DataQuery{
JSON: []byte(`