Skip to content

Commit

Permalink
Add info field to query response (#6207)
Browse files Browse the repository at this point in the history
  • Loading branch information
SungJin1212 committed Sep 19, 2024
1 parent 2f07f95 commit 0f848d8
Show file tree
Hide file tree
Showing 13 changed files with 334 additions and 116 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

* [FEATURE] Ruler: Experimental: Add `ruler.frontend-address` to allow query to query frontends instead of ingesters. #6151
* [FEATURE] Ruler: Minimize chances of missed rule group evaluations that can occur due to OOM kills, bad underlying nodes, or due to an unhealthy ruler that appears in the ring as healthy. This feature is enabled via `-ruler.enable-ha-evaluation` flag. #6129
* [ENHANCEMENT] Query Frontend: Add info field to query response. #6207
* [ENHANCEMENT] Query Frontend: Add peakSample in query stats response. #6188
* [ENHANCEMENT] Ruler: Add new ruler metric `cortex_ruler_rule_groups_in_store` that is the total rule groups per tenant in store, which can be used to compare with `cortex_prometheus_rule_group_rules` to count the number of rule groups that are not loaded by a ruler. #5869
* [ENHANCEMENT] Ingester/Ring: New `READONLY` status on ring to be used by Ingester. New ingester API to change mode of ingester #6163
Expand Down
9 changes: 9 additions & 0 deletions pkg/querier/tripperware/instantquery/instant_query_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -362,6 +362,15 @@ func TestMergeResponse(t *testing.T) {
},
expectedResp: `{"status":"success","data":{"resultType":"vector","result":[{"metric":{"__name__":"up","job":"foo"},"value":[1,"1"]},{"metric":{"__name__":"up","job":"bar"},"value":[1,"2"]}]},"warnings":["warning1","warning2","warning3"]}`,
},
{
name: "merge with infos.",
req: &tripperware.PrometheusRequest{Query: "topk(10, up) by(job)"},
resps: []string{
`{"status":"success","infos":["info1","info2"],"data":{"resultType":"vector","result":[{"metric":{"__name__":"up","job":"foo"},"value":[1,"1"]}]}}`,
`{"status":"success","infos":["info1","info3"],"data":{"resultType":"vector","result":[{"metric":{"__name__":"up","job":"bar"},"value":[1,"2"]}]}}`,
},
expectedResp: `{"status":"success","data":{"resultType":"vector","result":[{"metric":{"__name__":"up","job":"foo"},"value":[1,"1"]},{"metric":{"__name__":"up","job":"bar"},"value":[1,"2"]}]},"infos":["info1","info2","info3"]}`,
},
{
name: "merge two responses with stats",
req: defaultReq,
Expand Down
5 changes: 5 additions & 0 deletions pkg/querier/tripperware/merge.go
Original file line number Diff line number Diff line change
Expand Up @@ -42,11 +42,15 @@ func MergeResponse(ctx context.Context, sumStats bool, req Request, responses ..
}
promResponses := make([]*PrometheusResponse, 0, len(responses))
warnings := make([][]string, 0, len(responses))
infos := make([][]string, 0, len(responses))
for _, resp := range responses {
promResponses = append(promResponses, resp.(*PrometheusResponse))
if w := resp.(*PrometheusResponse).Warnings; w != nil {
warnings = append(warnings, w)
}
if i := resp.(*PrometheusResponse).Infos; i != nil {
infos = append(infos, i)
}
}

// Check if it is a range query. Range query passed req as nil since
Expand Down Expand Up @@ -96,6 +100,7 @@ func MergeResponse(ctx context.Context, sumStats bool, req Request, responses ..
Status: StatusSuccess,
Data: data,
Warnings: strutil.MergeUnsortedSlices(warnings...),
Infos: strutil.MergeUnsortedSlices(infos...),
}
return res, nil
}
Expand Down
218 changes: 142 additions & 76 deletions pkg/querier/tripperware/query.pb.go

Large diffs are not rendered by default.

1 change: 1 addition & 0 deletions pkg/querier/tripperware/query.proto
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ message PrometheusResponse {
string Error = 4 [(gogoproto.jsontag) = "error,omitempty"];
repeated tripperware.PrometheusResponseHeader Headers = 5 [(gogoproto.jsontag) = "-"];
repeated string Warnings = 6 [(gogoproto.jsontag) = "warnings,omitempty"];
repeated string Infos = 7 [(gogoproto.jsontag) = "infos,omitempty"];
}

message PrometheusData {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,8 @@ func TestRoundTrip(t *testing.T) {
_, err = w.Write([]byte(responseBody))
} else if r.RequestURI == queryWithWarnings {
_, err = w.Write([]byte(responseBodyWithWarnings))
} else if r.RequestURI == queryWithInfos {
_, err = w.Write([]byte(responseBodyWithInfos))
} else {
_, err = w.Write([]byte("bar"))
}
Expand Down
34 changes: 34 additions & 0 deletions pkg/querier/tripperware/queryrange/query_range_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -92,8 +92,10 @@ func TestResponse(t *testing.T) {
t.Parallel()
r := *parsedResponse
rWithWarnings := *parsedResponseWithWarnings
rWithInfos := *parsedResponseWithInfos
r.Headers = respHeaders
rWithWarnings.Headers = respHeaders
rWithInfos.Headers = respHeaders
for i, tc := range []struct {
body string
expected *tripperware.PrometheusResponse
Expand All @@ -108,6 +110,10 @@ func TestResponse(t *testing.T) {
body: responseBodyWithWarnings,
expected: &rWithWarnings,
},
{
body: responseBodyWithInfos,
expected: &rWithInfos,
},
{
body: responseBody,
cancelCtxBeforeDecode: true,
Expand Down Expand Up @@ -484,6 +490,34 @@ func TestMergeAPIResponses(t *testing.T) {
},
},
},
{
name: "Merge response with infos.",
input: []tripperware.Response{
mustParse(t, `{"status":"success","infos":["info1","info2"],"data":{"resultType":"matrix","result":[{"metric":{"a":"b","c":"d"},"values":[[1,"1"]]}]}}`),
mustParse(t, `{"status":"success","infos":["info1","info3"],"data":{"resultType":"matrix","result":[{"metric":{"a":"b","c":"d"},"values":[[1,"1"]]}]}}`),
},
expected: &tripperware.PrometheusResponse{
Status: StatusSuccess,
Infos: []string{"info1", "info2", "info3"},
Data: tripperware.PrometheusData{
ResultType: matrix,
Result: tripperware.PrometheusQueryResult{
Result: &tripperware.PrometheusQueryResult_Matrix{
Matrix: &tripperware.Matrix{
SampleStreams: []tripperware.SampleStream{
{
Labels: []cortexpb.LabelAdapter{{Name: "a", Value: "b"}, {Name: "c", Value: "d"}},
Samples: []cortexpb.Sample{
{Value: 1, TimestampMs: 1000},
},
},
},
},
},
},
},
},
},
{
name: "Merging of samples where there is complete overlap.",
input: []tripperware.Response{
Expand Down
130 changes: 98 additions & 32 deletions pkg/querier/tripperware/queryrange/queryrange.pb.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions pkg/querier/tripperware/queryrange/queryrange.proto
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ message PrometheusResponse {
string Error = 4 [(gogoproto.jsontag) = "error,omitempty"];
repeated tripperware.PrometheusResponseHeader Headers = 5 [(gogoproto.jsontag) = "-"];
repeated string Warnings = 6 [(gogoproto.jsontag) = "warnings,omitempty"];
repeated string Infos = 7 [(gogoproto.jsontag) = "infos,omitempty"];
}

message PrometheusData {
Expand Down
5 changes: 5 additions & 0 deletions pkg/querier/tripperware/queryrange/results_cache.go
Original file line number Diff line number Diff line change
Expand Up @@ -101,6 +101,7 @@ func (PrometheusResponseExtractor) Extract(start, end int64, from tripperware.Re
},
Headers: promRes.Headers,
Warnings: promRes.Warnings,
Infos: promRes.Infos,
}
}

Expand All @@ -116,6 +117,7 @@ func (PrometheusResponseExtractor) ResponseWithoutHeaders(resp tripperware.Respo
Stats: promRes.Data.Stats,
},
Warnings: promRes.Warnings,
Infos: promRes.Infos,
}
}

Expand All @@ -130,6 +132,7 @@ func (PrometheusResponseExtractor) ResponseWithoutStats(resp tripperware.Respons
},
Headers: promRes.Headers,
Warnings: promRes.Warnings,
Infos: promRes.Infos,
}
}

Expand Down Expand Up @@ -600,6 +603,7 @@ func convertToTripperwarePrometheusResponse(resp tripperware.Response) tripperwa
Error: r.Error,
Headers: r.Headers,
Warnings: r.Warnings,
Infos: r.Infos,
}
}

Expand All @@ -621,6 +625,7 @@ func convertFromTripperwarePrometheusResponse(resp tripperware.Response) tripper
Error: r.Error,
Headers: r.Headers,
Warnings: r.Warnings,
Infos: r.Infos,
}
}

Expand Down
Loading

0 comments on commit 0f848d8

Please sign in to comment.