From af3dc5016bce6ce2c0a49f53b78d92b8e72c6485 Mon Sep 17 00:00:00 2001 From: Ariel Date: Thu, 2 Apr 2020 15:48:16 -0400 Subject: [PATCH 1/2] Allows specifying a timestamp precision value for writes to InfluxDB --- plugins/outputs/influxdb_v2/http.go | 26 +++++++++++++++++++++++-- plugins/outputs/influxdb_v2/influxdb.go | 6 ++++++ 2 files changed, 30 insertions(+), 2 deletions(-) diff --git a/plugins/outputs/influxdb_v2/http.go b/plugins/outputs/influxdb_v2/http.go index b94df889bfc6e..8f56fb8590827 100644 --- a/plugins/outputs/influxdb_v2/http.go +++ b/plugins/outputs/influxdb_v2/http.go @@ -53,6 +53,7 @@ type HTTPConfig struct { UserAgent string ContentEncoding string TLSConfig *tls.Config + Precision string Serializer *influx.Serializer } @@ -65,6 +66,7 @@ type httpClient struct { Bucket string BucketTag string ExcludeBucketTag bool + Precision string client *http.Client serializer *influx.Serializer @@ -127,6 +129,13 @@ func NewHTTPClient(config *HTTPConfig) (*httpClient, error) { return nil, fmt.Errorf("unsupported scheme %q", config.URL.Scheme) } + precision := config.Precision + if precision != "" && !checkValidPrecision(precision) { + return nil, fmt.Errorf("unsupported precision %v", precision) + } else { + precision = "ns" + } + client := &httpClient{ serializer: serializer, client: &http.Client{ @@ -141,6 +150,7 @@ func NewHTTPClient(config *HTTPConfig) (*httpClient, error) { Bucket: config.Bucket, BucketTag: config.BucketTag, ExcludeBucketTag: config.ExcludeBucketTag, + Precision: precision, } return client, nil } @@ -210,7 +220,7 @@ func (c *httpClient) Write(ctx context.Context, metrics []telegraf.Metric) error } func (c *httpClient) writeBatch(ctx context.Context, bucket string, metrics []telegraf.Metric) error { - url, err := makeWriteURL(*c.url, c.Organization, bucket) + url, err := makeWriteURL(*c.url, c.Organization, bucket, c.Precision) if err != nil { return err } @@ -327,10 +337,11 @@ func (c *httpClient) addHeaders(req *http.Request) { } } -func makeWriteURL(loc url.URL, org, bucket string) (string, error) { +func makeWriteURL(loc url.URL, org, bucket string, precision string) (string, error) { params := url.Values{} params.Set("bucket", bucket) params.Set("org", org) + params.Set("precision", precision) switch loc.Scheme { case "unix": @@ -343,9 +354,20 @@ func makeWriteURL(loc url.URL, org, bucket string) (string, error) { return "", fmt.Errorf("unsupported scheme: %q", loc.Scheme) } loc.RawQuery = params.Encode() + fmt.Printf("%v\n", loc.RequestURI()) return loc.String(), nil } func (c *httpClient) Close() { internal.CloseIdleConnections(c.client) } + +func checkValidPrecision(precision string) bool { + validPrecisions := [4]string{"ns", "us", "ms", "s"} + for _, value := range validPrecisions { + if value == precision { + return true + } + } + return false +} diff --git a/plugins/outputs/influxdb_v2/influxdb.go b/plugins/outputs/influxdb_v2/influxdb.go index 4e23146916cdb..770535704bd54 100644 --- a/plugins/outputs/influxdb_v2/influxdb.go +++ b/plugins/outputs/influxdb_v2/influxdb.go @@ -72,6 +72,10 @@ var sampleConfig = ` # tls_key = "/etc/telegraf/key.pem" ## Use TLS but skip chain & host verification # insecure_skip_verify = false + + ## Timestamp precision + ## InfluxDB accepts the following precisions: "ns" (default), "us", "ms", "s" + ` type Client interface { @@ -94,6 +98,7 @@ type InfluxDB struct { UserAgent string `toml:"user_agent"` ContentEncoding string `toml:"content_encoding"` UintSupport bool `toml:"influx_uint_support"` + Precision string `toml:"precision"` tls.ClientConfig clients []Client @@ -191,6 +196,7 @@ func (i *InfluxDB) getHTTPClient(ctx context.Context, url *url.URL, proxy *url.U ContentEncoding: i.ContentEncoding, TLSConfig: tlsConfig, Serializer: i.newSerializer(), + Precision: i.Precision, } c, err := NewHTTPClient(config) From fa6709475388911fb93177e6d766cf08956f2e3b Mon Sep 17 00:00:00 2001 From: Ariel Date: Thu, 2 Apr 2020 16:01:40 -0400 Subject: [PATCH 2/2] Update README.md --- plugins/outputs/influxdb_v2/README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/plugins/outputs/influxdb_v2/README.md b/plugins/outputs/influxdb_v2/README.md index 49c080f330aa4..860e138ec2f8a 100644 --- a/plugins/outputs/influxdb_v2/README.md +++ b/plugins/outputs/influxdb_v2/README.md @@ -56,6 +56,10 @@ The InfluxDB output plugin writes metrics to the [InfluxDB v2.x] HTTP service. # tls_key = "/etc/telegraf/key.pem" ## Use TLS but skip chain & host verification # insecure_skip_verify = false + + ## Timestamp precision + ## InfluxDB accepts the following precisions: "ns" (default), "us", "ms", "s" + ``` [InfluxDB v2.x]: https://github.com/influxdata/influxdb