Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
aos
GitHub Repository: aos/grafana-agent
Path: blob/main/pkg/traces/remotewriteexporter/exporter_test.go
4096 views
1
package remotewriteexporter
2
3
import (
4
"context"
5
"testing"
6
"time"
7
8
"github.com/grafana/agent/pkg/metrics/instance"
9
"github.com/grafana/agent/pkg/traces/contextkeys"
10
"github.com/prometheus/prometheus/model/exemplar"
11
"github.com/prometheus/prometheus/model/histogram"
12
"github.com/prometheus/prometheus/model/labels"
13
"github.com/prometheus/prometheus/model/metadata"
14
"github.com/prometheus/prometheus/storage"
15
"github.com/stretchr/testify/require"
16
"go.opentelemetry.io/collector/config"
17
"go.opentelemetry.io/collector/pdata/pcommon"
18
"go.opentelemetry.io/collector/pdata/pmetric"
19
)
20
21
const (
22
callsMetric = "traces_spanmetrics_calls_total"
23
sumMetric = "traces_spanmetrics_latency_sum"
24
countMetric = "traces_spanmetrics_latency_count"
25
bucketMetric = "traces_spanmetrics_latency_bucket"
26
)
27
28
func TestRemoteWriteExporter_ConsumeMetrics(t *testing.T) {
29
var (
30
countValue uint64 = 20
31
sumValue float64 = 100
32
bucketCounts = []uint64{1, 2, 3, 4, 5, 6}
33
explicitBounds = []float64{1, 2.5, 5, 7.5, 10}
34
ts = time.Date(2020, 1, 2, 3, 4, 5, 6, time.UTC)
35
)
36
37
cfg := Config{
38
ExporterSettings: config.ExporterSettings{},
39
ConstLabels: nil,
40
Namespace: "traces",
41
PromInstance: "traces",
42
}
43
exp, err := newRemoteWriteExporter(&cfg)
44
require.NoError(t, err)
45
46
manager := &mockManager{}
47
ctx := context.WithValue(context.Background(), contextkeys.Metrics, manager)
48
require.NoError(t, exp.Start(ctx, nil))
49
50
metrics := pmetric.NewMetrics()
51
ilm := metrics.ResourceMetrics().AppendEmpty().ScopeMetrics().AppendEmpty()
52
ilm.Scope().SetName("spanmetrics")
53
54
// Append sum metric
55
sm := ilm.Metrics().AppendEmpty()
56
sm.SetEmptySum()
57
sm.SetName("spanmetrics_calls_total")
58
sm.Sum().SetAggregationTemporality(pmetric.AggregationTemporalityCumulative)
59
60
sdp := sm.Sum().DataPoints().AppendEmpty()
61
sdp.SetTimestamp(pcommon.NewTimestampFromTime(ts.UTC()))
62
sdp.SetDoubleValue(sumValue)
63
64
// Append histogram
65
hm := ilm.Metrics().AppendEmpty()
66
hm.SetEmptyHistogram()
67
hm.SetName("spanmetrics_latency")
68
hm.Histogram().SetAggregationTemporality(pmetric.AggregationTemporalityCumulative)
69
70
hdp := hm.Histogram().DataPoints().AppendEmpty()
71
hdp.SetTimestamp(pcommon.NewTimestampFromTime(ts.UTC()))
72
hdp.BucketCounts().FromRaw(bucketCounts)
73
hdp.ExplicitBounds().FromRaw(explicitBounds)
74
hdp.SetCount(countValue)
75
hdp.SetSum(sumValue)
76
77
err = exp.ConsumeMetrics(context.TODO(), metrics)
78
require.NoError(t, err)
79
80
time.Sleep(5 * time.Second)
81
82
require.NoError(t, exp.Shutdown(context.TODO()))
83
84
// Verify calls
85
calls := manager.instance.GetAppended(callsMetric)
86
require.Equal(t, len(calls), 1)
87
require.Equal(t, calls[0].v, sumValue)
88
require.Equal(t, calls[0].l, labels.Labels{{Name: nameLabelKey, Value: "traces_spanmetrics_calls_total"}})
89
90
// Verify _sum
91
sum := manager.instance.GetAppended(sumMetric)
92
require.Equal(t, len(sum), 1)
93
require.Equal(t, sum[0].v, sumValue)
94
require.Equal(t, sum[0].l, labels.Labels{{Name: nameLabelKey, Value: "traces_spanmetrics_latency_" + sumSuffix}})
95
96
// Check _count
97
count := manager.instance.GetAppended(countMetric)
98
require.Equal(t, len(count), 1)
99
require.Equal(t, count[0].v, float64(countValue))
100
require.Equal(t, count[0].l, labels.Labels{{Name: nameLabelKey, Value: "traces_spanmetrics_latency_" + countSuffix}})
101
102
// Check _bucket
103
buckets := manager.instance.GetAppended(bucketMetric)
104
require.Equal(t, len(buckets), len(bucketCounts))
105
}
106
107
type mockManager struct {
108
instance *mockInstance
109
}
110
111
func (m *mockManager) GetInstance(string) (instance.ManagedInstance, error) {
112
if m.instance == nil {
113
m.instance = &mockInstance{}
114
}
115
return m.instance, nil
116
}
117
118
func (m *mockManager) ListInstances() map[string]instance.ManagedInstance { return nil }
119
120
func (m *mockManager) ListConfigs() map[string]instance.Config { return nil }
121
122
func (m *mockManager) ApplyConfig(_ instance.Config) error { return nil }
123
124
func (m *mockManager) DeleteConfig(_ string) error { return nil }
125
126
func (m *mockManager) Stop() {}
127
128
type mockInstance struct {
129
instance.NoOpInstance
130
appender *mockAppender
131
}
132
133
func (m *mockInstance) Appender(_ context.Context) storage.Appender {
134
if m.appender == nil {
135
m.appender = &mockAppender{}
136
}
137
return m.appender
138
}
139
140
func (m *mockInstance) GetAppended(n string) []metric {
141
return m.appender.GetAppended(n)
142
}
143
144
type metric struct {
145
l labels.Labels
146
t int64
147
v float64
148
}
149
150
type mockAppender struct {
151
appendedMetrics []metric
152
}
153
154
var _ storage.Appender = (*mockAppender)(nil)
155
156
func (a *mockAppender) GetAppended(n string) []metric {
157
var ms []metric
158
for _, m := range a.appendedMetrics {
159
if n == m.l.Get(nameLabelKey) {
160
ms = append(ms, m)
161
}
162
}
163
return ms
164
}
165
166
func (a *mockAppender) Append(_ storage.SeriesRef, l labels.Labels, t int64, v float64) (storage.SeriesRef, error) {
167
a.appendedMetrics = append(a.appendedMetrics, metric{l: l, t: t, v: v})
168
return 0, nil
169
}
170
171
func (a *mockAppender) Commit() error { return nil }
172
173
func (a *mockAppender) Rollback() error { return nil }
174
175
func (a *mockAppender) AppendExemplar(_ storage.SeriesRef, _ labels.Labels, _ exemplar.Exemplar) (storage.SeriesRef, error) {
176
return 0, nil
177
}
178
179
func (a *mockAppender) UpdateMetadata(_ storage.SeriesRef, _ labels.Labels, _ metadata.Metadata) (storage.SeriesRef, error) {
180
return 0, nil
181
}
182
183
func (a *mockAppender) AppendHistogram(_ storage.SeriesRef, _ labels.Labels, _ int64, _ *histogram.Histogram, _ *histogram.FloatHistogram) (storage.SeriesRef, error) {
184
return 0, nil
185
}
186
187