From 3380fdf69d893ad35a56044a1058511577bc6d3b Mon Sep 17 00:00:00 2001 From: "Artem V. Navrotskiy" Date: Thu, 17 Jan 2019 21:51:18 +0300 Subject: [PATCH] Add option to report input timestamp in prometheus output (#5292) --- Gopkg.lock | 7 ++++--- Gopkg.toml | 2 +- plugins/outputs/prometheus_client/README.md | 3 +++ .../prometheus_client/prometheus_client.go | 16 ++++++++++++++-- 4 files changed, 22 insertions(+), 6 deletions(-) diff --git a/Gopkg.lock b/Gopkg.lock index e36b76d9b..98eafd39d 100644 --- a/Gopkg.lock +++ b/Gopkg.lock @@ -892,15 +892,16 @@ version = "v1.0.0" [[projects]] - digest = "1:4142d94383572e74b42352273652c62afec5b23f325222ed09198f46009022d1" + digest = "1:6f218995d6a74636cfcab45ce03005371e682b4b9bee0e5eb0ccfd83ef85364f" name = "github.com/prometheus/client_golang" packages = [ "prometheus", + "prometheus/internal", "prometheus/promhttp", ] pruneopts = "" - revision = "c5b7fccd204277076155f10851dad72b76a49317" - version = "v0.8.0" + revision = "505eaef017263e299324067d40ca2c48f6a2cf50" + version = "v0.9.2" [[projects]] branch = "master" diff --git a/Gopkg.toml b/Gopkg.toml index 02b499007..d1cbd081d 100644 --- a/Gopkg.toml +++ b/Gopkg.toml @@ -132,7 +132,7 @@ [[constraint]] name = "github.com/prometheus/client_golang" - version = "0.8.0" + version = "0.9.2" [[constraint]] name = "github.com/prometheus/client_model" diff --git a/plugins/outputs/prometheus_client/README.md b/plugins/outputs/prometheus_client/README.md index d4de4894a..c06fdbaf1 100644 --- a/plugins/outputs/prometheus_client/README.md +++ b/plugins/outputs/prometheus_client/README.md @@ -35,4 +35,7 @@ This plugin starts a [Prometheus](https://prometheus.io/) Client, it exposes all ## If set, enable TLS with the given certificate. # tls_cert = "/etc/ssl/telegraf.crt" # tls_key = "/etc/ssl/telegraf.key" + + ## Export metric collection time. + # export_timestamp = false ``` diff --git a/plugins/outputs/prometheus_client/prometheus_client.go b/plugins/outputs/prometheus_client/prometheus_client.go index 0192d935f..ef81034cd 100644 --- a/plugins/outputs/prometheus_client/prometheus_client.go +++ b/plugins/outputs/prometheus_client/prometheus_client.go @@ -7,7 +7,6 @@ import ( "log" "net" "net/http" - "os" "regexp" "sort" "strconv" @@ -38,6 +37,8 @@ type Sample struct { // Histograms and Summaries need a count and a sum Count uint64 Sum float64 + // Metric timestamp + Timestamp time.Time // Expiration is the deadline that this Sample is valid until. Expiration time.Time } @@ -64,6 +65,7 @@ type PrometheusClient struct { Path string `toml:"path"` CollectorsExclude []string `toml:"collectors_exclude"` StringAsLabel bool `toml:"string_as_label"` + ExportTimestamp bool `toml:"export_timestamp"` server *http.Server @@ -103,6 +105,9 @@ var sampleConfig = ` ## If set, enable TLS with the given certificate. # tls_cert = "/etc/ssl/telegraf.crt" # tls_key = "/etc/ssl/telegraf.key" + + ## Export metric collection time. + # export_timestamp = false ` func (p *PrometheusClient) auth(h http.Handler) http.Handler { @@ -159,7 +164,7 @@ func (p *PrometheusClient) Connect() error { case "gocollector": registry.Register(prometheus.NewGoCollector()) case "process": - registry.Register(prometheus.NewProcessCollector(os.Getpid(), "")) + registry.Register(prometheus.NewProcessCollector(prometheus.ProcessCollectorOpts{})) default: return fmt.Errorf("unrecognized collector %s", collector) } @@ -282,6 +287,9 @@ func (p *PrometheusClient) Collect(ch chan<- prometheus.Metric) { name, labels, err.Error()) } + if p.ExportTimestamp { + metric = prometheus.NewMetricWithTimestamp(sample.Timestamp, metric) + } ch <- metric } } @@ -398,6 +406,7 @@ func (p *PrometheusClient) Write(metrics []telegraf.Metric) error { SummaryValue: summaryvalue, Count: count, Sum: sum, + Timestamp: point.Time(), Expiration: now.Add(p.ExpirationInterval.Duration), } mname = sanitize(point.Name()) @@ -439,6 +448,7 @@ func (p *PrometheusClient) Write(metrics []telegraf.Metric) error { HistogramValue: histogramvalue, Count: count, Sum: sum, + Timestamp: point.Time(), Expiration: now.Add(p.ExpirationInterval.Duration), } mname = sanitize(point.Name()) @@ -463,6 +473,7 @@ func (p *PrometheusClient) Write(metrics []telegraf.Metric) error { sample := &Sample{ Labels: labels, Value: value, + Timestamp: point.Time(), Expiration: now.Add(p.ExpirationInterval.Duration), } @@ -500,6 +511,7 @@ func init() { return &PrometheusClient{ ExpirationInterval: internal.Duration{Duration: time.Second * 60}, StringAsLabel: true, + ExportTimestamp: true, fam: make(map[string]*MetricFamily), now: time.Now, }