|
|
|
@ -19,6 +19,7 @@ import (
|
|
|
|
|
jsoniter "github.com/json-iterator/go"
|
|
|
|
|
|
|
|
|
|
"github.com/prometheus/prometheus/model/exemplar"
|
|
|
|
|
"github.com/prometheus/prometheus/model/labels"
|
|
|
|
|
"github.com/prometheus/prometheus/promql"
|
|
|
|
|
"github.com/prometheus/prometheus/util/jsonutil"
|
|
|
|
|
)
|
|
|
|
@ -29,6 +30,7 @@ func init() {
|
|
|
|
|
jsoniter.RegisterTypeEncoderFunc("promql.FPoint", marshalFPointJSON, marshalPointJSONIsEmpty)
|
|
|
|
|
jsoniter.RegisterTypeEncoderFunc("promql.HPoint", marshalHPointJSON, marshalPointJSONIsEmpty)
|
|
|
|
|
jsoniter.RegisterTypeEncoderFunc("exemplar.Exemplar", marshalExemplarJSON, marshalExemplarJSONEmpty)
|
|
|
|
|
jsoniter.RegisterTypeEncoderFunc("labels.Labels", unsafeMarshalLabelsJSON, labelsIsEmpty)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// JSONCodec is a Codec that encodes API responses as JSON.
|
|
|
|
@ -217,3 +219,28 @@ func marshalExemplarJSON(ptr unsafe.Pointer, stream *jsoniter.Stream) {
|
|
|
|
|
func marshalExemplarJSONEmpty(unsafe.Pointer) bool {
|
|
|
|
|
return false
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func unsafeMarshalLabelsJSON(ptr unsafe.Pointer, stream *jsoniter.Stream) {
|
|
|
|
|
labelsPtr := (*labels.Labels)(ptr)
|
|
|
|
|
marshalLabelsJSON(*labelsPtr, stream)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func marshalLabelsJSON(lbls labels.Labels, stream *jsoniter.Stream) {
|
|
|
|
|
stream.WriteObjectStart()
|
|
|
|
|
i := 0
|
|
|
|
|
lbls.Range(func(v labels.Label) {
|
|
|
|
|
if i != 0 {
|
|
|
|
|
stream.WriteMore()
|
|
|
|
|
}
|
|
|
|
|
i++
|
|
|
|
|
stream.WriteString(v.Name)
|
|
|
|
|
stream.WriteRaw(`:`)
|
|
|
|
|
stream.WriteString(v.Value)
|
|
|
|
|
})
|
|
|
|
|
stream.WriteObjectEnd()
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func labelsIsEmpty(ptr unsafe.Pointer) bool {
|
|
|
|
|
labelsPtr := (*labels.Labels)(ptr)
|
|
|
|
|
return labelsPtr.IsEmpty()
|
|
|
|
|
}
|
|
|
|
|