Skip to content

chore(config): experiment - mapless config system implementation 3b#1886

Draft
webern wants to merge 25 commits into
mainfrom
m/spike-3b
Draft

chore(config): experiment - mapless config system implementation 3b#1886
webern wants to merge 25 commits into
mainfrom
m/spike-3b

Conversation

@webern

@webern webern commented Jun 18, 2026

Copy link
Copy Markdown
Contributor

Summary

This is a prototype of a system that eliminates untyped, stringly access to a generic configuration map and produces a strongly typed barrier between agent-data-plane and Datadog Agent config. It encapsulates knowledge of Datadog Agent configuration into a single system, isolated from agent-data-plane and provides the extension point where other configuration dialects may be inserted (such as OTeL, for example).

This PR is not mergeable, but I need to keep it here and keep it healthy and rebased. The "real" PRs will essentially burn down this diff in more manageable chunks.

Change Type

  • Non-functional (chore, refactoring, docs)

How did you test this PR?

This PR is basically a test, in itself, of the design and the ability to pass CI with a prototype of the design.

References

#1788

webern added 14 commits June 18, 2026 12:02
Rename the forwarder DatadogConfiguration to DatadogForwarderConfiguration, then
generate a public nested DatadogConfiguration in datadog-agent-config for the
support: full / support: partial overlay keys. The overlay selects the keys
(schema pruning); typify generates the nested struct tree from the pruned JSON
Schema. Numerics mirror the schema (f64); refinement is deferred to the
translator. Mostly unused until the translator PR.
The name saluki-config conflates pretty easy with the actual
configuration structs that are used to configure saluki components and
agent-data-plane. In reality, the crate is a utility crate for
configuration mechanics, and tools will help disambiguate as we build
out the config translation system.
Adds the following new crates in an empty state:
- lib/agent-data-plane-config-system
- lib/agent-data-plane-config
- lib/saluki-component-config
A new form of testing is added at test/architecture which cuts across
crate boundaries. It uses grep and crate dependencies etc to assert
things like crate-a must not depend on crate-b. ThisType must not appear
in crate-c.

The purpose, initially, is to drive config system development. But
ultimately this could be a powerful way to constrain coding agents from
creating architectural entropy.
Source-agnostic component-native config structs mirroring the config-only
fields of each saluki-components struct, plus ScopedConfig<T> fixed-or-live
handle. Un-ignore the step-2 leaf dependency guards.

Build Order step 2.
Add witness_gen.rs: generate DatadogConfigConsumer (one consume_<key> per
supported key) and a fallible drive() that walks DatadogConfiguration with
clobber-with-defaults semantics for absent optional sections. Add hand-written
TranslateError. Relocate KEY_ALIASES and DatadogRemapper here as the
authoritative Datadog source-normalization home.

Fix: datadog_config_gen.rs now resolves schema $refs, so apm_config.* and
multi_region_failover.* keys are no longer silently dropped from
DatadogConfiguration. Witness now covers all 147 support: full/partial keys.

Build Order step 4.
Define SalukiConfiguration { control, components } with per-domain group
wrappers embedding saluki-component-config leaf structs directly.
ControlConfiguration carries pipeline gates and topology-shaping.
SalukiOnlyConfiguration + seed(), BootstrapConfiguration { datadog, saluki },
authority enums, and ConfigViews. Add the binary-local dogstatsd filter and
workload leaf structs. Add Serialize/PartialEq/Eq to saluki-io ListenAddress.
Un-ignore step-3 dependency guards.

Build Order step 3.
RemoteAgentClientConfiguration (pure typed config), connect() ->
DatadogAgentConnection (Arc-shared session + config stream), and a typed
Attachments bundle (status/flare/telemetry/metrics/autodiscovery/host_tags).
The raw map is confined inside connect(); no public signature exposes it.

Build Order step 6.
Translator implements all 147 witness consume_<key> methods, delegating by
ownership domain to translate/datadog/<subsystem>.rs. Endpoints assembled from
scratch in finish(); translate() runs seed-then-drive as the single reusable
path for startup and dynamic retranslation. Add ControlConfiguration.log_file
as the destination for data_plane.log_file.

Build Order step 7.
ConfigUpdateRouter ingests ConfigUpdate snapshots/partials into a retained
source snapshot, retranslates via the same seed-then-drive path, and routes
coarse per-slice diffs to typed ScopedConfig<T> handles (DynamicConfigHandles).
Rejects malformed updates and keeps last-good. Live in stream mode, Fixed in
local mode. Dynamic log level routed as a dedicated ScopedConfig<String>.

