2024-02-01 04:33:03 +00:00
|
|
|
package prompbmarshal
|
|
|
|
|
|
|
|
import (
|
|
|
|
"fmt"
|
2024-05-12 09:24:48 +00:00
|
|
|
|
2024-07-03 13:10:09 +00:00
|
|
|
"github.com/VictoriaMetrics/VictoriaMetrics/lib/protoparser/prometheus"
|
2024-05-12 09:24:48 +00:00
|
|
|
"github.com/VictoriaMetrics/VictoriaMetrics/lib/slicesutil"
|
2024-02-01 04:33:03 +00:00
|
|
|
)
|
|
|
|
|
|
|
|
// MarshalProtobuf marshals wr to dst and returns the result.
|
|
|
|
func (wr *WriteRequest) MarshalProtobuf(dst []byte) []byte {
|
|
|
|
size := wr.Size()
|
|
|
|
dstLen := len(dst)
|
2024-05-12 09:24:48 +00:00
|
|
|
dst = slicesutil.SetLength(dst, dstLen+size)
|
2024-02-01 04:33:03 +00:00
|
|
|
n, err := wr.MarshalToSizedBuffer(dst[dstLen:])
|
|
|
|
if err != nil {
|
|
|
|
panic(fmt.Errorf("BUG: unexpected error when marshaling WriteRequest: %w", err))
|
|
|
|
}
|
|
|
|
return dst[:dstLen+n]
|
|
|
|
}
|
|
|
|
|
|
|
|
// Reset resets wr.
|
|
|
|
func (wr *WriteRequest) Reset() {
|
|
|
|
wr.Timeseries = ResetTimeSeries(wr.Timeseries)
|
|
|
|
}
|
|
|
|
|
|
|
|
// ResetTimeSeries clears all the GC references from tss and returns an empty tss ready for further use.
|
|
|
|
func ResetTimeSeries(tss []TimeSeries) []TimeSeries {
|
2024-03-03 21:40:34 +00:00
|
|
|
clear(tss)
|
2024-02-01 04:33:03 +00:00
|
|
|
return tss[:0]
|
|
|
|
}
|
2024-07-03 13:10:09 +00:00
|
|
|
|
|
|
|
// MustParsePromMetrics parses metrics in Prometheus text exposition format from s and returns them.
|
|
|
|
//
|
|
|
|
// Metrics must be delimited with newlines.
|
|
|
|
//
|
|
|
|
// offsetMsecs is added to every timestamp in parsed metrics.
|
|
|
|
//
|
|
|
|
// This function is for testing purposes only. Do not use it in non-test code.
|
|
|
|
func MustParsePromMetrics(s string, offsetMsecs int64) []TimeSeries {
|
|
|
|
var rows prometheus.Rows
|
|
|
|
errLogger := func(s string) {
|
|
|
|
panic(fmt.Errorf("unexpected error when parsing Prometheus metrics: %s", s))
|
|
|
|
}
|
|
|
|
rows.UnmarshalWithErrLogger(s, errLogger)
|
|
|
|
tss := make([]TimeSeries, 0, len(rows.Rows))
|
|
|
|
samples := make([]Sample, 0, len(rows.Rows))
|
|
|
|
for _, row := range rows.Rows {
|
|
|
|
labels := make([]Label, 0, len(row.Tags)+1)
|
|
|
|
labels = append(labels, Label{
|
|
|
|
Name: "__name__",
|
|
|
|
Value: row.Metric,
|
|
|
|
})
|
|
|
|
for _, tag := range row.Tags {
|
|
|
|
labels = append(labels, Label{
|
|
|
|
Name: tag.Key,
|
|
|
|
Value: tag.Value,
|
|
|
|
})
|
|
|
|
}
|
|
|
|
samples = append(samples, Sample{
|
|
|
|
Value: row.Value,
|
|
|
|
Timestamp: row.Timestamp + offsetMsecs,
|
|
|
|
})
|
|
|
|
ts := TimeSeries{
|
|
|
|
Labels: labels,
|
|
|
|
Samples: samples[len(samples)-1:],
|
|
|
|
}
|
|
|
|
tss = append(tss, ts)
|
|
|
|
}
|
|
|
|
return tss
|
|
|
|
}
|