1
0
Fork 0
telegraf/plugins/aggregators/starlark/starlark_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

434 lines
7.9 KiB
Go

package starlark
import (
"testing"
"time"
"github.com/stretchr/testify/require"
"github.com/influxdata/telegraf"
"github.com/influxdata/telegraf/metric"
common "github.com/influxdata/telegraf/plugins/common/starlark"
"github.com/influxdata/telegraf/testutil"
)
var m1 = metric.New("m1",
map[string]string{"foo": "bar"},
map[string]interface{}{
"a": int64(1),
"b": int64(1),
"c": int64(1),
"d": int64(1),
"e": int64(1),
"f": int64(2),
"g": int64(2),
"h": int64(2),
"i": int64(2),
"j": int64(3),
},
time.Now(),
)
var m2 = metric.New("m1",
map[string]string{"foo": "bar"},
map[string]interface{}{
"a": int64(1),
"b": int64(3),
"c": int64(3),
"d": int64(3),
"e": int64(3),
"f": int64(1),
"g": int64(1),
"h": int64(1),
"i": int64(1),
"j": int64(1),
"k": int64(200),
"l": int64(200),
"ignoreme": "string",
"andme": true,
},
time.Now(),
)
func BenchmarkApply(b *testing.B) {
minmax, err := newMinMax()
require.NoError(b, err)
for n := 0; n < b.N; n++ {
minmax.Add(m1)
minmax.Add(m2)
}
}
// Test two metrics getting added.
func TestMinMaxWithPeriod(t *testing.T) {
acc := testutil.Accumulator{}
minmax, err := newMinMax()
require.NoError(t, err)
minmax.Add(m1)
minmax.Add(m2)
minmax.Push(&acc)
expectedFields := map[string]interface{}{
"a_max": int64(1),
"a_min": int64(1),
"b_max": int64(3),
"b_min": int64(1),
"c_max": int64(3),
"c_min": int64(1),
"d_max": int64(3),
"d_min": int64(1),
"e_max": int64(3),
"e_min": int64(1),
"f_max": int64(2),
"f_min": int64(1),
"g_max": int64(2),
"g_min": int64(1),
"h_max": int64(2),
"h_min": int64(1),
"i_max": int64(2),
"i_min": int64(1),
"j_max": int64(3),
"j_min": int64(1),
"k_max": int64(200),
"k_min": int64(200),
"l_max": int64(200),
"l_min": int64(200),
}
expectedTags := map[string]string{
"foo": "bar",
}
acc.AssertContainsTaggedFields(t, "m1", expectedFields, expectedTags)
}
// Test two metrics getting added with a push/reset in between (simulates
// getting added in different periods.)
func TestMinMaxDifferentPeriods(t *testing.T) {
acc := testutil.Accumulator{}
minmax, err := newMinMax()
require.NoError(t, err)
minmax.Add(m1)
minmax.Push(&acc)
expectedFields := map[string]interface{}{
"a_max": int64(1),
"a_min": int64(1),
"b_max": int64(1),
"b_min": int64(1),
"c_max": int64(1),
"c_min": int64(1),
"d_max": int64(1),
"d_min": int64(1),
"e_max": int64(1),
"e_min": int64(1),
"f_max": int64(2),
"f_min": int64(2),
"g_max": int64(2),
"g_min": int64(2),
"h_max": int64(2),
"h_min": int64(2),
"i_max": int64(2),
"i_min": int64(2),
"j_max": int64(3),
"j_min": int64(3),
}
expectedTags := map[string]string{
"foo": "bar",
}
acc.AssertContainsTaggedFields(t, "m1", expectedFields, expectedTags)
acc.ClearMetrics()
minmax.Reset()
minmax.Add(m2)
minmax.Push(&acc)
expectedFields = map[string]interface{}{
"a_max": int64(1),
"a_min": int64(1),
"b_max": int64(3),
"b_min": int64(3),
"c_max": int64(3),
"c_min": int64(3),
"d_max": int64(3),
"d_min": int64(3),
"e_max": int64(3),
"e_min": int64(3),
"f_max": int64(1),
"f_min": int64(1),
"g_max": int64(1),
"g_min": int64(1),
"h_max": int64(1),
"h_min": int64(1),
"i_max": int64(1),
"i_min": int64(1),
"j_max": int64(1),
"j_min": int64(1),
"k_max": int64(200),
"k_min": int64(200),
"l_max": int64(200),
"l_min": int64(200),
}
expectedTags = map[string]string{
"foo": "bar",
}
acc.AssertContainsTaggedFields(t, "m1", expectedFields, expectedTags)
}
func newMinMax() (*Starlark, error) {
return newStarlarkFromScript("testdata/min_max.star")
}
func TestSimple(t *testing.T) {
plugin, err := newMerge()
require.NoError(t, err)
plugin.Add(
testutil.MustMetric(
"cpu",
map[string]string{
"cpu": "cpu0",
},
map[string]interface{}{
"time_idle": 42,
},
time.Unix(0, 0),
),
)
require.NoError(t, err)
plugin.Add(
testutil.MustMetric(
"cpu",
map[string]string{
"cpu": "cpu0",
},
map[string]interface{}{
"time_guest": 42,
},
time.Unix(0, 0),
),
)
require.NoError(t, err)
var acc testutil.Accumulator
plugin.Push(&acc)
expected := []telegraf.Metric{
testutil.MustMetric(
"cpu",
map[string]string{
"cpu": "cpu0",
},
map[string]interface{}{
"time_idle": 42,
"time_guest": 42,
},
time.Unix(0, 0),
),
}
testutil.RequireMetricsEqual(t, expected, acc.GetTelegrafMetrics())
}
func TestNanosecondPrecision(t *testing.T) {
plugin, err := newMerge()
require.NoError(t, err)
plugin.Add(
testutil.MustMetric(
"cpu",
map[string]string{
"cpu": "cpu0",
},
map[string]interface{}{
"time_idle": 42,
},
time.Unix(0, 1),
),
)
require.NoError(t, err)
plugin.Add(
testutil.MustMetric(
"cpu",
map[string]string{
"cpu": "cpu0",
},
map[string]interface{}{
"time_guest": 42,
},
time.Unix(0, 1),
),
)
require.NoError(t, err)
var acc testutil.Accumulator
acc.SetPrecision(time.Second)
plugin.Push(&acc)
expected := []telegraf.Metric{
testutil.MustMetric(
"cpu",
map[string]string{
"cpu": "cpu0",
},
map[string]interface{}{
"time_idle": 42,
"time_guest": 42,
},
time.Unix(0, 1),
),
}
testutil.RequireMetricsEqual(t, expected, acc.GetTelegrafMetrics())
}
func TestReset(t *testing.T) {
plugin, err := newMerge()
require.NoError(t, err)
plugin.Add(
testutil.MustMetric(
"cpu",
map[string]string{
"cpu": "cpu0",
},
map[string]interface{}{
"time_idle": 42,
},
time.Unix(0, 0),
),
)
require.NoError(t, err)
var acc testutil.Accumulator
plugin.Push(&acc)
plugin.Reset()
plugin.Add(
testutil.MustMetric(
"cpu",
map[string]string{
"cpu": "cpu0",
},
map[string]interface{}{
"time_guest": 42,
},
time.Unix(0, 0),
),
)
require.NoError(t, err)
plugin.Push(&acc)
expected := []telegraf.Metric{
testutil.MustMetric(
"cpu",
map[string]string{
"cpu": "cpu0",
},
map[string]interface{}{
"time_idle": 42,
},
time.Unix(0, 0),
),
testutil.MustMetric(
"cpu",
map[string]string{
"cpu": "cpu0",
},
map[string]interface{}{
"time_guest": 42,
},
time.Unix(0, 0),
),
}
testutil.RequireMetricsEqual(t, expected, acc.GetTelegrafMetrics())
}
func newMerge() (*Starlark, error) {
return newStarlarkFromScript("testdata/merge.star")
}
func TestLastFromSource(t *testing.T) {
acc := testutil.Accumulator{}
plugin, err := newStarlarkFromSource(`
state = {}
def add(metric):
state["last"] = metric
def push():
return state.get("last")
def reset():
state.clear()
`)
require.NoError(t, err)
plugin.Add(
testutil.MustMetric(
"cpu",
map[string]string{
"cpu": "cpu0",
},
map[string]interface{}{
"time_idle": 42,
},
time.Unix(0, 0),
),
)
require.NoError(t, err)
plugin.Add(
testutil.MustMetric(
"cpu",
map[string]string{
"cpu": "cpu2",
},
map[string]interface{}{
"time_idle": 31,
},
time.Unix(0, 0),
),
)
require.NoError(t, err)
plugin.Push(&acc)
expectedFields := map[string]interface{}{
"time_idle": int64(31),
}
expectedTags := map[string]string{
"cpu": "cpu2",
}
acc.AssertContainsTaggedFields(t, "cpu", expectedFields, expectedTags)
plugin.Reset()
}
func newStarlarkFromSource(source string) (*Starlark, error) {
plugin := &Starlark{
Common: common.Common{
StarlarkLoadFunc: common.LoadFunc,
Log: testutil.Logger{},
Source: source,
},
}
err := plugin.Init()
if err != nil {
return nil, err
}
return plugin, nil
}
func newStarlarkFromScript(script string) (*Starlark, error) {
plugin := &Starlark{
Common: common.Common{
StarlarkLoadFunc: common.LoadFunc,
Log: testutil.Logger{},
Script: script,
},
}
err := plugin.Init()
if err != nil {
return nil, err
}
return plugin, nil
}