Skip to content

chore(config): typed config foundation#1957

Merged
webern merged 2 commits into
mainfrom
m/pr2-model
Jul 9, 2026
Merged

chore(config): typed config foundation#1957
webern merged 2 commits into
mainfrom
m/pr2-model

Conversation

@webern

@webern webern commented Jul 1, 2026

Copy link
Copy Markdown
Contributor

Human Summary

This PR serves as the foundation for strongly-typed configuration for ADP. It does not affect the binary, but sets up the base for future PRs that will migrate the binary from map access with GenericConfiguration to typed access with SalukiConfiguration.

This PR sets up:

  • the translation target: SalukiConfiguration
  • a compile time auditable translation system: DatadogConfigWitness
  • implements the translation of DatadogConfiguration to SalukiConfiguration
  • Discovers and promotes a bunch of keys that were missing from our inventory (which, I think, sort of demonstrates the need for this project to succeed).

The shape of SalukiConfiguration is likely to change as we progress.

Challenges

One difficult aspect of this project is that the discovery and inventorying of all of the configs we are using messy. The full audit and shape of SalukiConfiguration can only be fully realized once it is being pushed down to components and usage sites, so consider this a sketch of its final form.

The other big challenge is churn. It will be costly for me to keep it up-to-date as the codebase changes underneath it. I have written skills to help with this, but it is not easy. Once the system is complete and high-churn areas like DogStatsD are swung over to typed config, I don't think it will be hard for team members to use, but it is not intuitive in a transitory state. As such, I recommend we refrain from merging until enough of the PR stack is approved to swing us over to using this.

That being said, it's important to get early feedback before the stack gets too deep.

AI Summary

This PR adds the foundation for translating Datadog Agent configuration into a typed ADP
configuration model.

The change is additive: the existing runtime config path is not cut over in this PR.

What changed:

  • Adds agent-data-plane-config, a source-agnostic data model centered on
    SalukiConfiguration { control, shared, domains }. The model derives PartialEq to support
    later per-subtree change detection.
  • Adds generated witness support in datadog-agent-config:
    • DatadogConfigWitness
    • generated drive(...), which reports every failed key, not just the first
    • TranslateError (one failed key) and TranslateErrors (the aggregate drive returns)
  • Adds agent-data-plane-config-system, with the initial Datadog translator
    (DatadogTranslator::translate, an inherent method that returns the fully-populated model plus
    any translation errors).
  • Separates the two config writers:
    • Datadog-schema keys are consumed through the generated witness driver.
    • Saluki-only fields are copied through SalukiOnly::seed.
  • Promotes 24 additional Datadog config keys into the supported inventory so they can be represented
    in the typed model.
  • Adds the NO_SMOKE config-testing sentinel for supported keys that do not yet fit the existing
    smoke-test model.
  • Moves generated Datadog config output under datadog_agent_config::generated so generated config
    modules are grouped together.

Out of scope for this PR:

  • wiring the new config system into bin/agent-data-plane
  • migrating components away from GenericConfiguration
  • dynamic config routing
  • removing the old raw-map access path

Change Type

  • Non-functional (chore, refactoring, docs)

How did you test this PR?

  • make check-all
  • Verified each commit builds independently.
  • Regenerated config output and verified the generated tree is stable.

References

@webern webern requested a review from a team as a code owner July 1, 2026 14:14
@dd-octo-sts dd-octo-sts Bot added the area/docs Reference documentation. label Jul 1, 2026
@webern webern requested a review from Copilot July 1, 2026 14:15
@webern webern changed the title M/pr2 model chore(config): typed config foundation Jul 1, 2026
@pr-commenter

pr-commenter Bot commented Jul 1, 2026

Copy link
Copy Markdown

Binary Size Analysis (Agent Data Plane)

Baseline: 5364030 · Comparison: 52d4d61 · diff
Analysis Configuration: stripped binaries · Pass/Fail Threshold: +5%
Sizes: 41.66 MiB (baseline) vs 41.67 MiB (comparison)
Size Change: +3.57 KiB (+0.01%)

