@@ -340,64 +340,109 @@ func TestExplicitReconnect(t *testing.T) {
340
340
}
341
341
342
342
func TestConnectMetrics (t * testing.T ) {
343
- tmp := tmpDir (t )
344
- defer os .RemoveAll (tmp )
345
- cmmServer := metrics .NewCSIMetricsManagerForPlugin ("fake.csi.driver.io" )
346
- // We have to have a real implementation of the gRPC call, otherwise the metrics
347
- // interceptor is not called. The CSI identity service is used because it's simple.
348
- addr , stopServer := startServer (t , tmp , & identityServer {}, nil , cmmServer )
349
- defer stopServer ()
350
-
351
- cmm := metrics .NewCSIMetricsManager ("fake.csi.driver.io" )
352
- conn , err := Connect (addr , cmm )
353
- if assert .NoError (t , err , "connect via absolute path" ) &&
354
- assert .NotNil (t , conn , "got a connection" ) {
355
- defer conn .Close ()
356
- assert .Equal (t , connectivity .Ready , conn .GetState (), "connection ready" )
357
-
358
- identityClient := csi .NewIdentityClient (conn )
359
- if _ , err := identityClient .GetPluginInfo (context .Background (), & csi.GetPluginInfoRequest {}); assert .Error (t , err ) {
360
- errStatus , _ := status .FromError (err )
361
- assert .Equal (t , codes .Unimplemented , errStatus .Code (), "not implemented" )
362
- }
343
+ testCases := []struct {
344
+ name string
345
+ expectedMetrics string
346
+ ctx context.Context
347
+ checkServer bool
348
+ cmm metrics.CSIMetricsManager
349
+ }{
350
+ {
351
+ name : "Regular connection test" ,
352
+ expectedMetrics : `# HELP csi_sidecar_operations_seconds [ALPHA] Container Storage Interface operation duration with gRPC error code status total
353
+ # TYPE csi_sidecar_operations_seconds histogram
354
+ csi_sidecar_operations_seconds_bucket{driver_name="fake.csi.driver.io",grpc_status_code="Unimplemented",method_name="/csi.v1.Identity/GetPluginInfo",le="0.1"} 1
355
+ csi_sidecar_operations_seconds_bucket{driver_name="fake.csi.driver.io",grpc_status_code="Unimplemented",method_name="/csi.v1.Identity/GetPluginInfo",le="0.25"} 1
356
+ csi_sidecar_operations_seconds_bucket{driver_name="fake.csi.driver.io",grpc_status_code="Unimplemented",method_name="/csi.v1.Identity/GetPluginInfo",le="0.5"} 1
357
+ csi_sidecar_operations_seconds_bucket{driver_name="fake.csi.driver.io",grpc_status_code="Unimplemented",method_name="/csi.v1.Identity/GetPluginInfo",le="1"} 1
358
+ csi_sidecar_operations_seconds_bucket{driver_name="fake.csi.driver.io",grpc_status_code="Unimplemented",method_name="/csi.v1.Identity/GetPluginInfo",le="2.5"} 1
359
+ csi_sidecar_operations_seconds_bucket{driver_name="fake.csi.driver.io",grpc_status_code="Unimplemented",method_name="/csi.v1.Identity/GetPluginInfo",le="5"} 1
360
+ csi_sidecar_operations_seconds_bucket{driver_name="fake.csi.driver.io",grpc_status_code="Unimplemented",method_name="/csi.v1.Identity/GetPluginInfo",le="10"} 1
361
+ csi_sidecar_operations_seconds_bucket{driver_name="fake.csi.driver.io",grpc_status_code="Unimplemented",method_name="/csi.v1.Identity/GetPluginInfo",le="15"} 1
362
+ csi_sidecar_operations_seconds_bucket{driver_name="fake.csi.driver.io",grpc_status_code="Unimplemented",method_name="/csi.v1.Identity/GetPluginInfo",le="25"} 1
363
+ csi_sidecar_operations_seconds_bucket{driver_name="fake.csi.driver.io",grpc_status_code="Unimplemented",method_name="/csi.v1.Identity/GetPluginInfo",le="50"} 1
364
+ csi_sidecar_operations_seconds_bucket{driver_name="fake.csi.driver.io",grpc_status_code="Unimplemented",method_name="/csi.v1.Identity/GetPluginInfo",le="120"} 1
365
+ csi_sidecar_operations_seconds_bucket{driver_name="fake.csi.driver.io",grpc_status_code="Unimplemented",method_name="/csi.v1.Identity/GetPluginInfo",le="300"} 1
366
+ csi_sidecar_operations_seconds_bucket{driver_name="fake.csi.driver.io",grpc_status_code="Unimplemented",method_name="/csi.v1.Identity/GetPluginInfo",le="600"} 1
367
+ csi_sidecar_operations_seconds_bucket{driver_name="fake.csi.driver.io",grpc_status_code="Unimplemented",method_name="/csi.v1.Identity/GetPluginInfo",le="+Inf"} 1
368
+ csi_sidecar_operations_seconds_sum{driver_name="fake.csi.driver.io",grpc_status_code="Unimplemented",method_name="/csi.v1.Identity/GetPluginInfo"} 0
369
+ csi_sidecar_operations_seconds_count{driver_name="fake.csi.driver.io",grpc_status_code="Unimplemented",method_name="/csi.v1.Identity/GetPluginInfo"} 1
370
+ ` ,
371
+ ctx : context .Background (),
372
+ cmm : metrics .NewCSIMetricsManager ("fake.csi.driver.io" ),
373
+ checkServer : true ,
374
+ },
375
+ {
376
+ name : "connection test with migrated metrics" ,
377
+ expectedMetrics : `# HELP csi_sidecar_operations_seconds [ALPHA] Container Storage Interface operation duration with gRPC error code status total
378
+ # TYPE csi_sidecar_operations_seconds histogram
379
+ csi_sidecar_operations_seconds_bucket{driver_name="fake.csi.driver.io",grpc_status_code="Unimplemented",method_name="/csi.v1.Identity/GetPluginInfo",migrated="true",le="0.1"} 1
380
+ csi_sidecar_operations_seconds_bucket{driver_name="fake.csi.driver.io",grpc_status_code="Unimplemented",method_name="/csi.v1.Identity/GetPluginInfo",migrated="true",le="0.25"} 1
381
+ csi_sidecar_operations_seconds_bucket{driver_name="fake.csi.driver.io",grpc_status_code="Unimplemented",method_name="/csi.v1.Identity/GetPluginInfo",migrated="true",le="0.5"} 1
382
+ csi_sidecar_operations_seconds_bucket{driver_name="fake.csi.driver.io",grpc_status_code="Unimplemented",method_name="/csi.v1.Identity/GetPluginInfo",migrated="true",le="1"} 1
383
+ csi_sidecar_operations_seconds_bucket{driver_name="fake.csi.driver.io",grpc_status_code="Unimplemented",method_name="/csi.v1.Identity/GetPluginInfo",migrated="true",le="2.5"} 1
384
+ csi_sidecar_operations_seconds_bucket{driver_name="fake.csi.driver.io",grpc_status_code="Unimplemented",method_name="/csi.v1.Identity/GetPluginInfo",migrated="true",le="5"} 1
385
+ csi_sidecar_operations_seconds_bucket{driver_name="fake.csi.driver.io",grpc_status_code="Unimplemented",method_name="/csi.v1.Identity/GetPluginInfo",migrated="true",le="10"} 1
386
+ csi_sidecar_operations_seconds_bucket{driver_name="fake.csi.driver.io",grpc_status_code="Unimplemented",method_name="/csi.v1.Identity/GetPluginInfo",migrated="true",le="15"} 1
387
+ csi_sidecar_operations_seconds_bucket{driver_name="fake.csi.driver.io",grpc_status_code="Unimplemented",method_name="/csi.v1.Identity/GetPluginInfo",migrated="true",le="25"} 1
388
+ csi_sidecar_operations_seconds_bucket{driver_name="fake.csi.driver.io",grpc_status_code="Unimplemented",method_name="/csi.v1.Identity/GetPluginInfo",migrated="true",le="50"} 1
389
+ csi_sidecar_operations_seconds_bucket{driver_name="fake.csi.driver.io",grpc_status_code="Unimplemented",method_name="/csi.v1.Identity/GetPluginInfo",migrated="true",le="120"} 1
390
+ csi_sidecar_operations_seconds_bucket{driver_name="fake.csi.driver.io",grpc_status_code="Unimplemented",method_name="/csi.v1.Identity/GetPluginInfo",migrated="true",le="300"} 1
391
+ csi_sidecar_operations_seconds_bucket{driver_name="fake.csi.driver.io",grpc_status_code="Unimplemented",method_name="/csi.v1.Identity/GetPluginInfo",migrated="true",le="600"} 1
392
+ csi_sidecar_operations_seconds_bucket{driver_name="fake.csi.driver.io",grpc_status_code="Unimplemented",method_name="/csi.v1.Identity/GetPluginInfo",migrated="true",le="+Inf"} 1
393
+ csi_sidecar_operations_seconds_sum{driver_name="fake.csi.driver.io",grpc_status_code="Unimplemented",method_name="/csi.v1.Identity/GetPluginInfo",migrated="true"} 0
394
+ csi_sidecar_operations_seconds_count{driver_name="fake.csi.driver.io",grpc_status_code="Unimplemented",method_name="/csi.v1.Identity/GetPluginInfo",migrated="true"} 1
395
+ ` ,
396
+ ctx : context .WithValue (context .Background (), AdditionalInfoKey , AdditionalInfo {
397
+ Migrated : "true" ,
398
+ }),
399
+ cmm : metrics .NewCSIMetricsManagerForSidecarWithMigrationStatus ("fake.csi.driver.io" ),
400
+ checkServer : false ,
401
+ },
363
402
}
403
+ for _ , test := range testCases {
404
+ t .Logf ("Running testcase %v" , test .name )
405
+ tmp := tmpDir (t )
406
+ defer os .RemoveAll (tmp )
407
+ cmmServer := metrics .NewCSIMetricsManagerForPlugin ("fake.csi.driver.io" )
408
+ // We have to have a real implementation of the gRPC call, otherwise the metrics
409
+ // interceptor is not called. The CSI identity service is used because it's simple.
410
+ addr , stopServer := startServer (t , tmp , & identityServer {}, nil , cmmServer )
411
+ defer stopServer ()
412
+
413
+ cmm := test .cmm
414
+ conn , err := Connect (addr , cmm )
415
+ if assert .NoError (t , err , "connect via absolute path" ) &&
416
+ assert .NotNil (t , conn , "got a connection" ) {
417
+ defer conn .Close ()
418
+ assert .Equal (t , connectivity .Ready , conn .GetState (), "connection ready" )
419
+
420
+ identityClient := csi .NewIdentityClient (conn )
421
+ if _ , err := identityClient .GetPluginInfo (test .ctx , & csi.GetPluginInfoRequest {}); assert .Error (t , err ) {
422
+ errStatus , _ := status .FromError (err )
423
+ assert .Equal (t , codes .Unimplemented , errStatus .Code (), "not implemented" )
424
+ }
425
+ }
364
426
365
- expectedMetrics := `# HELP csi_sidecar_operations_seconds [ALPHA] Container Storage Interface operation duration with gRPC error code status total
366
- # TYPE csi_sidecar_operations_seconds histogram
367
- csi_sidecar_operations_seconds_bucket{driver_name="fake.csi.driver.io",grpc_status_code="Unimplemented",method_name="/csi.v1.Identity/GetPluginInfo",le="0.1"} 1
368
- csi_sidecar_operations_seconds_bucket{driver_name="fake.csi.driver.io",grpc_status_code="Unimplemented",method_name="/csi.v1.Identity/GetPluginInfo",le="0.25"} 1
369
- csi_sidecar_operations_seconds_bucket{driver_name="fake.csi.driver.io",grpc_status_code="Unimplemented",method_name="/csi.v1.Identity/GetPluginInfo",le="0.5"} 1
370
- csi_sidecar_operations_seconds_bucket{driver_name="fake.csi.driver.io",grpc_status_code="Unimplemented",method_name="/csi.v1.Identity/GetPluginInfo",le="1"} 1
371
- csi_sidecar_operations_seconds_bucket{driver_name="fake.csi.driver.io",grpc_status_code="Unimplemented",method_name="/csi.v1.Identity/GetPluginInfo",le="2.5"} 1
372
- csi_sidecar_operations_seconds_bucket{driver_name="fake.csi.driver.io",grpc_status_code="Unimplemented",method_name="/csi.v1.Identity/GetPluginInfo",le="5"} 1
373
- csi_sidecar_operations_seconds_bucket{driver_name="fake.csi.driver.io",grpc_status_code="Unimplemented",method_name="/csi.v1.Identity/GetPluginInfo",le="10"} 1
374
- csi_sidecar_operations_seconds_bucket{driver_name="fake.csi.driver.io",grpc_status_code="Unimplemented",method_name="/csi.v1.Identity/GetPluginInfo",le="15"} 1
375
- csi_sidecar_operations_seconds_bucket{driver_name="fake.csi.driver.io",grpc_status_code="Unimplemented",method_name="/csi.v1.Identity/GetPluginInfo",le="25"} 1
376
- csi_sidecar_operations_seconds_bucket{driver_name="fake.csi.driver.io",grpc_status_code="Unimplemented",method_name="/csi.v1.Identity/GetPluginInfo",le="50"} 1
377
- csi_sidecar_operations_seconds_bucket{driver_name="fake.csi.driver.io",grpc_status_code="Unimplemented",method_name="/csi.v1.Identity/GetPluginInfo",le="120"} 1
378
- csi_sidecar_operations_seconds_bucket{driver_name="fake.csi.driver.io",grpc_status_code="Unimplemented",method_name="/csi.v1.Identity/GetPluginInfo",le="300"} 1
379
- csi_sidecar_operations_seconds_bucket{driver_name="fake.csi.driver.io",grpc_status_code="Unimplemented",method_name="/csi.v1.Identity/GetPluginInfo",le="600"} 1
380
- csi_sidecar_operations_seconds_bucket{driver_name="fake.csi.driver.io",grpc_status_code="Unimplemented",method_name="/csi.v1.Identity/GetPluginInfo",le="+Inf"} 1
381
- csi_sidecar_operations_seconds_sum{driver_name="fake.csi.driver.io",grpc_status_code="Unimplemented",method_name="/csi.v1.Identity/GetPluginInfo"} 0
382
- csi_sidecar_operations_seconds_count{driver_name="fake.csi.driver.io",grpc_status_code="Unimplemented",method_name="/csi.v1.Identity/GetPluginInfo"} 1
383
- `
384
-
385
- if err := testutil .GatherAndCompare (
386
- cmm .GetRegistry (), strings .NewReader (expectedMetrics ), "csi_sidecar_operations_seconds" ); err != nil {
387
- // Ignore mismatches on csi_sidecar_operations_seconds_sum metric because execution time will vary from test to test.
388
- err = verifyMetricsError (t , err , "csi_sidecar_operations_seconds_sum" )
389
- if err != nil {
390
- t .Errorf ("Expected client metrics not found -- %v" , err )
427
+ if err := testutil .GatherAndCompare (
428
+ cmm .GetRegistry (), strings .NewReader (test .expectedMetrics ), "csi_sidecar_operations_seconds" ); err != nil {
429
+ // Ignore mismatches on csi_sidecar_operations_seconds_sum metric because execution time will vary from test to test.
430
+ err = verifyMetricsError (t , err , "csi_sidecar_operations_seconds_sum" )
431
+ if err != nil {
432
+ t .Errorf ("Expected client metrics not found -- %v" , err )
433
+ }
391
434
}
392
- }
393
435
394
- expectedMetrics = strings .Replace (expectedMetrics , "csi_sidecar" , metrics .SubsystemPlugin , - 1 )
395
- if err := testutil .GatherAndCompare (
396
- cmmServer .GetRegistry (), strings .NewReader (expectedMetrics ), "csi_plugin_operations_seconds" ); err != nil {
397
- // Ignore mismatches on csi_sidecar_operations_seconds_sum metric because execution time will vary from test to test.
398
- err = verifyMetricsError (t , err , metrics .SubsystemPlugin + "_operations_seconds_sum" )
399
- if err != nil {
400
- t .Errorf ("Expected server metrics not found -- %v" , err )
436
+ if test .checkServer {
437
+ expectedMetrics := strings .Replace (test .expectedMetrics , "csi_sidecar" , metrics .SubsystemPlugin , - 1 )
438
+ if err := testutil .GatherAndCompare (
439
+ cmmServer .GetRegistry (), strings .NewReader (expectedMetrics ), "csi_plugin_operations_seconds" ); err != nil {
440
+ // Ignore mismatches on csi_sidecar_operations_seconds_sum metric because execution time will vary from test to test.
441
+ err = verifyMetricsError (t , err , metrics .SubsystemPlugin + "_operations_seconds_sum" )
442
+ if err != nil {
443
+ t .Errorf ("Expected server metrics not found -- %v" , err )
444
+ }
445
+ }
401
446
}
402
447
}
403
448
}
0 commit comments