Skip to content

feat(dogstatsd): add support for observability_pipelines_worker.metrics / vector.metrics config keys#1655

Merged
gh-worker-dd-mergequeue-cf854d[bot] merged 5 commits into
mainfrom
andrewq/add-support-vector
May 14, 2026
Merged

feat(dogstatsd): add support for observability_pipelines_worker.metrics / vector.metrics config keys#1655
gh-worker-dd-mergequeue-cf854d[bot] merged 5 commits into
mainfrom
andrewq/add-support-vector

Conversation

@aqian01
Copy link
Copy Markdown
Contributor

@aqian01 aqian01 commented May 14, 2026

Summary

Source

Adds ADP support for routing metric series and sketches to Observability Pipelines Worker using:

  • observability_pipelines_worker.metrics.enabled
  • observability_pipelines_worker.metrics.url

legacy aliases:

  • vector.metrics.enabled
  • vector.metrics.url

When enabled with a valid URL, metric payloads use OPW as the primary endpoint. Non-metric payloads continue using the normal Datadog primary endpoint. additional_endpoints continue receiving dual-shipped payloads.

Changes:

  • Added OPW metrics config parsing with vector.metrics.* fallback.
  • Added per-path routing for series and sketches in the Datadog forwarder.
  • Kept dynamic API-key refresh attached to OPW-routed traffic.
  • Registered OPW metrics keys as supported config.
  • Kept OPW logs/traces keys explicitly unsupported.
  • Updated DogStatsD config docs and known config inventory.

Change Type

  • Bug fix
  • New feature
  • Non-functional (chore, refactoring, docs)
  • Performance

How did you test this PR?

Unit tests

Manual Testing
Started a local OPW listener:
nc -l 127.0.0.1 8080
Started the dev core Agent with ADP enabled:

DD_DATA_PLANE_FORCE_ENABLE=true \
DD_DATA_PLANE_ENABLED=true \
DD_DATA_PLANE_DOGSTATSD_ENABLED=true \
./bin/agent/agent run -c dev/dist/datadog.yaml

Started ADP with OPW metrics routing enabled:

DD_API_KEY=<api_key> \
DD_CMD_PORT=5001 \
DD_DATA_PLANE_ENABLED=true \
DD_DATA_PLANE_DOGSTATSD_ENABLED=true \
DD_DOGSTATSD_PORT=9191 \
DD_DOGSTATSD_SOCKET=/tmp/adp-dogstatsd-dgram.sock \
DD_DOGSTATSD_STREAM_SOCKET=/tmp/adp-dogstatsd-stream.sock \
DD_DATA_PLANE_TELEMETRY_ENABLED=true \
DD_DATA_PLANE_TELEMETRY_LISTEN_ADDR=tcp://127.0.0.1:5102 \
DD_AUTH_TOKEN_FILE_PATH=/path/to/datadog-agent/dev/dist/auth_token \
DD_IPC_CERT_FILE_PATH=/path/to/datadog-agent/dev/dist/ipc_cert.pem \
DD_OBSERVABILITY_PIPELINES_WORKER_METRICS_ENABLED=true \
DD_OBSERVABILITY_PIPELINES_WORKER_METRICS_URL=http://127.0.0.1:8080 \
RUST_LOG=info \
target/devel/agent-data-plane run

Sent a DogStatsD metric to ADP:

echo "opw.manual.test:1|c" | nc -u -w0 127.0.0.1 9191

Verified the OPW listener received the metrics request:

nc -l 127.0.0.1 8080
POST /api/v2/series HTTP/1.1
content-type: application/x-protobuf
content-encoding: zstd
dd-api-key: apikey
dd-agent-version: 0.1.37
user-agent: agent-data-plane/0.1.37
host: 127.0.0.1:8080
transfer-encoding: chunked

References

@dd-octo-sts dd-octo-sts Bot added area/components Sources, transforms, and destinations. area/docs Reference documentation. encoder/datadog-metrics Datadog Metrics encoder. forwarder/datadog Datadog forwarder. labels May 14, 2026
@pr-commenter
Copy link
Copy Markdown

pr-commenter Bot commented May 14, 2026

Binary Size Analysis (Agent Data Plane)

Target: 0408d5c (baseline) vs 08eb7ac (comparison) diff
Analysis Type: Stripped binaries (debug symbols excluded)
Baseline Size: 37.23 MiB
Comparison Size: 37.22 MiB
Size Change: -14.02 KiB (-0.04%)
Pass/Fail Threshold: +5%
Result: PASSED ✅

