@@ -14,13 +14,37 @@ import (
14
14
"github.com/golang/snappy"
15
15
promconfig "github.com/prometheus/prometheus/config"
16
16
writev2 "github.com/prometheus/prometheus/prompb/io/prometheus/write/v2"
17
+ "github.com/prometheus/prometheus/storage/remote"
17
18
"github.com/stretchr/testify/assert"
18
19
"go.opentelemetry.io/collector/component/componenttest"
19
20
"go.opentelemetry.io/collector/consumer/consumertest"
21
+ "go.opentelemetry.io/collector/pdata/pmetric"
20
22
"go.opentelemetry.io/collector/receiver/receivertest"
23
+
24
+ "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatatest/pmetrictest"
21
25
)
22
26
23
- func setupServer (t * testing.T ) {
27
+ var (
28
+ writeV2RequestFixture = & writev2.Request {
29
+ Symbols : []string {"" , "__name__" , "test_metric1" , "job" , "test" , "instance" , "service-x/107cn001" , "d" , "e" , "foo" , "bar" , "f" , "g" , "h" , "i" , "Test gauge for test purposes" , "Maybe op/sec who knows (:" , "Test counter for test purposes" },
30
+ Timeseries : []writev2.TimeSeries {
31
+ {
32
+ LabelsRefs : []uint32 {1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 }, // Symbolized writeRequestFixture.Timeseries[0].Labels
33
+ Samples : []writev2.Sample {{Value : 1 , Timestamp : 1 }},
34
+ },
35
+ {
36
+ LabelsRefs : []uint32 {1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 }, // Same series as first. Should use the same resource metrics.
37
+ Samples : []writev2.Sample {{Value : 2 , Timestamp : 2 }},
38
+ },
39
+ {
40
+ LabelsRefs : []uint32 {1 , 2 , 3 , 9 , 5 , 10 , 7 , 8 , 9 , 10 }, // This series has different label values for job and instance.
41
+ Samples : []writev2.Sample {{Value : 2 , Timestamp : 2 }},
42
+ },
43
+ },
44
+ }
45
+ )
46
+
47
+ func setupMetricsReceiver (t * testing.T ) * prometheusRemoteWriteReceiver {
24
48
t .Helper ()
25
49
26
50
factory := NewFactory ()
@@ -30,6 +54,13 @@ func setupServer(t *testing.T) {
30
54
assert .NoError (t , err )
31
55
assert .NotNil (t , prwReceiver , "metrics receiver creation failed" )
32
56
57
+ return prwReceiver .(* prometheusRemoteWriteReceiver )
58
+ }
59
+
60
+ func setupServer (t * testing.T ) {
61
+ t .Helper ()
62
+
63
+ prwReceiver := setupMetricsReceiver (t )
33
64
ctx , cancel := context .WithCancel (context .Background ())
34
65
t .Cleanup (cancel )
35
66
@@ -98,3 +129,82 @@ func TestHandlePRWContentTypeNegotiation(t *testing.T) {
98
129
})
99
130
}
100
131
}
132
+
133
+ func TestTranslateV2 (t * testing.T ) {
134
+ prwReceiver := setupMetricsReceiver (t )
135
+ ctx , cancel := context .WithCancel (context .Background ())
136
+ t .Cleanup (cancel )
137
+
138
+ for _ , tc := range []struct {
139
+ name string
140
+ request * writev2.Request
141
+ expectError string
142
+ expectedMetrics pmetric.Metrics
143
+ expectedStats remote.WriteResponseStats
144
+ }{
145
+ {
146
+ name : "missing metric name" ,
147
+ request : & writev2.Request {
148
+ Symbols : []string {"" , "foo" , "bar" },
149
+ Timeseries : []writev2.TimeSeries {
150
+ {
151
+ LabelsRefs : []uint32 {1 , 2 },
152
+ Samples : []writev2.Sample {{Value : 1 , Timestamp : 1 }},
153
+ },
154
+ },
155
+ },
156
+ expectError : "missing metric name in labels" ,
157
+ },
158
+ {
159
+ name : "duplicate label" ,
160
+ request : & writev2.Request {
161
+ Symbols : []string {"" , "__name__" , "test" },
162
+ Timeseries : []writev2.TimeSeries {
163
+ {
164
+ LabelsRefs : []uint32 {1 , 2 , 1 , 2 },
165
+ Samples : []writev2.Sample {{Value : 1 , Timestamp : 1 }},
166
+ },
167
+ },
168
+ },
169
+ expectError : `duplicate label "__name__" in labels` ,
170
+ },
171
+ {
172
+ name : "valid request" ,
173
+ request : writeV2RequestFixture ,
174
+ expectedMetrics : func () pmetric.Metrics {
175
+ expected := pmetric .NewMetrics ()
176
+ rm1 := expected .ResourceMetrics ().AppendEmpty ()
177
+ rmAttributes1 := rm1 .Resource ().Attributes ()
178
+ rmAttributes1 .PutStr ("service.namespace" , "test" )
179
+ rmAttributes1 .PutStr ("service.name" , "service-x" )
180
+ rmAttributes1 .PutStr ("service.instance.id" , "107cn001" )
181
+ smAttributes1 := rm1 .ScopeMetrics ().AppendEmpty ().Scope ().Attributes ()
182
+ smAttributes1 .PutStr ("d" , "e" )
183
+ smAttributes1 .PutStr ("foo" , "bar" )
184
+
185
+ rm2 := expected .ResourceMetrics ().AppendEmpty ()
186
+ rmAttributes2 := rm2 .Resource ().Attributes ()
187
+ rmAttributes2 .PutStr ("service.namespace" , "foo" )
188
+ rmAttributes2 .PutStr ("service.name" , "bar" )
189
+ smAttributes2 := rm2 .ScopeMetrics ().AppendEmpty ().Scope ().Attributes ()
190
+ smAttributes2 .PutStr ("d" , "e" )
191
+ smAttributes2 .PutStr ("foo" , "bar" )
192
+
193
+ return expected
194
+ }(),
195
+ expectedStats : remote.WriteResponseStats {},
196
+ },
197
+ } {
198
+ t .Run (tc .name , func (t * testing.T ) {
199
+ metrics , stats , err := prwReceiver .translateV2 (ctx , tc .request )
200
+ if tc .expectError != "" {
201
+ assert .ErrorContains (t , err , tc .expectError )
202
+ return
203
+ }
204
+
205
+ assert .NoError (t , err )
206
+ assert .NoError (t , pmetrictest .CompareMetrics (tc .expectedMetrics , metrics ))
207
+ assert .Equal (t , tc .expectedStats , stats )
208
+ })
209
+ }
210
+ }
0 commit comments