From 1d3afd469f15e202eccc2191dfccc3ed65428288 Mon Sep 17 00:00:00 2001 From: kannar Date: Mon, 24 Apr 2023 20:47:07 +0200 Subject: [PATCH] fix(outputs.warp10): Support Infinity/-Infinity/NaN values (#13126) --- plugins/outputs/warp10/warp10.go | 31 ++++++++++++++++++++++++ plugins/outputs/warp10/warp10_test.go | 34 +++++++++++++++++++++++++++ testutil/testutil.go | 7 ++++++ 3 files changed, 72 insertions(+) diff --git a/plugins/outputs/warp10/warp10.go b/plugins/outputs/warp10/warp10.go index 97a3ea019..5796a3be4 100644 --- a/plugins/outputs/warp10/warp10.go +++ b/plugins/outputs/warp10/warp10.go @@ -198,7 +198,38 @@ func boolToString(inputBool bool) string { return strconv.FormatBool(inputBool) } +/* +Warp10 supports Infinity/-Infinity/NaN +<' +// class{label=value} 42.0 +0// class-1{label=value}{attribute=value} 42 +=1// Infinity +'> +PARSE + +<' +// class{label=value} 42.0 +0// class-1{label=value}{attribute=value} 42 +=1// -Infinity +'> +PARSE + +<' +// class{label=value} 42.0 +0// class-1{label=value}{attribute=value} 42 +=1// NaN +'> +PARSE +*/ func floatToString(inputNum float64) string { + switch { + case math.IsNaN(inputNum): + return "NaN" + case math.IsInf(inputNum, -1): + return "-Infinity" + case math.IsInf(inputNum, 1): + return "Infinity" + } return strconv.FormatFloat(inputNum, 'f', 6, 64) } diff --git a/plugins/outputs/warp10/warp10_test.go b/plugins/outputs/warp10/warp10_test.go index 798a9610d..8ffdbe06b 100644 --- a/plugins/outputs/warp10/warp10_test.go +++ b/plugins/outputs/warp10/warp10_test.go @@ -1,6 +1,7 @@ package warp10 import ( + "math" "testing" "github.com/influxdata/telegraf/config" @@ -24,6 +25,39 @@ func TestWriteWarp10(t *testing.T) { require.Exactly(t, "1257894000000000// unit.testtest1.value{source=telegraf,tag1=value1} 1.000000\n", payload) } +func TestWriteWarp10ValueNaN(t *testing.T) { + w := Warp10{ + Prefix: "unit.test", + WarpURL: "http://localhost:8090", + Token: config.NewSecret([]byte("WRITE")), + } + + payload := w.GenWarp10Payload(testutil.MockMetricsWithValue(math.NaN())) + require.Exactly(t, "1257894000000000// unit.testtest1.value{source=telegraf,tag1=value1} NaN\n", payload) +} + +func TestWriteWarp10ValueInfinity(t *testing.T) { + w := Warp10{ + Prefix: "unit.test", + WarpURL: "http://localhost:8090", + Token: config.NewSecret([]byte("WRITE")), + } + + payload := w.GenWarp10Payload(testutil.MockMetricsWithValue(math.Inf(1))) + require.Exactly(t, "1257894000000000// unit.testtest1.value{source=telegraf,tag1=value1} Infinity\n", payload) +} + +func TestWriteWarp10ValueMinusInfinity(t *testing.T) { + w := Warp10{ + Prefix: "unit.test", + WarpURL: "http://localhost:8090", + Token: config.NewSecret([]byte("WRITE")), + } + + payload := w.GenWarp10Payload(testutil.MockMetricsWithValue(math.Inf(-1))) + require.Exactly(t, "1257894000000000// unit.testtest1.value{source=telegraf,tag1=value1} -Infinity\n", payload) +} + func TestWriteWarp10EncodedTags(t *testing.T) { w := Warp10{ Prefix: "unit.test", diff --git a/testutil/testutil.go b/testutil/testutil.go index 80bee356e..916271d05 100644 --- a/testutil/testutil.go +++ b/testutil/testutil.go @@ -42,6 +42,13 @@ func MockMetrics() []telegraf.Metric { return metrics } +func MockMetricsWithValue(value float64) []telegraf.Metric { + metrics := make([]telegraf.Metric, 0) + // Create a new point batch + metrics = append(metrics, TestMetric(value)) + return metrics +} + // TestMetric Returns a simple test point: // // measurement -> "test1" or name