Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
aos
GitHub Repository: aos/grafana-agent
Path: blob/main/component/otelcol/receiver/prometheus/prometheus_test.go
4096 views
1
package prometheus_test
2
3
import (
4
"context"
5
"testing"
6
"time"
7
8
"github.com/grafana/agent/component/otelcol"
9
"github.com/grafana/agent/component/otelcol/internal/fakeconsumer"
10
"github.com/grafana/agent/component/otelcol/receiver/prometheus"
11
flowprometheus "github.com/grafana/agent/component/prometheus"
12
"github.com/grafana/agent/pkg/flow/componenttest"
13
"github.com/grafana/agent/pkg/river"
14
"github.com/grafana/agent/pkg/util"
15
"github.com/prometheus/common/model"
16
"github.com/prometheus/prometheus/model/labels"
17
"github.com/prometheus/prometheus/scrape"
18
"github.com/stretchr/testify/require"
19
"go.opentelemetry.io/collector/pdata/pmetric"
20
)
21
22
// Test performs a basic integration test which runs the
23
// otelcol.receiver.prometheus component and ensures that it can receive and
24
// forward metric data.
25
func Test(t *testing.T) {
26
ctx := componenttest.TestContext(t)
27
l := util.TestLogger(t)
28
29
ctrl, err := componenttest.NewControllerFromID(l, "otelcol.receiver.prometheus")
30
require.NoError(t, err)
31
32
cfg := `
33
output {
34
// no-op: will be overridden by test code.
35
}
36
`
37
var args prometheus.Arguments
38
require.NoError(t, river.Unmarshal([]byte(cfg), &args))
39
40
// Override our settings so metrics get forwarded to metricCh.
41
metricCh := make(chan pmetric.Metrics)
42
args.Output = makeMetricsOutput(metricCh)
43
44
go func() {
45
err := ctrl.Run(ctx, args)
46
require.NoError(t, err)
47
}()
48
49
require.NoError(t, ctrl.WaitRunning(time.Second))
50
require.NoError(t, ctrl.WaitExports(time.Second))
51
52
exports := ctrl.Exports().(prometheus.Exports)
53
54
// Use the exported Appendable to send metrics to the receiver in the
55
// background.
56
go func() {
57
l := labels.Labels{
58
{Name: model.MetricNameLabel, Value: "testMetric"},
59
{Name: model.JobLabel, Value: "testJob"},
60
{Name: model.InstanceLabel, Value: "otelcol.receiver.prometheus"},
61
{Name: "foo", Value: "bar"},
62
}
63
ts := time.Now().Unix()
64
v := 100.
65
66
ctx := context.Background()
67
ctx = scrape.ContextWithMetricMetadataStore(ctx, flowprometheus.NoopMetadataStore{})
68
ctx = scrape.ContextWithTarget(ctx, &scrape.Target{})
69
app := exports.Receiver.Appender(ctx)
70
_, err := app.Append(0, l, ts, v)
71
require.NoError(t, err)
72
require.NoError(t, app.Commit())
73
}()
74
75
// Wait for our client to get the metric.
76
select {
77
case <-time.After(time.Second):
78
require.FailNow(t, "failed waiting for metrics")
79
case m := <-metricCh:
80
require.Equal(t, 1, m.MetricCount())
81
require.Equal(t, "testMetric", m.ResourceMetrics().At(0).ScopeMetrics().At(0).Metrics().At(0).Name())
82
}
83
}
84
85
// makeMetricsOutput returns a ConsumerArguments which will forward metrics to
86
// the provided channel.
87
func makeMetricsOutput(ch chan pmetric.Metrics) *otelcol.ConsumerArguments {
88
metricsConsumer := fakeconsumer.Consumer{
89
ConsumeMetricsFunc: func(ctx context.Context, m pmetric.Metrics) error {
90
select {
91
case <-ctx.Done():
92
return ctx.Err()
93
case ch <- m:
94
return nil
95
}
96
},
97
}
98
99
return &otelcol.ConsumerArguments{
100
Metrics: []otelcol.Consumer{&metricsConsumer},
101
}
102
}
103
104