mirror of
https://github.com/prometheus/prometheus.git
synced 2024-12-26 06:04:05 -08:00
feat: ProtobufParse.formatOpenMetricsFloat: improve float formatting by using strconv.AppendFloat instead of fmt.Sprint
Signed-off-by: machine424 <ayoubmrini424@gmail.com>
This commit is contained in:
parent
d4b1f9eb33
commit
18b81ad79d
|
@ -20,7 +20,9 @@ import (
|
|||
"fmt"
|
||||
"io"
|
||||
"math"
|
||||
"strconv"
|
||||
"strings"
|
||||
"sync"
|
||||
"unicode/utf8"
|
||||
|
||||
"github.com/gogo/protobuf/proto"
|
||||
|
@ -34,6 +36,15 @@ import (
|
|||
dto "github.com/prometheus/prometheus/prompb/io/prometheus/client"
|
||||
)
|
||||
|
||||
// floatFormatBufPool is exclusively used in formatOpenMetricsFloat.
|
||||
var floatFormatBufPool = sync.Pool{
|
||||
New: func() interface{} {
|
||||
// To contain at most 17 digits and additional syntax for a float64.
|
||||
b := make([]byte, 0, 24)
|
||||
return &b
|
||||
},
|
||||
}
|
||||
|
||||
// ProtobufParser is a very inefficient way of unmarshaling the old Prometheus
|
||||
// protobuf format and then present it as it if were parsed by a
|
||||
// Prometheus-2-style text parser. This is only done so that we can easily plug
|
||||
|
@ -629,11 +640,15 @@ func formatOpenMetricsFloat(f float64) string {
|
|||
case math.IsInf(f, -1):
|
||||
return "-Inf"
|
||||
}
|
||||
s := fmt.Sprint(f)
|
||||
if strings.ContainsAny(s, "e.") {
|
||||
return s
|
||||
bp := floatFormatBufPool.Get().(*[]byte)
|
||||
defer floatFormatBufPool.Put(bp)
|
||||
|
||||
*bp = strconv.AppendFloat((*bp)[:0], f, 'g', -1, 64)
|
||||
if bytes.ContainsAny(*bp, "e.") {
|
||||
return string(*bp)
|
||||
}
|
||||
return s + ".0"
|
||||
*bp = append(*bp, '.', '0')
|
||||
return string(*bp)
|
||||
}
|
||||
|
||||
// isNativeHistogram returns false iff the provided histograms has no spans at
|
||||
|
|
|
@ -409,6 +409,49 @@ metric: <
|
|||
>
|
||||
>
|
||||
|
||||
`,
|
||||
`name: "test_histogram3"
|
||||
help: "Similar histogram as before but now with integer buckets."
|
||||
type: HISTOGRAM
|
||||
metric: <
|
||||
histogram: <
|
||||
sample_count: 6
|
||||
sample_sum: 50
|
||||
bucket: <
|
||||
cumulative_count: 2
|
||||
upper_bound: -20
|
||||
>
|
||||
bucket: <
|
||||
cumulative_count: 4
|
||||
upper_bound: 20
|
||||
exemplar: <
|
||||
label: <
|
||||
name: "dummyID"
|
||||
value: "59727"
|
||||
>
|
||||
value: 15
|
||||
timestamp: <
|
||||
seconds: 1625851153
|
||||
nanos: 146848499
|
||||
>
|
||||
>
|
||||
>
|
||||
bucket: <
|
||||
cumulative_count: 6
|
||||
upper_bound: 30
|
||||
exemplar: <
|
||||
label: <
|
||||
name: "dummyID"
|
||||
value: "5617"
|
||||
>
|
||||
value: 25
|
||||
>
|
||||
>
|
||||
schema: 0
|
||||
zero_threshold: 0
|
||||
>
|
||||
>
|
||||
|
||||
`,
|
||||
`name: "test_histogram_family"
|
||||
help: "Test histogram metric family with two very simple histograms."
|
||||
|
@ -1050,6 +1093,66 @@ func TestProtobufParse(t *testing.T) {
|
|||
"le", "+Inf",
|
||||
),
|
||||
},
|
||||
{
|
||||
m: "test_histogram3",
|
||||
help: "Similar histogram as before but now with integer buckets.",
|
||||
},
|
||||
{
|
||||
m: "test_histogram3",
|
||||
typ: model.MetricTypeHistogram,
|
||||
},
|
||||
{
|
||||
m: "test_histogram3_count",
|
||||
v: 6,
|
||||
lset: labels.FromStrings(
|
||||
"__name__", "test_histogram3_count",
|
||||
),
|
||||
},
|
||||
{
|
||||
m: "test_histogram3_sum",
|
||||
v: 50,
|
||||
lset: labels.FromStrings(
|
||||
"__name__", "test_histogram3_sum",
|
||||
),
|
||||
},
|
||||
{
|
||||
m: "test_histogram3_bucket\xffle\xff-20.0",
|
||||
v: 2,
|
||||
lset: labels.FromStrings(
|
||||
"__name__", "test_histogram3_bucket",
|
||||
"le", "-20.0",
|
||||
),
|
||||
},
|
||||
{
|
||||
m: "test_histogram3_bucket\xffle\xff20.0",
|
||||
v: 4,
|
||||
lset: labels.FromStrings(
|
||||
"__name__", "test_histogram3_bucket",
|
||||
"le", "20.0",
|
||||
),
|
||||
es: []exemplar.Exemplar{
|
||||
{Labels: labels.FromStrings("dummyID", "59727"), Value: 15, HasTs: true, Ts: 1625851153146},
|
||||
},
|
||||
},
|
||||
{
|
||||
m: "test_histogram3_bucket\xffle\xff30.0",
|
||||
v: 6,
|
||||
lset: labels.FromStrings(
|
||||
"__name__", "test_histogram3_bucket",
|
||||
"le", "30.0",
|
||||
),
|
||||
es: []exemplar.Exemplar{
|
||||
{Labels: labels.FromStrings("dummyID", "5617"), Value: 25, HasTs: false},
|
||||
},
|
||||
},
|
||||
{
|
||||
m: "test_histogram3_bucket\xffle\xff+Inf",
|
||||
v: 6,
|
||||
lset: labels.FromStrings(
|
||||
"__name__", "test_histogram3_bucket",
|
||||
"le", "+Inf",
|
||||
),
|
||||
},
|
||||
{
|
||||
m: "test_histogram_family",
|
||||
help: "Test histogram metric family with two very simple histograms.",
|
||||
|
@ -1857,6 +1960,66 @@ func TestProtobufParse(t *testing.T) {
|
|||
"le", "+Inf",
|
||||
),
|
||||
},
|
||||
{
|
||||
m: "test_histogram3",
|
||||
help: "Similar histogram as before but now with integer buckets.",
|
||||
},
|
||||
{
|
||||
m: "test_histogram3",
|
||||
typ: model.MetricTypeHistogram,
|
||||
},
|
||||
{
|
||||
m: "test_histogram3_count",
|
||||
v: 6,
|
||||
lset: labels.FromStrings(
|
||||
"__name__", "test_histogram3_count",
|
||||
),
|
||||
},
|
||||
{
|
||||
m: "test_histogram3_sum",
|
||||
v: 50,
|
||||
lset: labels.FromStrings(
|
||||
"__name__", "test_histogram3_sum",
|
||||
),
|
||||
},
|
||||
{
|
||||
m: "test_histogram3_bucket\xffle\xff-20.0",
|
||||
v: 2,
|
||||
lset: labels.FromStrings(
|
||||
"__name__", "test_histogram3_bucket",
|
||||
"le", "-20.0",
|
||||
),
|
||||
},
|
||||
{
|
||||
m: "test_histogram3_bucket\xffle\xff20.0",
|
||||
v: 4,
|
||||
lset: labels.FromStrings(
|
||||
"__name__", "test_histogram3_bucket",
|
||||
"le", "20.0",
|
||||
),
|
||||
es: []exemplar.Exemplar{
|
||||
{Labels: labels.FromStrings("dummyID", "59727"), Value: 15, HasTs: true, Ts: 1625851153146},
|
||||
},
|
||||
},
|
||||
{
|
||||
m: "test_histogram3_bucket\xffle\xff30.0",
|
||||
v: 6,
|
||||
lset: labels.FromStrings(
|
||||
"__name__", "test_histogram3_bucket",
|
||||
"le", "30.0",
|
||||
),
|
||||
es: []exemplar.Exemplar{
|
||||
{Labels: labels.FromStrings("dummyID", "5617"), Value: 25, HasTs: false},
|
||||
},
|
||||
},
|
||||
{
|
||||
m: "test_histogram3_bucket\xffle\xff+Inf",
|
||||
v: 6,
|
||||
lset: labels.FromStrings(
|
||||
"__name__", "test_histogram3_bucket",
|
||||
"le", "+Inf",
|
||||
),
|
||||
},
|
||||
{
|
||||
m: "test_histogram_family",
|
||||
help: "Test histogram metric family with two very simple histograms.",
|
||||
|
|
Loading…
Reference in a new issue