Changes by Module

Module File Size Symbols
figment -61.74 KiB 140
saluki_components::config_registry::datadog -43.20 KiB 3
core +41.36 KiB 1626
tonic -26.68 KiB 64
prost +22.26 KiB 108
otlp_protos::otlp_include::opentelemetry -19.45 KiB 134
serde_with -18.52 KiB 17
saluki_components::common::otlp +16.98 KiB 29
serde +16.70 KiB 21
http_body_util +15.46 KiB 67
&mut serde_json +14.94 KiB 21
saluki_components::transforms::dogstatsd_mapper +14.69 KiB 8
serde_json -9.95 KiB 39
axum +6.77 KiB 29
saluki_context::hash::hash_context_with_seen +6.04 KiB 3
[sections] -5.97 KiB 8
hyper_util +5.75 KiB 7
saluki_components::forwarders::otlp +5.53 KiB 2
saluki_components::transforms::aggregate +5.43 KiB 7
tracing +5.25 KiB 17

Detailed Symbol Changes

    FILE SIZE        VM SIZE    
 --------------  -------------- 
 +34e3% +43.5Ki +89e3% +43.5Ki    core::ops::function::FnOnce::call_once::h734b67589c43d342
  [NEW] +42.3Ki  [NEW] +42.2Ki    saluki_components::common::datadog::io::run_endpoint_io_loop::_{{closure}}::h066303133936e970
  +723% +38.7Ki  +741% +38.7Ki    saluki_components::common::otlp::traces::translator::OtlpTracesTranslator::translate_spans::hca110ec4a6bf0390
  [NEW] +12.3Ki  [NEW] +12.1Ki    _<tracing::instrument::Instrumented<T> as core::future::future::Future>::poll::h78b34981b14d9408
  [NEW] +10.8Ki  [NEW] +10.7Ki    saluki_components::sources::otlp::logs::transform::transform_log_record::hefcb9c2341939142
  [NEW] +10.5Ki  [NEW] +10.3Ki    saluki_components::transforms::dogstatsd_mapper::_::_<impl serde_core::de::Deserialize for saluki_components::transforms::dogstatsd_mapper::MetricMappingConfig>::deserialize::h0e19828712c22b7b
  [NEW] +8.28Ki  [NEW] +8.12Ki    _<figment::value::de::ConfiguredValueDe<I> as serde_core::de::Deserializer>::deserialize_any::hb25ca949f7beffcd
  [NEW] +8.06Ki  [NEW] +7.90Ki    _<&mut serde_json::de::Deserializer<R> as serde_core::de::Deserializer>::deserialize_struct::h296a1abeac8594b2
  [NEW] +7.38Ki  [NEW] +7.24Ki    saluki_components::common::datadog::config::ForwarderConfiguration::build_routable_endpoints::h635d5bf8a146ce9e
  [NEW] +6.97Ki  [NEW] +6.73Ki    saluki_components::transforms::dogstatsd_mapper::_::_<impl serde_core::de::Deserialize for saluki_components::transforms::dogstatsd_mapper::MappingProfileConfig>::deserialize::ha53eba20458470ca
  [DEL] -6.95Ki  [DEL] -6.78Ki    _<serde_with::content::de::ContentDeserializer<E> as serde_core::de::Deserializer>::deserialize_struct::he154ba270aa5f917
  [DEL] -7.82Ki  [DEL] -7.68Ki    _<serde_json::de::SeqAccess<R> as serde_core::de::SeqAccess>::next_element_seed::h7d6778903c1cffa1
  [DEL] -8.42Ki  [DEL] -8.25Ki    _<serde_with::content::de::ContentDeserializer<E> as serde_core::de::Deserializer>::deserialize_struct::h72e6f84457605ff5
  [DEL] -9.96Ki  [DEL] -9.82Ki    _<tracing::instrument::Instrumented<T> as core::future::future::Future>::poll::h8a9881bd2979145e
 -83.9% -10.3Ki -85.1% -10.3Ki    _<saluki_components::sources::otlp::logs::translator::OtlpLogsTranslator as core::iter::traits::iterator::Iterator>::next::h3860cbd002a9a1e5
 -69.3% -12.7Ki -69.7% -12.7Ki    h2::proto::connection::DynConnection<B>::recv_frame::hfe9e3743004c5b69
  [DEL] -19.2Ki  [DEL] -19.0Ki    _<figment::value::de::ConfiguredValueDe<I> as serde_core::de::Deserializer>::deserialize_any::h6d4c5015194831f4
  [DEL] -19.6Ki  [DEL] -19.5Ki    saluki_components::common::otlp::traces::transform::otel_span_to_dd_span::h886792eeb237ebc9
  -0.3% -24.7Ki  -0.3% -15.8Ki    [7520 Others]
  [DEL] -41.6Ki  [DEL] -41.5Ki    saluki_components::config_registry::datadog::SUPPORTED_ANNOTATIONS::_{{closure}}::h23d11e78cfbe0815
  [DEL] -41.6Ki  [DEL] -41.5Ki    saluki_components::common::datadog::io::run_endpoint_io_loop::_{{closure}}::hc63512f5c44efe66
  -0.0% -14.0Ki  -0.0% -5.27Ki    TOTAL