✅ Binary size difference within threshold

Changes by Module
Module File Size Symbols
anon.15e9bac6b79a003fbf40acae4efa5248.259.llvm.8525197878747720874 +21.50 KiB 1
anon.906046189c51c143e7c52e4ee69c5016.30.llvm.13653499532151601150 -21.50 KiB 1
anon.0b3641050f6efdf247e7988cba8ad8fc.74.llvm.4253902684945045806 +6.63 KiB 1
anon.1d550ee948a60c8215b8fd26ee5b9b92.76.llvm.3750543801746210431 -6.63 KiB 1
core +4.70 KiB 226
anon.19b21aae522286351e09323f216d8471.227.llvm.3942497954323316244 +3.37 KiB 1
anon.19b21aae522286351e09323f216d8471.227.llvm.7159571839051514198 -3.37 KiB 1
tokio -2.57 KiB 6
[Unmapped] +2.49 KiB 1
serde_core -2.06 KiB 4
figment +1.99 KiB 13
anon.19b21aae522286351e09323f216d8471.26.llvm.3942497954323316244 +1.24 KiB 1
anon.9f57deab38cb447f7dd82e5766cd87af.24.llvm.16874604699339231193 -1.24 KiB 1
anon.78e2ab5ca990a7c1a03b4273b302ee41.72.llvm.16536251843199223712 +1.16 KiB 1
anon.391c08d31a60f103688017552ef9d6db.29.llvm.2053566032357081019 -1.16 KiB 1
anon.3f7afa29e65c54dec2727dfc4a417b2e.1.llvm.425674894410810657 -990 B 1
anon.15e9bac6b79a003fbf40acae4efa5248.14.llvm.8525197878747720874 +989 B 1
go_duration::parse_duration_or_nanos +927 B 1
anon.2c1eefaba2edc09dddea6ff0bb067596.255.llvm.5030714494618970269 +915 B 1
anon.6e13b50c2656d803ff9e7b11c69ad6e3.133.llvm.16682867644991629646 -915 B 1
Detailed Symbol Changes
    FILE SIZE        VM SIZE    
 --------------  -------------- 
  [NEW] +21.5Ki  [NEW]     +81    anon.15e9bac6b79a003fbf40acae4efa5248.259.llvm.8525197878747720874
  [NEW] +6.63Ki  [NEW] +6.55Ki    anon.0b3641050f6efdf247e7988cba8ad8fc.74.llvm.4253902684945045806
  [NEW] +3.37Ki  [NEW] +3.28Ki    anon.19b21aae522286351e09323f216d8471.227.llvm.3942497954323316244
   +43% +2.49Ki  [ = ]       0    [Unmapped]
  [NEW] +2.07Ki  [NEW] +1.65Ki    _<hyper_timeout::TimeoutConnector<T> as tower_service::Service<http::uri::Uri>>::call::_{{closure}}::h03196d27fe68c6b3
  [NEW] +2.05Ki  [NEW] +1.96Ki    core::str::_<impl str>::trim_matches::h1214e1306cfc635f
  +534% +1.82Ki +12e2% +1.82Ki    core::ptr::drop_in_place<core::option::Option<tokio::sync::broadcast::Sender<saluki_config::dynamic::event::ConfigChangeEvent>>>::h3777d01eeae4f32b
  +0.1% +1.61Ki  +0.0% +1.03Ki    [1645 Others]
  [NEW] +1.24Ki  [NEW]     +92    anon.19b21aae522286351e09323f216d8471.26.llvm.3942497954323316244
  [NEW] +1.24Ki  [NEW] +1.15Ki    figment::value::value::Value::serialize::hbd861d22ab8dd137
  [NEW] +1.16Ki  [NEW]     +96    anon.78e2ab5ca990a7c1a03b4273b302ee41.72.llvm.16536251843199223712
  [DEL]    -990  [DEL]     -95    anon.3f7afa29e65c54dec2727dfc4a417b2e.1.llvm.425674894410810657
  [DEL] -1.16Ki  [DEL]     -96    anon.391c08d31a60f103688017552ef9d6db.29.llvm.2053566032357081019
  [DEL] -1.24Ki  [DEL]     -92    anon.9f57deab38cb447f7dd82e5766cd87af.24.llvm.16874604699339231193
  [DEL] -1.26Ki  [DEL] -1.17Ki    serde_core::ser::Serializer::collect_map::h6dedf62dd353f733
  [DEL] -1.44Ki  [DEL] -1.34Ki    core::str::_<impl str>::trim_matches::hb1f4823fdc7cdfc9
  [DEL] -1.98Ki  [DEL] -1.84Ki    _<tokio::sync::broadcast::Sender<T> as core::ops::drop::Drop>::drop::h8bf9ccec58df3b8f
  [DEL] -2.07Ki  [DEL] -1.65Ki    _<hyper_timeout::TimeoutConnector<T> as tower_service::Service<http::uri::Uri>>::call::_{{closure}}::h375daa735fe1dbc5
  [DEL] -3.37Ki  [DEL] -3.28Ki    anon.19b21aae522286351e09323f216d8471.227.llvm.7159571839051514198
  [DEL] -6.63Ki  [DEL] -6.55Ki    anon.1d550ee948a60c8215b8fd26ee5b9b92.76.llvm.3750543801746210431
  [DEL] -21.5Ki  [DEL]     -81    anon.906046189c51c143e7c52e4ee69c5016.30.llvm.13653499532151601150
  +0.0% +3.57Ki  +0.0% +1.52Ki    TOTAL

