-
Notifications
You must be signed in to change notification settings - Fork 434
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Distributed tracing support with Micrometer and OpenTelemetry #376
Changes from all commits
98ad35e
01e7620
af9e289
8fae4d3
2a2f309
2d5d1b5
fda47dc
56e34d9
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,33 @@ | ||
package org.lognet.springboot.grpc.tracing; | ||
|
||
import io.grpc.CallOptions; | ||
import io.grpc.Channel; | ||
import io.grpc.ClientCall; | ||
import io.grpc.ClientInterceptor; | ||
import io.grpc.ForwardingClientCall; | ||
import io.grpc.Metadata; | ||
import io.grpc.MethodDescriptor; | ||
import io.opentelemetry.api.trace.Span; | ||
import io.opentelemetry.api.trace.TraceId; | ||
|
||
public class TracingClientInterceptor implements ClientInterceptor { | ||
Check warning on line 13 in grpc-client-spring-boot-starter/src/main/java/org/lognet/springboot/grpc/tracing/TracingClientInterceptor.java Codecov / codecov/patchgrpc-client-spring-boot-starter/src/main/java/org/lognet/springboot/grpc/tracing/TracingClientInterceptor.java#L13
|
||
@Override | ||
public <ReqT, RespT> ClientCall<ReqT, RespT> interceptCall( | ||
MethodDescriptor<ReqT, RespT> method, CallOptions callOptions, Channel next) { | ||
|
||
return new ForwardingClientCall.SimpleForwardingClientCall<ReqT, RespT>(next.newCall(method, callOptions)) { | ||
Check warning on line 18 in grpc-client-spring-boot-starter/src/main/java/org/lognet/springboot/grpc/tracing/TracingClientInterceptor.java Codecov / codecov/patchgrpc-client-spring-boot-starter/src/main/java/org/lognet/springboot/grpc/tracing/TracingClientInterceptor.java#L18
|
||
@Override | ||
public void start(ClientCall.Listener<RespT> responseListener, Metadata headers) { | ||
Span currentSpan = Span.current(); | ||
String traceId = currentSpan.getSpanContext().getTraceId(); | ||
String spanId = currentSpan.getSpanContext().getSpanId(); | ||
Check warning on line 23 in grpc-client-spring-boot-starter/src/main/java/org/lognet/springboot/grpc/tracing/TracingClientInterceptor.java Codecov / codecov/patchgrpc-client-spring-boot-starter/src/main/java/org/lognet/springboot/grpc/tracing/TracingClientInterceptor.java#L21-L23
|
||
|
||
if (!traceId.equals(TraceId.getInvalid())) { | ||
headers.put(Metadata.Key.of("traceId", Metadata.ASCII_STRING_MARSHALLER), traceId); | ||
headers.put(Metadata.Key.of("spanId", Metadata.ASCII_STRING_MARSHALLER), spanId); | ||
Check warning on line 27 in grpc-client-spring-boot-starter/src/main/java/org/lognet/springboot/grpc/tracing/TracingClientInterceptor.java Codecov / codecov/patchgrpc-client-spring-boot-starter/src/main/java/org/lognet/springboot/grpc/tracing/TracingClientInterceptor.java#L26-L27
|
||
} | ||
super.start(responseListener, headers); | ||
} | ||
Check warning on line 30 in grpc-client-spring-boot-starter/src/main/java/org/lognet/springboot/grpc/tracing/TracingClientInterceptor.java Codecov / codecov/patchgrpc-client-spring-boot-starter/src/main/java/org/lognet/springboot/grpc/tracing/TracingClientInterceptor.java#L29-L30
|
||
}; | ||
} | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,44 @@ | ||
package org.lognet.springboot.grpc.autoconfigure.tracing; | ||
|
||
import io.opentelemetry.api.trace.Tracer; | ||
import io.opentelemetry.exporter.otlp.trace.OtlpGrpcSpanExporter; | ||
import io.opentelemetry.exporter.otlp.trace.OtlpGrpcSpanExporterBuilder; | ||
import io.opentelemetry.sdk.OpenTelemetrySdk; | ||
import io.opentelemetry.sdk.trace.SdkTracerProvider; | ||
import io.opentelemetry.sdk.trace.export.BatchSpanProcessor; | ||
import org.lognet.springboot.grpc.tracing.TracingServerInterceptor; | ||
import org.springframework.boot.actuate.autoconfigure.tracing.otlp.OtlpProperties; | ||
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; | ||
import org.springframework.boot.context.properties.EnableConfigurationProperties; | ||
import org.springframework.context.annotation.Bean; | ||
import org.springframework.context.annotation.Configuration; | ||
|
||
@Configuration | ||
@ConditionalOnClass({OpenTelemetrySdk.class}) | ||
@EnableConfigurationProperties(OtlpProperties.class) | ||
public class OtelConfiguration { | ||
Check warning on line 19 in grpc-spring-boot-starter/src/main/java/org/lognet/springboot/grpc/autoconfigure/tracing/OtelConfiguration.java Codecov / codecov/patchgrpc-spring-boot-starter/src/main/java/org/lognet/springboot/grpc/autoconfigure/tracing/OtelConfiguration.java#L19
|
||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. this should be conditional on There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. makes sense |
||
|
||
@Bean | ||
public OtlpGrpcSpanExporter otlpExporter(OtlpProperties properties) { | ||
OtlpGrpcSpanExporterBuilder builder = OtlpGrpcSpanExporter.builder().setEndpoint(properties.getEndpoint()); | ||
return builder.build(); | ||
} | ||
Check warning on line 25 in grpc-spring-boot-starter/src/main/java/org/lognet/springboot/grpc/autoconfigure/tracing/OtelConfiguration.java Codecov / codecov/patchgrpc-spring-boot-starter/src/main/java/org/lognet/springboot/grpc/autoconfigure/tracing/OtelConfiguration.java#L24-L25
|
||
|
||
@Bean | ||
public Tracer tracer(OtlpGrpcSpanExporter otlpExporter) { | ||
SdkTracerProvider tracerProvider = SdkTracerProvider.builder() | ||
.addSpanProcessor(BatchSpanProcessor.builder(otlpExporter).build()) | ||
.build(); | ||
|
||
OpenTelemetrySdk openTelemetry = OpenTelemetrySdk.builder() | ||
Check warning on line 33 in grpc-spring-boot-starter/src/main/java/org/lognet/springboot/grpc/autoconfigure/tracing/OtelConfiguration.java Codecov / codecov/patchgrpc-spring-boot-starter/src/main/java/org/lognet/springboot/grpc/autoconfigure/tracing/OtelConfiguration.java#L31-L33
|
||
.setTracerProvider(tracerProvider) | ||
.buildAndRegisterGlobal(); | ||
|
||
Check warning on line 36 in grpc-spring-boot-starter/src/main/java/org/lognet/springboot/grpc/autoconfigure/tracing/OtelConfiguration.java Codecov / codecov/patchgrpc-spring-boot-starter/src/main/java/org/lognet/springboot/grpc/autoconfigure/tracing/OtelConfiguration.java#L36
|
||
return openTelemetry.getTracerProvider().get("grpc-spring-boot-starter"); | ||
} | ||
Check warning on line 38 in grpc-spring-boot-starter/src/main/java/org/lognet/springboot/grpc/autoconfigure/tracing/OtelConfiguration.java Codecov / codecov/patchgrpc-spring-boot-starter/src/main/java/org/lognet/springboot/grpc/autoconfigure/tracing/OtelConfiguration.java#L38
|
||
|
||
@Bean | ||
public TracingServerInterceptor tracingServerInterceptor(Tracer tracer) { | ||
return new TracingServerInterceptor(tracer); | ||
} | ||
Check warning on line 43 in grpc-spring-boot-starter/src/main/java/org/lognet/springboot/grpc/autoconfigure/tracing/OtelConfiguration.java Codecov / codecov/patchgrpc-spring-boot-starter/src/main/java/org/lognet/springboot/grpc/autoconfigure/tracing/OtelConfiguration.java#L43
|
||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,61 @@ | ||
package org.lognet.springboot.grpc.tracing; | ||
|
||
import io.grpc.Metadata; | ||
import io.grpc.ServerCall; | ||
import io.grpc.ServerCallHandler; | ||
import io.grpc.ServerInterceptor; | ||
import io.opentelemetry.api.trace.*; | ||
import io.opentelemetry.context.Context; | ||
import io.opentelemetry.context.Scope; | ||
import lombok.Setter; | ||
import lombok.experimental.Accessors; | ||
import org.springframework.core.Ordered; | ||
|
||
import java.util.Optional; | ||
|
||
public class TracingServerInterceptor implements ServerInterceptor, Ordered { | ||
|
||
@Setter | ||
@Accessors(fluent = true) | ||
private Integer order; | ||
Check warning on line 20 in grpc-spring-boot-starter/src/main/java/org/lognet/springboot/grpc/tracing/TracingServerInterceptor.java Codecov / codecov/patchgrpc-spring-boot-starter/src/main/java/org/lognet/springboot/grpc/tracing/TracingServerInterceptor.java#L18-L20
|
||
|
||
private final Tracer tracer; | ||
|
||
public TracingServerInterceptor(Tracer tracer) { | ||
this.tracer = tracer; | ||
} | ||
|
||
@Override | ||
public <ReqT, RespT> ServerCall.Listener<ReqT> interceptCall( | ||
ServerCall<ReqT, RespT> call, Metadata headers, ServerCallHandler<ReqT, RespT> next) { | ||
|
||
String traceId = headers.get(Metadata.Key.of("traceId", Metadata.ASCII_STRING_MARSHALLER)); | ||
String spanId = headers.get(Metadata.Key.of("spanId", Metadata.ASCII_STRING_MARSHALLER)); | ||
Check warning on line 33 in grpc-spring-boot-starter/src/main/java/org/lognet/springboot/grpc/tracing/TracingServerInterceptor.java Codecov / codecov/patchgrpc-spring-boot-starter/src/main/java/org/lognet/springboot/grpc/tracing/TracingServerInterceptor.java#L25-L33
|
||
|
||
Context spanContext = createSpanContext(traceId, spanId); | ||
Check warning on line 35 in grpc-spring-boot-starter/src/main/java/org/lognet/springboot/grpc/tracing/TracingServerInterceptor.java Codecov / codecov/patchgrpc-spring-boot-starter/src/main/java/org/lognet/springboot/grpc/tracing/TracingServerInterceptor.java#L35
|
||
SpanBuilder spanBuilder = tracer.spanBuilder("grpc-spring-boot-starter-span").setParent(spanContext); | ||
Span span = spanBuilder.startSpan(); | ||
Context scopedContext = Context.current().with(span); | ||
|
||
try (Scope scope = scopedContext.makeCurrent()) { | ||
return next.startCall(call, headers); | ||
Check warning on line 41 in grpc-spring-boot-starter/src/main/java/org/lognet/springboot/grpc/tracing/TracingServerInterceptor.java Codecov / codecov/patchgrpc-spring-boot-starter/src/main/java/org/lognet/springboot/grpc/tracing/TracingServerInterceptor.java#L41
|
||
} finally { | ||
span.end(); | ||
} | ||
} | ||
|
||
Check warning on line 46 in grpc-spring-boot-starter/src/main/java/org/lognet/springboot/grpc/tracing/TracingServerInterceptor.java Codecov / codecov/patchgrpc-spring-boot-starter/src/main/java/org/lognet/springboot/grpc/tracing/TracingServerInterceptor.java#L44-L46
|
||
private Context createSpanContext(String traceId, String spanId) { | ||
SpanContext spanContext = SpanContext.createFromRemoteParent( | ||
traceId != null ? traceId : "", | ||
spanId != null ? spanId : "", | ||
TraceFlags.getDefault(), | ||
Check warning on line 51 in grpc-spring-boot-starter/src/main/java/org/lognet/springboot/grpc/tracing/TracingServerInterceptor.java Codecov / codecov/patchgrpc-spring-boot-starter/src/main/java/org/lognet/springboot/grpc/tracing/TracingServerInterceptor.java#L51
|
||
TraceState.getDefault() | ||
); | ||
return Context.current().with(Span.wrap(spanContext)); | ||
} | ||
|
||
@Override | ||
public int getOrder() { | ||
return Optional.ofNullable(order).orElse(HIGHEST_PRECEDENCE); | ||
} | ||
Check warning on line 60 in grpc-spring-boot-starter/src/main/java/org/lognet/springboot/grpc/tracing/TracingServerInterceptor.java Codecov / codecov/patchgrpc-spring-boot-starter/src/main/java/org/lognet/springboot/grpc/tracing/TracingServerInterceptor.java#L59-L60
|
||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
io.micrometer:micrometer-tracing-bridge-otel
is it in-use ?There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.