5252import com .google .showcase .v1beta1 .EchoRequest ;
5353import com .google .showcase .v1beta1 .EchoResponse ;
5454import com .google .showcase .v1beta1 .EchoSettings ;
55+ import com .google .showcase .v1beta1 .GetUserRequest ;
56+ import com .google .showcase .v1beta1 .IdentityClient ;
5557import com .google .showcase .v1beta1 .it .util .TestClientInitializer ;
5658import com .google .showcase .v1beta1 .stub .EchoStub ;
5759import com .google .showcase .v1beta1 .stub .EchoStubSettings ;
@@ -152,6 +154,16 @@ void testTracing_successfulEcho_grpc() throws Exception {
152154 assertThat (
153155 attemptSpan
154156 .getAttributes ()
157+ .get (AttributeKey .stringKey (ObservabilityAttributes .RPC_SYSTEM_NAME_ATTRIBUTE )))
158+ .isEqualTo ("grpc" );
159+ assertThat (
160+ attemptSpan
161+ .getAttributes ()
162+ .get (AttributeKey .stringKey (ObservabilityAttributes .RPC_RESPONSE_STATUS_ATTRIBUTE )))
163+ .isEqualTo ("OK" );
164+ assertThat (
165+ attemptSpan
166+ .getAttributes ()
155167 .get (AttributeKey .stringKey (ObservabilityAttributes .REPO_ATTRIBUTE )))
156168 .isEqualTo (SHOWCASE_REPO );
157169 assertThat (
@@ -223,6 +235,16 @@ void testTracing_successfulEcho_httpjson() throws Exception {
223235 assertThat (
224236 attemptSpan
225237 .getAttributes ()
238+ .get (AttributeKey .stringKey (ObservabilityAttributes .RPC_SYSTEM_NAME_ATTRIBUTE )))
239+ .isEqualTo ("http" );
240+ assertThat (
241+ attemptSpan
242+ .getAttributes ()
243+ .get (AttributeKey .longKey (ObservabilityAttributes .HTTP_RESPONSE_STATUS_ATTRIBUTE )))
244+ .isEqualTo (200L );
245+ assertThat (
246+ attemptSpan
247+ .getAttributes ()
226248 .get (AttributeKey .stringKey (ObservabilityAttributes .REPO_ATTRIBUTE )))
227249 .isEqualTo (SHOWCASE_REPO );
228250 assertThat (
@@ -274,6 +296,66 @@ private long computeExpectedHttpJsonResponseSize(Message message)
274296 return jsonPayload .getBytes (StandardCharsets .UTF_8 ).length ;
275297 }
276298
299+ @ Test
300+ void testTracing_successfulIdentityGetUser_grpc () throws Exception {
301+ SpanTracerFactory tracingFactory = new SpanTracerFactory (openTelemetrySdk );
302+
303+ try (IdentityClient client = TestClientInitializer .createGrpcIdentityClientOpentelemetry (tracingFactory )) {
304+
305+ try {
306+ client .getUser (GetUserRequest .newBuilder ().setName ("users/test-user" ).build ());
307+ } catch (Exception e ) {
308+ // Ignored, the showcase server may not have this user, but trace is still
309+ // generated.
310+ }
311+
312+ List <SpanData > spans = spanExporter .getFinishedSpanItems ();
313+ assertThat (spans ).isNotEmpty ();
314+
315+ SpanData attemptSpan = spans .stream ()
316+ .filter (span -> span .getName ().equals ("google.showcase.v1beta1.Identity/GetUser" ))
317+ .findFirst ()
318+ .orElseThrow (() -> new AssertionError ("Incorrect span name" ));
319+ assertThat (
320+ attemptSpan
321+ .getAttributes ()
322+ .get (
323+ AttributeKey .stringKey (
324+ ObservabilityAttributes .DESTINATION_RESOURCE_ID_ATTRIBUTE )))
325+ .isEqualTo ("users/test-user" );
326+ }
327+ }
328+
329+ @ Test
330+ void testTracing_successfulIdentityGetUser_httpjson () throws Exception {
331+ SpanTracerFactory tracingFactory = new SpanTracerFactory (openTelemetrySdk );
332+
333+ try (IdentityClient client = TestClientInitializer .createHttpJsonIdentityClientOpentelemetry (tracingFactory )) {
334+
335+ try {
336+ client .getUser (GetUserRequest .newBuilder ().setName ("users/test-user" ).build ());
337+ } catch (Exception e ) {
338+ // Ignored, the showcase server may not have this user, but trace is still
339+ // generated.
340+ }
341+
342+ List <SpanData > spans = spanExporter .getFinishedSpanItems ();
343+ assertThat (spans ).isNotEmpty ();
344+
345+ SpanData attemptSpan = spans .stream ()
346+ .filter (span -> span .getName ().equals ("GET v1beta1/{name=users/*}" ))
347+ .findFirst ()
348+ .orElseThrow (() -> new AssertionError ("Incorrect span name" ));
349+ assertThat (
350+ attemptSpan
351+ .getAttributes ()
352+ .get (
353+ AttributeKey .stringKey (
354+ ObservabilityAttributes .DESTINATION_RESOURCE_ID_ATTRIBUTE )))
355+ .isEqualTo ("users/test-user" );
356+ }
357+ }
358+
277359 @ Test
278360 void testTracing_retry_grpc () throws Exception {
279361 final int attempts = 5 ;
@@ -424,7 +506,7 @@ void testTracing_retry_httpjson() throws Exception {
424506 assertThat (resendCounts ).containsExactlyElementsIn (expectedCounts ).inOrder ();
425507 }
426508
427- private void verifyErrorTypeAttribute ( String expectedErrorType ) {
509+ private SpanData getErrorAttribute ( ) {
428510 List <SpanData > spans = spanExporter .getFinishedSpanItems ();
429511 assertThat (spans ).isNotEmpty ();
430512
@@ -439,16 +521,11 @@ private void verifyErrorTypeAttribute(String expectedErrorType) {
439521 != null )
440522 .findFirst ()
441523 .orElseThrow (() -> new AssertionError ("Span with error.type not found" ));
442-
443- assertThat (
444- errorSpan
445- .getAttributes ()
446- .get (AttributeKey .stringKey (ObservabilityAttributes .ERROR_TYPE_ATTRIBUTE )))
447- .isEqualTo (expectedErrorType );
524+ return errorSpan ;
448525 }
449526
450527 @ Test
451- void testTracing_failedEcho_grpc_recordsErrorType () throws Exception {
528+ void testTracing_failedEcho_grpc_recordsErrorAttributes () throws Exception {
452529 SpanTracerFactory tracingFactory = new SpanTracerFactory (openTelemetrySdk );
453530
454531 ClientInterceptor interceptor =
@@ -490,52 +567,28 @@ public void sendMessage(ReqT message) {}
490567 EchoRequest echoRequest = EchoRequest .newBuilder ().build ();
491568
492569 assertThrows (UnavailableException .class , () -> client .echo (echoRequest ));
493- verifyErrorTypeAttribute ("UNAVAILABLE" );
494- }
495- }
496- @ Test
497- void testTracing_statusCodes_grpc () throws Exception {
498- SpanTracerFactory tracingFactory = new SpanTracerFactory (openTelemetrySdk );
499- EchoRequest errorRequest =
500- EchoRequest .newBuilder ()
501- .setError (
502- Status .newBuilder ().setCode (StatusCode .Code .INVALID_ARGUMENT .ordinal ()).build ())
503- .build ();
504- EchoRequest successRequest = EchoRequest .newBuilder ().setContent ("tracing-test" ).build ();
505-
506- try (EchoClient grpcClient =
507- TestClientInitializer .createGrpcEchoClientOpentelemetry (tracingFactory )) {
508-
509- grpcClient .echo (successRequest );
510- assertThrows (
511- com .google .api .gax .rpc .InvalidArgumentException .class ,
512- () -> grpcClient .echo (errorRequest ));
513-
514- List <SpanData > spans = spanExporter .getFinishedSpanItems ();
515- assertThat (spans ).hasSize (2 );
516-
517- SpanData grpcSuccessSpan = spans .get (0 );
570+ SpanData errorSpan = getErrorAttribute ();
571+ assertThat (
572+ errorSpan
573+ .getAttributes ()
574+ .get (AttributeKey .stringKey (ObservabilityAttributes .ERROR_TYPE_ATTRIBUTE )))
575+ .isEqualTo ("UNAVAILABLE" );
518576 assertThat (
519- grpcSuccessSpan
577+ errorSpan
520578 .getAttributes ()
521579 .get (
522- AttributeKey .stringKey (
523- ObservabilityAttributes .RPC_RESPONSE_STATUS_ATTRIBUTE )))
524- .isEqualTo ("OK" );
525-
526- SpanData grpcErrorSpan = spans .get (1 );
580+ AttributeKey .stringKey (ObservabilityAttributes .EXCEPTION_TYPE_ATTRIBUTE )))
581+ .isEqualTo ("com.google.api.gax.rpc.UnavailableException" );
527582 assertThat (
528- grpcErrorSpan
583+ errorSpan
529584 .getAttributes ()
530585 .get (
531- AttributeKey .stringKey (
532- ObservabilityAttributes .RPC_RESPONSE_STATUS_ATTRIBUTE )))
533- .isEqualTo ("INVALID_ARGUMENT" );
534- }
535- }
536-
586+ AttributeKey .stringKey (ObservabilityAttributes .STATUS_MESSAGE_ATTRIBUTE )))
587+ .isEqualTo ("io.grpc.StatusRuntimeException: UNAVAILABLE" );
588+ }
589+ }
537590 @ Test
538- void testTracing_failedEcho_httpjson_recordsErrorType () throws Exception {
591+ void testTracing_failedEcho_httpjson_recordsErrorAttributes () throws Exception {
539592 SpanTracerFactory tracingFactory = new SpanTracerFactory (openTelemetrySdk );
540593
541594 HttpTransport mockTransport =
@@ -625,9 +678,67 @@ public String getHeaderValue(int index) {
625678 EchoRequest echoRequest = EchoRequest .newBuilder ().build ();
626679
627680 assertThrows (UnavailableException .class , () -> client .echo (echoRequest ));
628- verifyErrorTypeAttribute ("503" );
681+ SpanData errorSpan = getErrorAttribute ();
682+ assertThat (
683+ errorSpan
684+ .getAttributes ()
685+ .get (AttributeKey .stringKey (ObservabilityAttributes .ERROR_TYPE_ATTRIBUTE )))
686+ .isEqualTo ("503" );
687+ assertThat (
688+ errorSpan
689+ .getAttributes ()
690+ .get (
691+ AttributeKey .stringKey (ObservabilityAttributes .EXCEPTION_TYPE_ATTRIBUTE )))
692+ .isEqualTo ("com.google.api.gax.rpc.UnavailableException" );
693+ assertThat (
694+ errorSpan
695+ .getAttributes ()
696+ .get (
697+ AttributeKey .stringKey (ObservabilityAttributes .STATUS_MESSAGE_ATTRIBUTE )))
698+ .isEqualTo ("Service Unavailable" );
629699 }
630700 }
701+
702+ @ Test
703+ void testTracing_statusCodes_grpc () throws Exception {
704+ SpanTracerFactory tracingFactory = new SpanTracerFactory (openTelemetrySdk );
705+ EchoRequest errorRequest = EchoRequest .newBuilder ()
706+ .setError (
707+ Status .newBuilder ().setCode (StatusCode .Code .INVALID_ARGUMENT .ordinal ()).build ())
708+ .build ();
709+ EchoRequest successRequest = EchoRequest .newBuilder ().setContent ("tracing-test" ).build ();
710+
711+ try (EchoClient grpcClient = TestClientInitializer .createGrpcEchoClientOpentelemetry (tracingFactory )) {
712+
713+ grpcClient .echo (successRequest );
714+ assertThrows (
715+ com .google .api .gax .rpc .InvalidArgumentException .class ,
716+ () -> grpcClient .echo (errorRequest ));
717+
718+ List <SpanData > spans = spanExporter .getFinishedSpanItems ();
719+ assertThat (spans ).hasSize (2 );
720+
721+ SpanData grpcSuccessSpan = spans .get (0 );
722+ assertThat (
723+ grpcSuccessSpan
724+ .getAttributes ()
725+ .get (
726+ AttributeKey .stringKey (
727+ ObservabilityAttributes .RPC_RESPONSE_STATUS_ATTRIBUTE )))
728+ .isEqualTo ("OK" );
729+
730+ SpanData grpcErrorSpan = spans .get (1 );
731+ assertThat (
732+ grpcErrorSpan
733+ .getAttributes ()
734+ .get (
735+ AttributeKey .stringKey (
736+ ObservabilityAttributes .RPC_RESPONSE_STATUS_ATTRIBUTE )))
737+ .isEqualTo ("INVALID_ARGUMENT" );
738+ }
739+ }
740+
741+ @ Test
631742 void testTracing_statusCodes_httpjson () throws Exception {
632743 SpanTracerFactory tracingFactory = new SpanTracerFactory (openTelemetrySdk );
633744 EchoRequest errorRequest =
0 commit comments