@aqian01 aqian01 marked this pull request as ready for review May 14, 2026 16:26
@aqian01 aqian01 requested a review from a team as a code owner May 14, 2026 16:26
@pr-commenter
Copy link
Copy Markdown

pr-commenter Bot commented May 14, 2026

Regression Detector (Agent Data Plane)

Run ID: aa6eb3dd-7c18-4736-a55e-62eb38fa1455
Baseline: 0408d5ce · Comparison: 08eb7acd · Diff

Optimization Goals: ✅ No significant changes detected

Fine details of change detection per experiment (35)

Experiments configured erratic: true are tagged (ignored) and skipped when determining which experiments regressed or improved. Experiments which are detected as erratic at runtime are tagged (erratic) to flag that the run's sample dispersion was high, but their regression / improvement signal still counts.

experiment goal Δ mean % links
dsd_uds_10mb_3k_contexts_cpu (erratic) cpu ⚪ +5.48 metrics profiles logs
dsd_uds_1mb_3k_contexts_cpu (erratic) cpu ⚪ +4.94 metrics profiles logs
otlp_ingest_traces_ottl_transform_5mb_cpu (erratic) cpu ⚪ +1.52 metrics profiles logs
otlp_ingest_metrics_5mb_cpu (erratic) cpu ⚪ +1.01 metrics profiles logs
dsd_uds_10mb_3k_contexts_memory memory ⚪ +0.93 metrics profiles logs
dsd_uds_100mb_3k_contexts_memory memory ⚪ +0.69 metrics profiles logs
dsd_uds_512kb_3k_contexts_memory memory ⚪ +0.61 metrics profiles logs
dsd_uds_100mb_3k_contexts_cpu (erratic) cpu ⚪ +0.59 metrics profiles logs
dsd_uds_500mb_3k_contexts_throughput throughput ⚪ -0.36 metrics profiles logs
quality_gates_rss_dsd_low memory ⚪ +0.32 metrics profiles logs
quality_gates_rss_dsd_heavy memory ⚪ +0.30 metrics profiles logs
dsd_uds_500mb_3k_contexts_memory memory ⚪ +0.25 metrics profiles logs
quality_gates_rss_dsd_ultraheavy memory ⚪ +0.19 metrics profiles logs
quality_gates_rss_dsd_medium memory ⚪ +0.16 metrics profiles logs
dsd_uds_1mb_3k_contexts_memory memory ⚪ +0.16 metrics profiles logs
otlp_ingest_traces_ottl_transform_5mb_throughput throughput ⚪ -0.14 metrics profiles logs
otlp_ingest_traces_ottl_filtering_5mb_memory memory ⚪ +0.12 metrics profiles logs
otlp_ingest_traces_5mb_memory memory ⚪ +0.06 metrics profiles logs
otlp_ingest_traces_ottl_filtering_5mb_cpu (erratic) cpu ⚪ +0.03 metrics profiles logs
dsd_uds_100mb_3k_contexts_throughput throughput ⚪ -0.02 metrics profiles logs
dsd_uds_10mb_3k_contexts_throughput throughput ⚪ -0.02 metrics profiles logs
otlp_ingest_logs_5mb_throughput (ignored) throughput ⚪ -0.01 metrics profiles logs
dsd_uds_512kb_3k_contexts_throughput throughput ⚪ -0.01 metrics profiles logs
dsd_uds_1mb_3k_contexts_throughput throughput ⚪ -0.00 metrics profiles logs
otlp_ingest_metrics_5mb_throughput throughput ⚪ +0.01 metrics profiles logs
quality_gates_rss_idle memory ⚪ -0.08 metrics profiles logs
otlp_ingest_traces_ottl_filtering_5mb_throughput throughput ⚪ +0.15 metrics profiles logs
otlp_ingest_logs_5mb_memory (ignored) memory ⚪ -0.16 metrics profiles logs
otlp_ingest_traces_ottl_transform_5mb_memory memory ⚪ -0.16 metrics profiles logs
otlp_ingest_logs_5mb_cpu (ignored) cpu ⚪ -0.34 metrics profiles logs
dsd_uds_500mb_3k_contexts_cpu (erratic) cpu ⚪ -0.60 metrics profiles logs
otlp_ingest_traces_5mb_throughput throughput ⚪ +0.95 metrics profiles logs
otlp_ingest_metrics_5mb_memory memory ⚪ -1.95 metrics profiles logs
otlp_ingest_traces_5mb_cpu (erratic) cpu ⚪ -2.46 metrics profiles logs
dsd_uds_512kb_3k_contexts_cpu (erratic) cpu 🟢 -13.70 metrics profiles logs
Bounds Checks: ✅ Passed (5)
experiment check replicates observed links
quality_gates_rss_dsd_heavy memory_usage 10/10 ✅ 121 MiB ≤ 140 MiB metrics profiles logs
quality_gates_rss_dsd_low memory_usage 10/10 ✅ 39.4 MiB ≤ 50 MiB metrics profiles logs
quality_gates_rss_dsd_medium memory_usage 10/10 ✅ 59.9 MiB ≤ 75 MiB metrics profiles logs
quality_gates_rss_dsd_ultraheavy memory_usage 10/10 ✅ 177 MiB ≤ 200 MiB metrics profiles logs
quality_gates_rss_idle memory_usage 10/10 ✅ 26.9 MiB ≤ 40 MiB metrics profiles logs
Explanation