Copilot AI 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.

Pull request overview

This PR lays the groundwork for moving ADP from map-based config access to a strongly-typed config translation pipeline by introducing a typed target model (SalukiConfiguration), a generated compile-time witness (DatadogConfigWitness + drive), and an initial Datadog-to-Saluki translator. It also expands the Datadog config inventory and introduces a NO_SMOKE sentinel for keys that shouldn’t participate in the current smoke-test model.

Changes:

  • Add new typed ADP configuration model crates (agent-data-plane-config, agent-data-plane-config-system) and initial Datadog translator + Saluki-only seeding.
  • Generate a Datadog config witness trait + driver and reorganize generated output under datadog_agent_config::generated.
  • Promote additional config keys into the overlay inventory, update docs, and add NO_SMOKE handling in config-testing generation.

Reviewed changes

Copilot reviewed 30 out of 35 changed files in this pull request and generated 6 comments.

Show a summary per file
File Description
rustfmt.toml Ignore generated config dir
lib/datadog-agent/config/src/translate_error.rs Add translator error type
lib/datadog-agent/config/src/lib.rs Re-export generated witness APIs
lib/datadog-agent/config/src/generated/witness.rs Generated witness + driver
lib/datadog-agent/config/src/generated/mod.rs Generated module layout
lib/datadog-agent/config/src/generated/datadog_configuration.rs Update generated typed config
lib/datadog-agent/config/src/generated/classifier_data.rs Adjust imports for relocated module
lib/datadog-agent/config/src/classifier/mod.rs Consume classifier data from generated module
lib/datadog-agent/config/schema/schema_overlay.yaml Promote keys; add NO_SMOKE usage
lib/datadog-agent/config/Cargo.toml Add snafu dependency
lib/datadog-agent/config/build/witness_gen.rs New witness generator
lib/datadog-agent/config/build/datadog_config_gen.rs Write to generated/; materialize sections
lib/datadog-agent/config/build/classifier_gen.rs Write classifier data to generated/
lib/datadog-agent/config/build.rs Run witness generator after config gen
lib/datadog-agent/config-testing/src/config_registry/tag_filterlist.rs Generated registry adds metric tag filterlist
lib/datadog-agent/config-testing/build/registry_gen.rs Skip NO_SMOKE keys in smoke registry
lib/datadog-agent/config-overlay-model/src/smoke_test_support.rs Add NO_SMOKE sentinel enum variant
lib/agent-data-plane-config/src/shared.rs Add shared typed config model
lib/agent-data-plane-config/src/lib.rs Define SalukiConfiguration root
lib/agent-data-plane-config/src/domains/traces.rs Add traces domain model
lib/agent-data-plane-config/src/domains/otlp.rs Add OTLP domain model
lib/agent-data-plane-config/src/domains/multi_region_failover.rs Add MRF domain model
lib/agent-data-plane-config/src/domains/mod.rs Wire domain configuration struct
lib/agent-data-plane-config/src/domains/dogstatsd.rs Add DogStatsD domain model
lib/agent-data-plane-config/src/domains/checks.rs Add checks domain model
lib/agent-data-plane-config/src/control.rs Add control/orchestration model
lib/agent-data-plane-config/Cargo.toml New model crate manifest
lib/agent-data-plane-config-system/src/translators/mod.rs Translator trait + module wiring
lib/agent-data-plane-config-system/src/translators/datadog_translator.rs Implement Datadog witness translator
lib/agent-data-plane-config-system/src/saluki_only.rs Saluki-only source + seeding
lib/agent-data-plane-config-system/src/lib.rs Public translate entrypoint + test
lib/agent-data-plane-config-system/Cargo.toml New config-system crate manifest
docs/agent-data-plane/configuration/dogstatsd.md Document newly inventoried keys
Cargo.toml Add new workspace members/deps
Cargo.lock Lockfile updates for new crates

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread lib/agent-data-plane-config-system/src/translators/datadog_translator.rs Outdated
Comment thread lib/agent-data-plane-config-system/src/translators/datadog_translator.rs Outdated
Comment thread lib/agent-data-plane-config-system/src/translators/datadog_translator.rs Outdated
Comment thread lib/agent-data-plane-config-system/src/translators/datadog_translator.rs Outdated
Comment thread lib/agent-data-plane-config-system/src/translators/datadog_translator.rs Outdated
Comment thread lib/agent-data-plane-config-system/src/translators/datadog_translator.rs Outdated

