1
0
Fork 0
telegraf/plugins/processors/template/template_test.go
Daniel Baumann 4978089aab
Adding upstream version 1.34.4.
Signed-off-by: Daniel Baumann <daniel@debian.org>
2025-05-24 07:26:29 +02:00

344 lines
7.7 KiB
Go

package template
import (
"sync"
"testing"
"time"
"github.com/stretchr/testify/require"
"github.com/influxdata/telegraf"
"github.com/influxdata/telegraf/metric"
"github.com/influxdata/telegraf/testutil"
)
func TestName(t *testing.T) {
plugin := TemplateProcessor{
Tag: "measurement",
Template: "{{ .Name }}",
}
err := plugin.Init()
require.NoError(t, err)
input := []telegraf.Metric{
testutil.MustMetric(
"cpu",
map[string]string{},
map[string]interface{}{
"time_idle": 42,
},
time.Unix(0, 0),
),
}
actual := plugin.Apply(input...)
expected := []telegraf.Metric{
testutil.MustMetric(
"cpu",
map[string]string{
"measurement": "cpu",
},
map[string]interface{}{
"time_idle": 42,
},
time.Unix(0, 0),
),
}
testutil.RequireMetricsEqual(t, expected, actual)
}
func TestNameTemplate(t *testing.T) {
plugin := TemplateProcessor{
Tag: `{{ .Tag "foo" }}`,
Template: `{{ .Name }}`,
}
err := plugin.Init()
require.NoError(t, err)
input := []telegraf.Metric{
testutil.MustMetric(
"cpu",
map[string]string{"foo": "measurement"},
map[string]interface{}{
"time_idle": 42,
},
time.Unix(0, 0),
),
}
actual := plugin.Apply(input...)
expected := []telegraf.Metric{
testutil.MustMetric(
"cpu",
map[string]string{
"foo": "measurement",
"measurement": "cpu",
},
map[string]interface{}{
"time_idle": 42,
},
time.Unix(0, 0),
),
}
testutil.RequireMetricsEqual(t, expected, actual)
}
func TestTagTemplateConcatenate(t *testing.T) {
now := time.Now()
// Create Template processor
tmp := TemplateProcessor{Tag: "topic", Template: `{{.Tag "hostname"}}.{{ .Tag "level" }}`}
// manually init
err := tmp.Init()
if err != nil {
panic(err)
}
// create metric for testing
input := []telegraf.Metric{testutil.MustMetric("Tags", map[string]string{"hostname": "localhost", "level": "debug"}, nil, now)}
// act
actual := tmp.Apply(input[0])
// assert
expected := []telegraf.Metric{
testutil.MustMetric("Tags", map[string]string{"hostname": "localhost", "level": "debug", "topic": "localhost.debug"}, nil, now),
}
testutil.RequireMetricsEqual(t, expected, actual)
}
func TestMetricMissingTagsIsNotLost(t *testing.T) {
now := time.Now()
// Create Template processor
tmp := TemplateProcessor{Tag: "topic", Template: `{{.Tag "hostname"}}.{{ .Tag "level" }}`}
// manually init
err := tmp.Init()
if err != nil {
panic(err)
}
// create metrics for testing
m1 := testutil.MustMetric("Works", map[string]string{"hostname": "localhost", "level": "debug"}, nil, now)
m2 := testutil.MustMetric("Fails", map[string]string{"hostname": "localhost"}, nil, now)
// act
actual := tmp.Apply(m1, m2)
// assert
// make sure no metrics are lost when a template process fails
require.Len(t, actual, 2, "Number of metrics input should equal number of metrics output")
}
func TestTagAndFieldConcatenate(t *testing.T) {
now := time.Now()
// Create Template processor
tmp := TemplateProcessor{Tag: "LocalTemp", Template: `{{.Tag "location"}} is {{ .Field "temperature" }}`}
// manually init
err := tmp.Init()
if err != nil {
panic(err)
}
// create metric for testing
m1 := testutil.MustMetric("weather", map[string]string{"location": "us-midwest"}, map[string]interface{}{"temperature": "too warm"}, now)
// act
actual := tmp.Apply(m1)
// assert
expected := []telegraf.Metric{
testutil.MustMetric(
"weather",
map[string]string{"location": "us-midwest", "LocalTemp": "us-midwest is too warm"},
map[string]interface{}{"temperature": "too warm"},
now,
),
}
testutil.RequireMetricsEqual(t, expected, actual)
}
func TestFieldList(t *testing.T) {
// Prepare
plugin := TemplateProcessor{Tag: "fields", Template: "{{.FieldList}}"}
require.NoError(t, plugin.Init())
// Run
m := testutil.TestMetric(1.23)
actual := plugin.Apply(m)
// Verify
expected := m.Copy()
expected.AddTag("fields", "map[value:1.23]")
testutil.RequireMetricsEqual(t, []telegraf.Metric{expected}, actual)
}
func TestTagList(t *testing.T) {
// Prepare
plugin := TemplateProcessor{Tag: "tags", Template: "{{.TagList}}"}
require.NoError(t, plugin.Init())
// Run
m := testutil.TestMetric(1.23)
actual := plugin.Apply(m)
// Verify
expected := m.Copy()
expected.AddTag("tags", "map[tag1:value1]")
testutil.RequireMetricsEqual(t, []telegraf.Metric{expected}, actual)
}
func TestFields(t *testing.T) {
// Prepare
plugin := TemplateProcessor{
Tag: "fields",
Template: "{{.Fields}}",
Log: testutil.Logger{},
}
require.NoError(t, plugin.Init())
// Run
m := testutil.TestMetric(1.23)
actual := plugin.Apply(m)
// Verify
expected := m.Copy()
expected.AddTag("fields", "map[value:1.23]")
testutil.RequireMetricsEqual(t, []telegraf.Metric{expected}, actual)
}
func TestTags(t *testing.T) {
// Prepare
plugin := TemplateProcessor{
Tag: "tags",
Template: "{{.Tags}}",
Log: testutil.Logger{},
}
require.NoError(t, plugin.Init())
// Run
m := testutil.TestMetric(1.23)
actual := plugin.Apply(m)
// Verify
expected := m.Copy()
expected.AddTag("tags", "map[tag1:value1]")
testutil.RequireMetricsEqual(t, []telegraf.Metric{expected}, actual)
}
func TestString(t *testing.T) {
// Prepare
plugin := TemplateProcessor{
Tag: "tags",
Template: "{{.}}",
Log: testutil.Logger{},
}
require.NoError(t, plugin.Init())
// Run
m := testutil.TestMetric(1.23)
actual := plugin.Apply(m)
// Verify
expected := m.Copy()
expected.AddTag("tags", "test1 map[tag1:value1] map[value:1.23] 1257894000000000000")
testutil.RequireMetricsEqual(t, []telegraf.Metric{expected}, actual)
}
func TestDot(t *testing.T) {
// Prepare
plugin := TemplateProcessor{Tag: "metric", Template: "{{.}}"}
require.NoError(t, plugin.Init())
// Run
m := testutil.TestMetric(1.23)
actual := plugin.Apply(m)
// Verify
expected := m.Copy()
expected.AddTag("metric", "test1 map[tag1:value1] map[value:1.23] 1257894000000000000")
testutil.RequireMetricsEqual(t, []telegraf.Metric{expected}, actual)
}
func TestTracking(t *testing.T) {
// Create a tracking metric and tap the delivery information
var mu sync.Mutex
delivered := make([]telegraf.DeliveryInfo, 0, 1)
notify := func(di telegraf.DeliveryInfo) {
mu.Lock()
defer mu.Unlock()
delivered = append(delivered, di)
}
m := testutil.TestMetric(1.23)
input, _ := metric.WithTracking(m, notify)
// Create an expectation
e := m.Copy()
e.AddTag("metric", "test1 map[tag1:value1] map[value:1.23] 1257894000000000000")
expected := []telegraf.Metric{e}
// Configure the plugin
plugin := TemplateProcessor{Tag: "metric", Template: "{{.}}"}
require.NoError(t, plugin.Init())
// Process expected metrics and compare with resulting metrics
actual := plugin.Apply(input)
testutil.RequireMetricsEqual(t, expected, actual)
// Simulate output acknowledging delivery
for _, m := range actual {
m.Accept()
}
// Check delivery
// Check delivery
require.Eventuallyf(t, func() bool {
mu.Lock()
defer mu.Unlock()
return len(delivered) == 1
}, time.Second, 100*time.Millisecond, "%d delivered but 1 expected", len(delivered))
}
func TestSprig(t *testing.T) {
plugin := TemplateProcessor{
Tag: `{{ .Tag "foo" | lower }}`,
Template: `{{ .Name | upper }}`,
}
err := plugin.Init()
require.NoError(t, err)
input := []telegraf.Metric{
testutil.MustMetric(
"cpu",
map[string]string{"foo": "MEASUREMENT"},
map[string]interface{}{
"time_idle": 42,
},
time.Unix(0, 0),
),
}
actual := plugin.Apply(input...)
expected := []telegraf.Metric{
testutil.MustMetric(
"cpu",
map[string]string{
"foo": "MEASUREMENT",
"measurement": "CPU",
},
map[string]interface{}{
"time_idle": 42,
},
time.Unix(0, 0),
),
}
testutil.RequireMetricsEqual(t, expected, actual)
}