10000 working writer · DataDog/dd-trace-java@f0215ef · GitHub
[go: up one dir, main page]

Skip to content

Commit f0215ef

Browse files
committed
working writer
1 parent fcb29cc commit f0215ef

File tree

13 files changed

+386
-10
lines changed

13 files changed

+386
-10
lines changed

communication/build.gradle

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ dependencies {
44
implementation libs.slf4j
55

66
api project(':remote-config:remote-config-api')
7+
implementation project(':components:json')
78
implementation project(':remote-config:remote-config-core')
89
implementation project(':internal-api')
910
implementation project(':utils:container-utils')

dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/Agent.java

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
import datadog.trace.bootstrap.instrumentation.api.AgentTracer;
3838
import datadog.trace.bootstrap.instrumentation.api.AgentTracer.TracerAPI;
3939
import datadog.trace.bootstrap.instrumentation.api.ProfilingContextIntegration;
40+
import datadog.trace.bootstrap.instrumentation.api.WriterConstants;
4041
import datadog.trace.bootstrap.instrumentation.jfr.InstrumentationBasedProfiling;
4142
import datadog.trace.util.AgentTaskScheduler;
4243
import datadog.trace.util.AgentThreadFactory.AgentThread;
@@ -111,7 +112,9 @@ private enum AgentFeature {
111112
DATA_JOBS(propertyNameToSystemPropertyName(GeneralConfig.DATA_JOBS_ENABLED), false),
112113
AGENTLESS_LOG_SUBMISSION(
113114
propertyNameToSystemPropertyName(GeneralConfig.AGENTLESS_LOG_SUBMISSION_ENABLED), false),
114-
LLMOBS(propertyNameToSystemPropertyName(LlmObsConfig.LLMOBS_ENABLED), false);
115+
LLMOBS(propertyNameToSystemPropertyName(LlmObsConfig.LLMOBS_ENABLED), false),
116+
LLMOBS_AGENTLESS(
117+
propertyNameToSystemPropertyName(LlmObsConfig.LLMOBS_AGENTLESS_ENABLED), false);
115118

116119
private final String systemProp;
117120
private final boolean enabledByDefault;
@@ -153,6 +156,7 @@ public boolean isEnabledByDefault() {
153156
private static boolean cwsEnabled = false;
154157
private static boolean ciVisibilityEnabled = false;
155158
private static boolean llmObsEnabled = false;
159+
private static boolean llmObsAgentlessEnabled = false;
156160
private static boolean usmEnabled = false;
157161
private static boolean telemetryEnabled = true;
158162
private static boolean debuggerEnabled = false;
@@ -273,6 +277,23 @@ public static void start(
273277
agentlessLogSubmissionEnabled = isFeatureEnabled(AgentFeature.AGENTLESS_LOG_SUBMISSION);
274278
llmObsEnabled = isFeatureEnabled(AgentFeature.LLMOBS);
275279

280+
if (llmObsEnabled) {
281+
// for llm obs spans, use agent proxy by default, apm spans will use agent writer
282+
setSystemPropertyDefault(
283+
propertyNameToSystemPropertyName(TracerConfig.WRITER_TYPE),
284+
WriterConstants.MULTI_WRITER_TYPE
285+
+ ":"
286+
+ WriterConstants.DD_INTAKE_WRITER_TYPE
287+
+ ","
288+
+ WriterConstants.DD_AGENT_WRITER_TYPE);
289+
if (llmObsAgentlessEnabled) {
290+
// use API writer only
291+
setSystemPropertyDefault(
292+
propertyNameToSystemPropertyName(TracerConfig.WRITER_TYPE),
293+
WriterConstants.DD_INTAKE_WRITER_TYPE);
294+
}
295+
}
296+
276297
if (profilingEnabled) {
277298
if (!isOracleJDK8()) {
278299
// Profiling agent startup code is written in a way to allow `startProfilingAgent` be called

dd-trace-api/src/main/java/datadog/trace/api/llmobs/LLMObsConstants.java

Lines changed: 0 additions & 5 deletions
This file was deleted.

dd-trace-core/build.gradle

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,11 @@ dependencies {
6868
implementation project(':components:json')
6969
implementation project(':utils:container-utils')
7070
implementation project(':utils:socket-utils')
71+
72+
implementation group: 'org.msgpack', name: 'msgpack-core', version: '0.8.10'
73+
implementation group: 'org.msgpack', name: 'jackson-dataformat-msgpack', version: '0.8.10'
74+
implementation group: 'com.fasterxml.jackson.core', name: 'jackson-core', version: '2.10.0'
75+
7176
// for span exception debugging
7277
compileOnly project(':dd-java-agent:agent-debugger:debugger-bootstrap')
7378

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
@@ -82,7 +82,7 @@ public static Writer createWriter(
8282

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

119+
final RemoteApi llmobsApi =
120+
createDDIntakeRemoteApi(config, commObjects, featuresDiscovery, TrackType.LLMOBS);
121+
builder.addTrack(TrackType.LLMOBS, llmobsApi);
122+
119123
remoteWriter = builder.build();
120124

121125
} else { // configuredType == DDAgentWriter
@@ -171,20 +175,34 @@ private static RemoteApi createDDIntakeRemoteApi(
171175
SharedCommunicationObjects commObjects,
172176
DDAgentFeaturesDiscovery featuresDiscovery,
173177
TrackType trackType) {
174-
if (featuresDiscovery.supportsEvpProxy() && !config.isCiVisibilityAgentlessEnabled()) {
178+
boolean evpProxySupported = featuresDiscovery.supportsEvpProxy();
179+
boolean useProxyApi =
180+
(evpProxySupported && TrackType.LLMOBS == trackType && !config.isLlmObsAgentlessEnabled())
181+
|| (evpProxySupported
182+
&& (TrackType.CITESTCOV == trackType || TrackType.CITESTCYCLE == trackType)
183+
&& !config.isCiVisibilityAgentlessEnabled());
184+
185+
if (useProxyApi) {
175186
return DDEvpProxyApi.builder()
176187
.httpClient(commObjects.okHttpClient)
177188
.agentUrl(commObjects.agentUrl)
178189
.evpProxyEndpoint(featuresDiscovery.getEvpProxyEndpoint())
179190
.trackType(trackType)
180191
.compressionEnabled(featuresDiscovery.supportsContentEncodingHeadersWithEvpProxy())
181192
.build();
182-
183193
} else {
184194
HttpUrl hostUrl = null;
195+
String llmObsAgentlessUrl = config.getLlMObsAgentlessUrl();
196+
185197
if (config.getCiVisibilityAgentlessUrl() != null) {
186198
hostUrl = HttpUrl.get(config.getCiVisibilityAgentlessUrl());
187199
log.info("Using host URL '{}' to report CI Visibility traces in Agentless mode.", hostUrl);
200+
} else if (config.isLlmObsEnabled()
201+
&& config.isLlmObsAgentlessEnabled()
202+
&& llmObsAgentlessUrl != null
203+
&& !llmObsAgentlessUrl.isEmpty()) {
204+
hostUrl = HttpUrl.get(llmObsAgentlessUrl);
205+
log.info("Using host URL '{}' to report LLM Obs traces in Agentless mode.", hostUrl);
188206
}
189207
return DDIntakeApi.builder()
190208
.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)
0