@@ -13,14 +13,63 @@ import (
13
13
"github.com/gogo/protobuf/proto"
14
14
"github.com/golang/snappy"
15
15
promconfig "github.com/prometheus/prometheus/config"
16
+ "github.com/prometheus/prometheus/model/histogram"
16
17
writev2 "github.com/prometheus/prometheus/prompb/io/prometheus/write/v2"
18
+ "github.com/prometheus/prometheus/storage/remote"
17
19
"github.com/stretchr/testify/assert"
18
20
"go.opentelemetry.io/collector/component/componenttest"
19
21
"go.opentelemetry.io/collector/consumer/consumertest"
22
+ "go.opentelemetry.io/collector/pdata/pmetric"
20
23
"go.opentelemetry.io/collector/receiver/receivertest"
24
+
25
+ "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatatest/pmetrictest"
21
26
)
22
27
23
- func setupServer (t * testing.T ) {
28
+ var (
29
+ testHistogram = histogram.Histogram {
30
+ Schema : 2 ,
31
+ ZeroThreshold : 1e-128 ,
32
+ ZeroCount : 0 ,
33
+ Count : 0 ,
34
+ Sum : 20 ,
35
+ PositiveSpans : []histogram.Span {{Offset : 0 , Length : 1 }},
36
+ PositiveBuckets : []int64 {1 },
37
+ NegativeSpans : []histogram.Span {{Offset : 0 , Length : 1 }},
38
+ NegativeBuckets : []int64 {- 1 },
39
+ }
40
+
41
+ writeV2RequestFixture = & writev2.Request {
42
+ Symbols : []string {"" , "__name__" , "test_metric1" , "b" , "c" , "baz" , "qux" , "d" , "e" , "foo" , "bar" , "f" , "g" , "h" , "i" , "Test gauge for test purposes" , "Maybe op/sec who knows (:" , "Test counter for test purposes" },
43
+ Timeseries : []writev2.TimeSeries {
44
+ {
45
+ LabelsRefs : []uint32 {1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 }, // Symbolized writeRequestFixture.Timeseries[0].Labels
46
+ Metadata : writev2.Metadata {
47
+ Type : writev2 .Metadata_METRIC_TYPE_GAUGE , // writeV2RequestSeries1Metadata.Type.
48
+
49
+ HelpRef : 15 , // Symbolized writeV2RequestSeries1Metadata.Help.
50
+ UnitRef : 16 , // Symbolized writeV2RequestSeries1Metadata.Unit.
51
+ },
52
+ Samples : []writev2.Sample {{Value : 1 , Timestamp : 1 }},
53
+ Exemplars : []writev2.Exemplar {{LabelsRefs : []uint32 {11 , 12 }, Value : 1 , Timestamp : 1 }},
54
+ Histograms : []writev2.Histogram {writev2 .FromIntHistogram (1 , & testHistogram ), writev2 .FromFloatHistogram (2 , testHistogram .ToFloat (nil ))},
55
+ },
56
+ {
57
+ LabelsRefs : []uint32 {1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 }, // Same series as first.
58
+ Metadata : writev2.Metadata {
59
+ Type : writev2 .Metadata_METRIC_TYPE_COUNTER , // writeV2RequestSeries2Metadata.Type.
60
+
61
+ HelpRef : 17 , // Symbolized writeV2RequestSeries2Metadata.Help.
62
+ // No unit.
63
+ },
64
+ Samples : []writev2.Sample {{Value : 2 , Timestamp : 2 }},
65
+ Exemplars : []writev2.Exemplar {{LabelsRefs : []uint32 {13 , 14 }, Value : 2 , Timestamp : 2 }},
66
+ Histograms : []writev2.Histogram {writev2 .FromIntHistogram (3 , & testHistogram ), writev2 .FromFloatHistogram (4 , testHistogram .ToFloat (nil ))},
67
+ },
68
+ },
69
+ }
70
+ )
71
+
72
+ func setupMetricsReceiver (t * testing.T ) * prometheusRemoteWriteReceiver {
24
73
t .Helper ()
25
74
26
75
factory := NewFactory ()
@@ -30,6 +79,13 @@ func setupServer(t *testing.T) {
30
79
assert .NoError (t , err )
31
80
assert .NotNil (t , prwReceiver , "metrics receiver creation failed" )
32
81
82
+ return prwReceiver .(* prometheusRemoteWriteReceiver )
83
+ }
84
+
85
+ func setupServer (t * testing.T ) {
86
+ t .Helper ()
87
+
88
+ prwReceiver := setupMetricsReceiver (t )
33
89
ctx , cancel := context .WithCancel (context .Background ())
34
90
t .Cleanup (cancel )
35
91
@@ -98,3 +154,70 @@ func TestHandlePRWContentTypeNegotiation(t *testing.T) {
98
154
})
99
155
}
100
156
}
157
+
158
+ func TestTranslateV2 (t * testing.T ) {
159
+ prwReceiver := setupMetricsReceiver (t )
160
+ ctx , cancel := context .WithCancel (context .Background ())
161
+ t .Cleanup (cancel )
162
+
163
+ for _ , tc := range []struct {
164
+ name string
165
+ request * writev2.Request
166
+ expectError string
167
+ expectedMetrics pmetric.Metrics
168
+ expectedStats remote.WriteResponseStats
169
+ }{
170
+ {
171
+ name : "missing metric name" ,
172
+ request : & writev2.Request {
173
+ Symbols : []string {"" , "foo" , "bar" },
174
+ Timeseries : []writev2.TimeSeries {
175
+ {
176
+ LabelsRefs : []uint32 {1 , 2 },
177
+ Samples : []writev2.Sample {{Value : 1 , Timestamp : 1 }},
178
+ },
179
+ },
180
+ },
181
+ expectError : "missing metric name in labels" ,
182
+ },
183
+ {
184
+ name : "duplicate label" ,
185
+ request : & writev2.Request {
186
+ Symbols : []string {"" , "__name__" , "test" },
187
+ Timeseries : []writev2.TimeSeries {
188
+ {
189
+ LabelsRefs : []uint32 {1 , 2 , 1 , 2 },
190
+ Samples : []writev2.Sample {{Value : 1 , Timestamp : 1 }},
191
+ },
192
+ },
193
+ },
194
+ expectError : `duplicate label "__name__" in labels` ,
195
+ },
196
+ {
197
+ name : "valid request" ,
198
+ request : writeV2RequestFixture ,
199
+ expectedMetrics : func () pmetric.Metrics {
200
+ expected := pmetric .NewMetrics ()
201
+ rmAttributes := expected .ResourceMetrics ().AppendEmpty ().Resource ().Attributes ()
202
+ rmAttributes .PutStr ("b" , "c" )
203
+ rmAttributes .PutStr ("baz" , "qux" )
204
+ rmAttributes .PutStr ("d" , "e" )
205
+ rmAttributes .PutStr ("foo" , "bar" )
206
+ return expected
207
+ }(),
208
+ expectedStats : remote.WriteResponseStats {},
209
+ },
210
+ } {
211
+ t .Run (tc .name , func (t * testing.T ) {
212
+ metrics , stats , err := prwReceiver .translateV2 (ctx , tc .request )
213
+ if tc .expectError != "" {
214
+ assert .ErrorContains (t , err , tc .expectError )
215
+ return
216
+ }
217
+
218
+ assert .NoError (t , err )
219
+ assert .NoError (t , pmetrictest .CompareMetrics (tc .expectedMetrics , metrics ))
220
+ assert .Equal (t , tc .expectedStats , stats )
221
+ })
222
+ }
223
+ }
0 commit comments