@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: 8649764c8b

ℹ️ 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 lib/agent-data-plane-config-system/src/translators/datadog_translator.rs Outdated
@pr-commenter

pr-commenter Bot commented Jul 1, 2026

Copy link
Copy Markdown

Regression Detector (Agent Data Plane)

Run ID: 7df691e0-d2a6-487f-9c38-000e86d3ab09
Baseline: 53640306 · Comparison: 52d4d614 · diff

Optimization Goals: ✅ No significant changes detected

Fine details of change detection per experiment (5)

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_dsd_medium memory ⚪ +0.34 metrics profiles logs
quality_gates_rss_dsd_low memory ⚪ +0.24 metrics profiles logs
quality_gates_rss_idle memory ⚪ +0.11 metrics profiles logs
quality_gates_rss_dsd_ultraheavy memory ⚪ -0.08 metrics profiles logs
quality_gates_rss_dsd_heavy memory ⚪ -0.11 metrics profiles logs
Bounds Checks: ✅ Passed (5)
experiment check replicates observed links
quality_gates_rss_dsd_heavy memory_usage 10/10 ✅ 133 MiB ≤ 140 MiB metrics profiles logs
quality_gates_rss_dsd_low memory_usage 10/10 ✅ 43.1 MiB ≤ 50 MiB metrics profiles logs
quality_gates_rss_dsd_medium memory_usage 10/10 ✅ 64.8 MiB ≤ 75 MiB metrics profiles logs
quality_gates_rss_dsd_ultraheavy memory_usage 10/10 ✅ 192 MiB ≤ 200 MiB metrics profiles logs
quality_gates_rss_idle memory_usage 10/10 ✅ 28.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.

@datadog-official

This comment has been minimized.

