Path: blob/main/pkg/traces/remotewriteexporter/exporter_test.go
4096 views
package remotewriteexporter12import (3"context"4"testing"5"time"67"github.com/grafana/agent/pkg/metrics/instance"8"github.com/grafana/agent/pkg/traces/contextkeys"9"github.com/prometheus/prometheus/model/exemplar"10"github.com/prometheus/prometheus/model/histogram"11"github.com/prometheus/prometheus/model/labels"12"github.com/prometheus/prometheus/model/metadata"13"github.com/prometheus/prometheus/storage"14"github.com/stretchr/testify/require"15"go.opentelemetry.io/collector/config"16"go.opentelemetry.io/collector/pdata/pcommon"17"go.opentelemetry.io/collector/pdata/pmetric"18)1920const (21callsMetric = "traces_spanmetrics_calls_total"22sumMetric = "traces_spanmetrics_latency_sum"23countMetric = "traces_spanmetrics_latency_count"24bucketMetric = "traces_spanmetrics_latency_bucket"25)2627func TestRemoteWriteExporter_ConsumeMetrics(t *testing.T) {28var (29countValue uint64 = 2030sumValue float64 = 10031bucketCounts = []uint64{1, 2, 3, 4, 5, 6}32explicitBounds = []float64{1, 2.5, 5, 7.5, 10}33ts = time.Date(2020, 1, 2, 3, 4, 5, 6, time.UTC)34)3536cfg := Config{37ExporterSettings: config.ExporterSettings{},38ConstLabels: nil,39Namespace: "traces",40PromInstance: "traces",41}42exp, err := newRemoteWriteExporter(&cfg)43require.NoError(t, err)4445manager := &mockManager{}46ctx := context.WithValue(context.Background(), contextkeys.Metrics, manager)47require.NoError(t, exp.Start(ctx, nil))4849metrics := pmetric.NewMetrics()50ilm := metrics.ResourceMetrics().AppendEmpty().ScopeMetrics().AppendEmpty()51ilm.Scope().SetName("spanmetrics")5253// Append sum metric54sm := ilm.Metrics().AppendEmpty()55sm.SetEmptySum()56sm.SetName("spanmetrics_calls_total")57sm.Sum().SetAggregationTemporality(pmetric.AggregationTemporalityCumulative)5859sdp := sm.Sum().DataPoints().AppendEmpty()60sdp.SetTimestamp(pcommon.NewTimestampFromTime(ts.UTC()))61sdp.SetDoubleValue(sumValue)6263// Append histogram64hm := ilm.Metrics().AppendEmpty()65hm.SetEmptyHistogram()66hm.SetName("spanmetrics_latency")67hm.Histogram().SetAggregationTemporality(pmetric.AggregationTemporalityCumulative)6869hdp := hm.Histogram().DataPoints().AppendEmpty()70hdp.SetTimestamp(pcommon.NewTimestampFromTime(ts.UTC()))71hdp.BucketCounts().FromRaw(bucketCounts)72hdp.ExplicitBounds().FromRaw(explicitBounds)73hdp.SetCount(countValue)74hdp.SetSum(sumValue)7576err = exp.ConsumeMetrics(context.TODO(), metrics)77require.NoError(t, err)7879time.Sleep(5 * time.Second)8081require.NoError(t, exp.Shutdown(context.TODO()))8283// Verify calls84calls := manager.instance.GetAppended(callsMetric)85require.Equal(t, len(calls), 1)86require.Equal(t, calls[0].v, sumValue)87require.Equal(t, calls[0].l, labels.Labels{{Name: nameLabelKey, Value: "traces_spanmetrics_calls_total"}})8889// Verify _sum90sum := manager.instance.GetAppended(sumMetric)91require.Equal(t, len(sum), 1)92require.Equal(t, sum[0].v, sumValue)93require.Equal(t, sum[0].l, labels.Labels{{Name: nameLabelKey, Value: "traces_spanmetrics_latency_" + sumSuffix}})9495// Check _count96count := manager.instance.GetAppended(countMetric)97require.Equal(t, len(count), 1)98require.Equal(t, count[0].v, float64(countValue))99require.Equal(t, count[0].l, labels.Labels{{Name: nameLabelKey, Value: "traces_spanmetrics_latency_" + countSuffix}})100101// Check _bucket102buckets := manager.instance.GetAppended(bucketMetric)103require.Equal(t, len(buckets), len(bucketCounts))104}105106type mockManager struct {107instance *mockInstance108}109110func (m *mockManager) GetInstance(string) (instance.ManagedInstance, error) {111if m.instance == nil {112m.instance = &mockInstance{}113}114return m.instance, nil115}116117func (m *mockManager) ListInstances() map[string]instance.ManagedInstance { return nil }118119func (m *mockManager) ListConfigs() map[string]instance.Config { return nil }120121func (m *mockManager) ApplyConfig(_ instance.Config) error { return nil }122123func (m *mockManager) DeleteConfig(_ string) error { return nil }124125func (m *mockManager) Stop() {}126127type mockInstance struct {128instance.NoOpInstance129appender *mockAppender130}131132func (m *mockInstance) Appender(_ context.Context) storage.Appender {133if m.appender == nil {134m.appender = &mockAppender{}135}136return m.appender137}138139func (m *mockInstance) GetAppended(n string) []metric {140return m.appender.GetAppended(n)141}142143type metric struct {144l labels.Labels145t int64146v float64147}148149type mockAppender struct {150appendedMetrics []metric151}152153var _ storage.Appender = (*mockAppender)(nil)154155func (a *mockAppender) GetAppended(n string) []metric {156var ms []metric157for _, m := range a.appendedMetrics {158if n == m.l.Get(nameLabelKey) {159ms = append(ms, m)160}161}162return ms163}164165func (a *mockAppender) Append(_ storage.SeriesRef, l labels.Labels, t int64, v float64) (storage.SeriesRef, error) {166a.appendedMetrics = append(a.appendedMetrics, metric{l: l, t: t, v: v})167return 0, nil168}169170func (a *mockAppender) Commit() error { return nil }171172func (a *mockAppender) Rollback() error { return nil }173174func (a *mockAppender) AppendExemplar(_ storage.SeriesRef, _ labels.Labels, _ exemplar.Exemplar) (storage.SeriesRef, error) {175return 0, nil176}177178func (a *mockAppender) UpdateMetadata(_ storage.SeriesRef, _ labels.Labels, _ metadata.Metadata) (storage.SeriesRef, error) {179return 0, nil180}181182func (a *mockAppender) AppendHistogram(_ storage.SeriesRef, _ labels.Labels, _ int64, _ *histogram.Histogram, _ *histogram.FloatHistogram) (storage.SeriesRef, error) {183return 0, nil184}185186187