Build Order step 8.
ConfigurationSystem::load loads local Datadog + Saluki sources once, parses
typed BootstrapConfiguration, and decides LocalSnapshot vs AgentStream
authority. start_runtime consumes the loaded object by value: in local mode the
local snapshot is the runtime authority; in stream mode it connects, awaits the
first config-stream snapshot, and spawns the dynamic router task. Started exposes
saluki()/dynamic_handles()/attachments()/config_views(). Views regenerate
live-on-request from a shared ViewSources cell, scrubbed via saluki-common.
Un-ignore the step-7 config-system guard.

Build Order step 5 (+ /config view producer).
Components no longer parse GenericConfiguration. Each Configuration consumes its
source-agnostic leaf slice: trivial configs embed the leaf struct directly,
behavior-carrying configs (forwarder, apm, obfuscation, otlp, retry/proxy) build
from it via from_native adapters. Dynamic components (forwarder API-key,
dsd debug-log, MRF) consume ScopedConfig<T> handles instead of string-key
watches. Raw-map config validation removed from components (now config-system's
job). All forbidden raw-map symbols eliminated from the crate.

NOTE: bin/agent-data-plane does not yet compile -- the topology/startup cutover
that feeds these typed slices lands in the next commit (atomic refactor).

Build Order step 9 (components half).
Startup is now ConfigurationSystem::load -> start_runtime: bootstrap logging
and early metrics from typed slices, topology consumes ControlConfiguration +
ComponentConfiguration native slices and DynamicConfigHandles, internal services
build on typed Attachments, /config serves scrubbed ConfigViews live-on-request,
and dynamic log level rides ScopedConfig<String>. Pipeline-gate predicates moved
onto ControlConfiguration. All raw-map symbols eliminated from the binary; the
out-of-scope saluki-env provider layer is fed via a confined EnvConfig
pass-through owned by config-system. Un-ignore all remaining step-9/10/11 guards.

Build Order steps 9 (binary), 10, 11.
Fix clippy lints (char-pattern, push_str newline, field-reassign-with-default),
remove dependencies orphaned by the cutover (facet/figment/serde_with/serde_yaml
from saluki-components; prost-types/serde_with from agent-data-plane), sync the
third-party license file, extend the Vale technical vocabulary, and repair
intra-doc links. make check-all is green.
@webern webern requested a review from a team as a code owner June 18, 2026 10:24
@datadog-official

datadog-official Bot commented Jun 18, 2026

Copy link
Copy Markdown

Pipelines

Fix all issues with BitsAI

⚠️ Warnings

🚦 2 Pipeline jobs failed

DataDog/saluki | report-benchmarks-adp   View in Datadog   GitLab

DataDog/saluki | run-benchmarks-adp   View in Datadog   GitLab

Useful? React with 👍 / 👎

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

@dd-octo-sts dd-octo-sts Bot added area/io General I/O and networking. area/config Configuration. area/components Sources, transforms, and destinations. source/dogstatsd DogStatsD source. transform/aggregate Aggregate transform. area/observability Internal observability of ADP and Saluki. transform/dogstatsd-mapper DogStatsD Mapper synchronous transform. area/test All things testing: unit/integration, correctness, SMP regression, etc. decoders/otlp OTLP decoder. encoder/datadog-events Datadog events encoder. encoder/datadog-logs Datadog Logs encoder. encoder/datadog-metrics Datadog Metrics encoder. encoder/datadog-service-checks Datadog Service Checks encoder. encoder/datadog-stats Datadog APM Stats encoder. labels Jun 18, 2026
@dd-octo-sts dd-octo-sts Bot added encoder/datadog-traces Datadog Traces encoder. forwarder/datadog Datadog forwarder. forwarder/otlp OTLP forwarder. relay/otlp OTLP relay. source/otlp OTLP source. transform/apm-stats APM Stats transform. transform/trace-obfuscation Trace Obfuscation synchronous transform. transform/trace-sampler Trace Sampler synchronous transform. labels Jun 18, 2026

@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: fa750be44d

ℹ️ 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".

};

