diff --git a/connection/connection_test.go b/connection/connection_test.go index f03dad13..8cc4a573 100644 --- a/connection/connection_test.go +++ b/connection/connection_test.go @@ -359,7 +359,7 @@ func TestConnectMetrics(t *testing.T) { ` if err := testutil.GatherAndCompare( - cmm.GetRegistry(), strings.NewReader(expectedMetrics)); err != nil { + cmm.GetRegistry(), strings.NewReader(expectedMetrics), "csi_sidecar_operations_seconds"); err != nil { // Ignore mismatches on csi_sidecar_operations_seconds_sum metric because execution time will vary from test to test. err = verifyMetricsError(t, err, "csi_sidecar_operations_seconds_sum") if err != nil { diff --git a/metrics/metrics.go b/metrics/metrics.go index 2e252d65..1529d10d 100644 --- a/metrics/metrics.go +++ b/metrics/metrics.go @@ -92,6 +92,10 @@ func NewCSIMetricsManager(driverName string) CSIMetricsManager { ), } + // https://github.com/open-telemetry/opentelemetry-collector/issues/969 + // Add process_start_time_seconds into the metric to let the start time be parsed correctly + metrics.RegisterProcessStartTime(cmm.registry.RawRegister) + cmm.SetDriverName(driverName) cmm.registerMetrics() return &cmm @@ -171,7 +175,11 @@ func VerifyMetricsMatch(expectedMetrics, actualMetrics string, metricToIgnore st wantScanner.Scan() wantLine := strings.TrimSpace(wantScanner.Text()) gotLine := strings.TrimSpace(gotScanner.Text()) - if wantLine != gotLine && (metricToIgnore == "" || !strings.HasPrefix(gotLine, metricToIgnore)) { + if wantLine != gotLine && + (metricToIgnore == "" || !strings.HasPrefix(gotLine, metricToIgnore)) && + // We should ignore the comments from metricToIgnore, otherwise the verification will + // fail because of the comments. + !strings.HasPrefix(gotLine, "#") { return fmt.Errorf("\r\nMetric Want: %q\r\nMetric Got: %q\r\n", wantLine, gotLine) } } diff --git a/metrics/metrics_test.go b/metrics/metrics_test.go index 7d210837..cb099935 100644 --- a/metrics/metrics_test.go +++ b/metrics/metrics_test.go @@ -28,6 +28,11 @@ import ( "k8s.io/component-base/metrics/testutil" ) +const ( + SidecarOperationMetric = "csi_sidecar_operations_seconds" + ProcessStartTimeMetric = "process_start_time_seconds" +) + func TestRecordMetrics(t *testing.T) { // Arrange cmm := NewCSIMetricsManager( @@ -62,7 +67,7 @@ func TestRecordMetrics(t *testing.T) { ` if err := testutil.GatherAndCompare( - cmm.GetRegistry(), strings.NewReader(expectedMetrics)); err != nil { + cmm.GetRegistry(), strings.NewReader(expectedMetrics), SidecarOperationMetric); err != nil { t.Fatal(err) } } @@ -101,7 +106,7 @@ func TestRecordMetrics_NoDriverName(t *testing.T) { ` if err := testutil.GatherAndCompare( - cmm.GetRegistry(), strings.NewReader(expectedMetrics)); err != nil { + cmm.GetRegistry(), strings.NewReader(expectedMetrics), SidecarOperationMetric); err != nil { t.Fatal(err) } } @@ -139,7 +144,7 @@ func TestRecordMetrics_Negative(t *testing.T) { csi_sidecar_operations_seconds_count{driver_name="fake.csi.driver.io",grpc_status_code="InvalidArgument",method_name="myOperation"} 1 ` if err := testutil.GatherAndCompare( - cmm.GetRegistry(), strings.NewReader(expectedMetrics)); err != nil { + cmm.GetRegistry(), strings.NewReader(expectedMetrics), SidecarOperationMetric); err != nil { t.Fatal(err) } } @@ -197,7 +202,35 @@ func TestStartMetricsEndPoint_Noop(t *testing.T) { ` actualMetrics := string(contentBytes) - if err := VerifyMetricsMatch(expectedMetrics, actualMetrics, ""); err != nil { + if err := VerifyMetricsMatch(expectedMetrics, actualMetrics, ProcessStartTimeMetric); err != nil { t.Fatalf("Metrics returned by end point do not match expectation: %v", err) } } + +func TestProcessStartTimeMetricExist(t *testing.T) { + // Arrange + cmm := NewCSIMetricsManager( + "fake.csi.driver.io" /* driverName */) + operationDuration, _ := time.ParseDuration("20s") + + // Act + cmm.RecordMetrics( + "/csi.v1.Controller/ControllerGetCapabilities", /* operationName */ + nil, /* operationErr */ + operationDuration /* operationDuration */) + + // Assert + metricsFamilies, err := cmm.GetRegistry().Gather() + if err != nil { + t.Fatalf("Error fetching metrics: %v", err) + } + + // check process_start_time_seconds exist + for _, metricsFamily := range metricsFamilies { + if metricsFamily.GetName() == ProcessStartTimeMetric { + return + } + } + + t.Fatalf("Metrics does not contain %v. Scraped content: %v", ProcessStartTimeMetric, metricsFamilies) +}