From 226e8425cb19c451fbb60f546bc0daaa66275971 Mon Sep 17 00:00:00 2001 From: Thomas Roehl Date: Mon, 11 Dec 2023 14:57:06 +0100 Subject: [PATCH] Allow selection of timestamp precision in HttpSink --- sinks/httpSink.go | 21 +++++++++++++++++++-- sinks/httpSink.md | 4 +++- 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/sinks/httpSink.go b/sinks/httpSink.go index a9bcc96..5bad35a 100644 --- a/sinks/httpSink.go +++ b/sinks/httpSink.go @@ -45,6 +45,9 @@ type HttpSinkConfig struct { // Maximum number of retries to connect to the http server (default: 3) MaxRetries int `json:"max_retries,omitempty"` + + // Timestamp precision + Precision string `json:"precision,omitempty"` } type key_value_pair struct { @@ -141,7 +144,7 @@ func (s *HttpSink) Write(m lp.CCMetric) error { // Check that encoding worked if err != nil { - return fmt.Errorf("Encoding failed: %v", err) + return fmt.Errorf("encoding failed: %v", err) } if s.config.flushDelay == 0 { @@ -268,6 +271,7 @@ func NewHttpSink(name string, config json.RawMessage) (Sink, error) { s.config.Timeout = "5s" s.config.FlushDelay = "5s" s.config.MaxRetries = 3 + s.config.Precision = "ns" cclog.ComponentDebug(s.name, "Init()") // Read config @@ -315,6 +319,19 @@ func NewHttpSink(name string, config json.RawMessage) (Sink, error) { cclog.ComponentDebug(s.name, "Init(): flushDelay", t) } } + precision := influx.Nanosecond + if len(s.config.Precision) > 0 { + switch s.config.Precision { + case "s": + precision = influx.Second + case "ms": + precision = influx.Millisecond + case "us": + precision = influx.Microsecond + case "ns": + precision = influx.Nanosecond + } + } // Create http client s.client = &http.Client{ @@ -326,7 +343,7 @@ func NewHttpSink(name string, config json.RawMessage) (Sink, error) { } // Configure influx line protocol encoder - s.encoder.SetPrecision(influx.Nanosecond) + s.encoder.SetPrecision(precision) s.extended_tag_list = make([]key_value_pair, 0) return s, nil diff --git a/sinks/httpSink.md b/sinks/httpSink.md index ccb7c4b..ee1de5e 100644 --- a/sinks/httpSink.md +++ b/sinks/httpSink.md @@ -18,7 +18,8 @@ The `http` sink uses POST requests to a HTTP server to submit the metrics in the "timeout": "5s", "idle_connection_timeout" : "5s", "flush_delay": "2s", - "batch_size": 1000 + "batch_size": 1000, + "precision": "s" } } ``` @@ -34,3 +35,4 @@ The `http` sink uses POST requests to a HTTP server to submit the metrics in the - `idle_connection_timeout`: Timeout for idle connections (default '120s'). Should be larger than the measurement interval to keep the connection open - `flush_delay`: Batch all writes arriving in during this duration (default '1s', batching can be disabled by setting it to 0) - `batch_size`: Maximal batch size. If `batch_size` is reached before the end of `flush_delay`, the metrics are sent without further delay +- `precision`: Precision of the timestamp. Valid values are 's', 'ms', 'us' and 'ns'. (default is 'ns') \ No newline at end of file