Refactor JaegerRemoteSampler to leverage senders#8046
Refactor JaegerRemoteSampler to leverage senders#8046jack-berg wants to merge 3 commits intoopen-telemetry:mainfrom
Conversation
| public String toString() { | ||
| return toString(true); | ||
| } | ||
|
|
There was a problem hiding this comment.
Just moving this code to a more neutral SenderUtil class since its now being used outside GrpcExporterBuilder.
| import org.junit.jupiter.api.extension.RegisterExtension; | ||
| import org.junitpioneer.jupiter.SetSystemProperty; | ||
|
|
||
| class GrpcExporterTest { |
There was a problem hiding this comment.
Moved to SenderUtilTest
| return new byte[] {}; // TODO: drain input to byte array | ||
| public byte[] parse(InputStream inputStream) { | ||
| try { | ||
| int bufLen = 4 * 0x400; // 4KB |
There was a problem hiding this comment.
Lifted from the now-deleted MarshallerRemoteSamplerServiceGrpc.
| })); | ||
| } | ||
|
|
||
| private static byte[] getResponseMessageBytes(byte[] bodyBytes) throws IOException { |
There was a problem hiding this comment.
Lifted from the now-deleted OkHttpGrpcService
Codecov Report❌ Patch coverage is Additional details and impacted files@@ Coverage Diff @@
## main #8046 +/- ##
============================================
+ Coverage 90.20% 90.26% +0.06%
+ Complexity 7592 7565 -27
============================================
Files 841 839 -2
Lines 22911 22787 -124
Branches 2288 2271 -17
============================================
- Hits 20666 20569 -97
+ Misses 1529 1510 -19
+ Partials 716 708 -8 ☔ View full report in Codecov by Sentry. 🚀 New features to boost your workflow:
|
There was a problem hiding this comment.
Pull request overview
This pull request refactors JaegerRemoteSampler to use the public sender APIs (GrpcSender and GrpcSenderProvider) instead of maintaining its own internal HTTP client implementations. This change addresses issue #8001 regarding OkHttp compatibility, allowing the sampler to automatically benefit from separate versions of opentelemetry-exporter-sender-okhttp for OkHttp 4.x and 5.x.
Changes:
- Replaced internal
OkHttpGrpcServiceandUpstreamGrpcServiceclasses with the publicGrpcSenderAPI - Converted
JaegerRemoteSamplerfrom synchronous to asynchronous callback-based communication - Extracted common sender resolution logic into a new
SenderUtilclass shared betweenGrpcExporterBuilderandHttpExporterBuilder
Reviewed changes
Copilot reviewed 21 out of 21 changed files in this pull request and generated 7 comments.
Show a summary per file
| File | Description |
|---|---|
JaegerRemoteSampler.java |
Refactored to use GrpcSender with async callbacks instead of synchronous GrpcService execution |
JaegerRemoteSamplerBuilder.java |
Updated to resolve and create GrpcSender using GrpcSenderProvider instead of building custom HTTP clients |
OkHttpGrpcService.java |
Deleted - functionality moved to OkHttpGrpcSender |
UpstreamGrpcService.java |
Deleted - functionality exists in UpstreamGrpcSender |
GrpcService.java |
Deleted - replaced by public GrpcSender interface |
MarshallerRemoteSamplerServiceGrpc.java |
Deleted - no longer needed with sender abstraction |
SamplingStrategyResponseUnMarshaler.java |
Simplified to static read() method, removing stateful instance pattern |
OkHttpGrpcSender.java |
Added response message extraction logic from deleted OkHttpGrpcService |
UpstreamGrpcSender.java |
Added input stream parsing implementation for response messages |
SenderUtil.java |
New utility class consolidating sender provider resolution logic |
GrpcExporterBuilder.java |
Refactored to delegate sender resolution to SenderUtil |
HttpExporterBuilder.java |
Refactored to delegate sender resolution to SenderUtil |
ManagedChannelUtil.java |
Removed shutdownChannel() method (now handled by senders) |
ImmutableGrpcSenderConfig.java |
Made public to support external usage by JaegerRemoteSamplerBuilder |
build.gradle.kts (jaeger-remote-sampler) |
Removed direct OkHttp dependency, added test configuration for GrpcSenderProvider |
build.gradle.kts (exporters/common) |
Reorganized test suites to consolidate sender provider tests |
| Test files | Updated to reflect field name changes (delegate → grpcSender) and use GrpcStatusCode enum |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
...r/src/main/java/io/opentelemetry/sdk/extension/trace/jaeger/sampler/JaegerRemoteSampler.java
Outdated
Show resolved
Hide resolved
...r/src/main/java/io/opentelemetry/sdk/extension/trace/jaeger/sampler/JaegerRemoteSampler.java
Outdated
Show resolved
Hide resolved
exporters/common/src/main/java/io/opentelemetry/exporter/internal/SenderUtil.java
Outdated
Show resolved
Hide resolved
exporters/common/src/main/java/io/opentelemetry/exporter/internal/SenderUtil.java
Outdated
Show resolved
Hide resolved
...r/src/main/java/io/opentelemetry/sdk/extension/trace/jaeger/sampler/JaegerRemoteSampler.java
Show resolved
Hide resolved
...r/src/main/java/io/opentelemetry/sdk/extension/trace/jaeger/sampler/JaegerRemoteSampler.java
Outdated
Show resolved
Hide resolved
.../okhttp/src/main/java/io/opentelemetry/exporter/sender/okhttp/internal/OkHttpGrpcSender.java
Show resolved
Hide resolved
…y-java into refactor-jaeger-remote-sampler
| // TODO: remove support for reading OLD_SPI_PROPERTY after 1.61.0 | ||
| if (configuredSender.isEmpty()) { | ||
| configuredSender = ConfigUtil.getString(OLD_GRPC_SPI_PROPERTY, ""); | ||
| if (!configuredSender.isEmpty()) { |
|
|
||
| private static final String WORKER_THREAD_NAME = | ||
| JaegerRemoteSampler.class.getSimpleName() + "_WorkerThread"; | ||
| private static final String type = "remoteSampling"; |
There was a problem hiding this comment.
| private static final String type = "remoteSampling"; | |
| private static final String TYPE = "remoteSampling"; |
| } | ||
|
|
||
| private void getAndUpdateSampler() { | ||
| SamplingStrategyParametersMarshaler marsher = |
There was a problem hiding this comment.
| SamplingStrategyParametersMarshaler marsher = | |
| SamplingStrategyParametersMarshaler marshaler = |
| if (logger.isLoggable(Level.FINEST)) { | ||
| logger.log(Level.FINEST, "Failed to execute " + type + "s. Details follow: " + e); | ||
| } |
There was a problem hiding this comment.
(or did you want to not log the stack trace above at SEVERE?)
| if (logger.isLoggable(Level.FINEST)) { | |
| logger.log(Level.FINEST, "Failed to execute " + type + "s. Details follow: " + e); | |
| } |
| byte[] bodyBytes = null; | ||
| try { | ||
| bodyBytes = body.bytes(); | ||
| bodyBytes = getResponseMessageBytes(body.bytes()); |
There was a problem hiding this comment.
doc that GrpcResponse.getResponseMessage() should return protobuf bytes unwrapped from grpc framing?
| if (bodyBytes.length > 5) { | ||
| ByteArrayInputStream bodyStream = new ByteArrayInputStream(bodyBytes); | ||
| bodyStream.skip(5); | ||
| if (bodyBytes[0] == '1') { |
There was a problem hiding this comment.
(at least this is what AI tells me, and it seems believable, probably we need a compressed response test)
| if (bodyBytes[0] == '1') { | |
| if (bodyBytes[0] == 1) { |
| Buffer buffer = new Buffer(); | ||
| buffer.readFrom(bodyStream); | ||
| GzipSource gzipSource = new GzipSource(buffer); | ||
| bodyBytes = Okio.buffer(gzipSource).getBuffer().readByteArray(); |
There was a problem hiding this comment.
| bodyBytes = Okio.buffer(gzipSource).getBuffer().readByteArray(); | |
| bodyBytes = Okio.buffer(gzipSource).readByteArray(); |
Contributes to #8001 by refactoring JaegerRemoteSampler to be built on top of the newly public sender APIs.
This simplifies the code, and allows JaegerRemoteSampler to be able to automatically take advantage of breaking out
opentelemetry-exporter-sender-okhttpinto separate versions for okhttp 4.x and 5.x.