1717package io .grpc .opentelemetry ;
1818
1919import static io .grpc .ClientStreamTracer .NAME_RESOLUTION_DELAYED ;
20+ import static io .grpc .opentelemetry .internal .OpenTelemetryConstants .LOCALITY_KEY ;
2021import static io .grpc .opentelemetry .internal .OpenTelemetryConstants .METHOD_KEY ;
2122import static io .grpc .opentelemetry .internal .OpenTelemetryConstants .STATUS_KEY ;
2223import static io .grpc .opentelemetry .internal .OpenTelemetryConstants .TARGET_KEY ;
5253import io .opentelemetry .sdk .common .InstrumentationScopeInfo ;
5354import io .opentelemetry .sdk .testing .junit4 .OpenTelemetryRule ;
5455import java .io .InputStream ;
56+ import java .util .Arrays ;
5557import java .util .Map ;
5658import java .util .concurrent .TimeUnit ;
5759import java .util .concurrent .atomic .AtomicReference ;
@@ -158,8 +160,7 @@ public void setUp() throws Exception {
158160 public void testClientInterceptors () {
159161 OpenTelemetryMetricsResource resource = OpenTelemetryModule .createMetricInstruments (testMeter ,
160162 enabledMetricsMap , disableDefaultMetrics );
161- OpenTelemetryMetricsModule module =
162- new OpenTelemetryMetricsModule (fakeClock .getStopwatchSupplier (), resource );
163+ OpenTelemetryMetricsModule module = newOpenTelemetryMetricsModule (resource );
163164 grpcServerRule .getServiceRegistry ().addService (
164165 ServerServiceDefinition .builder ("package1.service2" ).addMethod (
165166 method , new ServerCallHandler <String , String >() {
@@ -215,8 +216,7 @@ public void clientBasicMetrics() {
215216 String target = "target:///" ;
216217 OpenTelemetryMetricsResource resource = OpenTelemetryModule .createMetricInstruments (testMeter ,
217218 enabledMetricsMap , disableDefaultMetrics );
218- OpenTelemetryMetricsModule module =
219- new OpenTelemetryMetricsModule (fakeClock .getStopwatchSupplier (), resource );
219+ OpenTelemetryMetricsModule module = newOpenTelemetryMetricsModule (resource );
220220 OpenTelemetryMetricsModule .CallAttemptsTracerFactory callAttemptsTracerFactory =
221221 new CallAttemptsTracerFactory (module , target , method .getFullMethodName ());
222222 Metadata headers = new Metadata ();
@@ -243,6 +243,8 @@ public void clientBasicMetrics() {
243243 .hasAttributes (attributes )
244244 .hasValue (1 ))));
245245
246+ tracer .addOptionalLabel ("grpc.lb.locality" , "should-be-ignored" );
247+
246248 fakeClock .forwardTime (30 , TimeUnit .MILLISECONDS );
247249 tracer .outboundHeaders ();
248250
@@ -353,8 +355,7 @@ public void recordAttemptMetrics() {
353355 String target = "dns:///example.com" ;
354356 OpenTelemetryMetricsResource resource = OpenTelemetryModule .createMetricInstruments (testMeter ,
355357 enabledMetricsMap , disableDefaultMetrics );
356- OpenTelemetryMetricsModule module =
357- new OpenTelemetryMetricsModule (fakeClock .getStopwatchSupplier (), resource );
358+ OpenTelemetryMetricsModule module = newOpenTelemetryMetricsModule (resource );
358359 OpenTelemetryMetricsModule .CallAttemptsTracerFactory callAttemptsTracerFactory =
359360 new OpenTelemetryMetricsModule .CallAttemptsTracerFactory (module , target ,
360361 method .getFullMethodName ());
@@ -779,8 +780,7 @@ public void clientStreamNeverCreatedStillRecordMetrics() {
779780 String target = "dns:///foo.example.com" ;
780781 OpenTelemetryMetricsResource resource = OpenTelemetryModule .createMetricInstruments (testMeter ,
781782 enabledMetricsMap , disableDefaultMetrics );
782- OpenTelemetryMetricsModule module =
783- new OpenTelemetryMetricsModule (fakeClock .getStopwatchSupplier (), resource );
783+ OpenTelemetryMetricsModule module = newOpenTelemetryMetricsModule (resource );
784784 OpenTelemetryMetricsModule .CallAttemptsTracerFactory callAttemptsTracerFactory =
785785 new OpenTelemetryMetricsModule .CallAttemptsTracerFactory (module , target ,
786786 method .getFullMethodName ());
@@ -880,11 +880,142 @@ public void clientStreamNeverCreatedStillRecordMetrics() {
880880 }
881881
882882 @ Test
883- public void serverBasicMetrics () {
883+ public void clientLocalityMetrics_present () {
884+ String target = "target:///" ;
885+ OpenTelemetryMetricsResource resource = OpenTelemetryModule .createMetricInstruments (testMeter ,
886+ enabledMetricsMap , disableDefaultMetrics );
887+ OpenTelemetryMetricsModule module = new OpenTelemetryMetricsModule (
888+ fakeClock .getStopwatchSupplier (), resource , Arrays .asList ("grpc.lb.locality" ));
889+ OpenTelemetryMetricsModule .CallAttemptsTracerFactory callAttemptsTracerFactory =
890+ new CallAttemptsTracerFactory (module , target , method .getFullMethodName ());
891+
892+ ClientStreamTracer tracer =
893+ callAttemptsTracerFactory .newClientStreamTracer (STREAM_INFO , new Metadata ());
894+ tracer .addOptionalLabel ("grpc.lb.foo" , "unimportant" );
895+ tracer .addOptionalLabel ("grpc.lb.locality" , "should-be-overwritten" );
896+ tracer .addOptionalLabel ("grpc.lb.locality" , "the-moon" );
897+ tracer .addOptionalLabel ("grpc.lb.foo" , "thats-no-moon" );
898+ tracer .streamClosed (Status .OK );
899+ callAttemptsTracerFactory .callEnded (Status .OK );
900+
901+ io .opentelemetry .api .common .Attributes attributes = io .opentelemetry .api .common .Attributes .of (
902+ TARGET_KEY , target ,
903+ METHOD_KEY , method .getFullMethodName ());
904+
905+ io .opentelemetry .api .common .Attributes clientAttributes
906+ = io .opentelemetry .api .common .Attributes .of (
907+ TARGET_KEY , target ,
908+ METHOD_KEY , method .getFullMethodName (),
909+ STATUS_KEY , Status .Code .OK .toString ());
910+
911+ io .opentelemetry .api .common .Attributes clientAttributesWithLocality
912+ = clientAttributes .toBuilder ()
913+ .put (LOCALITY_KEY , "the-moon" )
914+ .build ();
915+
916+ assertThat (openTelemetryTesting .getMetrics ())
917+ .satisfiesExactlyInAnyOrder (
918+ metric ->
919+ assertThat (metric )
920+ .hasName (CLIENT_ATTEMPT_COUNT_INSTRUMENT_NAME )
921+ .hasLongSumSatisfying (
922+ longSum -> longSum .hasPointsSatisfying (
923+ point -> point .hasAttributes (attributes ))),
924+ metric ->
925+ assertThat (metric )
926+ .hasName (CLIENT_ATTEMPT_DURATION_INSTRUMENT_NAME )
927+ .hasHistogramSatisfying (
928+ histogram -> histogram .hasPointsSatisfying (
929+ point -> point .hasAttributes (clientAttributesWithLocality ))),
930+ metric ->
931+ assertThat (metric )
932+ .hasName (CLIENT_ATTEMPT_SENT_TOTAL_COMPRESSED_MESSAGE_SIZE )
933+ .hasHistogramSatisfying (
934+ histogram -> histogram .hasPointsSatisfying (
935+ point -> point .hasAttributes (clientAttributesWithLocality ))),
936+ metric ->
937+ assertThat (metric )
938+ .hasName (CLIENT_ATTEMPT_RECV_TOTAL_COMPRESSED_MESSAGE_SIZE )
939+ .hasHistogramSatisfying (
940+ histogram -> histogram .hasPointsSatisfying (
941+ point -> point .hasAttributes (clientAttributesWithLocality ))),
942+ metric ->
943+ assertThat (metric )
944+ .hasName (CLIENT_CALL_DURATION )
945+ .hasHistogramSatisfying (
946+ histogram -> histogram .hasPointsSatisfying (
947+ point -> point .hasAttributes (clientAttributes ))));
948+ }
949+
950+ @ Test
951+ public void clientLocalityMetrics_missing () {
952+ String target = "target:///" ;
884953 OpenTelemetryMetricsResource resource = OpenTelemetryModule .createMetricInstruments (testMeter ,
885954 enabledMetricsMap , disableDefaultMetrics );
886955 OpenTelemetryMetricsModule module = new OpenTelemetryMetricsModule (
887- fakeClock .getStopwatchSupplier (), resource );
956+ fakeClock .getStopwatchSupplier (), resource , Arrays .asList ("grpc.lb.locality" ));
957+ OpenTelemetryMetricsModule .CallAttemptsTracerFactory callAttemptsTracerFactory =
958+ new CallAttemptsTracerFactory (module , target , method .getFullMethodName ());
959+
960+ ClientStreamTracer tracer =
961+ callAttemptsTracerFactory .newClientStreamTracer (STREAM_INFO , new Metadata ());
962+ tracer .streamClosed (Status .OK );
963+ callAttemptsTracerFactory .callEnded (Status .OK );
964+
965+ io .opentelemetry .api .common .Attributes attributes = io .opentelemetry .api .common .Attributes .of (
966+ TARGET_KEY , target ,
967+ METHOD_KEY , method .getFullMethodName ());
968+
969+ io .opentelemetry .api .common .Attributes clientAttributes
970+ = io .opentelemetry .api .common .Attributes .of (
971+ TARGET_KEY , target ,
972+ METHOD_KEY , method .getFullMethodName (),
973+ STATUS_KEY , Status .Code .OK .toString ());
974+
975+ io .opentelemetry .api .common .Attributes clientAttributesWithLocality
976+ = clientAttributes .toBuilder ()
977+ .put (LOCALITY_KEY , "unknown" )
978+ .build ();
979+
980+ assertThat (openTelemetryTesting .getMetrics ())
981+ .satisfiesExactlyInAnyOrder (
982+ metric ->
983+ assertThat (metric )
984+ .hasName (CLIENT_ATTEMPT_COUNT_INSTRUMENT_NAME )
985+ .hasLongSumSatisfying (
986+ longSum -> longSum .hasPointsSatisfying (
987+ point -> point .hasAttributes (attributes ))),
988+ metric ->
989+ assertThat (metric )
990+ .hasName (CLIENT_ATTEMPT_DURATION_INSTRUMENT_NAME )
991+ .hasHistogramSatisfying (
992+ histogram -> histogram .hasPointsSatisfying (
993+ point -> point .hasAttributes (clientAttributesWithLocality ))),
994+ metric ->
995+ assertThat (metric )
996+ .hasName (CLIENT_ATTEMPT_SENT_TOTAL_COMPRESSED_MESSAGE_SIZE )
997+ .hasHistogramSatisfying (
998+ histogram -> histogram .hasPointsSatisfying (
999+ point -> point .hasAttributes (clientAttributesWithLocality ))),
1000+ metric ->
1001+ assertThat (metric )
1002+ .hasName (CLIENT_ATTEMPT_RECV_TOTAL_COMPRESSED_MESSAGE_SIZE )
1003+ .hasHistogramSatisfying (
1004+ histogram -> histogram .hasPointsSatisfying (
1005+ point -> point .hasAttributes (clientAttributesWithLocality ))),
1006+ metric ->
1007+ assertThat (metric )
1008+ .hasName (CLIENT_CALL_DURATION )
1009+ .hasHistogramSatisfying (
1010+ histogram -> histogram .hasPointsSatisfying (
1011+ point -> point .hasAttributes (clientAttributes ))));
1012+ }
1013+
1014+ @ Test
1015+ public void serverBasicMetrics () {
1016+ OpenTelemetryMetricsResource resource = OpenTelemetryModule .createMetricInstruments (testMeter ,
1017+ enabledMetricsMap , disableDefaultMetrics );
1018+ OpenTelemetryMetricsModule module = newOpenTelemetryMetricsModule (resource );
8881019 ServerStreamTracer .Factory tracerFactory = module .getServerTracerFactory ();
8891020 ServerStreamTracer tracer =
8901021 tracerFactory .newServerStreamTracer (method .getFullMethodName (), new Metadata ());
@@ -994,6 +1125,12 @@ public void serverBasicMetrics() {
9941125
9951126 }
9961127
1128+ private OpenTelemetryMetricsModule newOpenTelemetryMetricsModule (
1129+ OpenTelemetryMetricsResource resource ) {
1130+ return new OpenTelemetryMetricsModule (
1131+ fakeClock .getStopwatchSupplier (), resource , Arrays .asList ());
1132+ }
1133+
9971134 static class CallInfo <ReqT , RespT > extends ServerCallInfo <ReqT , RespT > {
9981135 private final MethodDescriptor <ReqT , RespT > methodDescriptor ;
9991136 private final Attributes attributes ;
0 commit comments