Skip to content

Commit 1dba3d5

Browse files
authored
Merge pull request #54 from Jiawei0227/processstart
Add process_start_time_seconds metric into csi metric lib
2 parents fb645ec + 8632ac1 commit 1dba3d5

File tree

3 files changed

+58
-14
lines changed

3 files changed

+58
-14
lines changed

connection/connection_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -383,7 +383,7 @@ func TestConnectMetrics(t *testing.T) {
383383
`
384384

385385
if err := testutil.GatherAndCompare(
386-
cmm.GetRegistry(), strings.NewReader(expectedMetrics)); err != nil {
386+
cmm.GetRegistry(), strings.NewReader(expectedMetrics), "csi_sidecar_operations_seconds"); err != nil {
387387
// Ignore mismatches on csi_sidecar_operations_seconds_sum metric because execution time will vary from test to test.
388388
err = verifyMetricsError(t, err, "csi_sidecar_operations_seconds_sum")
389389
if err != nil {
@@ -393,7 +393,7 @@ func TestConnectMetrics(t *testing.T) {
393393

394394
expectedMetrics = strings.Replace(expectedMetrics, "csi_sidecar", metrics.SubsystemPlugin, -1)
395395
if err := testutil.GatherAndCompare(
396-
cmmServer.GetRegistry(), strings.NewReader(expectedMetrics)); err != nil {
396+
cmmServer.GetRegistry(), strings.NewReader(expectedMetrics), "csi_plugin_operations_seconds"); err != nil {
397397
// Ignore mismatches on csi_sidecar_operations_seconds_sum metric because execution time will vary from test to test.
398398
err = verifyMetricsError(t, err, metrics.SubsystemPlugin+"_operations_seconds_sum")
399399
if err != nil {

metrics/metrics.go

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -181,6 +181,11 @@ func NewCSIMetricsManagerWithOptions(driverName string, options ...MetricsManage
181181
subsystem: SubsystemSidecar,
182182
stabilityLevel: metrics.ALPHA,
183183
}
184+
185+
// https://github.com/open-telemetry/opentelemetry-collector/issues/969
186+
// Add process_start_time_seconds into the metric to let the start time be parsed correctly
187+
metrics.RegisterProcessStartTime(cmm.registry.Register)
188+
184189
for _, option := range options {
185190
option(&cmm)
186191
}
@@ -357,7 +362,11 @@ func VerifyMetricsMatch(expectedMetrics, actualMetrics string, metricToIgnore st
357362
wantScanner.Scan()
358363
wantLine := strings.TrimSpace(wantScanner.Text())
359364
gotLine := strings.TrimSpace(gotScanner.Text())
360-
if wantLine != gotLine && (metricToIgnore == "" || !strings.HasPrefix(gotLine, metricToIgnore)) {
365+
if wantLine != gotLine &&
366+
(metricToIgnore == "" || !strings.HasPrefix(gotLine, metricToIgnore)) &&
367+
// We should ignore the comments from metricToIgnore, otherwise the verification will
368+
// fail because of the comments.
369+
!strings.HasPrefix(gotLine, "#") {
361370
return fmt.Errorf("\r\nMetric Want: %q\r\nMetric Got: %q\r\n", wantLine, gotLine)
362371
}
363372
}

metrics/metrics_test.go

Lines changed: 46 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,11 @@ import (
2929
"k8s.io/component-base/metrics/testutil"
3030
)
3131

32+
const (
33+
SidecarOperationMetric = "csi_sidecar_operations_seconds"
34+
ProcessStartTimeMetric = "process_start_time_seconds"
35+
)
36+
3237
func TestRecordMetrics(t *testing.T) {
3338
testcases := map[string]struct {
3439
subsystem string
@@ -102,15 +107,17 @@ func testRecordMetrics(t *testing.T, subsystem string, stabilityLevel metrics.St
102107
csi_sidecar_operations_seconds_sum{driver_name="fake.csi.driver.io",grpc_status_code="OK",method_name="/csi.v1.Controller/ControllerGetCapabilities"} 20
103108
csi_sidecar_operations_seconds_count{driver_name="fake.csi.driver.io",grpc_status_code="OK",method_name="/csi.v1.Controller/ControllerGetCapabilities"} 1
104109
`
110+
metricName := SidecarOperationMetric
105111
if subsystem != "" {
106112
expectedMetrics = strings.Replace(expectedMetrics, "csi_sidecar", subsystem, -1)
113+
metricName = strings.Replace(metricName, "csi_sidecar", subsystem, -1)
107114
}
108115
if stabilityLevel != "" {
109116
expectedMetrics = strings.Replace(expectedMetrics, "ALPHA", string(stabilityLevel), -1)
110117
}
111118

112119
if err := testutil.GatherAndCompare(
113-
cmm.GetRegistry(), strings.NewReader(expectedMetrics)); err != nil {
120+
cmm.GetRegistry(), strings.NewReader(expectedMetrics), metricName); err != nil {
114121
t.Fatal(err)
115122
}
116123
}
@@ -151,7 +158,7 @@ func TestFixedLabels(t *testing.T) {
151158
`
152159

153160
if err := testutil.GatherAndCompare(
154-
cmm.GetRegistry(), strings.NewReader(expectedMetrics)); err != nil {
161+
cmm.GetRegistry(), strings.NewReader(expectedMetrics), SidecarOperationMetric); err != nil {
155162
t.Fatal(err)
156163
}
157164
}
@@ -200,7 +207,7 @@ func TestVaryingLabels(t *testing.T) {
200207
`
201208

202209
if err := testutil.GatherAndCompare(
203-
cmm.GetRegistry(), strings.NewReader(expectedMetrics)); err != nil {
210+
cmm.GetRegistry(), strings.NewReader(expectedMetrics), SidecarOperationMetric); err != nil {
204211
t.Fatal(err)
205212
}
206213
}
@@ -273,7 +280,7 @@ func TestTwoVaryingLabels(t *testing.T) {
273280
`
274281

275282
if err := testutil.GatherAndCompare(
276-
cmm.GetRegistry(), strings.NewReader(expectedMetrics)); err != nil {
283+
cmm.GetRegistry(), strings.NewReader(expectedMetrics), SidecarOperationMetric); err != nil {
277284
t.Fatal(err)
278285
}
279286
}
@@ -318,7 +325,7 @@ func TestVaryingLabelsBackfill(t *testing.T) {
318325
`
319326

320327
if err := testutil.GatherAndCompare(
321-
cmm.GetRegistry(), strings.NewReader(expectedMetrics)); err != nil {
328+
cmm.GetRegistry(), strings.NewReader(expectedMetrics), SidecarOperationMetric); err != nil {
322329
t.Fatal(err)
323330
}
324331
}
@@ -392,7 +399,7 @@ func TestCombinedLabels(t *testing.T) {
392399
`
393400

394401
if err := testutil.GatherAndCompare(
395-
cmm.GetRegistry(), strings.NewReader(expectedMetrics)); err != nil {
402+
cmm.GetRegistry(), strings.NewReader(expectedMetrics), SidecarOperationMetric); err != nil {
396403
t.Fatal(err)
397404
}
398405
}
@@ -431,7 +438,7 @@ func TestRecordMetrics_NoDriverName(t *testing.T) {
431438
`
432439

433440
if err := testutil.GatherAndCompare(
434-
cmm.GetRegistry(), strings.NewReader(expectedMetrics)); err != nil {
441+
cmm.GetRegistry(), strings.NewReader(expectedMetrics), SidecarOperationMetric); err != nil {
435442
t.Fatal(err)
436443
}
437444
}
@@ -469,7 +476,7 @@ func TestRecordMetrics_Negative(t *testing.T) {
469476
csi_sidecar_operations_seconds_count{driver_name="fake.csi.driver.io",grpc_status_code="InvalidArgument",method_name="myOperation"} 1
470477
`
471478
if err := testutil.GatherAndCompare(
472-
cmm.GetRegistry(), strings.NewReader(expectedMetrics)); err != nil {
479+
cmm.GetRegistry(), strings.NewReader(expectedMetrics), SidecarOperationMetric); err != nil {
473480
t.Fatal(err)
474481
}
475482
}
@@ -505,6 +512,7 @@ func TestStartMetricsEndPoint_Noop(t *testing.T) {
505512
if err != nil {
506513
t.Fatalf("Failed to parse metrics response. Response was: %+v Error: %v", resp, err)
507514
}
515+
actualMetrics := string(contentBytes)
508516

509517
expectedMetrics := `# HELP csi_sidecar_operations_seconds [ALPHA] Container Storage Interface operation duration with gRPC error code status total
510518
# TYPE csi_sidecar_operations_seconds histogram
@@ -524,10 +532,37 @@ func TestStartMetricsEndPoint_Noop(t *testing.T) {
524532
csi_sidecar_operations_seconds_bucket{driver_name="fake.csi.driver.io",grpc_status_code="OK",method_name="/csi.v1.Controller/ControllerGetCapabilities",le="+Inf"} 1
525533
csi_sidecar_operations_seconds_sum{driver_name="fake.csi.driver.io",grpc_status_code="OK",method_name="/csi.v1.Controller/ControllerGetCapabilities"} 20
526534
csi_sidecar_operations_seconds_count{driver_name="fake.csi.driver.io",grpc_status_code="OK",method_name="/csi.v1.Controller/ControllerGetCapabilities"} 1
527-
`
535+
`
528536

529-
actualMetrics := string(contentBytes)
530-
if err := VerifyMetricsMatch(expectedMetrics, actualMetrics, ""); err != nil {
537+
if err := VerifyMetricsMatch(expectedMetrics, actualMetrics, ProcessStartTimeMetric); err != nil {
531538
t.Fatalf("Metrics returned by end point do not match expectation: %v", err)
532539
}
533540
}
541+
542+
func TestProcessStartTimeMetricExist(t *testing.T) {
543+
// Arrange
544+
cmm := NewCSIMetricsManagerForSidecar(
545+
"fake.csi.driver.io" /* driverName */)
546+
operationDuration, _ := time.ParseDuration("20s")
547+
548+
// Act
549+
cmm.RecordMetrics(
550+
"/csi.v1.Controller/ControllerGetCapabilities", /* operationName */
551+
nil, /* operationErr */
552+
operationDuration /* operationDuration */)
553+
554+
// Assert
555+
metricsFamilies, err := cmm.GetRegistry().Gather()
556+
if err != nil {
557+
t.Fatalf("Error fetching metrics: %v", err)
558+
}
559+
560+
// check process_start_time_seconds exist
561+
for _, metricsFamily := range metricsFamilies {
562+
if metricsFamily.GetName() == ProcessStartTimeMetric {
563+
return
564+
}
565+
}
566+
567+
t.Fatalf("Metrics does not contain %v. Scraped content: %v", ProcessStartTimeMetric, metricsFamilies)
568+
}

0 commit comments

Comments
 (0)