@@ -340,64 +340,109 @@ func TestExplicitReconnect(t *testing.T) {
340340}
341341
342342func  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 .NewCSIMetricsManagerWithOptions ("fake.csi.driver.io" , metrics .WithLabelNames (metrics .LabelMigrated )),
400+ 			checkServer : false ,
401+ 		},
363402	}
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+ 		}
364426
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+ 			}
391434		}
392- 	}
393435
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+ 			}
401446		}
402447	}
403448}
0 commit comments