Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
aos
GitHub Repository: aos/grafana-agent
Path: blob/main/component/prometheus/relabel/relabel_test.go
4094 views
1
package relabel
2
3
import (
4
"math"
5
"testing"
6
"time"
7
8
"context"
9
10
"github.com/grafana/agent/component"
11
flow_relabel "github.com/grafana/agent/component/common/relabel"
12
"github.com/grafana/agent/component/prometheus"
13
"github.com/grafana/agent/pkg/flow/componenttest"
14
"github.com/grafana/agent/pkg/river"
15
"github.com/grafana/agent/pkg/util"
16
prom "github.com/prometheus/client_golang/prometheus"
17
"github.com/prometheus/prometheus/model/labels"
18
"github.com/prometheus/prometheus/model/relabel"
19
"github.com/prometheus/prometheus/model/value"
20
"github.com/prometheus/prometheus/storage"
21
"github.com/stretchr/testify/require"
22
)
23
24
func TestCache(t *testing.T) {
25
relabeller := generateRelabel(t)
26
lbls := labels.FromStrings("__address__", "localhost")
27
relabeller.relabel(0, lbls)
28
require.Len(t, relabeller.cache, 1)
29
entry, found := relabeller.getFromCache(prometheus.GlobalRefMapping.GetOrAddGlobalRefID(lbls))
30
require.True(t, found)
31
require.NotNil(t, entry)
32
require.True(
33
t,
34
prometheus.GlobalRefMapping.GetOrAddGlobalRefID(entry.labels) != prometheus.GlobalRefMapping.GetOrAddGlobalRefID(lbls),
35
)
36
}
37
38
func TestEviction(t *testing.T) {
39
relabeller := generateRelabel(t)
40
lbls := labels.FromStrings("__address__", "localhost")
41
relabeller.relabel(0, lbls)
42
require.Len(t, relabeller.cache, 1)
43
relabeller.relabel(math.Float64frombits(value.StaleNaN), lbls)
44
require.Len(t, relabeller.cache, 0)
45
}
46
47
func TestUpdateReset(t *testing.T) {
48
relabeller := generateRelabel(t)
49
lbls := labels.FromStrings("__address__", "localhost")
50
relabeller.relabel(0, lbls)
51
require.Len(t, relabeller.cache, 1)
52
_ = relabeller.Update(Arguments{
53
MetricRelabelConfigs: []*flow_relabel.Config{},
54
})
55
require.Len(t, relabeller.cache, 0)
56
}
57
58
func TestNil(t *testing.T) {
59
fanout := prometheus.NewInterceptor(nil, prometheus.WithAppendHook(func(ref storage.SeriesRef, _ labels.Labels, _ int64, _ float64, _ storage.Appender) (storage.SeriesRef, error) {
60
require.True(t, false)
61
return ref, nil
62
}))
63
relabeller, err := New(component.Options{
64
ID: "1",
65
Logger: util.TestFlowLogger(t),
66
OnStateChange: func(e component.Exports) {},
67
Registerer: prom.NewRegistry(),
68
}, Arguments{
69
ForwardTo: []storage.Appendable{fanout},
70
MetricRelabelConfigs: []*flow_relabel.Config{
71
{
72
SourceLabels: []string{"__address__"},
73
Regex: flow_relabel.Regexp(relabel.MustNewRegexp("(.+)")),
74
Action: "drop",
75
},
76
},
77
})
78
require.NotNil(t, relabeller)
79
require.NoError(t, err)
80
81
lbls := labels.FromStrings("__address__", "localhost")
82
relabeller.relabel(0, lbls)
83
}
84
85
func BenchmarkCache(b *testing.B) {
86
fanout := prometheus.NewInterceptor(nil, prometheus.WithAppendHook(func(ref storage.SeriesRef, l labels.Labels, _ int64, _ float64, _ storage.Appender) (storage.SeriesRef, error) {
87
require.True(b, l.Has("new_label"))
88
return ref, nil
89
}))
90
var entry storage.Appendable
91
_, _ = New(component.Options{
92
ID: "1",
93
Logger: util.TestFlowLogger(b),
94
OnStateChange: func(e component.Exports) {
95
newE := e.(Exports)
96
entry = newE.Receiver
97
},
98
Registerer: prom.NewRegistry(),
99
}, Arguments{
100
ForwardTo: []storage.Appendable{fanout},
101
MetricRelabelConfigs: []*flow_relabel.Config{
102
{
103
SourceLabels: []string{"__address__"},
104
Regex: flow_relabel.Regexp(relabel.MustNewRegexp("(.+)")),
105
TargetLabel: "new_label",
106
Replacement: "new_value",
107
Action: "replace",
108
},
109
},
110
})
111
112
lbls := labels.FromStrings("__address__", "localhost")
113
app := entry.Appender(context.Background())
114
115
for i := 0; i < b.N; i++ {
116
app.Append(0, lbls, time.Now().UnixMilli(), 0)
117
}
118
app.Commit()
119
}
120
121
func generateRelabel(t *testing.T) *Component {
122
fanout := prometheus.NewInterceptor(nil, prometheus.WithAppendHook(func(ref storage.SeriesRef, l labels.Labels, _ int64, _ float64, _ storage.Appender) (storage.SeriesRef, error) {
123
require.True(t, l.Has("new_label"))
124
return ref, nil
125
}))
126
relabeller, err := New(component.Options{
127
ID: "1",
128
Logger: util.TestFlowLogger(t),
129
OnStateChange: func(e component.Exports) {},
130
Registerer: prom.NewRegistry(),
131
}, Arguments{
132
ForwardTo: []storage.Appendable{fanout},
133
MetricRelabelConfigs: []*flow_relabel.Config{
134
{
135
SourceLabels: []string{"__address__"},
136
Regex: flow_relabel.Regexp(relabel.MustNewRegexp("(.+)")),
137
TargetLabel: "new_label",
138
Replacement: "new_value",
139
Action: "replace",
140
},
141
},
142
})
143
require.NotNil(t, relabeller)
144
require.NoError(t, err)
145
return relabeller
146
}
147
148
func TestRuleGetter(t *testing.T) {
149
// Set up the component Arguments.
150
originalCfg := `rule {
151
action = "keep"
152
source_labels = ["__name__"]
153
regex = "up"
154
}
155
forward_to = []`
156
var args Arguments
157
require.NoError(t, river.Unmarshal([]byte(originalCfg), &args))
158
159
// Set up and start the component.
160
tc, err := componenttest.NewControllerFromID(nil, "prometheus.relabel")
161
require.NoError(t, err)
162
go func() {
163
err = tc.Run(componenttest.TestContext(t), args)
164
require.NoError(t, err)
165
}()
166
require.NoError(t, tc.WaitExports(time.Second))
167
168
// Use the getter to retrieve the original relabeling rules.
169
exports := tc.Exports().(Exports)
170
gotOriginal := exports.Rules
171
172
// Update the component with new relabeling rules and retrieve them.
173
updatedCfg := `rule {
174
action = "drop"
175
source_labels = ["__name__"]
176
regex = "up"
177
}
178
forward_to = []`
179
require.NoError(t, river.Unmarshal([]byte(updatedCfg), &args))
180
181
require.NoError(t, tc.Update(args))
182
exports = tc.Exports().(Exports)
183
gotUpdated := exports.Rules
184
185
require.NotEqual(t, gotOriginal, gotUpdated)
186
require.Len(t, gotOriginal, 1)
187
require.Len(t, gotUpdated, 1)
188
189
require.Equal(t, gotOriginal[0].Action, flow_relabel.Keep)
190
require.Equal(t, gotUpdated[0].Action, flow_relabel.Drop)
191
require.Equal(t, gotUpdated[0].SourceLabels, gotOriginal[0].SourceLabels)
192
require.Equal(t, gotUpdated[0].Regex, gotOriginal[0].Regex)
193
}
194
195