Skip to content

Commit 2babc69

Browse files
authored
Introduce mTLS support for JaegerRemoteSamplerBuilder (#5209) (#5248)
1 parent 4532648 commit 2babc69

File tree

3 files changed

+61
-0
lines changed

3 files changed

+61
-0
lines changed

docs/apidiffs/current_vs_latest/opentelemetry-sdk-extension-jaeger-remote-sampler.txt

+3
Original file line numberDiff line numberDiff line change
@@ -65,3 +65,6 @@ Comparing source compatibility of against
6565
---! REMOVED METHOD: PUBLIC(-) io.opentelemetry.sdk.extension.trace.jaeger.proto.api_v2.Sampling$SamplingStrategyResponse$Builder clone()
6666
---! REMOVED METHOD: PUBLIC(-) io.opentelemetry.sdk.extension.trace.jaeger.proto.api_v2.Sampling$SamplingStrategyResponse$Builder setField(com.google.protobuf.Descriptors$FieldDescriptor, java.lang.Object)
6767
---! REMOVED METHOD: PUBLIC(-) io.opentelemetry.sdk.extension.trace.jaeger.proto.api_v2.Sampling$SamplingStrategyResponse$Builder setRepeatedField(com.google.protobuf.Descriptors$FieldDescriptor, int, java.lang.Object)
68+
*** MODIFIED CLASS: PUBLIC FINAL io.opentelemetry.sdk.extension.trace.jaeger.sampler.JaegerRemoteSamplerBuilder (not serializable)
69+
=== CLASS FILE FORMAT VERSION: 52.0 <- 52.0
70+
+++ NEW METHOD: PUBLIC(+) io.opentelemetry.sdk.extension.trace.jaeger.sampler.JaegerRemoteSamplerBuilder setClientTls(byte[], byte[])

sdk-extensions/jaeger-remote-sampler/src/main/java/io/opentelemetry/sdk/extension/trace/jaeger/sampler/JaegerRemoteSamplerBuilder.java

+9
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,15 @@ public JaegerRemoteSamplerBuilder setTrustedCertificates(byte[] trustedCertifica
6565
return this;
6666
}
6767

68+
/**
69+
* Sets the client key and the certificate chain to use for verifying client when TLS is enabled.
70+
* The key must be PKCS8, and both must be in PEM format.
71+
*/
72+
public JaegerRemoteSamplerBuilder setClientTls(byte[] privateKeyPem, byte[] certificatePem) {
73+
delegate.setClientTls(privateKeyPem, certificatePem);
74+
return this;
75+
}
76+
6877
/**
6978
* Sets the polling interval for configuration updates. If unset, defaults to {@value
7079
* DEFAULT_POLLING_INTERVAL_MILLIS}ms. Must be positive.

sdk-extensions/jaeger-remote-sampler/src/test/java/io/opentelemetry/sdk/extension/trace/jaeger/sampler/JaegerRemoteSamplerTest.java

+49
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88
import static org.assertj.core.api.Assertions.assertThat;
99
import static org.assertj.core.api.Assertions.assertThatThrownBy;
1010
import static org.awaitility.Awaitility.await;
11+
import static org.junit.jupiter.api.Named.named;
12+
import static org.junit.jupiter.params.provider.Arguments.arguments;
1113

1214
import com.linecorp.armeria.common.grpc.protocol.ArmeriaStatusException;
1315
import com.linecorp.armeria.server.ServerBuilder;
@@ -16,6 +18,7 @@
1618
import com.linecorp.armeria.testing.junit5.server.SelfSignedCertificateExtension;
1719
import com.linecorp.armeria.testing.junit5.server.ServerExtension;
1820
import io.github.netmikey.logunit.api.LogCapturer;
21+
import io.netty.handler.ssl.ClientAuth;
1922
import io.opentelemetry.internal.testing.slf4j.SuppressLogger;
2023
import io.opentelemetry.sdk.extension.trace.jaeger.proto.api_v2.Sampling;
2124
import io.opentelemetry.sdk.extension.trace.jaeger.proto.api_v2.Sampling.RateLimitingSamplingStrategy;
@@ -29,12 +32,18 @@
2932
import java.util.concurrent.CompletionStage;
3033
import java.util.concurrent.ConcurrentLinkedQueue;
3134
import java.util.concurrent.TimeUnit;
35+
import java.util.stream.Stream;
3236
import javax.annotation.Nullable;
3337
import org.awaitility.core.ThrowingRunnable;
3438
import org.junit.jupiter.api.BeforeEach;
3539
import org.junit.jupiter.api.Order;
3640
import org.junit.jupiter.api.Test;
41+
import org.junit.jupiter.api.extension.ExtensionContext;
3742
import org.junit.jupiter.api.extension.RegisterExtension;
43+
import org.junit.jupiter.params.ParameterizedTest;
44+
import org.junit.jupiter.params.provider.Arguments;
45+
import org.junit.jupiter.params.provider.ArgumentsProvider;
46+
import org.junit.jupiter.params.provider.ArgumentsSource;
3847
import org.slf4j.event.Level;
3948
import org.slf4j.event.LoggingEvent;
4049

@@ -61,7 +70,12 @@ private static void addGrpcError(int code, @Nullable String message) {
6170
@RegisterExtension
6271
static final SelfSignedCertificateExtension certificate = new SelfSignedCertificateExtension();
6372

73+
@RegisterExtension
6474
@Order(2)
75+
static final SelfSignedCertificateExtension clientCertificate =
76+
new SelfSignedCertificateExtension();
77+
78+
@Order(3)
6579
@RegisterExtension
6680
static final ServerExtension server =
6781
new ServerExtension() {
@@ -98,6 +112,11 @@ protected CompletionStage<byte[]> handleMessage(
98112
sb.http(0);
99113
sb.https(0);
100114
sb.tls(certificate.certificateFile(), certificate.privateKeyFile());
115+
sb.tlsCustomizer(
116+
ssl -> {
117+
ssl.clientAuth(ClientAuth.OPTIONAL);
118+
ssl.trustManager(clientCertificate.certificate());
119+
});
101120
}
102121
};
103122

@@ -140,6 +159,36 @@ void tlsConnectionWorks() throws IOException {
140159
}
141160
}
142161

162+
@ParameterizedTest
163+
@ArgumentsSource(ClientPrivateKeyProvider.class)
164+
void clientTlsConnectionWorks(byte[] privateKey) throws IOException {
165+
try (JaegerRemoteSampler sampler =
166+
JaegerRemoteSampler.builder()
167+
.setEndpoint(server.httpsUri().toString())
168+
.setPollingInterval(1, TimeUnit.SECONDS)
169+
.setTrustedCertificates(Files.readAllBytes(certificate.certificateFile().toPath()))
170+
.setClientTls(
171+
privateKey, Files.readAllBytes(clientCertificate.certificateFile().toPath()))
172+
.setServiceName(SERVICE_NAME)
173+
.build()) {
174+
175+
await().untilAsserted(samplerIsType(sampler, RateLimitingSampler.class));
176+
177+
// verify
178+
assertThat(sampler.getDescription()).contains("RateLimitingSampler{999.00}");
179+
}
180+
}
181+
182+
private static class ClientPrivateKeyProvider implements ArgumentsProvider {
183+
@Override
184+
@SuppressWarnings("PrimitiveArrayPassedToVarargsMethod")
185+
public Stream<? extends Arguments> provideArguments(ExtensionContext context) throws Exception {
186+
return Stream.of(
187+
arguments(named("PEM", Files.readAllBytes(clientCertificate.privateKeyFile().toPath()))),
188+
arguments(named("DER", clientCertificate.privateKey().getEncoded())));
189+
}
190+
}
191+
143192
@Test
144193
void description() {
145194
try (JaegerRemoteSampler sampler =

0 commit comments

Comments
 (0)