Skip to content

Commit fbc197f

Browse files
authored
Enhance the performance of the frontend JSON codec (#6816)
* Enhance the performance of the frontend JSON codec Signed-off-by: Xiaochao Dong (@damnever) <[email protected]> * Do not rely on the magical init function Signed-off-by: Xiaochao Dong (@damnever) <[email protected]> --------- Signed-off-by: Xiaochao Dong (@damnever) <[email protected]>
1 parent c1f2190 commit fbc197f

File tree

3 files changed

+12
-26
lines changed

3 files changed

+12
-26
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@
4242
* [ENHANCEMENT] Parquet Storage: Add some metrics for parquet blocks and converter. #6809 #6821
4343
* [ENHANCEMENT] Compactor: Optimize cleaner run time. #6815
4444
* [ENHANCEMENT] Parquet Storage: Allow percentage based dynamic shard size for Parquet Converter. #6817
45+
* [ENHANCEMENT] Query Frontend: Enhance the performance of the JSON codec. #6816
4546
* [BUGFIX] Ingester: Avoid error or early throttling when READONLY ingesters are present in the ring #6517
4647
* [BUGFIX] Ingester: Fix labelset data race condition. #6573
4748
* [BUGFIX] Compactor: Cleaner should not put deletion marker for blocks with no-compact marker. #6576

pkg/chunk/json_helpers.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,14 +10,14 @@ import (
1010
)
1111

1212
func init() {
13-
jsoniter.RegisterTypeDecoderFunc("labels.Labels", decodeLabels)
14-
jsoniter.RegisterTypeEncoderFunc("labels.Labels", encodeLabels, labelsIsEmpty)
13+
jsoniter.RegisterTypeDecoderFunc("labels.Labels", DecodeLabels)
14+
jsoniter.RegisterTypeEncoderFunc("labels.Labels", EncodeLabels, labelsIsEmpty)
1515
jsoniter.RegisterTypeDecoderFunc("model.Time", decodeModelTime)
1616
jsoniter.RegisterTypeEncoderFunc("model.Time", encodeModelTime, modelTimeIsEmpty)
1717
}
1818

1919
// Override Prometheus' labels.Labels decoder which goes via a map
20-
func decodeLabels(ptr unsafe.Pointer, iter *jsoniter.Iterator) {
20+
func DecodeLabels(ptr unsafe.Pointer, iter *jsoniter.Iterator) {
2121
labelsPtr := (*labels.Labels)(ptr)
2222
*labelsPtr = make(labels.Labels, 0, 10)
2323
iter.ReadMapCB(func(iter *jsoniter.Iterator, key string) bool {
@@ -31,7 +31,7 @@ func decodeLabels(ptr unsafe.Pointer, iter *jsoniter.Iterator) {
3131
}
3232

3333
// Override Prometheus' labels.Labels encoder which goes via a map
34-
func encodeLabels(ptr unsafe.Pointer, stream *jsoniter.Stream) {
34+
func EncodeLabels(ptr unsafe.Pointer, stream *jsoniter.Stream) {
3535
labelsPtr := (*labels.Labels)(ptr)
3636
stream.WriteObjectStart()
3737
for i, v := range *labelsPtr {

pkg/querier/tripperware/query.go

Lines changed: 7 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ import (
2525
"github.com/prometheus/prometheus/util/jsonutil"
2626
"github.com/weaveworks/common/httpgrpc"
2727

28+
"github.com/cortexproject/cortex/pkg/chunk"
2829
"github.com/cortexproject/cortex/pkg/cortexpb"
2930
"github.com/cortexproject/cortex/pkg/util/limiter"
3031
"github.com/cortexproject/cortex/pkg/util/runutil"
@@ -113,12 +114,8 @@ func decodeSampleStream(ptr unsafe.Pointer, iter *jsoniter.Iterator) {
113114
for field := iter.ReadObject(); field != ""; field = iter.ReadObject() {
114115
switch field {
115116
case "metric":
116-
metricString := iter.ReadAny().ToString()
117117
lbls := labels.Labels{}
118-
if err := json.UnmarshalFromString(metricString, &lbls); err != nil {
119-
iter.ReportError("unmarshal SampleStream", err.Error())
120-
return
121-
}
118+
chunk.DecodeLabels(unsafe.Pointer(&lbls), iter)
122119
ss.Labels = cortexpb.FromLabelsToLabelAdapters(lbls)
123120
case "values":
124121
for iter.ReadArray() {
@@ -302,12 +299,8 @@ func encodeSampleStream(ptr unsafe.Pointer, stream *jsoniter.Stream) {
302299
stream.WriteObjectStart()
303300

304301
stream.WriteObjectField(`metric`)
305-
lbls, err := cortexpb.FromLabelAdaptersToLabels(ss.Labels).MarshalJSON()
306-
if err != nil {
307-
stream.Error = err
308-
return
309-
}
310-
stream.SetBuffer(append(stream.Buffer(), lbls...))
302+
metric := cortexpb.FromLabelAdaptersToLabels(ss.Labels)
303+
chunk.EncodeLabels(unsafe.Pointer(&metric), stream)
311304

312305
if len(ss.Samples) > 0 {
313306
stream.WriteMore()
@@ -343,12 +336,8 @@ func decodeSample(ptr unsafe.Pointer, iter *jsoniter.Iterator) {
343336
for field := iter.ReadObject(); field != ""; field = iter.ReadObject() {
344337
switch field {
345338
case "metric":
346-
metricString := iter.ReadAny().ToString()
347339
lbls := labels.Labels{}
348-
if err := json.UnmarshalFromString(metricString, &lbls); err != nil {
349-
iter.ReportError("unmarshal Sample", err.Error())
350-
return
351-
}
340+
chunk.DecodeLabels(unsafe.Pointer(&lbls), iter)
352341
ss.Labels = cortexpb.FromLabelsToLabelAdapters(lbls)
353342
case "value":
354343
ss.Sample = &cortexpb.Sample{}
@@ -368,12 +357,8 @@ func encodeSample(ptr unsafe.Pointer, stream *jsoniter.Stream) {
368357
stream.WriteObjectStart()
369358

370359
stream.WriteObjectField(`metric`)
371-
lbls, err := cortexpb.FromLabelAdaptersToLabels(ss.Labels).MarshalJSON()
372-
if err != nil {
373-
stream.Error = err
374-
return
375-
}
376-
stream.SetBuffer(append(stream.Buffer(), lbls...))
360+
metric := cortexpb.FromLabelAdaptersToLabels(ss.Labels)
361+
chunk.EncodeLabels(unsafe.Pointer(&metric), stream)
377362

378363
if ss.Sample != nil {
379364
stream.WriteMore()

0 commit comments

Comments
 (0)