85 lines
2.6 KiB
Go
85 lines
2.6 KiB
Go
package prometheus
|
|
|
|
import (
|
|
"math"
|
|
"strconv"
|
|
"time"
|
|
|
|
dto "github.com/prometheus/client_model/go"
|
|
|
|
"github.com/influxdata/telegraf"
|
|
"github.com/influxdata/telegraf/metric"
|
|
)
|
|
|
|
func (p *Parser) extractMetricsV1(prommetrics *dto.MetricFamily) []telegraf.Metric {
|
|
now := time.Now()
|
|
|
|
// Convert each prometheus metrics to the corresponding telegraf metrics.
|
|
// You will get one telegraf metric with one field per prometheus metric
|
|
// for "simple" types like Gauge and Counter but a telegraf metric with
|
|
// multiple fields for "complex" types like Summary or Histogram.
|
|
var metrics []telegraf.Metric
|
|
metricName := prommetrics.GetName()
|
|
metricType := prommetrics.GetType()
|
|
for _, pm := range prommetrics.Metric {
|
|
// Extract the timestamp of the metric if it exists and should
|
|
// not be ignored.
|
|
t := now
|
|
if ts := pm.GetTimestampMs(); !p.IgnoreTimestamp && ts > 0 {
|
|
t = time.UnixMilli(ts)
|
|
}
|
|
|
|
// Convert the labels to tags
|
|
tags := getTagsFromLabels(pm, p.DefaultTags)
|
|
|
|
// Construct the metrics
|
|
switch metricType {
|
|
case dto.MetricType_SUMMARY:
|
|
summary := pm.GetSummary()
|
|
|
|
// Collect the fields
|
|
fields := make(map[string]interface{}, len(summary.Quantile)+2)
|
|
fields["count"] = float64(summary.GetSampleCount())
|
|
fields["sum"] = summary.GetSampleSum()
|
|
for _, q := range summary.Quantile {
|
|
if v := q.GetValue(); !math.IsNaN(v) {
|
|
fname := strconv.FormatFloat(q.GetQuantile(), 'g', -1, 64)
|
|
fields[fname] = v
|
|
}
|
|
}
|
|
metrics = append(metrics, metric.New(metricName, tags, fields, t, telegraf.Summary))
|
|
case dto.MetricType_HISTOGRAM:
|
|
histogram := pm.GetHistogram()
|
|
|
|
// Collect the fields
|
|
fields := make(map[string]interface{}, len(histogram.Bucket)+2)
|
|
fields["count"] = float64(pm.GetHistogram().GetSampleCount())
|
|
fields["sum"] = pm.GetHistogram().GetSampleSum()
|
|
for _, b := range histogram.Bucket {
|
|
fname := strconv.FormatFloat(b.GetUpperBound(), 'g', -1, 64)
|
|
fields[fname] = float64(b.GetCumulativeCount())
|
|
}
|
|
metrics = append(metrics, metric.New(metricName, tags, fields, t, telegraf.Histogram))
|
|
default:
|
|
var fname string
|
|
var v float64
|
|
if gauge := pm.GetGauge(); gauge != nil {
|
|
fname = "gauge"
|
|
v = gauge.GetValue()
|
|
} else if counter := pm.GetCounter(); counter != nil {
|
|
fname = "counter"
|
|
v = counter.GetValue()
|
|
} else if untyped := pm.GetUntyped(); untyped != nil {
|
|
fname = "value"
|
|
v = untyped.GetValue()
|
|
}
|
|
if fname != "" && !math.IsNaN(v) {
|
|
fields := map[string]interface{}{fname: v}
|
|
vtype := mapValueType(metricType)
|
|
metrics = append(metrics, metric.New(metricName, tags, fields, t, vtype))
|
|
}
|
|
}
|
|
}
|
|
|
|
return metrics
|
|
}
|