4242import io .opentelemetry .api .OpenTelemetry ;
4343import io .opentelemetry .api .baggage .Baggage ;
4444import io .opentelemetry .api .common .AttributesBuilder ;
45+ import io .opentelemetry .api .logs .Severity ;
4546import io .opentelemetry .api .trace .Span ;
4647import io .opentelemetry .api .trace .StatusCode ;
4748import io .opentelemetry .api .trace .Tracer ;
@@ -68,7 +69,7 @@ final class OpenTelemetryTracingModule {
6869 private static final AtomicIntegerFieldUpdater <ServerTracer > streamClosedUpdater ;
6970
7071 /*
71- * When using Atomic*FieldUpdater, some Samsung Android 5.0.x devices encounter a bug in their JDK
72+ * When using Atomic*FieldUpdater, some Samsung Android 5.0.x devices encounter a bug in their JDKimport io.opentelemetry.api.logs.Severity;logsb
7273 * reflection API that triggers a NoSuchFieldException. When this occurs, we fallback to
7374 * (potentially racy) direct updates of the volatile variables.
7475 */
@@ -97,13 +98,17 @@ final class OpenTelemetryTracingModule {
9798 private final ServerInterceptor serverSpanPropagationInterceptor =
9899 new TracingServerSpanPropagationInterceptor ();
99100 private final ServerTracerFactory serverTracerFactory = new ServerTracerFactory ();
101+ private final io .opentelemetry .api .logs .Logger otelLogger ;
100102
101103 OpenTelemetryTracingModule (OpenTelemetry openTelemetry ) {
102104 this .otelTracer = checkNotNull (openTelemetry .getTracerProvider (), "tracerProvider" )
103105 .tracerBuilder (OpenTelemetryConstants .INSTRUMENTATION_SCOPE )
104106 .setInstrumentationVersion (IMPLEMENTATION_VERSION )
105107 .build ();
106108 this .contextPropagators = checkNotNull (openTelemetry .getPropagators (), "contextPropagators" );
109+ this .otelLogger = openTelemetry .getLogsBridge ().loggerBuilder ("grpc-java-client-scope" )
110+ .setInstrumentationVersion ("1.0.0" )
111+ .build ();
107112 }
108113
109114 @ VisibleForTesting
@@ -116,7 +121,7 @@ Tracer getTracer() {
116121 */
117122 @ VisibleForTesting
118123 CallAttemptsTracerFactory newClientCallTracer (Span clientSpan , MethodDescriptor <?, ?> method ) {
119- return new CallAttemptsTracerFactory (clientSpan , method );
124+ return new CallAttemptsTracerFactory (clientSpan , method , otelLogger );
120125 }
121126
122127 /**
@@ -142,11 +147,14 @@ final class CallAttemptsTracerFactory extends ClientStreamTracer.Factory {
142147 volatile int callEnded ;
143148 private final Span clientSpan ;
144149 private final String fullMethodName ;
150+ private final io .opentelemetry .api .logs .Logger otelLogger ;
145151
146- CallAttemptsTracerFactory (Span clientSpan , MethodDescriptor <?, ?> method ) {
152+ CallAttemptsTracerFactory (Span clientSpan , MethodDescriptor <?, ?> method ,
153+ io .opentelemetry .api .logs .Logger otelLogger ) {
147154 checkNotNull (method , "method" );
148155 this .fullMethodName = checkNotNull (method .getFullMethodName (), "fullMethodName" );
149156 this .clientSpan = checkNotNull (clientSpan , "clientSpan" );
157+ this .otelLogger = otelLogger ;
150158 }
151159
152160 @ Override
@@ -464,6 +472,11 @@ private void recordOutboundMessageSentEvent(Span span,
464472 attributesBuilder .put ("message-size-compressed" , optionalWireSize );
465473 }
466474 span .addEvent ("Outbound message" , attributesBuilder .build ());
475+ otelLogger .logRecordBuilder ().setSeverity (Severity .INFO )
476+ .setSeverityText ("INFO" )
477+ .setBody ("outbound message event" ) // The main message body
478+ .setAllAttributes (attributesBuilder .build ())
479+ .emit ();
467480 }
468481
469482 private void recordInboundCompressedMessage (Span span , int seqNo , long optionalWireSize ) {
0 commit comments