A change is flagged as a regression when |Δ mean %| > 5.00% in the regressing direction for its optimization goal AND SMP marks the experiment as a regression (is_regression: true). Improvements use the matching criteria for the improving direction. Experiments configured erratic: true (tagged (ignored)) are skipped outright; experiments detected as erratic at runtime (tagged (erratic)) still count, since that flag describes sample dispersion rather than directional certainty. The Δ mean % cell is colored accordingly: 🟢 = improvement, 🔴 = regression, ⚪ = neutral. Reduction in CPU or memory is an improvement; reduction in ingress throughput is a regression.

Comment thread lib/saluki-components/src/common/datadog/config.rs Outdated
Comment thread lib/saluki-components/src/common/datadog/config.rs Outdated
Comment thread lib/saluki-components/src/common/datadog/config.rs Outdated
Comment thread lib/saluki-components/src/common/datadog/config.rs Outdated
Comment thread lib/saluki-components/src/common/datadog/config.rs Outdated
Comment thread lib/saluki-components/src/common/datadog/config.rs Outdated
Comment thread lib/saluki-components/src/common/datadog/io.rs Outdated
@tobz tobz changed the title feat(dogstatsd): Add support for observability_pipelines_worker.metrics / vector.metrics config keys feat(dogstatsd): add support for observability_pipelines_worker.metrics / vector.metrics config keys May 14, 2026
@tobz tobz added the type/enhancement An enhancement in functionality or support. label May 14, 2026
@gh-worker-dd-mergequeue-cf854d gh-worker-dd-mergequeue-cf854d Bot merged commit 55cfc71 into main May 14, 2026
80 checks passed
dd-octo-sts Bot pushed a commit that referenced this pull request May 14, 2026
…ics` / `vector.metrics` config keys (#1655)

## Summary
<!-- Please provide a brief summary about what this PR does. -->
[Source](#1586)

Adds ADP support for routing metric series and sketches to Observability Pipelines Worker using:

- `observability_pipelines_worker.metrics.enabled`
- `observability_pipelines_worker.metrics.url`

legacy aliases:
- `vector.metrics.enabled`
- `vector.metrics.url`

When enabled with a valid URL, metric payloads use OPW as the primary endpoint. Non-metric payloads continue using the normal Datadog primary endpoint. additional_endpoints continue receiving dual-shipped payloads.

Changes:

- Added OPW metrics config parsing with vector.metrics.* fallback.
- Added per-path routing for series and sketches in the Datadog forwarder.
- Kept dynamic API-key refresh attached to OPW-routed traffic.
- Registered OPW metrics keys as supported config.
- Kept OPW logs/traces keys explicitly unsupported.
- Updated DogStatsD config docs and known config inventory.

## Change Type
- [ ] Bug fix
- [x] New feature
- [ ] Non-functional (chore, refactoring, docs)
- [ ] Performance

## How did you test this PR?
<!-- Please how you tested these changes here -->

Unit tests

Manual Testing
Started a local OPW listener:
`nc -l 127.0.0.1 8080`
Started the dev core Agent with ADP enabled:
```
DD_DATA_PLANE_FORCE_ENABLE=true \
DD_DATA_PLANE_ENABLED=true \
DD_DATA_PLANE_DOGSTATSD_ENABLED=true \
./bin/agent/agent run -c dev/dist/datadog.yaml
```
Started ADP with OPW metrics routing enabled:
```
DD_API_KEY=<api_key> \
DD_CMD_PORT=5001 \
DD_DATA_PLANE_ENABLED=true \
DD_DATA_PLANE_DOGSTATSD_ENABLED=true \
DD_DOGSTATSD_PORT=9191 \
DD_DOGSTATSD_SOCKET=/tmp/adp-dogstatsd-dgram.sock \
DD_DOGSTATSD_STREAM_SOCKET=/tmp/adp-dogstatsd-stream.sock \
DD_DATA_PLANE_TELEMETRY_ENABLED=true \
DD_DATA_PLANE_TELEMETRY_LISTEN_ADDR=tcp://127.0.0.1:5102 \
DD_AUTH_TOKEN_FILE_PATH=/path/to/datadog-agent/dev/dist/auth_token \
DD_IPC_CERT_FILE_PATH=/path/to/datadog-agent/dev/dist/ipc_cert.pem \
DD_OBSERVABILITY_PIPELINES_WORKER_METRICS_ENABLED=true \
DD_OBSERVABILITY_PIPELINES_WORKER_METRICS_URL=http://127.0.0.1:8080 \
RUST_LOG=info \
target/devel/agent-data-plane run
```
Sent a DogStatsD metric to ADP:
```
echo "opw.manual.test:1|c" | nc -u -w0 127.0.0.1 9191
```
Verified the OPW listener received the metrics request:

```
nc -l 127.0.0.1 8080
POST /api/v2/series HTTP/1.1
content-type: application/x-protobuf
content-encoding: zstd
dd-api-key: apikey
dd-agent-version: 0.1.37
user-agent: agent-data-plane/0.1.37
host: 127.0.0.1:8080
transfer-encoding: chunked
```

## References

<!-- Please list any issues closed by this PR. -->

<!--
- Closes: <issue link>
-->

<!-- Any other issues or PRs relevant to this PR? Feel free to list them here. -->

Co-authored-by: andrew.qian <andrew.qian@datadoghq.com> 55cfc71
@tobz tobz deleted the andrewq/add-support-vector branch May 14, 2026 20:10
gh-worker-dd-mergequeue-cf854d Bot pushed a commit that referenced this pull request May 18, 2026
## Summary

OPW logs and traces routing is entirely out of scope for ADP, so the `observability_pipelines_worker.{logs,traces}.{enabled,url}` and `vector.{logs,traces}.{enabled,url}` keys have no effect on ADP behavior. Moving them from `unsupported.rs` (which surfaces `Incompatible` warnings to operators) to `ignored_keys.yaml` (silently ignored) avoids misleading noise for users who have these keys set.

These annotations were added in #1655 but I think this was a mistake.

## Test plan
- [ ] `cargo check --workspace` passes
- [ ] Verify config registry emits no warning for `observability_pipelines_worker.logs.enabled` when set

Co-authored-by: jesse.szwedko <jesse.szwedko@datadoghq.com>
dd-octo-sts Bot pushed a commit that referenced this pull request May 18, 2026
## Summary

OPW logs and traces routing is entirely out of scope for ADP, so the `observability_pipelines_worker.{logs,traces}.{enabled,url}` and `vector.{logs,traces}.{enabled,url}` keys have no effect on ADP behavior. Moving them from `unsupported.rs` (which surfaces `Incompatible` warnings to operators) to `ignored_keys.yaml` (silently ignored) avoids misleading noise for users who have these keys set.

These annotations were added in #1655 but I think this was a mistake.

## Test plan
- [ ] `cargo check --workspace` passes
- [ ] Verify config registry emits no warning for `observability_pipelines_worker.logs.enabled` when set

Co-authored-by: jesse.szwedko <jesse.szwedko@datadoghq.com> 2af77b5
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area/components Sources, transforms, and destinations. area/docs Reference documentation. encoder/datadog-metrics Datadog Metrics encoder. forwarder/datadog Datadog forwarder. mergequeue-status: done type/enhancement An enhancement in functionality or support.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants