Skip to content

feat(data-pipeline): add agentless export#2081

Merged
gh-worker-dd-mergequeue-cf854d[bot] merged 18 commits into
mainfrom
paullgdc/data-pipeline/agentless_export
Jun 30, 2026
Merged

feat(data-pipeline): add agentless export#2081
gh-worker-dd-mergequeue-cf854d[bot] merged 18 commits into
mainfrom
paullgdc/data-pipeline/agentless_export

Conversation

@paullegranddc

Copy link
Copy Markdown
Contributor

Motivation

Send traces to the agentless endpoint to replace the JS and python exporters

What changes

  • Additional JSON agentless encoder
  • Additional configuration (agentless enablement, endpoint, API key)
  • Agentless traces need top level computation, but not dropping spans

# Motivation

Send traces to the agentless endpoint to replace the JS and python exporters

# What changes

* Additional JSON agentless encoder
* Additional configuration (agentless enablement, endpoint, API key)
* Agentless traces need top level computation, but not dropping spans
@paullegranddc
paullegranddc requested review from a team as code owners June 4, 2026 14:28

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: bf49210179

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread libdd-data-pipeline/src/trace_exporter/mod.rs
@github-actions

github-actions Bot commented Jun 4, 2026

Copy link
Copy Markdown
Contributor

Clippy Allow Annotation Report

Comparing clippy allow annotations between branches:

  • Base Branch: origin/main
  • PR Branch: origin/paullgdc/data-pipeline/agentless_export

Summary by Rule

Rule Base Branch PR Branch Change
unwrap_used 2 2 No change (0%)
Total 2 2 No change (0%)

Annotation Counts by File

File Base Branch PR Branch Change
libdd-data-pipeline/src/trace_exporter/mod.rs 2 2 No change (0%)

Annotation Stats by Crate

Crate Base Branch PR Branch Change
clippy-annotation-reporter 5 5 No change (0%)
datadog-ffe-ffi 1 1 No change (0%)
datadog-ipc 22 22 No change (0%)
datadog-live-debugger 4 4 No change (0%)
datadog-live-debugger-ffi 10 10 No change (0%)
datadog-profiling-replayer 4 4 No change (0%)
datadog-sidecar 45 45 No change (0%)
libdd-common 13 13 No change (0%)
libdd-common-ffi 12 12 No change (0%)
libdd-data-pipeline 6 6 No change (0%)
libdd-ddsketch 2 2 No change (0%)
libdd-dogstatsd-client 1 1 No change (0%)
libdd-profiling 13 13 No change (0%)
libdd-remote-config 3 3 No change (0%)
libdd-telemetry 20 20 No change (0%)
libdd-tinybytes 4 4 No change (0%)
libdd-trace-normalization 2 2 No change (0%)
libdd-trace-obfuscation 3 3 No change (0%)
libdd-trace-stats 1 1 No change (0%)
libdd-trace-utils 11 11 No change (0%)
Total 182 182 No change (0%)

About This Report

This report tracks Clippy allow annotations for specific rules, showing how they've changed in this PR. Decreasing the number of these annotations generally improves code quality.

@codecov-commenter

codecov-commenter commented Jun 4, 2026

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 86.38083% with 108 lines in your changes missing coverage. Please review.
✅ Project coverage is 73.73%. Comparing base (582bee1) to head (f208a39).
⚠️ Report is 51 commits behind head on main.

Additional details and impacted files
@@            Coverage Diff             @@
##             main    #2081      +/-   ##
==========================================
+ Coverage   73.58%   73.73%   +0.14%     
==========================================
  Files         470      474       +4     
  Lines       78449    79241     +792     
