@@ -22,7 +22,10 @@ import (
22
22
"log"
23
23
"net"
24
24
"os"
25
+ "reflect"
25
26
"regexp"
27
+ "sort"
28
+ "strings"
26
29
"testing"
27
30
"time"
28
31
@@ -62,6 +65,11 @@ func TestSanitize(t *testing.T) {
62
65
}
63
66
64
67
func TestWriteSummary (t * testing.T ) {
68
+ testWriteSummary (t , false )
69
+ testWriteSummary (t , true )
70
+ }
71
+
72
+ func testWriteSummary (t * testing.T , useTags bool ) {
65
73
sumVec := prometheus .NewSummaryVec (
66
74
prometheus.SummaryOpts {
67
75
Name : "name" ,
@@ -95,7 +103,8 @@ func TestWriteSummary(t *testing.T) {
95
103
{prefix : "pre.fix" },
96
104
}
97
105
98
- const want = `%s.name.constname.constvalue.labelname.val1.quantile.0_5 20 1477043
106
+ var (
107
+ want = `%s.name.constname.constvalue.labelname.val1.quantile.0_5 20 1477043
99
108
%s.name.constname.constvalue.labelname.val1.quantile.0_9 30 1477043
100
109
%s.name.constname.constvalue.labelname.val1.quantile.0_99 30 1477043
101
110
%s.name_sum.constname.constvalue.labelname.val1 60 1477043
@@ -106,11 +115,28 @@ func TestWriteSummary(t *testing.T) {
106
115
%s.name_sum.constname.constvalue.labelname.val2 90 1477043
107
116
%s.name_count.constname.constvalue.labelname.val2 3 1477043
108
117
`
118
+ wantTagged = `%s.name;constname=constvalue;labelname=val1;quantile=0.5 20 1477043
119
+ %s.name;constname=constvalue;labelname=val1;quantile=0.9 30 1477043
120
+ %s.name;constname=constvalue;labelname=val1;quantile=0.99 30 1477043
121
+ %s.name_sum;constname=constvalue;labelname=val1 60 1477043
122
+ %s.name_count;constname=constvalue;labelname=val1 3 1477043
123
+ %s.name;constname=constvalue;labelname=val2;quantile=0.5 30 1477043
124
+ %s.name;constname=constvalue;labelname=val2;quantile=0.9 40 1477043
125
+ %s.name;constname=constvalue;labelname=val2;quantile=0.99 40 1477043
126
+ %s.name_sum;constname=constvalue;labelname=val2 90 1477043
127
+ %s.name_count;constname=constvalue;labelname=val2 3 1477043
128
+ `
129
+ )
130
+
131
+ if useTags {
132
+ want = wantTagged
133
+ }
134
+
109
135
for i , tc := range testCases {
110
136
111
137
now := model .Time (1477043083 )
112
138
var buf bytes.Buffer
113
- err = writeMetrics (& buf , mfs , tc .prefix , now )
139
+ err = writeMetrics (& buf , mfs , useTags , tc .prefix , now )
114
140
if err != nil {
115
141
t .Fatalf ("error: %v" , err )
116
142
}
@@ -119,13 +145,21 @@ func TestWriteSummary(t *testing.T) {
119
145
tc .prefix , tc .prefix , tc .prefix , tc .prefix , tc .prefix ,
120
146
tc .prefix , tc .prefix , tc .prefix , tc .prefix , tc .prefix ,
121
147
)
122
- if got := buf .String (); wantWithPrefix != got {
123
- t .Fatalf ("test case index %d: wanted \n %s\n , got \n %s\n " , i , wantWithPrefix , got )
148
+
149
+ got := buf .String ()
150
+
151
+ if err := checkLinesAreEqual (wantWithPrefix , got , useTags ); err != nil {
152
+ t .Fatalf ("test case index %d:\n %s" , i , err .Error ())
124
153
}
125
154
}
126
155
}
127
156
128
157
func TestWriteHistogram (t * testing.T ) {
158
+ testWriteHistogram (t , false )
159
+ testWriteHistogram (t , true )
160
+ }
161
+
162
+ func testWriteHistogram (t * testing.T , useTags bool ) {
129
163
histVec := prometheus .NewHistogramVec (
130
164
prometheus.HistogramOpts {
131
165
Name : "name" ,
@@ -153,12 +187,13 @@ func TestWriteHistogram(t *testing.T) {
153
187
154
188
now := model .Time (1477043083 )
155
189
var buf bytes.Buffer
156
- err = writeMetrics (& buf , mfs , "prefix" , now )
190
+ err = writeMetrics (& buf , mfs , useTags , "prefix" , now )
157
191
if err != nil {
158
192
t .Fatalf ("error: %v" , err )
159
193
}
160
194
161
- want := `prefix.name_bucket.constname.constvalue.labelname.val1.le.0_01 0 1477043
195
+ var (
196
+ want = `prefix.name_bucket.constname.constvalue.labelname.val1.le.0_01 0 1477043
162
197
prefix.name_bucket.constname.constvalue.labelname.val1.le.0_02 0 1477043
163
198
prefix.name_bucket.constname.constvalue.labelname.val1.le.0_05 0 1477043
164
199
prefix.name_bucket.constname.constvalue.labelname.val1.le.0_1 0 1477043
@@ -173,12 +208,40 @@ prefix.name_sum.constname.constvalue.labelname.val2 90 1477043
173
208
prefix.name_count.constname.constvalue.labelname.val2 3 1477043
174
209
prefix.name_bucket.constname.constvalue.labelname.val2.le._Inf 3 1477043
175
210
`
176
- if got := buf .String (); want != got {
177
- t .Fatalf ("wanted \n %s\n , got \n %s\n " , want , got )
211
+ wantTagged = `prefix.name_bucket;constname=constvalue;labelname=val1;le=0.01 0 1477043
212
+ prefix.name_bucket;constname=constvalue;labelname=val1;le=0.02 0 1477043
213
+ prefix.name_bucket;constname=constvalue;labelname=val1;le=0.05 0 1477043
214
+ prefix.name_bucket;constname=constvalue;labelname=val1;le=0.1 0 1477043
215
+ prefix.name_sum;constname=constvalue;labelname=val1 60 1477043
216
+ prefix.name_count;constname=constvalue;labelname=val1 3 1477043
217
+ prefix.name_bucket;constname=constvalue;labelname=val1;le=+Inf 3 1477043
218
+ prefix.name_bucket;constname=constvalue;labelname=val2;le=0.01 0 1477043
219
+ prefix.name_bucket;constname=constvalue;labelname=val2;le=0.02 0 1477043
220
+ prefix.name_bucket;constname=constvalue;labelname=val2;le=0.05 0 1477043
221
+ prefix.name_bucket;constname=constvalue;labelname=val2;le=0.1 0 1477043
222
+ prefix.name_sum;constname=constvalue;labelname=val2 90 1477043
223
+ prefix.name_count;constname=constvalue;labelname=val2 3 1477043
224
+ prefix.name_bucket;constname=constvalue;labelname=val2;le=+Inf 3 1477043
225
+ `
226
+ )
227
+
228
+ if useTags {
229
+ want = wantTagged
230
+ }
231
+
232
+ got := buf .String ()
233
+
234
+ if err := checkLinesAreEqual (want , got , useTags ); err != nil {
235
+ t .Fatalf (err .Error ())
178
236
}
179
237
}
180
238
181
239
func TestToReader (t * testing.T ) {
240
+ testToReader (t , false )
241
+ testToReader (t , true )
242
+ }
243
+
244
+ func testToReader (t * testing.T , useTags bool ) {
182
245
cntVec := prometheus .NewCounterVec (
183
246
prometheus.CounterOpts {
184
247
Name : "name" ,
@@ -193,24 +256,86 @@ func TestToReader(t *testing.T) {
193
256
reg := prometheus .NewRegistry ()
194
257
reg .MustRegister (cntVec )
195
258
196
- want := `prefix.name.constname.constvalue.labelname.val1 1 1477043
259
+ var (
260
+ want = `prefix.name.constname.constvalue.labelname.val1 1 1477043
197
261
prefix.name.constname.constvalue.labelname.val2 1 1477043
198
262
`
263
+ wantTagged = `prefix.name;constname=constvalue;labelname=val1 1 1477043
264
+ prefix.name;constname=constvalue;labelname=val2 1 1477043
265
+ `
266
+ )
267
+
268
+ if useTags {
269
+ want = wantTagged
270
+ }
271
+
199
272
mfs , err := reg .Gather ()
200
273
if err != nil {
201
274
t .Fatalf ("error: %v" , err )
202
275
}
203
276
204
277
now := model .Time (1477043083 )
205
278
var buf bytes.Buffer
206
- err = writeMetrics (& buf , mfs , "prefix" , now )
279
+ err = writeMetrics (& buf , mfs , useTags , "prefix" , now )
207
280
if err != nil {
208
281
t .Fatalf ("error: %v" , err )
209
282
}
210
283
211
- if got := buf .String (); want != got {
212
- t .Fatalf ("wanted \n %s\n , got \n %s\n " , want , got )
284
+ got := buf .String ()
285
+
286
+ if err := checkLinesAreEqual (want , got , useTags ); err != nil {
287
+ t .Fatalf (err .Error ())
288
+ }
289
+ }
290
+
291
+ func checkLinesAreEqual (w , g string , useTags bool ) error {
292
+ if useTags {
293
+ taggedLineRegexp := regexp .MustCompile (`;| ` )
294
+
295
+ wantLines , err := stringToLines (w )
296
+ if err != nil {
297
+ return err
298
+ }
299
+
300
+ gotLines , err := stringToLines (g )
301
+ if err != nil {
302
+ return err
303
+ }
304
+
305
+ for lineInd := range gotLines {
306
+ var log string
307
+ // Tagged metric, order of tags doesn't matter
308
+ // m1 := "prefix.name;tag1=val1;tag2=val2 3 1477043"
309
+ // m2 := "prefix.name;tag2=val2;tag1=val1 3 1477043"
310
+ // m1 should be equal to m2
311
+ wantSplit := taggedLineRegexp .Split (wantLines [lineInd ], - 1 )
312
+ gotSplit := taggedLineRegexp .Split (gotLines [lineInd ], - 1 )
313
+ sort .Strings (wantSplit )
314
+ sort .Strings (gotSplit )
315
+
316
+ log += fmt .Sprintf ("want: %v\n got: %v\n \n " , wantSplit , gotSplit )
317
+
318
+ if ! reflect .DeepEqual (wantSplit , gotSplit ) {
319
+ return fmt .Errorf (log )
320
+ }
321
+ }
322
+ return nil
323
+ }
324
+
325
+ if w != g {
326
+ return fmt .Errorf ("wanted:\n \n %s\n got:\n \n %s" , w , g )
327
+ }
328
+
329
+ return nil
330
+ }
331
+
332
+ func stringToLines (s string ) (lines []string , err error ) {
333
+ scanner := bufio .NewScanner (strings .NewReader (s ))
334
+ for scanner .Scan () {
335
+ lines = append (lines , scanner .Text ())
213
336
}
337
+ err = scanner .Err ()
338
+ return
214
339
}
215
340
216
341
func TestPush (t * testing.T ) {
0 commit comments