Skip to content

Commit 20d2760

Browse files
committed
Merge branch 'gary/add-llm-obs-writer' into gary/llmobs-java-sdk-integration
2 parents 993cdbe + 4739666 commit 20d2760

File tree

11 files changed

+1002
-4
lines changed

11 files changed

+1002
-4
lines changed

dd-trace-core/build.gradle

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@ dependencies {
6868
implementation project(':components:json')
6969
implementation project(':utils:container-utils')
7070
implementation project(':utils:socket-utils')
71+
7172
// for span exception debugging
7273
compileOnly project(':dd-java-agent:agent-debugger:debugger-bootstrap')
7374

dd-trace-core/src/main/java/datadog/trace/common/writer/DDAgentWriter.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,7 @@ public DDAgentWriter build() {
151151
}
152152

153153
final DDAgentMapperDiscovery mapperDiscovery = new DDAgentMapperDiscovery(featureDiscovery);
154+
154155
final PayloadDispatcher dispatcher =
155156
new PayloadDispatcherImpl(mapperDiscovery, agentApi, healthMetrics, monitoring);
156157
final TraceProcessingWorker traceProcessingWorker =

dd-trace-core/src/main/java/datadog/trace/common/writer/WriterFactory.java

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ public static Writer createWriter(
8484

8585
// The AgentWriter doesn't support the CI Visibility protocol. If CI Visibility is
8686
// enabled, check if we can use the IntakeWriter instead.
87-
if (DD_AGENT_WRITER_TYPE.equals(configuredType) && config.isCiVisibilityEnabled()) {
87+
if (DD_AGENT_WRITER_TYPE.equals(configuredType) && (config.isCiVisibilityEnabled())) {
8888
if (featuresDiscovery.supportsEvpProxy() || config.isCiVisibilityAgentlessEnabled()) {
8989
configuredType = DD_INTAKE_WRITER_TYPE;
9090
} else {
@@ -118,6 +118,10 @@ public static Writer createWriter(
118118
builder.addTrack(TrackType.CITESTCOV, coverageApi);
119119
}
120120

121+
final RemoteApi llmobsApi =
122+
createDDIntakeRemoteApi(config, commObjects, featuresDiscovery, TrackType.LLMOBS);
123+
builder.addTrack(TrackType.LLMOBS, llmobsApi);
124+
121125
remoteWriter = builder.build();
122126

123127
} else { // configuredType == DDAgentWriter
@@ -173,20 +177,34 @@ private static RemoteApi createDDIntakeRemoteApi(
173177
SharedCommunicationObjects commObjects,
174178
DDAgentFeaturesDiscovery featuresDiscovery,
175179
TrackType trackType) {
176-
if (featuresDiscovery.supportsEvpProxy() && !config.isCiVisibilityAgentlessEnabled()) {
180+
boolean evpProxySupported = featuresDiscovery.supportsEvpProxy();
181+
boolean useProxyApi =
182+
(evpProxySupported && TrackType.LLMOBS == trackType && !config.isLlmObsAgentlessEnabled())
183+
|| (evpProxySupported
184+
&& (TrackType.CITESTCOV == trackType || TrackType.CITESTCYCLE == trackType)
185+
&& !config.isCiVisibilityAgentlessEnabled());
186+
187+
if (useProxyApi) {
177188
return DDEvpProxyApi.builder()
178189
.httpClient(commObjects.okHttpClient)
179190
.agentUrl(commObjects.agentUrl)
180191
.evpProxyEndpoint(featuresDiscovery.getEvpProxyEndpoint())
181192
.trackType(trackType)
182193
.compressionEnabled(featuresDiscovery.supportsContentEncodingHeadersWithEvpProxy())
183194
.build();
184-
185195
} else {
186196
HttpUrl hostUrl = null;
197+
String llmObsAgentlessUrl = config.getLlMObsAgentlessUrl();
198+
187199
if (config.getCiVisibilityAgentlessUrl() != null) {
188200
hostUrl = HttpUrl.get(config.getCiVisibilityAgentlessUrl());
189201
log.info("Using host URL '{}' to report CI Visibility traces in Agentless mode.", hostUrl);
202+
} else if (config.isLlmObsEnabled()
203+
&& config.isLlmObsAgentlessEnabled()
204+
&& llmObsAgentlessUrl != null
205+
&& !llmObsAgentlessUrl.isEmpty()) {
206+
hostUrl = HttpUrl.get(llmObsAgentlessUrl);
207+
log.info("Using host URL '{}' to report LLM Obs traces in Agentless mode.", hostUrl);
190208
}
191209
return DDIntakeApi.builder()
192210
.hostUrl(hostUrl)

dd-trace-core/src/main/java/datadog/trace/common/writer/ddagent/DDAgentApi.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,7 @@ public void addResponseListener(final RemoteResponseListener listener) {
9090
public Response sendSerializedTraces(final Payload payload) {
9191
final int sizeInBytes = payload.sizeInBytes();
9292
String tracesEndpoint = featuresDiscovery.getTraceEndpoint();
93+
9394
if (null == tracesEndpoint) {
9495
featuresDiscovery.discoverIfOutdated();
9596
tracesEndpoint = featuresDiscovery.getTraceEndpoint();

dd-trace-core/src/main/java/datadog/trace/common/writer/ddintake/DDIntakeApi.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,7 @@ public Response sendSerializedTraces(Payload payload) {
131131
.post(payload.toRequest())
132132
.tag(OkHttpUtils.CustomListener.class, telemetryListener)
133133
.build();
134+
134135
totalTraces += payload.traceCount();
135136
receivedTraces += payload.traceCount();
136137

dd-trace-core/src/main/java/datadog/trace/common/writer/ddintake/DDIntakeMapperDiscovery.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import datadog.trace.civisibility.writer.ddintake.CiTestCycleMapperV1;
77
import datadog.trace.common.writer.RemoteMapper;
88
import datadog.trace.common.writer.RemoteMapperDiscovery;
9+
import datadog.trace.llmobs.writer.ddintake.LLMObsSpanMapper;
910

1011
/**
1112
* Mapper discovery logic when a DDIntake is used. The mapper is discovered based on a backend
@@ -40,6 +41,8 @@ public void discover() {
4041
mapper = new CiTestCycleMapperV1(wellKnownTags, compressionEnabled);
4142
} else if (TrackType.CITESTCOV.equals(trackType)) {
4243
mapper = new CiTestCovMapperV2(compressionEnabled);
44+
} else if (TrackType.LLMOBS.equals(trackType)) {
45+
mapper = new LLMObsSpanMapper();
4346
} else {
4447
mapper = RemoteMapper.NO_OP;
4548
}

0 commit comments

Comments
 (0)