35
35
import com .google .api .client .http .javanet .NetHttpTransport ;
36
36
import com .google .api .core .ApiFuture ;
37
37
import com .google .api .gax .core .NoCredentialsProvider ;
38
+ import com .google .api .gax .grpc .InstantiatingGrpcChannelProvider ;
38
39
import com .google .api .gax .retrying .RetrySettings ;
39
40
import com .google .api .gax .rpc .InvalidArgumentException ;
40
41
import com .google .api .gax .rpc .StatusCode .Code ;
69
70
import io .opentelemetry .sdk .metrics .data .MetricData ;
70
71
import io .opentelemetry .sdk .metrics .data .PointData ;
71
72
import io .opentelemetry .sdk .testing .exporter .InMemoryMetricReader ;
73
+ import java .io .IOException ;
72
74
import java .util .ArrayList ;
75
+ import java .util .HashMap ;
73
76
import java .util .List ;
74
77
import java .util .Map ;
75
78
import java .util .Optional ;
@@ -100,7 +103,7 @@ class ITOtelMetrics {
100
103
private static final String OPERATION_COUNT = SERVICE_NAME + "/operation_count" ;
101
104
private static final String ATTEMPT_LATENCY = SERVICE_NAME + "/attempt_latency" ;
102
105
private static final String OPERATION_LATENCY = SERVICE_NAME + "/operation_latency" ;
103
- private static final int NUM_METRICS = 4 ;
106
+ private static final int NUM_DEFAULT_METRICS = 4 ;
104
107
private static final int NUM_COLLECTION_FLUSH_ATTEMPTS = 10 ;
105
108
private InMemoryMetricReader inMemoryMetricReader ;
106
109
private EchoClient grpcClient ;
@@ -272,16 +275,22 @@ private void verifyStatusAttribute(
272
275
}
273
276
}
274
277
278
+ /** Uses the default InMemoryMetricReader configured for showcase tests. */
279
+ private List <MetricData > getMetricDataList () throws InterruptedException {
280
+ return getMetricDataList (inMemoryMetricReader );
281
+ }
282
+
275
283
/**
276
- * Attempts to retrieve the metrics from the InMemoryMetricsReader. Sleep every second for at most
277
- * 10s to try and retrieve all the metrics available. If it is unable to retrieve all the metrics,
278
- * fail the test.
284
+ * Attempts to retrieve the metrics from a custom InMemoryMetricsReader. Sleep every second for at
285
+ * most 10s to try and retrieve all the metrics available. If it is unable to retrieve all the
286
+ * metrics, fail the test.
279
287
*/
280
- private List <MetricData > getMetricDataList () throws InterruptedException {
288
+ private List <MetricData > getMetricDataList (InMemoryMetricReader metricReader )
289
+ throws InterruptedException {
281
290
for (int i = 0 ; i < NUM_COLLECTION_FLUSH_ATTEMPTS ; i ++) {
282
291
Thread .sleep (1000L );
283
- List <MetricData > metricData = new ArrayList <>(inMemoryMetricReader .collectAllMetrics ());
284
- if (metricData .size () == NUM_METRICS ) {
292
+ List <MetricData > metricData = new ArrayList <>(metricReader .collectAllMetrics ());
293
+ if (metricData .size () == NUM_DEFAULT_METRICS ) {
285
294
return metricData ;
286
295
}
287
296
}
@@ -296,19 +305,19 @@ void testGrpc_operationSucceeded_recordsMetrics() throws InterruptedException {
296
305
EchoRequest .newBuilder ().setContent ("test_grpc_operation_succeeded" ).build ();
297
306
grpcClient .echo (echoRequest );
298
307
299
- List <MetricData > metricDataList = getMetricDataList ();
300
- verifyPointDataSum (metricDataList , attemptCount );
308
+ List <MetricData > actualMetricDataList = getMetricDataList ();
309
+ verifyPointDataSum (actualMetricDataList , attemptCount );
301
310
302
- Map <String , String > attributeMapping =
311
+ Map <String , String > expectedAttributes =
303
312
ImmutableMap .of (
304
313
MetricsTracer .METHOD_NAME_ATTRIBUTE ,
305
314
"Echo.Echo" ,
306
315
MetricsTracer .LANGUAGE_ATTRIBUTE ,
307
316
MetricsTracer .DEFAULT_LANGUAGE );
308
- verifyDefaultMetricsAttributes (metricDataList , attributeMapping );
317
+ verifyDefaultMetricsAttributes (actualMetricDataList , expectedAttributes );
309
318
310
319
List <StatusCount > statusCountList = ImmutableList .of (new StatusCount (Code .OK ));
311
- verifyStatusAttribute (metricDataList , statusCountList );
320
+ verifyStatusAttribute (actualMetricDataList , statusCountList );
312
321
}
313
322
314
323
@ Disabled ("https://github.com/googleapis/sdk-platform-java/issues/2503" )
@@ -319,19 +328,19 @@ void testHttpJson_operationSucceeded_recordsMetrics() throws InterruptedExceptio
319
328
EchoRequest .newBuilder ().setContent ("test_http_operation_succeeded" ).build ();
320
329
httpClient .echo (echoRequest );
321
330
322
- List <MetricData > metricDataList = getMetricDataList ();
323
- verifyPointDataSum (metricDataList , attemptCount );
331
+ List <MetricData > actualMetricDataList = getMetricDataList ();
332
+ verifyPointDataSum (actualMetricDataList , attemptCount );
324
333
325
- Map <String , String > attributeMapping =
334
+ Map <String , String > expectedAttributes =
326
335
ImmutableMap .of (
327
336
MetricsTracer .METHOD_NAME_ATTRIBUTE ,
328
337
"google.showcase.v1beta1.Echo/Echo" ,
329
338
MetricsTracer .LANGUAGE_ATTRIBUTE ,
330
339
MetricsTracer .DEFAULT_LANGUAGE );
331
- verifyDefaultMetricsAttributes (metricDataList , attributeMapping );
340
+ verifyDefaultMetricsAttributes (actualMetricDataList , expectedAttributes );
332
341
333
342
List <StatusCount > statusCountList = ImmutableList .of (new StatusCount (Code .OK ));
334
- verifyStatusAttribute (metricDataList , statusCountList );
343
+ verifyStatusAttribute (actualMetricDataList , statusCountList );
335
344
}
336
345
337
346
@ Test
@@ -349,19 +358,19 @@ void testGrpc_operationCancelled_recordsMetrics() throws Exception {
349
358
Thread .sleep (1000 );
350
359
blockResponseApiFuture .cancel (true );
351
360
352
- List <MetricData > metricDataList = getMetricDataList ();
353
- verifyPointDataSum (metricDataList , attemptCount );
361
+ List <MetricData > actualMetricDataList = getMetricDataList ();
362
+ verifyPointDataSum (actualMetricDataList , attemptCount );
354
363
355
- Map <String , String > attributeMapping =
364
+ Map <String , String > expectedAttributes =
356
365
ImmutableMap .of (
357
366
MetricsTracer .METHOD_NAME_ATTRIBUTE ,
358
367
"Echo.Block" ,
359
368
MetricsTracer .LANGUAGE_ATTRIBUTE ,
360
369
MetricsTracer .DEFAULT_LANGUAGE );
361
- verifyDefaultMetricsAttributes (metricDataList , attributeMapping );
370
+ verifyDefaultMetricsAttributes (actualMetricDataList , expectedAttributes );
362
371
363
372
List <StatusCount > statusCountList = ImmutableList .of (new StatusCount (Code .CANCELLED ));
364
- verifyStatusAttribute (metricDataList , statusCountList );
373
+ verifyStatusAttribute (actualMetricDataList , statusCountList );
365
374
}
366
375
367
376
@ Disabled ("https://github.com/googleapis/sdk-platform-java/issues/2503" )
@@ -377,19 +386,19 @@ void testHttpJson_operationCancelled_recordsMetrics() throws Exception {
377
386
Thread .sleep (1000 );
378
387
blockResponseApiFuture .cancel (true );
379
388
380
- List <MetricData > metricDataList = getMetricDataList ();
381
- verifyPointDataSum (metricDataList , attemptCount );
389
+ List <MetricData > actualMetricDataList = getMetricDataList ();
390
+ verifyPointDataSum (actualMetricDataList , attemptCount );
382
391
383
- Map <String , String > attributeMapping =
392
+ Map <String , String > expectedAttributes =
384
393
ImmutableMap .of (
385
394
MetricsTracer .METHOD_NAME_ATTRIBUTE ,
386
395
"google.showcase.v1beta1.Echo/Block" ,
387
396
MetricsTracer .LANGUAGE_ATTRIBUTE ,
388
397
MetricsTracer .DEFAULT_LANGUAGE );
389
- verifyDefaultMetricsAttributes (metricDataList , attributeMapping );
398
+ verifyDefaultMetricsAttributes (actualMetricDataList , expectedAttributes );
390
399
391
400
List <StatusCount > statusCountList = ImmutableList .of (new StatusCount (Code .CANCELLED ));
392
- verifyStatusAttribute (metricDataList , statusCountList );
401
+ verifyStatusAttribute (actualMetricDataList , statusCountList );
393
402
}
394
403
395
404
@ Test
@@ -406,19 +415,19 @@ void testGrpc_operationFailed_recordsMetrics() throws InterruptedException {
406
415
ApiFuture <BlockResponse > blockResponseApiFuture = blockCallable .futureCall (blockRequest );
407
416
assertThrows (ExecutionException .class , blockResponseApiFuture ::get );
408
417
409
- List <MetricData > metricDataList = getMetricDataList ();
410
- verifyPointDataSum (metricDataList , attemptCount );
418
+ List <MetricData > actualMetricDataList = getMetricDataList ();
419
+ verifyPointDataSum (actualMetricDataList , attemptCount );
411
420
412
- Map <String , String > attributeMapping =
421
+ Map <String , String > expectedAttributes =
413
422
ImmutableMap .of (
414
423
MetricsTracer .METHOD_NAME_ATTRIBUTE ,
415
424
"Echo.Block" ,
416
425
MetricsTracer .LANGUAGE_ATTRIBUTE ,
417
426
MetricsTracer .DEFAULT_LANGUAGE );
418
- verifyDefaultMetricsAttributes (metricDataList , attributeMapping );
427
+ verifyDefaultMetricsAttributes (actualMetricDataList , expectedAttributes );
419
428
420
429
List <StatusCount > statusCountList = ImmutableList .of (new StatusCount (statusCode ));
421
- verifyStatusAttribute (metricDataList , statusCountList );
430
+ verifyStatusAttribute (actualMetricDataList , statusCountList );
422
431
}
423
432
424
433
@ Disabled ("https://github.com/googleapis/sdk-platform-java/issues/2503" )
@@ -436,19 +445,19 @@ void testHttpJson_operationFailed_recordsMetrics() throws InterruptedException {
436
445
ApiFuture <BlockResponse > blockResponseApiFuture = blockCallable .futureCall (blockRequest );
437
446
assertThrows (ExecutionException .class , blockResponseApiFuture ::get );
438
447
439
- List <MetricData > metricDataList = getMetricDataList ();
440
- verifyPointDataSum (metricDataList , attemptCount );
448
+ List <MetricData > actualMetricDataList = getMetricDataList ();
449
+ verifyPointDataSum (actualMetricDataList , attemptCount );
441
450
442
- Map <String , String > attributeMapping =
451
+ Map <String , String > expectedAttributes =
443
452
ImmutableMap .of (
444
453
MetricsTracer .METHOD_NAME_ATTRIBUTE ,
445
454
"google.showcase.v1beta1.Echo/Block" ,
446
455
MetricsTracer .LANGUAGE_ATTRIBUTE ,
447
456
MetricsTracer .DEFAULT_LANGUAGE );
448
- verifyDefaultMetricsAttributes (metricDataList , attributeMapping );
457
+ verifyDefaultMetricsAttributes (actualMetricDataList , expectedAttributes );
449
458
450
459
List <StatusCount > statusCountList = ImmutableList .of (new StatusCount (statusCode ));
451
- verifyStatusAttribute (metricDataList , statusCountList );
460
+ verifyStatusAttribute (actualMetricDataList , statusCountList );
452
461
}
453
462
454
463
@ Test
@@ -499,19 +508,19 @@ void testGrpc_attemptFailedRetriesExhausted_recordsMetrics() throws Exception {
499
508
500
509
assertThrows (UnavailableException .class , () -> grpcClient .echo (echoRequest ));
501
510
502
- List <MetricData > metricDataList = getMetricDataList ();
503
- verifyPointDataSum (metricDataList , attemptCount );
511
+ List <MetricData > actualMetricDataList = getMetricDataList ();
512
+ verifyPointDataSum (actualMetricDataList , attemptCount );
504
513
505
- Map <String , String > attributeMapping =
514
+ Map <String , String > expectedAttributes =
506
515
ImmutableMap .of (
507
516
MetricsTracer .METHOD_NAME_ATTRIBUTE ,
508
517
"Echo.Echo" ,
509
518
MetricsTracer .LANGUAGE_ATTRIBUTE ,
510
519
MetricsTracer .DEFAULT_LANGUAGE );
511
- verifyDefaultMetricsAttributes (metricDataList , attributeMapping );
520
+ verifyDefaultMetricsAttributes (actualMetricDataList , expectedAttributes );
512
521
513
522
List <StatusCount > statusCountList = ImmutableList .of (new StatusCount (statusCode , 3 ));
514
- verifyStatusAttribute (metricDataList , statusCountList );
523
+ verifyStatusAttribute (actualMetricDataList , statusCountList );
515
524
516
525
grpcClient .close ();
517
526
grpcClient .awaitTermination (TestClientInitializer .AWAIT_TERMINATION_SECONDS , TimeUnit .SECONDS );
@@ -567,19 +576,19 @@ void testHttpJson_attemptFailedRetriesExhausted_recordsMetrics() throws Exceptio
567
576
568
577
assertThrows (UnavailableException .class , () -> httpClient .echo (echoRequest ));
569
578
570
- List <MetricData > metricDataList = getMetricDataList ();
571
- verifyPointDataSum (metricDataList , attemptCount );
579
+ List <MetricData > actualMetricDataList = getMetricDataList ();
580
+ verifyPointDataSum (actualMetricDataList , attemptCount );
572
581
573
- Map <String , String > attributeMapping =
582
+ Map <String , String > expectedAttributes =
574
583
ImmutableMap .of (
575
584
MetricsTracer .METHOD_NAME_ATTRIBUTE ,
576
585
"google.showcase.v1beta1.Echo/Echo" ,
577
586
MetricsTracer .LANGUAGE_ATTRIBUTE ,
578
587
MetricsTracer .DEFAULT_LANGUAGE );
579
- verifyDefaultMetricsAttributes (metricDataList , attributeMapping );
588
+ verifyDefaultMetricsAttributes (actualMetricDataList , expectedAttributes );
580
589
581
590
List <StatusCount > statusCountList = ImmutableList .of (new StatusCount (statusCode , 3 ));
582
- verifyStatusAttribute (metricDataList , statusCountList );
591
+ verifyStatusAttribute (actualMetricDataList , statusCountList );
583
592
584
593
httpClient .close ();
585
594
httpClient .awaitTermination (TestClientInitializer .AWAIT_TERMINATION_SECONDS , TimeUnit .SECONDS );
@@ -597,19 +606,19 @@ void testGrpc_attemptPermanentFailure_recordsMetrics() throws InterruptedExcepti
597
606
598
607
assertThrows (InvalidArgumentException .class , () -> grpcClient .block (blockRequest ));
599
608
600
- List <MetricData > metricDataList = getMetricDataList ();
601
- verifyPointDataSum (metricDataList , attemptCount );
609
+ List <MetricData > actualMetricDataList = getMetricDataList ();
610
+ verifyPointDataSum (actualMetricDataList , attemptCount );
602
611
603
- Map <String , String > attributeMapping =
612
+ Map <String , String > expectedAttributes =
604
613
ImmutableMap .of (
605
614
MetricsTracer .METHOD_NAME_ATTRIBUTE ,
606
615
"Echo.Block" ,
607
616
MetricsTracer .LANGUAGE_ATTRIBUTE ,
608
617
MetricsTracer .DEFAULT_LANGUAGE );
609
- verifyDefaultMetricsAttributes (metricDataList , attributeMapping );
618
+ verifyDefaultMetricsAttributes (actualMetricDataList , expectedAttributes );
610
619
611
620
List <StatusCount > statusCountList = ImmutableList .of (new StatusCount (statusCode ));
612
- verifyStatusAttribute (metricDataList , statusCountList );
621
+ verifyStatusAttribute (actualMetricDataList , statusCountList );
613
622
}
614
623
615
624
@ Disabled ("https://github.com/googleapis/sdk-platform-java/issues/2503" )
@@ -625,19 +634,19 @@ void testHttpJson_attemptPermanentFailure_recordsMetrics() throws InterruptedExc
625
634
626
635
assertThrows (InvalidArgumentException .class , () -> httpClient .block (blockRequest ));
627
636
628
- List <MetricData > metricDataList = getMetricDataList ();
629
- verifyPointDataSum (metricDataList , attemptCount );
637
+ List <MetricData > actualMetricDataList = getMetricDataList ();
638
+ verifyPointDataSum (actualMetricDataList , attemptCount );
630
639
631
- Map <String , String > attributeMapping =
640
+ Map <String , String > expectedAttributes =
632
641
ImmutableMap .of (
633
642
MetricsTracer .METHOD_NAME_ATTRIBUTE ,
634
643
"google.showcase.v1beta1.Echo/Block" ,
635
644
MetricsTracer .LANGUAGE_ATTRIBUTE ,
636
645
MetricsTracer .DEFAULT_LANGUAGE );
637
- verifyDefaultMetricsAttributes (metricDataList , attributeMapping );
646
+ verifyDefaultMetricsAttributes (actualMetricDataList , expectedAttributes );
638
647
639
648
List <StatusCount > statusCountList = ImmutableList .of (new StatusCount (statusCode ));
640
- verifyStatusAttribute (metricDataList , statusCountList );
649
+ verifyStatusAttribute (actualMetricDataList , statusCountList );
641
650
}
642
651
643
652
@ Test
@@ -694,20 +703,20 @@ void testGrpc_multipleFailedAttempts_successfulOperation() throws Exception {
694
703
695
704
grpcClient .block (blockRequest );
696
705
697
- List <MetricData > metricDataList = getMetricDataList ();
698
- verifyPointDataSum (metricDataList , attemptCount );
706
+ List <MetricData > actualMetricDataList = getMetricDataList ();
707
+ verifyPointDataSum (actualMetricDataList , attemptCount );
699
708
700
- Map <String , String > attributeMapping =
709
+ Map <String , String > expectedAttributes =
701
710
ImmutableMap .of (
702
711
MetricsTracer .METHOD_NAME_ATTRIBUTE ,
703
712
"Echo.Block" ,
704
713
MetricsTracer .LANGUAGE_ATTRIBUTE ,
705
714
MetricsTracer .DEFAULT_LANGUAGE );
706
- verifyDefaultMetricsAttributes (metricDataList , attributeMapping );
715
+ verifyDefaultMetricsAttributes (actualMetricDataList , expectedAttributes );
707
716
708
717
List <StatusCount > statusCountList =
709
718
ImmutableList .of (new StatusCount (Code .DEADLINE_EXCEEDED , 2 ), new StatusCount (Code .OK ));
710
- verifyStatusAttribute (metricDataList , statusCountList );
719
+ verifyStatusAttribute (actualMetricDataList , statusCountList );
711
720
712
721
grpcClient .close ();
713
722
grpcClient .awaitTermination (TestClientInitializer .AWAIT_TERMINATION_SECONDS , TimeUnit .SECONDS );
@@ -764,18 +773,86 @@ void testHttpJson_multipleFailedAttempts_successfulOperation() throws Exception
764
773
765
774
grpcClient .block (blockRequest );
766
775
767
- List <MetricData > metricDataList = getMetricDataList ();
768
- verifyPointDataSum (metricDataList , attemptCount );
776
+ List <MetricData > actualMetricDataList = getMetricDataList ();
777
+ verifyPointDataSum (actualMetricDataList , attemptCount );
769
778
770
- Map <String , String > attributeMapping =
779
+ Map <String , String > expectedAttributes =
771
780
ImmutableMap .of (
772
781
MetricsTracer .METHOD_NAME_ATTRIBUTE ,
773
782
"google.showcase.v1beta1.Echo/Block" ,
774
783
MetricsTracer .LANGUAGE_ATTRIBUTE ,
775
784
MetricsTracer .DEFAULT_LANGUAGE );
776
- verifyDefaultMetricsAttributes (metricDataList , attributeMapping );
785
+ verifyDefaultMetricsAttributes (actualMetricDataList , expectedAttributes );
777
786
778
787
httpClient .close ();
779
788
httpClient .awaitTermination (TestClientInitializer .AWAIT_TERMINATION_SECONDS , TimeUnit .SECONDS );
780
789
}
790
+
791
+ @ Test
792
+ void recordsCustomAttributes () throws InterruptedException , IOException {
793
+ InstantiatingGrpcChannelProvider channelProvider =
794
+ EchoSettings .defaultGrpcTransportProviderBuilder ()
795
+ .setChannelConfigurator (ManagedChannelBuilder ::usePlaintext )
796
+ .setAttemptDirectPathXds ()
797
+ .build ();
798
+
799
+ // Add custom attributes to be added as client level attributes
800
+ Map <String , String > customAttributes = new HashMap <>();
801
+ String directpathEnabled = "directpath_enabled" ;
802
+ customAttributes .put (directpathEnabled , String .valueOf (channelProvider .canUseDirectPath ()));
803
+ String directpathXdsEnabled = "directpathxds_enabled" ;
804
+ customAttributes .put (
805
+ directpathXdsEnabled , String .valueOf (channelProvider .isDirectPathXdsEnabled ()));
806
+ String randomAttributeKey1 = "testing" ;
807
+ String randomAttributeValue1 = "showcase" ;
808
+ String randomAttributeKey2 = "hello" ;
809
+ String randomAttributeValue2 = "world" ;
810
+ customAttributes .put (randomAttributeKey1 , randomAttributeValue1 );
811
+ customAttributes .put (randomAttributeKey2 , randomAttributeValue2 );
812
+
813
+ InMemoryMetricReader inMemoryMetricReader = InMemoryMetricReader .create ();
814
+ OpenTelemetryMetricsRecorder otelMetricsRecorder =
815
+ createOtelMetricsRecorder (inMemoryMetricReader );
816
+ MetricsTracerFactory metricsTracerFactory =
817
+ new MetricsTracerFactory (otelMetricsRecorder , customAttributes );
818
+
819
+ EchoSettings grpcEchoSettings =
820
+ EchoSettings .newBuilder ()
821
+ .setCredentialsProvider (NoCredentialsProvider .create ())
822
+ .setTransportChannelProvider (channelProvider )
823
+ .setEndpoint (TestClientInitializer .DEFAULT_GRPC_ENDPOINT )
824
+ .build ();
825
+
826
+ EchoStubSettings echoStubSettings =
827
+ (EchoStubSettings )
828
+ grpcEchoSettings
829
+ .getStubSettings ()
830
+ .toBuilder ()
831
+ .setTracerFactory (metricsTracerFactory )
832
+ .build ();
833
+ EchoStub stub = echoStubSettings .createStub ();
834
+ EchoClient grpcClient = EchoClient .create (stub );
835
+
836
+ EchoRequest echoRequest = EchoRequest .newBuilder ().setContent ("content" ).build ();
837
+ grpcClient .echo (echoRequest );
838
+
839
+ List <MetricData > actualMetricDataList = getMetricDataList (inMemoryMetricReader );
840
+ Map <String , String > expectedAttributes =
841
+ ImmutableMap .of (
842
+ MetricsTracer .METHOD_NAME_ATTRIBUTE ,
843
+ "Echo.Echo" ,
844
+ MetricsTracer .LANGUAGE_ATTRIBUTE ,
845
+ MetricsTracer .DEFAULT_LANGUAGE ,
846
+ directpathEnabled ,
847
+ "false" ,
848
+ directpathXdsEnabled ,
849
+ "true" ,
850
+ randomAttributeKey1 ,
851
+ randomAttributeValue1 ,
852
+ randomAttributeKey2 ,
853
+ randomAttributeValue2 );
854
+ verifyDefaultMetricsAttributes (actualMetricDataList , expectedAttributes );
855
+
856
+ inMemoryMetricReader .close ();
857
+ }
781
858
}
0 commit comments