if !in_standalone_mode && !dp_config.enabled() {
if !control.standalone_mode && !control.enabled {

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P1 Badge Translate data_plane gates before checking control.enabled

When data_plane.enabled: true is supplied by the Agent stream or local snapshot, the new typed translation never copies it into ControlConfiguration (the generated DatadogConfigurationDataPlane/witness omit enabled, standalone_mode, and the per-pipeline enabled gates). In that scenario control.enabled remains its default false, so this guard exits instead of starting ADP; the omitted sub-gates also leave DogStatsD/checks/OTLP at their defaults regardless of configuration.

Useful? React with 👍 / 👎.

pid: std::process::id(),
display_name: app_details.full_name().to_string(),
flavor: app_details.full_name().replace(' ', "_").to_lowercase(),
api_endpoint: secure_api_listen_address,

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P1 Badge Register a dialable secure API endpoint

For the default secure API address, this now registers tcp://0.0.0.0:5101 with the Core Agent. The previous path converted the listen address through GrpcTargetAddress::try_from_listen_addr, which strips the tcp:// listen URI and rewrites wildcard TCP binds to 127.0.0.1:5101; without that conversion, TCP registrations advertise a non-dialable callback endpoint, so the Agent cannot call the status/flare/telemetry services even after registration succeeds.

Useful? React with 👍 / 👎.

Comment on lines +112 to +115
let authority = if standalone_mode || !remote_agent_enabled {
RuntimeAuthority::LocalSnapshot
} else {
RuntimeAuthority::AgentStream

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge Honor use_new_config_stream_endpoint when choosing authority

When users set data_plane.use_new_config_stream_endpoint: false but leave remote-agent registration enabled, the old flow registered the remote agent and kept using the local snapshot; this authority decision ignores that flag and always selects AgentStream whenever remote_agent_enabled is true. In that compatibility mode ADP now connects to the new config stream and waits for an initial snapshot that the deployment explicitly disabled (or may not support), preventing startup from using the local configuration.

Useful? React with 👍 / 👎.

Comment on lines +127 to +129
let logging_bootstrap = agent_data_plane_config::LoggingBootstrap {
log_level: Some(runtime_log_level),
..Default::default()

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge Preserve non-level logging settings on runtime reload

This reload builds a LoggingBootstrap containing only log_level, but LoggingGuard::reload swaps the entire output stack. In local mode, or after the initial Agent snapshot, any configured log_format_json, console/syslog settings, rotation limits, disable_file_logging, or ADP log-file destination are reset to translator defaults as soon as run starts; carry the full runtime logging slice (or update only the base filter) instead of defaulting every non-level field.

Useful? React with 👍 / 👎.

_ => {}
}
}
aggregate.hist_config.statistics = statistics;

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge Keep histogram percentiles in translated histogram config

The witness always calls consume_histogram_aggregates with the Datadog default aggregate list, and this assignment replaces AggregateConfig::default().hist_config.statistics, which includes the default 0.95 percentile. Because histogram_percentiles is not witnessed or added back here, default DogStatsD histograms stop emitting .95percentile series (and configured percentile lists cannot take effect).

Useful? React with 👍 / 👎.

- Add AutoscalingFailoverConfig and ClusterAgentConfig leaf structs
  in saluki-component-config
- Add autoscaling_failover and cluster_agent groups to
  ComponentConfiguration in agent-data-plane-config
- Wire the 7 previously no-op DatadogConfigConsumer methods to their
  native config destinations (autoscaling, cluster_agent,
  dogstatsd_disable_verbose_logs)
- Regenerate schema overlay: adds the 7 missing trait methods
- Migrate ClusterAgentForwarderConfiguration and
  AutoscalingFailoverGatewayConfiguration to from_native constructors
- Move ClusterAgentConfiguration endpoint resolution logic into
  cluster_agent/mod.rs; re-add autoscaling failover pipeline in run.rs
- Fix io.rs: thread EndpointRequestMapperFactory through run_io_loop
  and run_endpoint_io_loop; use ServiceExt::map_request to avoid the
  Clone bound on Box<dyn FnMut>
- Fix cluster_agent/mod.rs: convert from_configuration to from_native
  using leaf types; update tests accordingly
- Fix autoscaling_failover_gateway/mod.rs: inline struct, drop dead
  saluki_config imports, convert tests to synchronous construction
@webern webern changed the title experiment(config): mapless config system implementation 3b chore(config): experiment - mapless config system implementation 3b Jun 18, 2026
@webern webern marked this pull request as draft June 18, 2026 11:18
webern added 4 commits June 18, 2026 14:16
.dockerignore excluded all of test/ except test/antithesis/, but
test/architecture is a Cargo workspace member so Docker builds fail
when cargo can't read its manifest.
build_collector is #[cfg(unix)] so std::future::Future is unused on
Windows, which is an error under #![deny(warnings)].
@pr-commenter

pr-commenter Bot commented Jun 18, 2026

Copy link
Copy Markdown

Binary Size Analysis (Agent Data Plane)

Baseline: 3ecd1e0 · Comparison: 8abc34e · diff
Analysis Configuration: stripped binaries · Pass/Fail Threshold: +5%
Sizes: 40.14 MiB (baseline) vs 40.88 MiB (comparison)
Size Change: +755.15 KiB (+1.84%)

✅ Binary size difference within threshold

Changes by Module
Module File Size Symbols
core +466.96 KiB 21471
serde_json +371.83 KiB 708
figment -368.01 KiB 648
datadog_agent_config::datadog_configuration::_ +147.92 KiB 15
saluki_config -120.61 KiB 94
serde -61.37 KiB 82
tokio +60.87 KiB 5635
anon.223d4bcdad4374235c52576851a6bca8.13.llvm.13490213587745400755 +48.93 KiB 1
anon.bddf8fb3fe9f427433cb50653dc09fae.13.llvm.12336716177042047445 -48.93 KiB 1
agent_data_plane::internal::remote_agent -45.51 KiB 51
[sections] +45.40 KiB 8
serde_with -43.95 KiB 31
saluki_components::common::datadog -41.78 KiB 477
serde_core -35.51 KiB 987
agent_data_plane::cli::run +33.61 KiB 109
agent_data_plane_config_system::translate::datadog +33.44 KiB 47
datadog_agent_config::witness::drive +30.35 KiB 1
agent_data_plane_config_system::dynamic::ConfigUpdateRouter +29.51 KiB 9
saluki_components::sources::dogstatsd -28.83 KiB 339
&mut serde_json -26.96 KiB 97
Detailed Symbol Changes
    FILE SIZE        VM SIZE    
 --------------  -------------- 
  +1.7%  +498Ki  +0.8%  +183Ki    [80830 Others]
  [NEW] +68.0Ki  [NEW] +67.9Ki    agent_data_plane::cli::run::handle_run_command::_{{closure}}::hd93cf3b481b5dcde
  [NEW] +58.8Ki  [NEW] +58.4Ki    _<datadog_agent_config::datadog_configuration::_::<impl serde_core::de::Deserialize for datadog_agent_config::datadog_configuration::DatadogConfiguration>::deserialize::__Visitor as serde_core::de::Visitor>::visit_map::hd078cbaf2e81c26e
  [NEW] +51.3Ki  [NEW] +51.1Ki    saluki_components::common::datadog::io::run_endpoint_io_loop::_{{closure}}::h024a19904241fc40
  [NEW] +51.3Ki  [NEW] +51.0Ki    _<datadog_agent_config::datadog_configuration::_::<impl serde_core::de::Deserialize for datadog_agent_config::datadog_configuration::DatadogConfiguration>::deserialize::__Visitor as serde_core::de::Visitor>::visit_map::h37d4a19b6d0f5b55
  [NEW] +48.9Ki  [NEW] +48.8Ki    anon.223d4bcdad4374235c52576851a6bca8.13.llvm.13490213587745400755
  [NEW] +38.1Ki  [NEW] +37.8Ki    core::ptr::drop_in_place<agent_data_plane::cli::run::handle_run_command::{{closure}}>::hcc629023a1ec74f8
  [NEW] +35.2Ki  [NEW] +35.0Ki    _<saluki_components::forwarders::otlp::OtlpForwarder as saluki_core::components::forwarders::Forwarder>::run::_{{closure}}::h0e24754d8bd5f9e7
  [NEW] +33.9Ki  [NEW] +33.8Ki    saluki_components::sources::otlp::metrics::translator::OtlpMetricsTranslator::translate_metrics::h37aa63b07d1b2aac
  [NEW] +32.8Ki  [NEW] +32.6Ki    _<saluki_components::transforms::aggregate::Aggregate as saluki_core::components::transforms::Transform>::run::_{{closure}}::hde45ecc8a541e6fb
  [NEW] +30.3Ki  [NEW] +30.3Ki    datadog_agent_config::witness::drive::h6f263443e831062a
  [NEW] +29.6Ki  [NEW] +29.5Ki    agent_data_plane::cli::dogstatsd::handle_dogstatsd_command::_{{closure}}::h23fc705d3bf43e58
  +2.5% +26.6Ki  +2.5% +26.6Ki    [section .gcc_except_table]
  [NEW] +26.1Ki  [NEW] +25.9Ki    _<saluki_components::sources::dogstatsd::DogStatsDConfiguration as saluki_core::components::sources::builder::SourceBuilder>::build::_{{closure}}::h689e6850acecbc25
  [DEL] -28.2Ki  [DEL] -28.1Ki    saluki_components::sources::otlp::metrics::translator::OtlpMetricsTranslator::translate_metrics::h25eea425da8db242
  [DEL] -30.3Ki  [DEL] -30.2Ki    agent_data_plane::cli::dogstatsd::handle_dogstatsd_command::_{{closure}}::h07109a4b4c5e1085
  [DEL] -35.5Ki  [DEL] -35.3Ki    _<saluki_components::transforms::aggregate::Aggregate as saluki_core::components::transforms::Transform>::run::_{{closure}}::hbad4d16da3c86eb9
  [DEL] -38.4Ki  [DEL] -38.2Ki    _<saluki_components::forwarders::otlp::OtlpForwarder as saluki_core::components::forwarders::Forwarder>::run::_{{closure}}::he152d08259d7cb93
  [DEL] -39.0Ki  [DEL] -38.9Ki    agent_data_plane::cli::run::handle_run_command::_{{closure}}::h70312369dcc72c92
  [DEL] -48.9Ki  [DEL] -48.8Ki    anon.bddf8fb3fe9f427433cb50653dc09fae.13.llvm.12336716177042047445
  [DEL] -53.8Ki  [DEL] -53.6Ki    saluki_components::common::datadog::io::run_endpoint_io_loop::_{{closure}}::h2f62230e50a7cd8f
  +1.8%  +755Ki  +1.3%  +438Ki    TOTAL

@pr-commenter

pr-commenter Bot commented Jun 18, 2026

Copy link
Copy Markdown

Regression Detector (Agent Data Plane)

Run ID: c5398f2b-fbd8-460e-a377-02d9b47a0520
Baseline: 3ecd1e05 · Comparison: 07d3ba27 · diff

Optimization Goals: ❌ 2 regressions detected

experiment goal Δ mean % links
quality_gates_rss_dsd_heavy memory 🔴 +22.98 metrics profiles logs
quality_gates_rss_dsd_ultraheavy memory 🔴 +20.47 metrics profiles logs
Fine details of change detection per experiment (18)

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
quality_gates_rss_idle memory ⚪ +2.86 metrics profiles logs
dsd_uds_500mb_3k_contexts_throughput throughput ⚪ -2.32 metrics profiles logs
quality_gates_rss_dsd_low memory ⚪ +1.80 metrics profiles logs
dsd_uds_512kb_3k_contexts_memory memory ⚪ +1.69 metrics profiles logs
dsd_uds_1mb_3k_contexts_memory memory ⚪ +1.48 metrics profiles logs
dsd_uds_10mb_3k_contexts_memory memory ⚪ +1.38 metrics profiles logs
dsd_uds_100mb_3k_contexts_memory memory ⚪ +1.00 metrics profiles logs
dsd_uds_500mb_3k_contexts_memory memory ⚪ +0.88 metrics profiles logs
quality_gates_rss_dsd_medium memory ⚪ +0.09 metrics profiles logs
dsd_uds_100mb_3k_contexts_throughput throughput ⚪ -0.03 metrics profiles logs
dsd_uds_512kb_3k_contexts_throughput throughput ⚪ +0.00 metrics profiles logs
dsd_uds_10mb_3k_contexts_throughput throughput ⚪ +0.00 metrics profiles logs
dsd_uds_1mb_3k_contexts_throughput throughput ⚪ +0.00 metrics profiles logs
dsd_uds_500mb_3k_contexts_cpu (erratic) cpu ⚪ -0.60 metrics profiles logs
dsd_uds_100mb_3k_contexts_cpu (erratic) cpu ⚪ -0.71 metrics profiles logs
dsd_uds_10mb_3k_contexts_cpu (erratic) cpu 🟢 -7.82 metrics profiles logs
dsd_uds_1mb_3k_contexts_cpu (erratic) cpu 🟢 -10.42 metrics profiles logs
dsd_uds_512kb_3k_contexts_cpu (erratic) cpu 🟢 -15.19 metrics profiles logs
Bounds Checks: ❌ Failed (5)
experiment check replicates observed links
quality_gates_rss_dsd_heavy memory_usage 0/10 ❌ 156 MiB ≤ 140 MiB metrics profiles logs
quality_gates_rss_dsd_low memory_usage 10/10 ✅ 40.8 MiB ≤ 50 MiB metrics profiles logs
quality_gates_rss_dsd_medium memory_usage 10/10 ✅ 63.4 MiB ≤ 75 MiB metrics profiles logs
quality_gates_rss_dsd_ultraheavy memory_usage 0/10 ❌ 221 MiB ≤ 200 MiB metrics profiles logs
quality_gates_rss_idle memory_usage 10/10 ✅ 29.1 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.

data_plane.enabled and data_plane.dogstatsd.enabled were in the
Datadog core schema but sat in schema_overlay excluded:. Move them
to support: full so the codegen produces fields in
DatadogConfiguration and witness methods in DatadogConfigConsumer.

Add patch_snapshot_pipeline_gates to bootstrap to normalize flat
DD_ figment keys (e.g. data_plane_enabled) to nested JSON before
serde_json::from_value, which fixes the
"Agent Data Plane is not enabled" failure in integration tests.

Thread standalone_mode (Saluki-internal, not in core schema) from
LoadedSources through start_local so control.standalone_mode is set
correctly at runtime.
@dd-octo-sts dd-octo-sts Bot added the area/docs Reference documentation. label Jun 18, 2026
webern added 2 commits June 18, 2026 16:17
- Restore "Waiting for initial configuration..." and "Initial
  configuration received." log messages in start_stream (dropped
  when the config-system crate was extracted from the binary).
- Thread data_plane.otlp.enabled through LoadedSources so both
  start_local and start_stream apply it to control.otlp.enabled
  (excluded from schema overlay; flat-key fallback in try_get_typed
  handles DD_DATA_PLANE_OTLP_ENABLED).
- Add data_plane.api_listen_address to LocalApiBootstrap; in
  start_stream apply both api and secure_api listen addresses
  from bootstrap after stream translation (stream snapshot from
  Core Agent does not include these ADP-local env vars).
@webern webern force-pushed the m/spike-3b branch 2 times, most recently from e013180 to f501ac4 Compare June 19, 2026 16:44
webern added 3 commits June 19, 2026 18:53
- Bridge DD_DOGSTATSD_TCP_PORT from Datadog source
  into saluki_only.dogstatsd.tcp_port (bootstrap).
- Send Ok(()) on registration failure so ADP does
  not exit when Agent is unreachable.
- Add metric_tag_filterlist to overlay + translation.
- Fan out apm_config.target_traces_per_second to
  both sampler and encoder.
- Add apm_config.errors_per_second and
  error_tracking_standalone.enabled to overlay +
  translation (fan out to sampler and encoder).
start_local was unconditionally forcing standalone_mode=true,
which killed the workload provider and broke origin detection.
When standalone_mode is false (the remote_agent_enabled=false
case), the Agent is still available for metadata services.
Connect to it so the env-provider gets real gRPC-backed
workload/host/autodiscovery providers.
Saluki-only keys set via DD_* env vars were silently
dropped, causing SMP memory regressions in the DSD
quality_gates benchmarks (~20% RSS increase).

Adds bridge_dd_fallbacks() to read saluki-only values
from the Datadog source when the Saluki source has not
set them. Covers aggregate_context_limit, interner
sizes, autoscale, and OTLP context limits.
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/config Configuration. area/docs Reference documentation. area/io General I/O and networking. area/observability Internal observability of ADP and Saluki. area/test All things testing: unit/integration, correctness, SMP regression, etc. decoders/otlp OTLP decoder. encoder/datadog-events Datadog events encoder. encoder/datadog-logs Datadog Logs encoder. encoder/datadog-metrics Datadog Metrics encoder. encoder/datadog-service-checks Datadog Service Checks encoder. encoder/datadog-stats Datadog APM Stats encoder. encoder/datadog-traces Datadog Traces encoder. forwarder/datadog Datadog forwarder. forwarder/otlp OTLP forwarder. relay/otlp OTLP relay. source/dogstatsd DogStatsD source. source/otlp OTLP source. transform/aggregate Aggregate transform. transform/apm-stats APM Stats transform. transform/dogstatsd-mapper DogStatsD Mapper synchronous transform. transform/trace-obfuscation Trace Obfuscation synchronous transform. transform/trace-sampler Trace Sampler synchronous transform.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant