diff --git a/src/main/java/dev/braintrust/config/BraintrustConfig.java b/src/main/java/dev/braintrust/config/BraintrustConfig.java index 6057de6..69ffd24 100644 --- a/src/main/java/dev/braintrust/config/BraintrustConfig.java +++ b/src/main/java/dev/braintrust/config/BraintrustConfig.java @@ -6,6 +6,8 @@ import java.util.Optional; import java.util.function.Consumer; import javax.annotation.Nullable; +import javax.net.ssl.SSLContext; +import javax.net.ssl.X509TrustManager; /** * Configuration for Braintrust SDK. Uses builder pattern with sensible defaults and environment @@ -23,6 +25,8 @@ public final class BraintrustConfig { private final boolean enableTraceConsoleLog; private final boolean debug; private final Duration requestTimeout; + private final SSLContext sslContext; + private final X509TrustManager x509TrustManager; private BraintrustConfig(Builder builder) { this.apiKey = builder.apiKey; @@ -33,6 +37,8 @@ private BraintrustConfig(Builder builder) { this.enableTraceConsoleLog = builder.enableTraceConsoleLog; this.debug = builder.debug; this.requestTimeout = builder.requestTimeout; + this.sslContext = builder.sslContext; + this.x509TrustManager = builder.x509TrustManager; } public String apiKey() { @@ -67,6 +73,14 @@ public Duration requestTimeout() { return requestTimeout; } + public SSLContext sslContext() { + return sslContext; + } + + public X509TrustManager x509TrustManager() { + return x509TrustManager; + } + /** Creates a new builder initialized with environment variables. */ public static Builder builder() { return new Builder(); @@ -94,6 +108,8 @@ public static final class Builder { private String orgName; private boolean enableTraceConsoleLog; private boolean debug; + private SSLContext sslContext; + private X509TrustManager x509TrustManager; private Duration requestTimeout = Duration.ofSeconds(30); private Builder() { @@ -155,6 +171,16 @@ public Builder requestTimeout(Duration timeout) { return this; } + public Builder sslContext(SSLContext sslContext) { + this.sslContext = sslContext; + return this; + } + + public Builder x509TrustManager(X509TrustManager x509TrustManager) { + this.x509TrustManager = x509TrustManager; + return this; + } + public BraintrustConfig build() { if (apiKey == null || apiKey.isBlank()) { throw new IllegalStateException( diff --git a/src/main/java/dev/braintrust/trace/BraintrustSpanExporter.java b/src/main/java/dev/braintrust/trace/BraintrustSpanExporter.java index a89c60c..9972113 100644 --- a/src/main/java/dev/braintrust/trace/BraintrustSpanExporter.java +++ b/src/main/java/dev/braintrust/trace/BraintrustSpanExporter.java @@ -92,6 +92,13 @@ private CompletableResultCode exportWithParent(String parent, List spa "Created exporter with x-bt-parent: {}", p); } + // If SSLContext is set, then apply it + if (config.sslContext() != null + && config.x509TrustManager() != null) { + exporterBuilder.setSslContext( + config.sslContext(), config.x509TrustManager()); + } + return exporterBuilder.build(); });