Parse NaN values from summary types in prometheus input (#6997)
This commit is contained in:
parent
d46f94112c
commit
0710cc7488
|
@ -15,7 +15,6 @@ import (
|
||||||
|
|
||||||
"github.com/influxdata/telegraf"
|
"github.com/influxdata/telegraf"
|
||||||
"github.com/influxdata/telegraf/metric"
|
"github.com/influxdata/telegraf/metric"
|
||||||
|
|
||||||
"github.com/matttproud/golang_protobuf_extensions/pbutil"
|
"github.com/matttproud/golang_protobuf_extensions/pbutil"
|
||||||
dto "github.com/prometheus/client_model/go"
|
dto "github.com/prometheus/client_model/go"
|
||||||
"github.com/prometheus/common/expfmt"
|
"github.com/prometheus/common/expfmt"
|
||||||
|
@ -115,14 +114,13 @@ func makeQuantilesV2(m *dto.Metric, tags map[string]string, metricName string, m
|
||||||
for _, q := range m.GetSummary().Quantile {
|
for _, q := range m.GetSummary().Quantile {
|
||||||
newTags := tags
|
newTags := tags
|
||||||
fields = make(map[string]interface{})
|
fields = make(map[string]interface{})
|
||||||
if !math.IsNaN(q.GetValue()) {
|
|
||||||
newTags["quantile"] = fmt.Sprint(q.GetQuantile())
|
|
||||||
fields[metricName] = float64(q.GetValue())
|
|
||||||
|
|
||||||
quantileMetric, err := metric.New("prometheus", newTags, fields, t, valueType(metricType))
|
newTags["quantile"] = fmt.Sprint(q.GetQuantile())
|
||||||
if err == nil {
|
fields[metricName] = float64(q.GetValue())
|
||||||
metrics = append(metrics, quantileMetric)
|
|
||||||
}
|
quantileMetric, err := metric.New("prometheus", newTags, fields, t, valueType(metricType))
|
||||||
|
if err == nil {
|
||||||
|
metrics = append(metrics, quantileMetric)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return metrics
|
return metrics
|
||||||
|
|
|
@ -2,12 +2,14 @@ package prometheus
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"math"
|
||||||
"net/http"
|
"net/http"
|
||||||
"net/http/httptest"
|
"net/http/httptest"
|
||||||
"net/url"
|
"net/url"
|
||||||
"testing"
|
"testing"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"github.com/influxdata/telegraf"
|
||||||
"github.com/influxdata/telegraf/testutil"
|
"github.com/influxdata/telegraf/testutil"
|
||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
|
@ -148,6 +150,69 @@ func TestPrometheusGeneratesSummaryMetricsV2(t *testing.T) {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestSummaryMayContainNaN(t *testing.T) {
|
||||||
|
const data = `# HELP go_gc_duration_seconds A summary of the GC invocation durations.
|
||||||
|
# TYPE go_gc_duration_seconds summary
|
||||||
|
go_gc_duration_seconds{quantile="0"} NaN
|
||||||
|
go_gc_duration_seconds{quantile="1"} NaN
|
||||||
|
go_gc_duration_seconds_sum 42.0
|
||||||
|
go_gc_duration_seconds_count 42
|
||||||
|
`
|
||||||
|
ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||||||
|
fmt.Fprintln(w, data)
|
||||||
|
}))
|
||||||
|
defer ts.Close()
|
||||||
|
|
||||||
|
p := &Prometheus{
|
||||||
|
URLs: []string{ts.URL},
|
||||||
|
URLTag: "",
|
||||||
|
MetricVersion: 2,
|
||||||
|
}
|
||||||
|
|
||||||
|
var acc testutil.Accumulator
|
||||||
|
|
||||||
|
err := p.Gather(&acc)
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
expected := []telegraf.Metric{
|
||||||
|
testutil.MustMetric(
|
||||||
|
"prometheus",
|
||||||
|
map[string]string{
|
||||||
|
"quantile": "0",
|
||||||
|
},
|
||||||
|
map[string]interface{}{
|
||||||
|
"go_gc_duration_seconds": math.NaN(),
|
||||||
|
},
|
||||||
|
time.Unix(0, 0),
|
||||||
|
telegraf.Summary,
|
||||||
|
),
|
||||||
|
testutil.MustMetric(
|
||||||
|
"prometheus",
|
||||||
|
map[string]string{
|
||||||
|
"quantile": "1",
|
||||||
|
},
|
||||||
|
map[string]interface{}{
|
||||||
|
"go_gc_duration_seconds": math.NaN(),
|
||||||
|
},
|
||||||
|
time.Unix(0, 0),
|
||||||
|
telegraf.Summary,
|
||||||
|
),
|
||||||
|
testutil.MustMetric(
|
||||||
|
"prometheus",
|
||||||
|
map[string]string{},
|
||||||
|
map[string]interface{}{
|
||||||
|
"go_gc_duration_seconds_sum": 42.0,
|
||||||
|
"go_gc_duration_seconds_count": 42.0,
|
||||||
|
},
|
||||||
|
time.Unix(0, 0),
|
||||||
|
telegraf.Summary,
|
||||||
|
),
|
||||||
|
}
|
||||||
|
|
||||||
|
testutil.RequireMetricsEqual(t, expected, acc.GetTelegrafMetrics(),
|
||||||
|
testutil.IgnoreTime(), testutil.SortMetrics())
|
||||||
|
}
|
||||||
|
|
||||||
func TestPrometheusGeneratesGaugeMetricsV2(t *testing.T) {
|
func TestPrometheusGeneratesGaugeMetricsV2(t *testing.T) {
|
||||||
ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||||||
fmt.Fprintln(w, sampleGaugeTextFormat)
|
fmt.Fprintln(w, sampleGaugeTextFormat)
|
||||||
|
|
Loading…
Reference in New Issue