Comment thread lib/datadog-agent/config/src/lib.rs Outdated
Comment thread lib/datadog-agent/config/src/generated/datadog_configuration.rs Outdated
@webern webern marked this pull request as draft July 2, 2026 13:29
@webern webern force-pushed the m/pr2-model branch 6 times, most recently from 55eedc5 to 5ca1e2d Compare July 3, 2026 17:00
@webern

webern commented Jul 3, 2026

Copy link
Copy Markdown
Contributor Author

I've spent many hours trying to preserve the separation of commits in this PR and it's just... a massive headache. So I'm going to squash it down to one commit so that future rebases and changes are less painful. Goodbye my beautiful commit history...

@webern webern marked this pull request as ready for review July 8, 2026 16:00
}

fn consume_dd_url(&mut self, value: String) {
self.config.shared.endpoints.dd_url = non_empty(value).filter(|url| url != DEFAULT_PRIMARY_ENDPOINT);

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.

Pointing out that #1965 / #2028 are handled here.

@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: 9e88715d5e

ℹ️ 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 lib/datadog-agent/config/src/duration_de.rs Outdated
Comment thread lib/agent-data-plane-config-system/src/translators/datadog_translator.rs Outdated

dogstatsd_expiry_seconds:
support: full
pipelines: [dogstatsd]

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.

Are these pipeline declarations and the differentiation between "shared" and "domains" config structs still worth the lift? IIRC this was originally to help the smoke tests determine if something was used, but seems like that job is being moved to the witness?

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.

Aaaactually, these are used primarily, and only, by the mechanism we use to warn on incompatible configs. And I believe they do nothing for support: full keys 🙄 . The thing that will become unused, as components cutover, is the used_by field that names structs that are directly deserializing from the GenericConfiguration map. So as we cut those over to typed config, the overlay will need a sentinel like MIGRATED_TO_CONFIG_SYSTEM (or whatever), during the transitional state. Then used_by and the smoke tests will be deleted, and alternate forms of config system testing will be introduced.

@thieman

thieman commented Jul 8, 2026

Copy link
Copy Markdown
Contributor

Is there a plan to compare the old vs new config structs to make sure type conversions etc are all handled equivalently?

Comment thread lib/agent-data-plane-config-system/src/translators/datadog_translator.rs Outdated

@tobz tobz left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Took another pass on this, and I'm still generally OK with this.

Given the size, I think we should bias towards getting it merged since we can incrementally tidy things up if we decide that we really want to make stylistic / ergonomics-related changes before starting the next "phase" of the migration.

webern added 2 commits July 9, 2026 13:47
Push a few more aspects of Go time.Duration parsing to the go-duration
crate.
Foundation for strongly-typed ADP configuration. No binary behavior change; it
sets up the base for later PRs that migrate from GenericConfiguration map access
to typed SalukiConfiguration access.

- adds the translation target: SalukiConfiguration
- adds a compile-time auditable translation system: DatadogConfigWitness
- translates DatadogConfiguration into SalukiConfiguration
- discovers and promotes config keys that were missing from the inventory
@dd-octo-sts dd-octo-sts Bot added the area/config Configuration. label Jul 9, 2026
@webern

webern commented Jul 9, 2026

Copy link
Copy Markdown
Contributor Author

/merge -m rebase

@gh-worker-devflow-routing-ef8351

gh-worker-devflow-routing-ef8351 Bot commented Jul 9, 2026

Copy link
Copy Markdown

View all feedbacks in Devflow UI.

2026-07-09 12:39:00 UTC ℹ️ Start processing command /merge -m rebase


2026-07-09 12:39:04 UTC ℹ️ MergeQueue: pull request added to the queue

The expected merge time in main is approximately 51m (p90).


2026-07-09 12:59:02 UTC 🚨 MergeQueue: This merge request is in error

mergequeue build completed successfully, but the github api returned an error while merging the pr

Details

Error: PUT https://api.github.com/repos/DataDog/saluki/pulls/1957/merge: 405 Rebase merges are not allowed on this repository. [] (Request ID: E22A:F91B0:14373E1:46BB173:6A4F9B0F)

FullStacktrace:
activity error (type: github.GithubService_MergePullRequest, scheduledEventID: 41, startedEventID: 42, identity: 1@github-worker-65778c9c86-lkzzl@): PUT https://api.github.com/repos/DataDog/saluki/pulls/1957/merge: 405 Rebase merges are not allowed on this repository. [] (Request ID: E22A:F91B0:14373E1:46BB173:6A4F9B0F) (type: GitFailure, retryable: false): PUT https://api.github.com/repos/DataDog/saluki/pulls/1957/merge: 405 Rebase merges are not allowed on this repository. [] (type: ErrorResponse, retryable: true)

@webern webern merged commit 6717eab into main Jul 9, 2026
83 of 84 checks passed
@webern webern deleted the m/pr2-model branch July 9, 2026 13:03
@webern

webern commented Jul 9, 2026

Copy link
Copy Markdown
Contributor Author

Note: i tried to separate out a small commit for the go-time-duration change that is more generally applicable, but... the merge queue rejected rebase-merge (apparently only after testing it or something), so I just squash merged it after that.

webern added a commit that referenced this pull request Jul 10, 2026
## Human Summary

Adds a typed configuration update subscription mechanism, known as
`Live<T>`.

The contract is to get a Live<T> from the type system like this:

```rust
let live = config_system.live(|c| &c.domains.dogstatsd.debug_log)
```

Then you put `live.changes()` in your tokio `select!`

```rust
  _ = live.changed() => {
      let metrics_stats_enabled = live.current().metrics_stats_enable;
      self.metrics_stats_enabled = metrics_stats_enabled;
      debug!(metrics_stats_enabled, "Updated DogStatsD metrics stats debug logging gate.");
```

## AI Summary

Adds the typed runtime configuration library and `Live<T>` view without
wiring it into the Agent Data Plane binary.

### Configuration system

The new `agent-data-plane-config-system` crate translates two
configuration sources into the ADP-native `SalukiConfiguration` model:

- Datadog configuration, translated through the generated configuration
witness
- Saluki-only configuration, which seeds fields not represented in the
Datadog schema

`ConfigurationSystem`:

- translates an initial `GenericConfiguration` into a complete typed
configuration
- subscribes to updates when the source map is dynamic
- coalesces bursts of updates before re-translating
- fails startup when the initial source cannot be translated
- keeps runtime updates durable by retaining defaults for invalid
translated values while applying other valid changes
- exposes the current configuration through a shared `ArcSwap`

### Live view of the configuration

`Live<T>` in `agent-data-plane-config` provides a typed view over a
projection of `SalukiConfiguration`:

- `Live::fixed` creates a value that never changes
- `Live::dynamic` tracks a shared configuration snapshot
- `current()` returns the latest projected value
- `Deref` reads the view's latest snapshot
- `changed()` waits for the projected value to change
- `project()` narrows a view to a child node or field

The view uses `ArcSwap` for consistent snapshots and a Tokio `watch`
channel for update notifications. A view only wakes its consumer when
its projected value changes.

This PR is library-only. It does not modify `bin/agent-data-plane`, wire
the configuration system into startup, add the `/config/internal`
endpoint, or add integration-test coverage. Those changes are deferred
to PR-3b, where environment handling and runtime wiring will be
addressed together.

## Change Type
- [x] Non-functional (chore, refactoring, docs)

## How did you test this PR?

- `make check-clippy`
- Unit tests in `agent-data-plane-config-system` cover startup
translation, translation errors, update convergence, projections,
field-level live views, fixed views, and startup values.

No integration test is included in this PR because the Agent Data Plane
wiring is deferred to PR-3b.

## References

- Depends on #1957
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area/config Configuration. area/docs Reference documentation. mergequeue-status: error

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants