Skip to content

Commit 71ba8eb

Browse files
committed
Add info field to query response
Signed-off-by: SungJin1212 <[email protected]>
1 parent 94122d1 commit 71ba8eb

13 files changed

+333
-120
lines changed

CHANGELOG.md

+1
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
* [FEATURE] Ruler: Experimental: Add `ruler.frontend-address` to allow query to query frontends instead of ingesters. #6151
66
* [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
7+
* [ENHANCEMENT] Query Frontend: Add info field to query response. #6207
78
* [ENHANCEMENT] Query Frontend: Add peakSample in query stats response. #6188
89
* [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
910
* [ENHANCEMENT] Ingester/Ring: New `READONLY` status on ring to be used by Ingester. New ingester API to change mode of ingester #6163

pkg/querier/tripperware/instantquery/instant_query_test.go

+9
Original file line numberDiff line numberDiff line change
@@ -362,6 +362,15 @@ func TestMergeResponse(t *testing.T) {
362362
},
363363
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"]}`,
364364
},
365+
{
366+
name: "merge with infos.",
367+
req: &tripperware.PrometheusRequest{Query: "topk(10, up) by(job)"},
368+
resps: []string{
369+
`{"status":"success","infos":["info1","info2"],"data":{"resultType":"vector","result":[{"metric":{"__name__":"up","job":"foo"},"value":[1,"1"]}]}}`,
370+
`{"status":"success","infos":["info1","info3"],"data":{"resultType":"vector","result":[{"metric":{"__name__":"up","job":"bar"},"value":[1,"2"]}]}}`,
371+
},
372+
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"]}`,
373+
},
365374
{
366375
name: "merge two responses with stats",
367376
req: defaultReq,

pkg/querier/tripperware/merge.go

+5
Original file line numberDiff line numberDiff line change
@@ -42,11 +42,15 @@ func MergeResponse(ctx context.Context, sumStats bool, req Request, responses ..
4242
}
4343
promResponses := make([]*PrometheusResponse, 0, len(responses))
4444
warnings := make([][]string, 0, len(responses))
45+
infos := make([][]string, 0, len(responses))
4546
for _, resp := range responses {
4647
promResponses = append(promResponses, resp.(*PrometheusResponse))
4748
if w := resp.(*PrometheusResponse).Warnings; w != nil {
4849
warnings = append(warnings, w)
4950
}
51+
if i := resp.(*PrometheusResponse).Infos; i != nil {
52+
infos = append(infos, i)
53+
}
5054
}
5155

5256
// Check if it is a range query. Range query passed req as nil since
@@ -96,6 +100,7 @@ func MergeResponse(ctx context.Context, sumStats bool, req Request, responses ..
96100
Status: StatusSuccess,
97101
Data: data,
98102
Warnings: strutil.MergeUnsortedSlices(warnings...),
103+
Infos: strutil.MergeUnsortedSlices(infos...),
99104
}
100105
return res, nil
101106
}

pkg/querier/tripperware/query.pb.go

+142-76
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pkg/querier/tripperware/query.proto

+1
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ message PrometheusResponse {
1919
string Error = 4 [(gogoproto.jsontag) = "error,omitempty"];
2020
repeated tripperware.PrometheusResponseHeader Headers = 5 [(gogoproto.jsontag) = "-"];
2121
repeated string Warnings = 6 [(gogoproto.jsontag) = "warnings,omitempty"];
22+
repeated string Infos = 7 [(gogoproto.jsontag) = "infos,omitempty"];
2223
}
2324

2425
message PrometheusData {

pkg/querier/tripperware/queryrange/query_range_middlewares_test.go

+2
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,8 @@ func TestRoundTrip(t *testing.T) {
3434
_, err = w.Write([]byte(responseBody))
3535
} else if r.RequestURI == queryWithWarnings {
3636
_, err = w.Write([]byte(responseBodyWithWarnings))
37+
} else if r.RequestURI == queryWithInfos {
38+
_, err = w.Write([]byte(responseBodyWithInfos))
3739
} else {
3840
_, err = w.Write([]byte("bar"))
3941
}

pkg/querier/tripperware/queryrange/query_range_test.go

+34
Original file line numberDiff line numberDiff line change
@@ -92,8 +92,10 @@ func TestResponse(t *testing.T) {
9292
t.Parallel()
9393
r := *parsedResponse
9494
rWithWarnings := *parsedResponseWithWarnings
95+
rWithInfos := *parsedResponseWithInfos
9596
r.Headers = respHeaders
9697
rWithWarnings.Headers = respHeaders
98+
rWithInfos.Headers = respHeaders
9799
for i, tc := range []struct {
98100
body string
99101
expected *tripperware.PrometheusResponse
@@ -108,6 +110,10 @@ func TestResponse(t *testing.T) {
108110
body: responseBodyWithWarnings,
109111
expected: &rWithWarnings,
110112
},
113+
{
114+
body: responseBodyWithInfos,
115+
expected: &rWithInfos,
116+
},
111117
{
112118
body: responseBody,
113119
cancelCtxBeforeDecode: true,
@@ -484,6 +490,34 @@ func TestMergeAPIResponses(t *testing.T) {
484490
},
485491
},
486492
},
493+
{
494+
name: "Merge response with infos.",
495+
input: []tripperware.Response{
496+
mustParse(t, `{"status":"success","infos":["info1","info2"],"data":{"resultType":"matrix","result":[{"metric":{"a":"b","c":"d"},"values":[[1,"1"]]}]}}`),
497+
mustParse(t, `{"status":"success","infos":["info1","info3"],"data":{"resultType":"matrix","result":[{"metric":{"a":"b","c":"d"},"values":[[1,"1"]]}]}}`),
498+
},
499+
expected: &tripperware.PrometheusResponse{
500+
Status: StatusSuccess,
501+
Infos: []string{"info1", "info2", "info3"},
502+
Data: tripperware.PrometheusData{
503+
ResultType: matrix,
504+
Result: tripperware.PrometheusQueryResult{
505+
Result: &tripperware.PrometheusQueryResult_Matrix{
506+
Matrix: &tripperware.Matrix{
507+
SampleStreams: []tripperware.SampleStream{
508+
{
509+
Labels: []cortexpb.LabelAdapter{{Name: "a", Value: "b"}, {Name: "c", Value: "d"}},
510+
Samples: []cortexpb.Sample{
511+
{Value: 1, TimestampMs: 1000},
512+
},
513+
},
514+
},
515+
},
516+
},
517+
},
518+
},
519+
},
520+
},
487521
{
488522
name: "Merging of samples where there is complete overlap.",
489523
input: []tripperware.Response{

pkg/querier/tripperware/queryrange/queryrange.pb.go

+98-32
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pkg/querier/tripperware/queryrange/queryrange.proto

+1
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ message PrometheusResponse {
1717
string Error = 4 [(gogoproto.jsontag) = "error,omitempty"];
1818
repeated tripperware.PrometheusResponseHeader Headers = 5 [(gogoproto.jsontag) = "-"];
1919
repeated string Warnings = 6 [(gogoproto.jsontag) = "warnings,omitempty"];
20+
repeated string Infos = 7 [(gogoproto.jsontag) = "infos,omitempty"];
2021
}
2122

2223
message PrometheusData {

pkg/querier/tripperware/queryrange/results_cache.go

+5
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,7 @@ func (PrometheusResponseExtractor) Extract(start, end int64, from tripperware.Re
101101
},
102102
Headers: promRes.Headers,
103103
Warnings: promRes.Warnings,
104+
Infos: promRes.Infos,
104105
}
105106
}
106107

@@ -116,6 +117,7 @@ func (PrometheusResponseExtractor) ResponseWithoutHeaders(resp tripperware.Respo
116117
Stats: promRes.Data.Stats,
117118
},
118119
Warnings: promRes.Warnings,
120+
Infos: promRes.Infos,
119121
}
120122
}
121123

@@ -130,6 +132,7 @@ func (PrometheusResponseExtractor) ResponseWithoutStats(resp tripperware.Respons
130132
},
131133
Headers: promRes.Headers,
132134
Warnings: promRes.Warnings,
135+
Infos: promRes.Infos,
133136
}
134137
}
135138

@@ -600,6 +603,7 @@ func convertToTripperwarePrometheusResponse(resp tripperware.Response) tripperwa
600603
Error: r.Error,
601604
Headers: r.Headers,
602605
Warnings: r.Warnings,
606+
Infos: r.Infos,
603607
}
604608
}
605609

@@ -621,6 +625,7 @@ func convertFromTripperwarePrometheusResponse(resp tripperware.Response) tripper
621625
Error: r.Error,
622626
Headers: r.Headers,
623627
Warnings: r.Warnings,
628+
Infos: r.Infos,
624629
}
625630
}
626631

0 commit comments

Comments
 (0)