==========================================
+ Hits        57729    58425     +696     
- Misses      20720    20816      +96     
Components Coverage Δ
libdd-crashtracker 65.46% <ø> (-0.02%) ⬇️
libdd-crashtracker-ffi 37.68% <ø> (ø)
libdd-agent-client 83.79% <ø> (ø)
libdd-alloc 98.77% <ø> (ø)
libdd-data-pipeline 86.76% <78.57%> (-0.39%) ⬇️
libdd-data-pipeline-ffi 77.03% <ø> (ø)
libdd-common 79.93% <ø> (ø)
libdd-common-ffi 74.41% <ø> (ø)
libdd-telemetry 73.34% <ø> (-0.03%) ⬇️
libdd-telemetry-ffi 31.36% <ø> (ø)
libdd-dogstatsd-client 82.64% <ø> (ø)
datadog-ipc 76.22% <ø> (+1.46%) ⬆️
libdd-profiling 81.68% <ø> (-0.02%) ⬇️
libdd-profiling-ffi 64.79% <ø> (ø)
libdd-sampling 97.41% <ø> (ø)
datadog-sidecar 35.99% <ø> (ø)
datdog-sidecar-ffi 15.89% <ø> (ø)
spawn-worker 48.86% <ø> (ø)
libdd-tinybytes 93.80% <ø> (ø)
libdd-trace-normalization 81.71% <ø> (ø)
libdd-trace-obfuscation 87.30% <ø> (ø)
libdd-trace-protobuf 68.25% <ø> (ø)
libdd-trace-utils 89.35% <90.32%> (+0.06%) ⬆️
libdd-tracer-flare 86.88% <ø> (ø)
libdd-log 74.83% <ø> (ø)
🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@dd-octo-sts

dd-octo-sts Bot commented Jun 4, 2026

Copy link
Copy Markdown
Contributor

Artifact Size Benchmark Report

aarch64-alpine-linux-musl
Artifact Baseline Commit Change
/aarch64-alpine-linux-musl/lib/libdatadog_profiling.a 85.14 MB 85.55 MB +.48% (+426.84 KB) 🔍
/aarch64-alpine-linux-musl/lib/libdatadog_profiling.so 7.82 MB 7.88 MB +.80% (+64.14 KB) 🔍
aarch64-unknown-linux-gnu
Artifact Baseline Commit Change
/aarch64-unknown-linux-gnu/lib/libdatadog_profiling.so 10.51 MB 10.53 MB +.13% (+14.76 KB) 🔍
/aarch64-unknown-linux-gnu/lib/libdatadog_profiling.a 96.27 MB 96.71 MB +.44% (+442.96 KB) 🔍
libdatadog-x64-windows
Artifact Baseline Commit Change
/libdatadog-x64-windows/debug/dynamic/datadog_profiling_ffi.dll 25.14 MB 25.34 MB +.80% (+207.50 KB) 🔍
/libdatadog-x64-windows/debug/dynamic/datadog_profiling_ffi.lib 88.04 KB 88.04 KB 0% (0 B) 👌
/libdatadog-x64-windows/debug/dynamic/datadog_profiling_ffi.pdb 183.36 MB 184.19 MB +.45% (+856.00 KB) 🔍
/libdatadog-x64-windows/debug/static/datadog_profiling_ffi.lib 938.86 MB 942.86 MB +.42% (+3.99 MB) 🔍
/libdatadog-x64-windows/release/dynamic/datadog_profiling_ffi.dll 8.22 MB 8.28 MB +.70% (+59.00 KB) 🔍
/libdatadog-x64-windows/release/dynamic/datadog_profiling_ffi.lib 88.04 KB 88.04 KB 0% (0 B) 👌
/libdatadog-x64-windows/release/dynamic/datadog_profiling_ffi.pdb 24.30 MB 24.47 MB +.67% (+168.00 KB) 🔍
/libdatadog-x64-windows/release/static/datadog_profiling_ffi.lib 48.47 MB 48.75 MB +.58% (+288.39 KB) 🔍
libdatadog-x86-windows
Artifact Baseline Commit Change
/libdatadog-x86-windows/debug/dynamic/datadog_profiling_ffi.dll 21.79 MB 21.98 MB +.85% (+190.50 KB) 🔍
/libdatadog-x86-windows/debug/dynamic/datadog_profiling_ffi.lib 89.42 KB 89.42 KB 0% (0 B) 👌
/libdatadog-x86-windows/debug/dynamic/datadog_profiling_ffi.pdb 187.40 MB 188.23 MB +.44% (+856.00 KB) 🔍
/libdatadog-x86-windows/debug/static/datadog_profiling_ffi.lib 927.44 MB 931.47 MB +.43% (+4.02 MB) 🔍
/libdatadog-x86-windows/release/dynamic/datadog_profiling_ffi.dll 6.35 MB 6.40 MB +.78% (+51.00 KB) 🔍
/libdatadog-x86-windows/release/dynamic/datadog_profiling_ffi.lib 89.42 KB 89.42 KB 0% (0 B) 👌
/libdatadog-x86-windows/release/dynamic/datadog_profiling_ffi.pdb 26.09 MB 26.27 MB +.68% (+184.00 KB) 🔍
/libdatadog-x86-windows/release/static/datadog_profiling_ffi.lib 46.11 MB 46.39 MB +.61% (+288.57 KB) 🔍
x86_64-alpine-linux-musl
Artifact Baseline Commit Change
/x86_64-alpine-linux-musl/lib/libdatadog_profiling.a 75.88 MB 76.30 MB +.54% (+426.82 KB) 🔍
/x86_64-alpine-linux-musl/lib/libdatadog_profiling.so 8.70 MB 8.74 MB +.44% (+40.12 KB) 🔍
x86_64-unknown-linux-gnu
Artifact Baseline Commit Change
/x86_64-unknown-linux-gnu/lib/libdatadog_profiling.a 91.34 MB 91.77 MB +.46% (+431.88 KB) 🔍
/x86_64-unknown-linux-gnu/lib/libdatadog_profiling.so 10.59 MB 10.65 MB +.53% (+58.02 KB) 🔍

@datadog-datadog-prod-us1

datadog-datadog-prod-us1 Bot commented Jun 4, 2026

Copy link
Copy Markdown
Contributor

Tests

🎉 All green!

🧪 All tests passed
❄️ No new flaky tests detected

🎯 Code Coverage (details)
Patch Coverage: 88.97%
Overall Coverage: 74.15% (+0.15%)

This comment will be updated automatically if new data arrives.
🔗 Commit SHA: 1d15342 | Docs | Datadog PR Page | Give us feedback!

self.agentless_endpoint.as_ref(),
) {
(Some(_), Some(_)) => {
tracing::warn!(

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should the builder fail if it has conflicting configuration? SDK configuration is complex. I'm of the opinion that it's better for the complexity to be concentrated in the SDKs and let them handle things like precedence.

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

On the same topic, the build should probably error out if set_url and output_format is used and agentless is set at the same time.

),
};

let agentless_config = match (agentless_endpoint, agentless_api_key) {

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

agentless config is going to happen after AgentInfoFetcher is spawned here. Won't that fail every 5 minutes when it polls an agent that doesn't exist?

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think the same applies to telemetry? It's built against the agent url.

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think all of this also applies to otlp mode for the exporter.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Made agentless mode incompatible with OLTP and agent.

OTLP is not incompatible with the agent settings though (and maybe shoudln't be? Users could be using the datadog agent still so we still get telemetry, but decide to export traces in otlp format somewhere else)

Comment thread libdd-data-pipeline/src/agentless/exporter.rs Outdated
for (k, v) in span.meta_struct.iter() {
let key: &str = k.borrow();
let bytes: &[u8] = v.borrow();
// Encode as a JSON array of u8 (default serde behavior for &[u8]).

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is this the right thing to do? If i'm reading js correctly (a big if) they just send meta_struct values as json, not msgpack encoded bytes.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

fixed, we now transcode the msp bytes to a json object

Comment thread libdd-trace-utils/src/agentless_encoder/mod.rs
}

/// Sends trace chunks to the Datadog agentless intake (`/v1/input`) as JSON.
async fn send_agentless_traces_inner<T: TraceData>(

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Where is max payload size handled? In the SDKs? I assume the endpoint has a max size that we have to respect?

@paullegranddc paullegranddc Jun 4, 2026

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It has a 5MB size limit I believe. I don't think this limit should be enforced in the trace exporter though.
It should probably be at the trace buffer.

Or maybe we could split incoming list of trace chunks in multiple payloads 🤔

@ekump ekump Jun 5, 2026

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ah, that's a good point. The trace buffer should handle flushing below the limit.

Although, looking at the trace buffer in data pipeline we don't enforce limits or split up chunks. We check after a chunk is added, and flush above flush_trigger_bytes. It's theoretically possible that if we receive a significantly large chunk we flush something that exceeds the intake limit. In a similar vain, we only drop chunks after max_buffered_bytes is exceeded, which can also trigger a flush that's beyond intake's limit.

What may make this an issue for agentless is that the max size for the agent is significantly larger than intake's limit. And the agent handles splitting up the payloads for intake's limits. So the trace buffers can usually get away with "trigger a flush once we exceed a limit".

I'm not sure this is a practical problem today that we need to deal with in this PR? I think we can tackle it separately?

Comment thread libdd-data-pipeline/examples/send-traces-agentless.rs
@bwoebi

bwoebi commented Jun 5, 2026

Copy link
Copy Markdown
Contributor

I have some questions:

  • Why is this serializing directly to JSON, rather than converting pb::TraceChunk (v07)? This would also be the proper long-term plan to just support v1 out of the box later.
  • We do have quite a bit of machinery in SendData to submit send_with_protobuf() - all there; including the existing retry mechanisms etc.
  • Endpoint has an api_key field, which is meant to distinguish the payload it gets sent to.

This PR feels like a lot of re-inventing the wheel.

@paullegranddc

paullegranddc commented Jun 5, 2026

Copy link
Copy Markdown
Contributor Author

Why is this serializing directly to JSON, rather than converting pb::TraceChunk (v07)?

Because it is not the same schema.

The agentless endpoint expects something like { traces: { runtime_id, <other tracer meta >, spans: [ {span_id: str (hex encoded), <other fields>} ]} }
Whereas V07 is a TracerPayload which is { <tracer meta>, chunks: [ { <chunk meta>, spans: [ {span_id: u64 } ] } ] }

As to why I do the conversion at encoding, creating an struct AgentlessPayload deriving serde and converting v04 span to this payload is way less efficient than doing it since we need to allocate intermediary structs

We do have quite a bit of machinery in SendData to submit send_with_protobuf() - all there; including the existing retry mechanisms etc.
Endpoint has an api_key field, which is meant to distinguish the payload it gets sent to.

I mean, send_agentless_traces_http is not that long, we do use the send_with_retry function so the logic is encapsulated and has the advantage of being independent from the rest of SendData, no mixed code path between different encoding and endpoints, easy to remove if we decide to drop agentless submission.

I agree that the api key should be passed in the Endpoint and I missed that I could reuse Endpoint::set_standard_headers https://github.com/DataDog/libdatadog/blob/main/libdd-common/src/lib.rs#L350

@bwoebi

bwoebi commented Jun 5, 2026

Copy link
Copy Markdown
Contributor

Makes sense, there is quite some overhead. The v1 protocol is much better at being transformed from what agent expects to what intake expects.
Let's leave this that way then.

I would prefer though if this weren't part of data-pipeline, but SendData as well. (i.e. just moving the code there).
Because the data-pipeline path is not accessible to the sidecar path at least (which we'll probably use too in 1~2 months).

@paullegranddc
paullegranddc force-pushed the paullgdc/data-pipeline/agentless_export branch from e358423 to 9b505b4 Compare June 22, 2026 16:30
@paullegranddc
paullegranddc requested a review from a team as a code owner June 25, 2026 15:25
Comment thread libdd-trace-utils/src/agentless_encoder/mod.rs Outdated

@Aaalibaba42 Aaalibaba42 left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Tiny nits

Comment thread libdd-data-pipeline/examples/send-traces-agentless.rs Outdated
Comment thread libdd-trace-utils/src/agentless_encoder/mod.rs Outdated
//! `metrics["_trace_root"]=1` where applicable.
//! - **Non-finite metrics** (NaN/Inf) are dropped (JSON can't represent them).
//!
//! Left todo is span normalization (service/name/resource/type truncation + defaults)

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is this a blocker to release ?

@paullegranddc paullegranddc Jun 29, 2026

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

minor: Would you mind changing this to // TODO: ... and adding a Jira ticket to track it?

Comment thread libdd-trace-utils/src/agentless_encoder/mod.rs

@ekump ekump left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

A few potential follow-ups, but nothing blocking. LGTM.

Comment on lines +21 to +23
//! - **Mutual exclusion with OTLP**: if both an OTLP and an agentless endpoint are configured on
//! the builder, OTLP wins and the agentless config is silently dropped with a warning at build
//! time.

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
//! - **Mutual exclusion with OTLP**: if both an OTLP and an agentless endpoint are configured on
//! the builder, OTLP wins and the agentless config is silently dropped with a warning at build
//! time.
//! - **Mutually exclusive transport**: agentless cannot be combined with OTLP
//! ([`set_otlp_endpoint`]), a caller-supplied agent URL ([`set_url`]), or log output;
//! configuring any of them together causes `build`/`build_async` to return
//! `BuilderErrorKind::InvalidConfiguration`.

}
}

#[cfg_attr(miri, ignore)]

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We still create an InvalidUrl error if you pass an empty string. We should probably continue to test that?

Comment thread libdd-data-pipeline/examples/send-traces-agentless.rs
/// Agentless trace export is mutually exclusive with both OTLP trace export
/// ([`Self::set_otlp_endpoint`]) and a configured agent URL ([`Self::set_url`]);
/// combining either with this method causes [`Self::build`]/[`Self::build_async`]
/// to return [`BuilderErrorKind::InvalidConfiguration`].

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
/// to return [`BuilderErrorKind::InvalidConfiguration`].
/// to return [`BuilderErrorKind::InvalidConfiguration`].
/// the output format is ignored in agentless mode; payloads are always
/// JSON

//! `metrics["_trace_root"]=1` where applicable.
//! - **Non-finite metrics** (NaN/Inf) are dropped (JSON can't represent them).
//!
//! Left todo is span normalization (service/name/resource/type truncation + defaults)

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

minor: Would you mind changing this to // TODO: ... and adding a Jira ticket to track it?

///
/// Returns `None` if serialization fails. The result is truncated to
/// [`MAX_META_VALUE_LEN`] characters with a trailing `"..."` if it would
/// otherwise exceed that limit.

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It's ok to defer to another PR, but if we truncate it's going to result in malformed JSON and get rejected at intake. I think #980 also introduces the same issue.

let key: &str = k.borrow();
let bytes: &[u8] = v.borrow();

// abort whole payload on malformed entry

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ok to defer to another PR: Should we really be aborting the entire payload if a single span's meta_struct fails to serialize? I think dd-trace-js will drop just the span.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The issue is that there is no easy way to both:

  • Not add overhead by going though an intermediary buffer
  • Rollback partial invalid writes

In practice since meta struct bytes are generated by tracers from objects when passing spans to libdatadog, this is not an error path that's going to happen anyway

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I agree with you here, but it will probably come back and bite us...

this is not an error path that's going to happen anyway

)?;
map.serialize_entry("service", service_str)?;
map.serialize_entry("error", &span.error)?;
map.serialize_entry("start", &span.start)?;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do we need to apply the unix normalization done for v04 msgpack encoding ? (i.e. Replacing negative by 0)

Comment thread libdd-trace-utils/src/agentless_encoder/mod.rs
Comment on lines +239 to +248
if !span_links_seen && !span.span_links.is_empty() {
if let Some(s) = serialize_span_links(&span.span_links) {
meta.serialize_entry("_dd.span_links", &s)?;
}
}
if !events_seen && !span.span_events.is_empty() {
if let Some(s) = serialize_span_events(&span.span_events) {
meta.serialize_entry("events", &s)?;
}
}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We should document that span.span_events/span_links are dropped if the field already exists in meta

/// `https://public-trace-http-intake.logs.datadoghq.com/v1/input`).
pub endpoint_url: String,
/// Datadog API key used for the `dd-api-key` header.
pub api_key: String,

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nit: Any reason to not use Endpoint to handle the api key ?

@gh-worker-dd-mergequeue-cf854d
gh-worker-dd-mergequeue-cf854d Bot merged commit 48b8243 into main Jun 30, 2026
131 checks passed
@gh-worker-dd-mergequeue-cf854d
gh-worker-dd-mergequeue-cf854d Bot deleted the paullgdc/data-pipeline/agentless_export branch June 30, 2026 18:04
iunanua added a commit that referenced this pull request Jul 7, 2026
…ibdd-data-pipeline, libdd-li... (#2201)

# Release proposal for libdd-capabilities-impl, libdd-common,
libdd-data-pipeline, libdd-library-config, libdd-remote-config,
libdd-sampling, libdd-telemetry, libdd-tinybytes, libdd-trace-utils and
their dependencies

This PR contains version bumps based on public API changes and commits
since last release.

## libdd-capabilities
**Next version:** `2.1.0`
**Semver bump:** `minor`
**Tag:** `libdd-capabilities-v2.1.0`

### Commits

- feat(data-pipeline)!: add stdout log trace exporter (#2074)

## libdd-common
**Next version:** `5.1.0`
**Semver bump:** `minor`
**Tag:** `libdd-common-v5.1.0`

### Commits

- refactor(clippy): prefer core and alloc imports (#2196)
- fix: update rustls-webpki to 0.103.13 (#2187)
- fix: update anyhow for unsoundness (#2186)
- feat(machine id): Add helpers in ddcommon to fetch the machine UUID l…
(#2163)

## libdd-ddsketch
**Next version:** `1.1.0`
**Semver bump:** `minor`
**Tag:** `libdd-ddsketch-v1.1.0`

### Commits

- feat(data-pipeline)!: export client-computed span stats as OTLP trace
metrics (#2067)
- test(ddsketch): add microbenchmarks for add/encode/collapse (#2125)

## libdd-trace-protobuf
**Next version:** `4.0.0`
**Semver bump:** `major`
**Tag:** `libdd-trace-protobuf-v4.0.0`

### Commits

- chore!: update protobufs to be in sync with datadog-agent (#2180)
- feat(stats)!: add whole key cardinality limit (#2158)
- feat(remote-config)!: use the proto file from the agent (#2165)
- feat(data-pipeline): OTLP HTTP/protobuf trace export (#2115)

## libdd-capabilities-impl
**Next version:** `3.0.0`
**Semver bump:** `major`
**Tag:** `libdd-capabilities-impl-v3.0.0`

### ⚠️ major bump forced due to:

- `libdd-common`: ^4.1.0 → ^5.1.0

### Commits

- feat(data-pipeline)!: add stdout log trace exporter (#2074)

## libdd-library-config
**Next version:** `3.0.0`
**Semver bump:** `major`
**Tag:** `libdd-library-config-v3.0.0`

### ⚠️ major bump forced due to:

- `libdd-trace-protobuf`: ^3.0.2 → ^4.0.0

### Commits

- refactor(clippy): prefer core and alloc imports (#2196)
- feat(library-config)!: caller-supplied threadlocal schema and extra
process-context attributes (#2162)
- fix(otel-thread-ctx): put the threadlocal attributes at the right
place in the context (#2167)

## libdd-remote-config
**Next version:** `2.0.0`
**Semver bump:** `major`
**Tag:** `libdd-remote-config-v2.0.0`

### ⚠️ major bump forced due to:

- `libdd-trace-protobuf`: ^3.0.2 → ^4.0.0

### Commits

- refactor(libdd-remote-config)!: hide Target inner properties so they
are not leaked (#2182)
- feat(remote-config)!: use the proto file from the agent (#2165)
- refactor(rc): reexport Endpoint and Tag common types (#2147)

## libdd-trace-normalization
**Next version:** `3.0.0`
**Semver bump:** `major`
**Tag:** `libdd-trace-normalization-v3.0.0`

### ⚠️ major bump forced due to:

- `libdd-trace-protobuf`: ^3.0.1 → ^4.0.0

### Commits

- feat(data-pipeline)!: CSS Trace Filters (#1985)

## libdd-shared-runtime
**Next version:** `2.0.0`
**Semver bump:** `major`
**Tag:** `libdd-shared-runtime-v2.0.0`

### ⚠️ major bump forced due to:

- `libdd-common`: ^4.1.0 → ^5.1.0

### Commits

- feat(shared-runtime)!: SharedRuntime Borrowed & Owned mode (#2061)
- feat(shared-runtime)!: use weak waker in trigger [APMSP-3371] (#2050)

## libdd-trace-utils
**Next version:** `9.0.0`
**Semver bump:** `major`
**Tag:** `libdd-trace-utils-v9.0.0`

### ⚠️ major bump forced due to:

- `libdd-common`: ^4.2.0 → ^5.1.0
- `libdd-trace-protobuf`: ^3.0.2 → ^4.0.0

### Commits

- ci(miri): skip slow miri tests (#2188)
- chore!: update protobufs to be in sync with datadog-agent (#2180)
- feat(data-pipeline): add agentless export (#2081)
- feat(data-pipeline)!: add stdout log trace exporter (#2074)
- feat(data-pipeline): OTLP HTTP/protobuf trace export (#2115)
- feat(otlp)!: Export OTLP spans with attribute-level OTel compatibility
(#2091)
- test(trace-utils): add V05 msgpack decode microbenchmark (#2127)
- feat(data-pipeline)!: export client-computed span stats as OTLP trace
metrics (#2067)
- test(trace-utils): add VecMap microbenchmarks (#2126)
- chore(stats)!: submit p0 telemetry in stats (#2130)
- refactor(change-buffer)!: replace slot index with span_id, fix segment
isolation (#2105)
- feat(data-pipeline)!: CSS Trace Filters (#1985)
- feat(trace-exporter): add v1 span and its encoder (#2039)
- fix(trace-utils): mark decoded span maps as deduped (#2110)
- feat(trace-utils)!: change buffer implementation (#2055)
- feat(native-spans)!: change buffer foundation (#2046)
- refactor(span)!: use VecMap for `meta`, `metrics` and `meta_struct`
for v04 spans (#2043)
- test: fix timeouts on heavily contended scenarios (#2093)

## libdd-telemetry
**Next version:** `6.0.0`
**Semver bump:** `major`
**Tag:** `libdd-telemetry-v6.0.0`

### ⚠️ major bump forced due to:

- `libdd-common`: ^4.2.0 → ^5.1.0
- `libdd-shared-runtime`: ^1.0.0 → ^2.0.0

### Commits

- ci(miri): skip slow miri tests (#2188)
- refactor(libdd-telemetry)!: avoid leaking libdd-common types in the
public API (#2152)
- feat(shared-runtime)!: SharedRuntime Borrowed & Owned mode (#2061)

## libdd-trace-obfuscation
**Next version:** `5.0.0`
**Semver bump:** `major`
**Tag:** `libdd-trace-obfuscation-v5.0.0`

### ⚠️ major bump forced due to:

- `libdd-common`: ^4.2.0 → ^5.1.0
- `libdd-trace-protobuf`: ^3.0.2 → ^4.0.0
- `libdd-trace-utils`: ^8.0.0 → ^9.0.0

### Commits

- refactor(clippy): prefer core and alloc imports (#2196)
- ci(miri): skip slow miri tests (#2188)
- fix: update anyhow for unsoundness (#2186)

## libdd-trace-stats
**Next version:** `6.0.0`
**Semver bump:** `major`
**Tag:** `libdd-trace-stats-v6.0.0`

### ⚠️ major bump forced due to:

- `libdd-common`: ^4.2.0 → ^5.1.0
- `libdd-shared-runtime`: ^1.0.0 → ^2.0.0
- `libdd-trace-protobuf`: ^3.0.2 → ^4.0.0
- `libdd-trace-utils`: ^8.0.0 → ^9.0.0

### Commits

- chore!: update protobufs to be in sync with datadog-agent (#2180)
- feat(stats)!: send telemetry for cardinality limits (#2159)
- feat(stats)!: add whole key cardinality limit (#2158)
- fix(trace-stats)!: add grpc_method to aggregation key (#2151)
- feat(shared-runtime)!: SharedRuntime Borrowed & Owned mode (#2061)
- feat(data-pipeline)!: export client-computed span stats as OTLP trace
metrics (#2067)
- refactor(span)!: use VecMap for `meta`, `metrics` and `meta_struct`
for v04 spans (#2043)

## libdd-data-pipeline
**Next version:** `7.0.0`
**Semver bump:** `major`
**Tag:** `libdd-data-pipeline-v7.0.0`

### ⚠️ major bump forced due to:

- `libdd-common`: ^4.2.0 → ^5.1.0
- `libdd-shared-runtime`: ^1.0.0 → ^2.0.0
- `libdd-telemetry`: ^5.0.1 → ^6.0.0
- `libdd-trace-protobuf`: ^3.0.2 → ^4.0.0
- `libdd-trace-stats`: ^5.0.0 → ^6.0.0
- `libdd-trace-utils`: ^8.0.0 → ^9.0.0

### Commits

- feat(trace_exporter): enable telemetry in stats exporter (#2160)
- refactor(libdd-telemetry)!: avoid leaking libdd-common types in the
public API (#2152)
- feat(stats): emit canonical gRPC status name for OTLP
rpc.response.status_code (#2183)
- feat(data-pipeline): add agentless export (#2081)
- feat(stats)!: send telemetry for cardinality limits (#2159)
- feat(stats)!: add whole key cardinality limit (#2158)
- fix(trace-stats)!: add grpc_method to aggregation key (#2151)
- feat(data-pipeline)!: add stdout log trace exporter (#2074)
- feat(shared-runtime)!: SharedRuntime Borrowed & Owned mode (#2061)
- feat(data-pipeline): OTLP HTTP/protobuf trace export (#2115)
- feat(otlp)!: Export OTLP spans with attribute-level OTel compatibility
(#2091)
- feat(data-pipeline)!: export client-computed span stats as OTLP trace
metrics (#2067)
- chore(stats)!: submit p0 telemetry in stats (#2130)
- feat(data-pipeline)!: CSS Trace Filters (#1985)
- feat(shared-runtime)!: use weak waker in trigger [APMSP-3371] (#2050)
- refactor(span)!: use VecMap for `meta`, `metrics` and `meta_struct`
for v04 spans (#2043)
- feat(stats)!: add endpoint gating to client-side stats [APMSP-3361]
(#2040)

## libdd-dogstatsd-client
**Next version:** `4.0.0`
**Semver bump:** `major`
**Tag:** `libdd-dogstatsd-client-v4.0.0`

### ⚠️ major bump forced due to:

- `libdd-common`: ^4.1.0 → ^5.1.0


## libdd-sampling
**Next version:** `5.0.0`
**Semver bump:** `major`
**Tag:** `libdd-sampling-v5.0.0`

### ⚠️ major bump forced due to:

- `libdd-common`: ^4.2.0 → ^5.1.0
- `libdd-trace-utils`: ^8.0.0 → ^9.0.0


[APMSP-3371]:
https://datadoghq.atlassian.net/browse/APMSP-3371?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ

---------

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: iunanua <[email protected]>
taegyunkim pushed a commit that referenced this pull request Jul 8, 2026
# Motivation

Send traces to the agentless endpoint to replace the JS and python exporters

# What changes

* Additional JSON agentless encoder
* Additional configuration (agentless enablement, endpoint, API key)
* Agentless traces need top level computation, but not dropping spans

Co-authored-by: paul.legranddescloizeaux <[email protected]>
Signed-off-by: Taegyun Kim <[email protected]>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

7 participants