diff --git a/api/prometheus/v1/api.go b/api/prometheus/v1/api.go index d5e0980cf..2f9191a42 100644 --- a/api/prometheus/v1/api.go +++ b/api/prometheus/v1/api.go @@ -837,11 +837,11 @@ func (r *RecordingRule) unmarshalTypeCheckedJSON(b []byte) error { func (qr *queryResult) UnmarshalJSON(b []byte) error { v := struct { - Type model.ValueType `json:"resultType"` - Result json.RawMessage `json:"result"` + Type model.ValueType `json:"resultType"` + Result gojson.RawMessage `json:"result"` }{} - err := json.Unmarshal(b, &v) + err := gojson.Unmarshal(b, &v) if err != nil { return err } @@ -1184,7 +1184,7 @@ func (h *httpAPI) Query(ctx context.Context, query string, ts time.Time, opts .. } var qres queryResult - return qres.v, warnings, infos, json.Unmarshal(body, &qres) + return qres.v, warnings, infos, gojson.Unmarshal(body, &qres) } func (h *httpAPI) QueryRange(ctx context.Context, query string, r Range, opts ...Option) (model.Value, Warnings, Infos, error) { diff --git a/api/prometheus/v1/api_bench_test.go b/api/prometheus/v1/api_bench_test.go index 5b434f72e..ed396243b 100644 --- a/api/prometheus/v1/api_bench_test.go +++ b/api/prometheus/v1/api_bench_test.go @@ -321,3 +321,129 @@ func BenchmarkRuleGroup(b *testing.B) { } }) } + +func BenchmarkQueryResult(b *testing.B) { + scalarData, err := json.Marshal(queryResult{ + Type: model.ValScalar, + Result: &model.Scalar{Value: 2, Timestamp: model.TimeFromUnix(1234)}, + }) + if err != nil { + b.Fatal(err) + } + + vectorData, err := json.Marshal(queryResult{ + Type: model.ValVector, + Result: model.Vector{genSample(), genSample(), genSample(), genSample(), genSample(), genSample(), genSample(), genSample(), genSample(), genSample()}, + }) + if err != nil { + b.Fatal(err) + } + + floatMatrix, histogramMatrix := generateData(10, 10) + floatData, err := json.Marshal(queryResult{ + Type: model.ValMatrix, + Result: floatMatrix, + }) + if err != nil { + b.Fatal(err) + } + + histogramData, err := json.Marshal(queryResult{ + Type: model.ValMatrix, + Result: histogramMatrix, + }) + if err != nil { + b.Fatal(err) + } + + b.Run("scalar", func(b *testing.B) { + for i := 0; i < b.N; i++ { + var q queryResult + if err := q.UnmarshalJSON(scalarData); err != nil { + b.Fatal(err) + } + } + }) + + b.Run("vector", func(b *testing.B) { + for i := 0; i < b.N; i++ { + var q queryResult + if err := q.UnmarshalJSON(vectorData); err != nil { + b.Fatal(err) + } + } + }) + + b.Run("matrix-float", func(b *testing.B) { + for i := 0; i < b.N; i++ { + var q queryResult + if err := q.UnmarshalJSON(floatData); err != nil { + b.Fatal(err) + } + } + }) + + b.Run("matrix-histogram", func(b *testing.B) { + for i := 0; i < b.N; i++ { + var q queryResult + if err := q.UnmarshalJSON(histogramData); err != nil { + b.Fatal(err) + } + } + }) +} + +func genSample() *model.Sample { + return &model.Sample{ + Metric: model.Metric{ + "name": "test_metric", + }, + Histogram: genSampleHistogram(), + Timestamp: 1234567, + } +} + +func genSampleHistogram() *model.SampleHistogram { + return &model.SampleHistogram{ + Count: 6, + Sum: 3897, + Buckets: model.HistogramBuckets{ + { + Boundaries: 1, + Lower: -4870.992343051145, + Upper: -4466.7196729968955, + Count: 1, + }, + { + Boundaries: 1, + Lower: -861.0779292198035, + Upper: -789.6119426088657, + Count: 1, + }, + { + Boundaries: 1, + Lower: -558.3399591246119, + Upper: -512, + Count: 1, + }, + { + Boundaries: 0, + Lower: 2048, + Upper: 2233.3598364984477, + Count: 1, + }, + { + Boundaries: 0, + Lower: 2896.3093757400984, + Upper: 3158.4477704354626, + Count: 1, + }, + { + Boundaries: 0, + Lower: 4466.7196729968955, + Upper: 4870.992343051145, + Count: 1, + }, + }, + } +}