Path: blob/main/component/discovery/relabel/relabel_test.go
4096 views
package relabel_test12import (3"testing"4"time"56flow_relabel "github.com/grafana/agent/component/common/relabel"7"github.com/grafana/agent/component/discovery"8"github.com/grafana/agent/component/discovery/relabel"9"github.com/grafana/agent/pkg/flow/componenttest"10"github.com/grafana/agent/pkg/river"11"github.com/stretchr/testify/require"12)1314func TestRelabelConfigApplication(t *testing.T) {15riverArguments := `16targets = [17{ "__meta_foo" = "foo", "__meta_bar" = "bar", "__address__" = "localhost", "instance" = "one", "app" = "backend", "__tmp_a" = "tmp" },18{ "__meta_foo" = "foo", "__meta_bar" = "bar", "__address__" = "localhost", "instance" = "two", "app" = "db", "__tmp_b" = "tmp" },19{ "__meta_baz" = "baz", "__meta_qux" = "qux", "__address__" = "localhost", "instance" = "three", "app" = "frontend", "__tmp_c" = "tmp" },20]2122rule {23source_labels = ["__address__", "instance"]24separator = "/"25target_label = "destination"26action = "replace"27}2829rule {30source_labels = ["app"]31action = "drop"32regex = "frontend"33}3435rule {36source_labels = ["app"]37action = "keep"38regex = "backend"39}4041rule {42source_labels = ["instance"]43target_label = "name"44}4546rule {47action = "labelmap"48regex = "__meta_(.*)"49replacement = "meta_$1"50}5152rule {53action = "labeldrop"54regex = "__meta(.*)|__tmp(.*)|instance"55}56`57expectedOutput := []discovery.Target{58map[string]string{"__address__": "localhost", "app": "backend", "destination": "localhost/one", "meta_bar": "bar", "meta_foo": "foo", "name": "one"},59}6061var args relabel.Arguments62require.NoError(t, river.Unmarshal([]byte(riverArguments), &args))6364tc, err := componenttest.NewControllerFromID(nil, "discovery.relabel")65require.NoError(t, err)66go func() {67err = tc.Run(componenttest.TestContext(t), args)68require.NoError(t, err)69}()7071require.NoError(t, tc.WaitExports(time.Second))72require.Equal(t, expectedOutput, tc.Exports().(relabel.Exports).Output)73require.NotNil(t, tc.Exports().(relabel.Exports).Rules)74}7576func TestRuleGetter(t *testing.T) {77originalCfg := `78targets = []7980rule {81action = "keep"82source_labels = ["__name__"]83regex = "up"84}`85var args relabel.Arguments86require.NoError(t, river.Unmarshal([]byte(originalCfg), &args))8788tc, err := componenttest.NewControllerFromID(nil, "discovery.relabel")89require.NoError(t, err)90go func() {91err = tc.Run(componenttest.TestContext(t), args)92require.NoError(t, err)93}()9495require.NoError(t, tc.WaitExports(time.Second))9697// Use the getter to retrieve the original relabeling rules.98exports := tc.Exports().(relabel.Exports)99gotOriginal := exports.Rules100101// Update the component with new relabeling rules and retrieve them.102updatedCfg := `103targets = []104105rule {106action = "drop"107source_labels = ["__name__"]108regex = "up"109}`110require.NoError(t, river.Unmarshal([]byte(updatedCfg), &args))111112require.NoError(t, tc.Update(args))113exports = tc.Exports().(relabel.Exports)114gotUpdated := exports.Rules115116require.NotEqual(t, gotOriginal, gotUpdated)117require.Len(t, gotOriginal, 1)118require.Len(t, gotUpdated, 1)119120require.Equal(t, gotOriginal[0].Action, flow_relabel.Keep)121require.Equal(t, gotUpdated[0].Action, flow_relabel.Drop)122require.Equal(t, gotUpdated[0].SourceLabels, gotOriginal[0].SourceLabels)123require.Equal(t, gotUpdated[0].Regex, gotOriginal[0].Regex)124}125126127