@@ -16,6 +16,7 @@ package clientv3test
16
16
17
17
import (
18
18
"bufio"
19
+ "bytes"
19
20
"context"
20
21
"errors"
21
22
"io"
@@ -30,6 +31,7 @@ import (
30
31
grpcprom "github.com/grpc-ecosystem/go-grpc-middleware/providers/prometheus"
31
32
"github.com/prometheus/client_golang/prometheus"
32
33
"github.com/prometheus/client_golang/prometheus/promhttp"
34
+ "github.com/prometheus/common/expfmt"
33
35
"google.golang.org/grpc"
34
36
35
37
"go.etcd.io/etcd/client/pkg/v3/transport"
@@ -150,6 +152,24 @@ func sumCountersForMetricAndLabels(t *testing.T, url string, metricName string,
150
152
}
151
153
152
154
func getHTTPBodyAsLines (t * testing.T , url string ) []string {
155
+ data := getHTTPBodyAsBytes (t , url )
156
+
157
+ reader := bufio .NewReader (bytes .NewReader (data ))
158
+ var lines []string
159
+ for {
160
+ line , err := reader .ReadString ('\n' )
161
+ if err != nil {
162
+ if errors .Is (err , io .EOF ) {
163
+ break
164
+ }
165
+ t .Fatalf ("error reading: %v" , err )
166
+ }
167
+ lines = append (lines , line )
168
+ }
169
+ return lines
170
+ }
171
+
172
+ func getHTTPBodyAsBytes (t * testing.T , url string ) []byte {
153
173
cfgtls := transport.TLSInfo {}
154
174
tr , err := transport .NewTransport (cfgtls , time .Second )
155
175
if err != nil {
@@ -165,21 +185,12 @@ func getHTTPBodyAsLines(t *testing.T, url string) []string {
165
185
if err != nil {
166
186
t .Fatalf ("Error fetching: %v" , err )
167
187
}
168
-
169
- reader := bufio .NewReader (resp .Body )
170
- var lines []string
171
- for {
172
- line , err := reader .ReadString ('\n' )
173
- if err != nil {
174
- if errors .Is (err , io .EOF ) {
175
- break
176
- }
177
- t .Fatalf ("error reading: %v" , err )
178
- }
179
- lines = append (lines , line )
188
+ defer resp .Body .Close ()
189
+ body , err := io .ReadAll (resp .Body )
190
+ if err != nil {
191
+ t .Fatalf ("Error reading http body: %v" , err )
180
192
}
181
- resp .Body .Close ()
182
- return lines
193
+ return body
183
194
}
184
195
185
196
func TestAllMetricsGenerated (t * testing.T ) {
@@ -252,42 +263,26 @@ func TestAllMetricsGenerated(t *testing.T) {
252
263
// Define the expected list of metrics
253
264
expectedMetrics := []string {
254
265
"etcd_cluster_version" ,
255
- "etcd_disk_backend_commit_duration_seconds_bucket" ,
256
- "etcd_disk_backend_commit_duration_seconds_count" ,
257
- "etcd_disk_backend_commit_duration_seconds_sum" ,
258
- "etcd_disk_backend_defrag_duration_seconds_bucket" ,
259
- "etcd_disk_backend_defrag_duration_seconds_count" ,
260
- "etcd_disk_backend_defrag_duration_seconds_sum" ,
261
- "etcd_disk_backend_snapshot_duration_seconds_bucket" ,
262
- "etcd_disk_backend_snapshot_duration_seconds_count" ,
263
- "etcd_disk_backend_snapshot_duration_seconds_sum" ,
266
+ "etcd_disk_backend_commit_duration_seconds" ,
267
+ "etcd_disk_backend_defrag_duration_seconds" ,
268
+ "etcd_disk_backend_snapshot_duration_seconds" ,
264
269
"etcd_disk_defrag_inflight" ,
265
- "etcd_disk_wal_fsync_duration_seconds_bucket" ,
266
- "etcd_disk_wal_fsync_duration_seconds_count" ,
267
- "etcd_disk_wal_fsync_duration_seconds_sum" ,
270
+ "etcd_disk_wal_fsync_duration_seconds" ,
268
271
"etcd_disk_wal_write_bytes_total" ,
269
- "etcd_disk_wal_write_duration_seconds_bucket" ,
270
- "etcd_disk_wal_write_duration_seconds_count" ,
271
- "etcd_disk_wal_write_duration_seconds_sum" ,
272
+ "etcd_disk_wal_write_duration_seconds" ,
272
273
"etcd_mvcc_db_open_read_transactions" ,
273
274
"etcd_mvcc_db_total_size_in_bytes" ,
274
275
"etcd_mvcc_db_total_size_in_use_in_bytes" ,
275
276
"etcd_mvcc_delete_total" ,
276
- "etcd_mvcc_hash_duration_seconds_bucket" ,
277
- "etcd_mvcc_hash_duration_seconds_count" ,
278
- "etcd_mvcc_hash_duration_seconds_sum" ,
279
- "etcd_mvcc_hash_rev_duration_seconds_bucket" ,
280
- "etcd_mvcc_hash_rev_duration_seconds_count" ,
281
- "etcd_mvcc_hash_rev_duration_seconds_sum" ,
277
+ "etcd_mvcc_hash_duration_seconds" ,
278
+ "etcd_mvcc_hash_rev_duration_seconds" ,
282
279
"etcd_mvcc_put_total" ,
283
280
"etcd_mvcc_range_total" ,
284
281
"etcd_mvcc_txn_total" ,
285
282
"etcd_network_client_grpc_received_bytes_total" ,
286
283
"etcd_network_client_grpc_sent_bytes_total" ,
287
284
"etcd_network_known_peers" ,
288
- "etcd_server_apply_duration_seconds_bucket" ,
289
- "etcd_server_apply_duration_seconds_count" ,
290
- "etcd_server_apply_duration_seconds_sum" ,
285
+ "etcd_server_apply_duration_seconds" ,
291
286
"etcd_server_client_requests_total" ,
292
287
"etcd_server_go_version" ,
293
288
"etcd_server_has_leader" ,
@@ -309,23 +304,15 @@ func TestAllMetricsGenerated(t *testing.T) {
309
304
"etcd_server_slow_read_indexes_total" ,
310
305
"etcd_server_snapshot_apply_in_progress_total" ,
311
306
"etcd_server_version" ,
312
- "etcd_snap_db_fsync_duration_seconds_bucket" ,
313
- "etcd_snap_db_fsync_duration_seconds_count" ,
314
- "etcd_snap_db_fsync_duration_seconds_sum" ,
315
- "etcd_snap_db_save_total_duration_seconds_bucket" ,
316
- "etcd_snap_db_save_total_duration_seconds_count" ,
317
- "etcd_snap_db_save_total_duration_seconds_sum" ,
318
- "etcd_snap_fsync_duration_seconds_bucket" ,
319
- "etcd_snap_fsync_duration_seconds_count" ,
320
- "etcd_snap_fsync_duration_seconds_sum" ,
307
+ "etcd_snap_db_fsync_duration_seconds" ,
308
+ "etcd_snap_db_save_total_duration_seconds" ,
309
+ "etcd_snap_fsync_duration_seconds" ,
321
310
"grpc_client_handled_total" ,
322
311
"grpc_client_msg_received_total" ,
323
312
"grpc_client_msg_sent_total" ,
324
313
"grpc_client_started_total" ,
325
314
"grpc_server_handled_total" ,
326
- "grpc_server_handling_seconds_bucket" ,
327
- "grpc_server_handling_seconds_count" ,
328
- "grpc_server_handling_seconds_sum" ,
315
+ "grpc_server_handling_seconds" ,
329
316
"grpc_server_msg_received_total" ,
330
317
"grpc_server_msg_sent_total" ,
331
318
"grpc_server_started_total" ,
@@ -341,20 +328,15 @@ func TestAllMetricsGenerated(t *testing.T) {
341
328
}
342
329
343
330
func getMetricsList (t * testing.T , url string ) []string {
344
- lines := getHTTPBodyAsLines (t , url )
345
- metrics := make (map [string ]struct {})
346
- for _ , line := range lines {
347
- if strings .Contains (line , "{" ) {
348
- metric := line [:strings .Index (line , "{" )]
349
- metrics [metric ] = struct {}{}
350
- } else {
351
- metric := line [:strings .Index (line , " " )]
352
- metrics [metric ] = struct {}{}
353
- }
331
+ data := getHTTPBodyAsBytes (t , url )
332
+ var parser expfmt.TextParser
333
+ mfs , err := parser .TextToMetricFamilies (bytes .NewReader (data ))
334
+ if err != nil {
335
+ t .Errorf ("Failed to parse metric families" )
354
336
}
355
- var metricList []string
356
- for metric := range metrics {
357
- metricList = append (metricList , metric )
337
+ var ms []string
338
+ for key := range mfs {
339
+ ms = append (ms , key )
358
340
}
359
- return metricList
341
+ return ms
360
342
}
0 commit comments