diff --git a/src/main/java/dev/braintrust/config/BraintrustConfig.java b/src/main/java/dev/braintrust/config/BraintrustConfig.java index 5c0a97e3..8eaf666f 100644 --- a/src/main/java/dev/braintrust/config/BraintrustConfig.java +++ b/src/main/java/dev/braintrust/config/BraintrustConfig.java @@ -96,14 +96,17 @@ URI fetchProjectURI(BraintrustApiClient client) { try { var orgAndProject = client.getProjectAndOrgInfo().orElseThrow(); var baseURI = new URI(appUrl()); + var path = + "/app/%s/p/%s" + .formatted( + orgAndProject.orgInfo().name(), orgAndProject.project().name()); return new URI( baseURI.getScheme(), + baseURI.getUserInfo(), baseURI.getHost(), - baseURI.getPath() - + "/app/" - + orgAndProject.orgInfo().name() - + "/p/" - + orgAndProject.project().name(), + baseURI.getPort(), + path, + null, null); } catch (URISyntaxException e) { throw new RuntimeException(e); diff --git a/src/main/java/dev/braintrust/trace/BraintrustLogExporter.java b/src/main/java/dev/braintrust/trace/BraintrustLogExporter.java index cce5fdf7..559ecd73 100644 --- a/src/main/java/dev/braintrust/trace/BraintrustLogExporter.java +++ b/src/main/java/dev/braintrust/trace/BraintrustLogExporter.java @@ -85,9 +85,23 @@ private CompletableResultCode exportWithParent(String parent, List { + if (result.isSuccess()) { + log.debug( + "Successfully exported {} logs with x-bt-parent: {}", + logs.size(), + parent); + } else { + log.warn( + "Failed to export {} spans to endpoint {}", + logs.size(), + logsEndpoint, + result.getFailureThrowable()); + } + }); } catch (Exception e) { log.error("Failed to export logs", e); return CompletableResultCode.ofFailure(); diff --git a/src/main/java/dev/braintrust/trace/BraintrustSpanExporter.java b/src/main/java/dev/braintrust/trace/BraintrustSpanExporter.java index 97ea63f2..a38c245f 100644 --- a/src/main/java/dev/braintrust/trace/BraintrustSpanExporter.java +++ b/src/main/java/dev/braintrust/trace/BraintrustSpanExporter.java @@ -88,13 +88,28 @@ private CompletableResultCode exportWithParent(String parent, List spa return exporterBuilder.build(); }); - log.debug("Exporting {} spans with x-bt-parent: {}", spans.size(), parent); if (config.exportSpansInMemoryForUnitTest()) { SPANS_EXPORTED.putIfAbsent(parent, new CopyOnWriteArrayList<>()); SPANS_EXPORTED.get(parent).addAll(spans); return CompletableResultCode.ofSuccess(); } else { - return exporter.export(spans); + var result = exporter.export(spans); + // NOTE: whenComplete mutates the original object. does not copy. + return result.whenComplete( + () -> { + if (result.isSuccess()) { + log.debug( + "Successfully exported {} spans with x-bt-parent: {}", + spans.size(), + parent); + } else { + log.warn( + "Failed to export {} spans to endpoint {}", + spans.size(), + tracesEndpoint, + result.getFailureThrowable()); + } + }); } } catch (Exception e) { log.error("Failed to export spans", e); diff --git a/src/test/java/dev/braintrust/config/BraintrustConfigTest.java b/src/test/java/dev/braintrust/config/BraintrustConfigTest.java index 52daef7f..945c7932 100644 --- a/src/test/java/dev/braintrust/config/BraintrustConfigTest.java +++ b/src/test/java/dev/braintrust/config/BraintrustConfigTest.java @@ -46,14 +46,27 @@ void projectUriFetching() { new dev.braintrust.api.BraintrustApiClient.OrganizationAndProjectInfo( orgInfo, project); var client = new dev.braintrust.api.BraintrustApiClient.InMemoryImpl(orgAndProjectInfo); - var config = - BraintrustConfig.of( - "BRAINTRUST_API_KEY", "foobar", - "BRAINTRUST_API_URL", "https://api.braintrust.dev", - "BRAINTRUST_APP_URL", "https://braintrust.dev", - "BRAINTRUST_DEFAULT_PROJECT_ID", projectId); - assertEquals( - "https://braintrust.dev/app/Test%20Org/p/some%20project", - config.fetchProjectURI(client).toASCIIString()); + { // standard braintrust.dev + var config = + BraintrustConfig.of( + "BRAINTRUST_API_KEY", "foobar", + "BRAINTRUST_API_URL", "https://api.braintrust.dev", + "BRAINTRUST_APP_URL", "https://braintrust.dev", + "BRAINTRUST_DEFAULT_PROJECT_ID", projectId); + assertEquals( + "https://braintrust.dev/app/Test%20Org/p/some%20project", + config.fetchProjectURI(client).toASCIIString()); + } + { // self-hosted with a non-standard port + var config = + BraintrustConfig.of( + "BRAINTRUST_API_KEY", "foobar", + "BRAINTRUST_API_URL", "http://someselfhost:8080", + "BRAINTRUST_APP_URL", "http://someselfhost:3001", + "BRAINTRUST_DEFAULT_PROJECT_ID", projectId); + assertEquals( + "http://someselfhost:3001/app/Test%20Org/p/some%20project", + config.fetchProjectURI(client).toASCIIString()); + } } }