Skip to content

Commit fbc197f

Browse files
authored
Enhance the performance of the frontend JSON codec (cortexproject#6816)
* Enhance the performance of the frontend JSON codec Signed-off-by: Xiaochao Dong (@damnever) <the.xcdong@gmail.com> * Do not rely on the magical init function Signed-off-by: Xiaochao Dong (@damnever) <the.xcdong@gmail.com> --------- Signed-off-by: Xiaochao Dong (@damnever) <the.xcdong@gmail.com>
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)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy