Path: blob/main/component/otelcol/receiver/prometheus/prometheus_test.go
4096 views
package prometheus_test12import (3"context"4"testing"5"time"67"github.com/grafana/agent/component/otelcol"8"github.com/grafana/agent/component/otelcol/internal/fakeconsumer"9"github.com/grafana/agent/component/otelcol/receiver/prometheus"10flowprometheus "github.com/grafana/agent/component/prometheus"11"github.com/grafana/agent/pkg/flow/componenttest"12"github.com/grafana/agent/pkg/river"13"github.com/grafana/agent/pkg/util"14"github.com/prometheus/common/model"15"github.com/prometheus/prometheus/model/labels"16"github.com/prometheus/prometheus/scrape"17"github.com/stretchr/testify/require"18"go.opentelemetry.io/collector/pdata/pmetric"19)2021// Test performs a basic integration test which runs the22// otelcol.receiver.prometheus component and ensures that it can receive and23// forward metric data.24func Test(t *testing.T) {25ctx := componenttest.TestContext(t)26l := util.TestLogger(t)2728ctrl, err := componenttest.NewControllerFromID(l, "otelcol.receiver.prometheus")29require.NoError(t, err)3031cfg := `32output {33// no-op: will be overridden by test code.34}35`36var args prometheus.Arguments37require.NoError(t, river.Unmarshal([]byte(cfg), &args))3839// Override our settings so metrics get forwarded to metricCh.40metricCh := make(chan pmetric.Metrics)41args.Output = makeMetricsOutput(metricCh)4243go func() {44err := ctrl.Run(ctx, args)45require.NoError(t, err)46}()4748require.NoError(t, ctrl.WaitRunning(time.Second))49require.NoError(t, ctrl.WaitExports(time.Second))5051exports := ctrl.Exports().(prometheus.Exports)5253// Use the exported Appendable to send metrics to the receiver in the54// background.55go func() {56l := labels.Labels{57{Name: model.MetricNameLabel, Value: "testMetric"},58{Name: model.JobLabel, Value: "testJob"},59{Name: model.InstanceLabel, Value: "otelcol.receiver.prometheus"},60{Name: "foo", Value: "bar"},61}62ts := time.Now().Unix()63v := 100.6465ctx := context.Background()66ctx = scrape.ContextWithMetricMetadataStore(ctx, flowprometheus.NoopMetadataStore{})67ctx = scrape.ContextWithTarget(ctx, &scrape.Target{})68app := exports.Receiver.Appender(ctx)69_, err := app.Append(0, l, ts, v)70require.NoError(t, err)71require.NoError(t, app.Commit())72}()7374// Wait for our client to get the metric.75select {76case <-time.After(time.Second):77require.FailNow(t, "failed waiting for metrics")78case m := <-metricCh:79require.Equal(t, 1, m.MetricCount())80require.Equal(t, "testMetric", m.ResourceMetrics().At(0).ScopeMetrics().At(0).Metrics().At(0).Name())81}82}8384// makeMetricsOutput returns a ConsumerArguments which will forward metrics to85// the provided channel.86func makeMetricsOutput(ch chan pmetric.Metrics) *otelcol.ConsumerArguments {87metricsConsumer := fakeconsumer.Consumer{88ConsumeMetricsFunc: func(ctx context.Context, m pmetric.Metrics) error {89select {90case <-ctx.Done():91return ctx.Err()92case ch <- m:93return nil94}95},96}9798return &otelcol.ConsumerArguments{99Metrics: []otelcol.Consumer{&metricsConsumer},100}101}102103104