Skip to content

chore(config): migrate HostTagsConfiguration to typed config#1996

Merged
webern merged 3 commits into
m/pr6-adp-cutoverfrom
m/host-tags-conf
Jul 6, 2026
Merged

chore(config): migrate HostTagsConfiguration to typed config#1996
webern merged 3 commits into
m/pr6-adp-cutoverfrom
m/host-tags-conf

Conversation

@webern

@webern webern commented Jul 5, 2026

Copy link
Copy Markdown
Contributor

Human Summary

It thrashed a bit on preserving the exact behavior that DurationString was providing and on viper time.Duration parsing correctness. Overall the changes it made seem fine to me.

AI Summary

Migrates HostTagsConfiguration from the raw GenericConfiguration map to the typed
SalukiConfiguration model, continuing the ADP config cutover.

expected_tags_duration is witnessed and already modeled at
shared.tags.expected_tags_duration, so the component now reads it directly from the typed
slice instead of parsing a DurationString off GenericConfiguration. The component's
hand-written zero default is dropped; the generated schema default (0s) is authoritative.

RemoteAgentClientConfiguration is a shared struct still consumed by several not-yet-migrated
remote-agent components, so it stays on GenericConfiguration for now. It is built at the call
site and passed into HostTagsConfiguration, which removes GenericConfiguration from the
component entirely.

Change Type

  • Non-functional (chore, refactoring, docs)

How did you test this PR?

make check-all, make test, and make check-docs all pass. Translation of
expected_tags_duration into the typed model is already covered by existing translator and
config-system tests.

References

@webern webern requested a review from a team as a code owner July 5, 2026 19:47
Copilot AI review requested due to automatic review settings July 5, 2026 19:47

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

Migrates the HostTagsConfiguration component off the raw GenericConfiguration map and onto the typed SalukiConfiguration model (specifically shared.tags.expected_tags_duration), continuing the ADP config cutover work.

Changes:

  • Updated HostTagsConfiguration::from_configuration to accept a pre-built RemoteAgentClientConfiguration plus typed GlobalTags, removing direct parsing of expected_tags_duration.
  • Updated the CLI pipeline wiring to build the remote-agent client config at the call site and pass typed tag settings into HostTagsConfiguration.

Reviewed changes

Copilot reviewed 2 out of 2 changed files in this pull request and generated no comments.

File Description
bin/agent-data-plane/src/components/host_tags/mod.rs Drops GenericConfiguration/DurationString parsing and reads expected_tags_duration from typed GlobalTags.
bin/agent-data-plane/src/cli/run.rs Builds RemoteAgentClientConfiguration locally and passes saluki.shared.tags into the host-tags transform config.
Comments suppressed due to low confidence (1)

bin/agent-data-plane/src/cli/run.rs:491

  • config_system.config() is loaded inside the standalone_mode conditional and then immediately loaded again afterwards. This adds an extra ArcSwap load and increases the chance that host-tags and metrics-encoder get built from different config snapshots. Consider loading the config once and reusing the same guard for both.
    if !dp_config.standalone_mode() {
        let client_config = RemoteAgentClientConfiguration::from_configuration(config)?;
        let saluki = config_system.config();
        let host_tags_config = HostTagsConfiguration::from_configuration(client_config, &saluki.shared.tags);
        if host_tags_config.enabled() {
            metrics_enrich_config = metrics_enrich_config.with_transform_builder("host_tags", host_tags_config);
        }
    }

    let saluki = config_system.config();
    let dd_metrics_config =
        DatadogMetricsConfiguration::from_configuration(&saluki.shared.metrics_encoding, &saluki.shared.endpoints)
            .error_context("Failed to configure Datadog Metrics encoder.")?;

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

@pr-commenter

pr-commenter Bot commented Jul 5, 2026

Copy link
Copy Markdown

Binary Size Analysis (Agent Data Plane)

Baseline: 7b98c6f · Comparison: ed62b57 · diff
Analysis Configuration: stripped binaries · Pass/Fail Threshold: +5%
Sizes: 41.63 MiB (baseline) vs 41.79 MiB (comparison)
Size Change: +163.84 KiB (+0.38%)

✅ Binary size difference within threshold

Changes by Module
Module File Size Symbols
figment -639.26 KiB 365
serde_json +251.48 KiB 515
datadog_agent_config::generated::datadog_configuration +148.49 KiB 45
core +147.85 KiB 9330
resource_accounting::groups::Tracked +121.24 KiB 35
tracing -116.86 KiB 99
tokio +73.68 KiB 3460
serde -72.26 KiB 67
agent_data_plane_config_system::saluki_env_overlay::PathRecorder +68.82 KiB 24
alloc +47.85 KiB 1718
serde_with -42.80 KiB 28
saluki_components::common::datadog -40.91 KiB 529
saluki_components::sources::dogstatsd -40.41 KiB 368
[sections] +33.97 KiB 8
prost +33.56 KiB 264
agent_data_plane_config_system::translators::datadog_translator +31.50 KiB 25
hyper_util +29.57 KiB 74
agent_data_plane_config::SalukiConfiguration +28.62 KiB 1
axum +25.34 KiB 375
otlp_protos::otlp_include::opentelemetry -25.32 KiB 144
Detailed Symbol Changes
    FILE SIZE        VM SIZE    
 --------------  -------------- 
  [NEW] +87.4Ki  [NEW] +87.1Ki    _<datadog_agent_config::generated::datadog_configuration::_::<impl serde_core::de::Deserialize for datadog_agent_config::generated::datadog_configuration::DatadogConfiguration>::deserialize::__Visitor as serde_core::de::Visitor>::visit_map::h59abc0a47db21533
  [NEW] +54.9Ki  [NEW] +54.7Ki    saluki_components::common::datadog::io::run_endpoint_io_loop::_{{closure}}::h619cfc6f7a2c29a2
  [NEW] +44.7Ki  [NEW] +44.6Ki    agent_data_plane::cli::run::handle_run_command::_{{closure}}::h329f79117c30c586
  [NEW] +40.9Ki  [NEW] +40.7Ki    _<saluki_components::forwarders::otlp::OtlpForwarder as saluki_core::components::forwarders::Forwarder>::run::_{{closure}}::h12001b40cfdbe9ad
  [NEW] +36.6Ki  [NEW] +36.4Ki    _<saluki_components::transforms::apm_stats::ApmStats as saluki_core::components::transforms::Transform>::run::_{{closure}}::hcfbaff7c8f04ca3a
  [NEW] +32.5Ki  [NEW] +32.3Ki    _<saluki_components::transforms::aggregate::Aggregate as saluki_core::components::transforms::Transform>::run::_{{closure}}::ha1b37f98738ba368
  [NEW] +32.1Ki  [NEW] +31.9Ki    saluki_components::sources::otlp::metrics::translator::OtlpMetricsTranslator::translate_metrics::h6f16bec49aa3e135
  [NEW] +29.1Ki  [NEW] +29.0Ki    agent_data_plane::cli::dogstatsd::handle_dogstatsd_command::_{{closure}}::hd2948b2b886d3024
  [NEW] +28.6Ki  [NEW] +28.5Ki    _<agent_data_plane_config::SalukiConfiguration as core::clone::Clone>::clone::h8de0a5256ebf7df6
  [NEW] +27.0Ki  [NEW] +26.9Ki    agent_data_plane::cli::run::create_topology::_{{closure}}::h7b42595e5eb142f8
  [NEW] +26.5Ki  [NEW] +26.3Ki    saluki_components::sources::dogstatsd::drive_stream::_{{closure}}::h16dece6451b89a07
  [DEL] -25.6Ki  [DEL] -25.4Ki    saluki_components::sources::dogstatsd::drive_stream::_{{closure}}::h3fe2520e3abdfc38
  [DEL] -26.6Ki  [DEL] -26.4Ki    _<saluki_components::sources::dogstatsd::DogStatsDConfiguration as saluki_core::components::sources::builder::SourceBuilder>::build::_{{closure}}::h2c2a33d551977c6d
  [DEL] -27.2Ki  [DEL] -26.9Ki    _<saluki_components::sources::dogstatsd::_::<impl serde_core::de::Deserialize for saluki_components::sources::dogstatsd::DogStatsDConfiguration>::deserialize::__Visitor as serde_core::de::Visitor>::visit_map::hfc578ba92a99992a
  [DEL] -28.6Ki  [DEL] -28.5Ki    saluki_components::sources::otlp::metrics::translator::OtlpMetricsTranslator::translate_metrics::h1e8351a6f731e9df
  [DEL] -28.6Ki  [DEL] -28.5Ki    agent_data_plane::cli::dogstatsd::handle_dogstatsd_command::_{{closure}}::h84db3f7ad161eab2
  [DEL] -32.6Ki  [DEL] -32.4Ki    _<saluki_components::transforms::aggregate::Aggregate as saluki_core::components::transforms::Transform>::run::_{{closure}}::h72e4b09fd816d94f
  [DEL] -38.7Ki  [DEL] -38.5Ki    _<saluki_components::forwarders::otlp::OtlpForwarder as saluki_core::components::forwarders::Forwarder>::run::_{{closure}}::h3cd6ee67f0471508
  [DEL] -44.7Ki  [DEL] -44.6Ki    agent_data_plane::cli::run::handle_run_command::_{{closure}}::h83501a7881036c5f
  [DEL] -56.8Ki  [DEL] -56.6Ki    saluki_components::common::datadog::io::run_endpoint_io_loop::_{{closure}}::h54fbb73bb30184e6
  +0.2% +32.9Ki  -0.5% -69.5Ki    [35193 Others]
  +0.4%  +163Ki  +0.2% +61.1Ki    TOTAL

@pr-commenter

pr-commenter Bot commented Jul 5, 2026

Copy link
Copy Markdown

Regression Detector (Agent Data Plane)

Run ID: f220a844-341e-4eca-9943-606032c04971
Baseline: 7b98c6f1 · Comparison: ed62b57b · 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_low memory ⚪ +1.54 metrics profiles logs
quality_gates_rss_idle memory ⚪ +0.75 metrics profiles logs
quality_gates_rss_dsd_medium memory ⚪ +0.70 metrics profiles logs
quality_gates_rss_dsd_heavy memory ⚪ +0.23 metrics profiles logs
quality_gates_rss_dsd_ultraheavy memory ⚪ +0.01 metrics profiles logs
Bounds Checks: ✅ Passed (5)
experiment check replicates observed links
quality_gates_rss_dsd_heavy memory_usage 10/10 ✅ 140 MiB ≤ 140 MiB metrics profiles logs
quality_gates_rss_dsd_low memory_usage 10/10 ✅ 43.4 MiB ≤ 50 MiB metrics profiles logs
quality_gates_rss_dsd_medium memory_usage 10/10 ✅ 65.1 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 ✅ 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.

@webern webern left a comment

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.

Claude Code operating on behalf of webern. Clean-room review completed. I found one input-sanitization/behavioral regression that should be fixed before merging; config reachability and the zero default otherwise look preserved. The existing Copilot review contained no actionable inline finding, and the performance/binary-size bot reports are not relevant to this config cutover.

client_config,
expected_tags_duration,
})
expected_tags_duration: tags.expected_tags_duration,

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.

[P1] Preserve rejection of negative numeric durations. Before this migration, GenericConfiguration::try_get_typed::<DurationString> rejected negative numeric values and HostTagsConfiguration::from_configuration propagated that error. The typed DatadogConfiguration path uses deserialize_go_duration, whose numeric visitor clamps negative values to zero. Consequently, expected_tags_duration: -1 now boots with host-tag enrichment silently disabled instead of rejecting the invalid configuration. Please preserve the old validation in the typed layer (including its DurationString overflow bounds) or otherwise make this cutover behavior-equivalent.

webern added 2 commits July 6, 2026 12:01
Build HostTagsConfiguration from the typed SalukiConfiguration model rather than
GenericConfiguration. The expected_tags_duration key is witnessed and already modeled
at shared.tags.expected_tags_duration, so the component now reads it from the typed
slice. The remote-agent client configuration (a shared, not-yet-migrated struct) is
built at the call site and passed in, removing GenericConfiguration from the component.
The typed Datadog config path deserializes duration fields via
deserialize_go_duration. Its numeric visitors clamped negative values to
zero and accepted nanosecond counts beyond Go's time.Duration bound,
diverging from the saluki_config::DurationString behavior it replaced.

For example, migrating HostTagsConfiguration to the typed model meant
expected_tags_duration: -1 silently became 0s (disabling host-tag
enrichment) instead of failing startup.

Reject negative numeric and string durations and enforce the i64::MAX
nanosecond overflow bound in the deserializer, matching DurationString.
Go duration strings, numeric nanoseconds, and schema defaults (0s) are
unchanged.
@webern webern force-pushed the m/host-tags-conf branch from ed62b57 to d9a040b Compare July 6, 2026 10:05

@webern webern left a comment

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.

Claude Code operating on behalf of webern. The negative-number and numeric-overflow fix is correct, but the follow-up review found one remaining DurationString compatibility gap in the same typed boundary.

/// numeric values clamp to zero, since `Duration` cannot represent them.
/// `duration_value_as_nanos`); a string is parsed with the shared `go-duration` parser.
///
/// Acceptance and rejection match `saluki_config::DurationString`, the type this replaced on the

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.

[P1] Preserve the legacy string coercion too. DurationString does more than call parse_duration: it trims whitespace and, if Go-duration parsing fails, accepts a bare integer string as nanoseconds. Thus expected_tags_duration: "5" (and env-var input DD_EXPECTED_TAGS_DURATION=5) previously produced 5 ns, while this typed path rejects it; padded input such as " 5s" also previously worked. That leaves the cutover behaviorally incompatible despite this statement. Please use equivalent string parsing here (preferably shared rather than duplicated) and add coverage for bare-integer and whitespace-padded strings, including overflow/negative fallback cases.

The typed config deserializer (deserialize_go_duration) and
saluki_config::DurationString each need to accept exactly what the
Datadog Agent's viper/cast configuration coercion accepts. That contract
was implemented independently in both places and drifted: the typed path
called go_duration::parse_duration directly, so unlike DurationString it
rejected whitespace-padded strings, bare-integer nanosecond strings such
as "5" (how DD_EXPECTED_TAGS_DURATION=5 arrives), and applied the
negative/overflow rules inconsistently.

Move the coercion into the go-duration crate, its single owner:
parse_viper_duration (trim + Go grammar + bare-integer-nanoseconds
fallback) plus checked_duration_from_nanos_{i128,u128,f64} for the shared
negative/overflow guards, with MAX_NANOS_U64 now public. parse_duration
stays the strict Go grammar primitive.

DurationString and deserialize_go_duration are both reimplemented on top
of these functions, so the typed path and DurationString are provably the
same coercion. No new dependencies (go-duration stays std-only) and no
saluki-config dependency is added to datadog-agent-config.

Tests: go-duration gains coverage for the coercion function and numeric
guards; the typed path gains bare-integer-string, whitespace-padding, and
negative/overflow-via-fallback cases. DurationString's existing suite is
unchanged and still passes.
Copilot AI review requested due to automatic review settings July 6, 2026 10:18

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.

Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.

@dd-octo-sts dd-octo-sts Bot added the area/config Configuration. label Jul 6, 2026
@webern webern merged commit 7a5e013 into m/pr6-adp-cutover Jul 6, 2026
9 of 10 checks passed
@webern webern deleted the m/host-tags-conf branch July 6, 2026 10:22
webern added a commit that referenced this pull request Jul 8, 2026
## Human Summary

It thrashed a bit on preserving the exact behavior that `DurationString`
was providing and on viper `time.Duration` parsing correctness. Overall
the changes it made seem fine to me.

## AI Summary

Migrates `HostTagsConfiguration` from the raw `GenericConfiguration` map
to the typed
`SalukiConfiguration` model, continuing the ADP config cutover.

`expected_tags_duration` is witnessed and already modeled at
`shared.tags.expected_tags_duration`, so the component now reads it
directly from the typed
slice instead of parsing a `DurationString` off `GenericConfiguration`.
The component's
hand-written zero default is dropped; the generated schema default
(`0s`) is authoritative.

`RemoteAgentClientConfiguration` is a shared struct still consumed by
several not-yet-migrated
remote-agent components, so it stays on `GenericConfiguration` for now.
It is built at the call
site and passed into `HostTagsConfiguration`, which removes
`GenericConfiguration` from the
component entirely.

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

## How did you test this PR?

`make check-all`, `make test`, and `make check-docs` all pass.
Translation of
`expected_tags_duration` into the typed model is already covered by
existing translator and
config-system tests.

## References

- Progresses #1788
- Merges into #1987
webern added a commit that referenced this pull request Jul 9, 2026
## Human Summary

It thrashed a bit on preserving the exact behavior that `DurationString`
was providing and on viper `time.Duration` parsing correctness. Overall
the changes it made seem fine to me.

## AI Summary

Migrates `HostTagsConfiguration` from the raw `GenericConfiguration` map
to the typed
`SalukiConfiguration` model, continuing the ADP config cutover.

`expected_tags_duration` is witnessed and already modeled at
`shared.tags.expected_tags_duration`, so the component now reads it
directly from the typed
slice instead of parsing a `DurationString` off `GenericConfiguration`.
The component's
hand-written zero default is dropped; the generated schema default
(`0s`) is authoritative.

`RemoteAgentClientConfiguration` is a shared struct still consumed by
several not-yet-migrated
remote-agent components, so it stays on `GenericConfiguration` for now.
It is built at the call
site and passed into `HostTagsConfiguration`, which removes
`GenericConfiguration` from the
component entirely.

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

## How did you test this PR?

`make check-all`, `make test`, and `make check-docs` all pass.
Translation of
`expected_tags_duration` into the typed model is already covered by
existing translator and
config-system tests.

## References

- Progresses #1788
- Merges into #1987
webern added a commit that referenced this pull request Jul 9, 2026
It thrashed a bit on preserving the exact behavior that `DurationString`
was providing and on viper `time.Duration` parsing correctness. Overall
the changes it made seem fine to me.

Migrates `HostTagsConfiguration` from the raw `GenericConfiguration` map
to the typed
`SalukiConfiguration` model, continuing the ADP config cutover.

`expected_tags_duration` is witnessed and already modeled at
`shared.tags.expected_tags_duration`, so the component now reads it
directly from the typed
slice instead of parsing a `DurationString` off `GenericConfiguration`.
The component's
hand-written zero default is dropped; the generated schema default
(`0s`) is authoritative.

`RemoteAgentClientConfiguration` is a shared struct still consumed by
several not-yet-migrated
remote-agent components, so it stays on `GenericConfiguration` for now.
It is built at the call
site and passed into `HostTagsConfiguration`, which removes
`GenericConfiguration` from the
component entirely.

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

`make check-all`, `make test`, and `make check-docs` all pass.
Translation of
`expected_tags_duration` into the typed model is already covered by
existing translator and
config-system tests.

- Progresses #1788
- Merges into #1987
webern added a commit that referenced this pull request Jul 9, 2026
It thrashed a bit on preserving the exact behavior that `DurationString`
was providing and on viper `time.Duration` parsing correctness. Overall
the changes it made seem fine to me.

Migrates `HostTagsConfiguration` from the raw `GenericConfiguration` map
to the typed
`SalukiConfiguration` model, continuing the ADP config cutover.

`expected_tags_duration` is witnessed and already modeled at
`shared.tags.expected_tags_duration`, so the component now reads it
directly from the typed
slice instead of parsing a `DurationString` off `GenericConfiguration`.
The component's
hand-written zero default is dropped; the generated schema default
(`0s`) is authoritative.

`RemoteAgentClientConfiguration` is a shared struct still consumed by
several not-yet-migrated
remote-agent components, so it stays on `GenericConfiguration` for now.
It is built at the call
site and passed into `HostTagsConfiguration`, which removes
`GenericConfiguration` from the
component entirely.

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

`make check-all`, `make test`, and `make check-docs` all pass.
Translation of
`expected_tags_duration` into the typed model is already covered by
existing translator and
config-system tests.

- Progresses #1788
- Merges into #1987
webern added a commit that referenced this pull request Jul 9, 2026
It thrashed a bit on preserving the exact behavior that `DurationString`
was providing and on viper `time.Duration` parsing correctness. Overall
the changes it made seem fine to me.

Migrates `HostTagsConfiguration` from the raw `GenericConfiguration` map
to the typed
`SalukiConfiguration` model, continuing the ADP config cutover.

`expected_tags_duration` is witnessed and already modeled at
`shared.tags.expected_tags_duration`, so the component now reads it
directly from the typed
slice instead of parsing a `DurationString` off `GenericConfiguration`.
The component's
hand-written zero default is dropped; the generated schema default
(`0s`) is authoritative.

`RemoteAgentClientConfiguration` is a shared struct still consumed by
several not-yet-migrated
remote-agent components, so it stays on `GenericConfiguration` for now.
It is built at the call
site and passed into `HostTagsConfiguration`, which removes
`GenericConfiguration` from the
component entirely.

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

`make check-all`, `make test`, and `make check-docs` all pass.
Translation of
`expected_tags_duration` into the typed model is already covered by
existing translator and
config-system tests.

- Progresses #1788
- Merges into #1987
webern added a commit that referenced this pull request Jul 9, 2026
It thrashed a bit on preserving the exact behavior that `DurationString`
was providing and on viper `time.Duration` parsing correctness. Overall
the changes it made seem fine to me.

Migrates `HostTagsConfiguration` from the raw `GenericConfiguration` map
to the typed
`SalukiConfiguration` model, continuing the ADP config cutover.

`expected_tags_duration` is witnessed and already modeled at
`shared.tags.expected_tags_duration`, so the component now reads it
directly from the typed
slice instead of parsing a `DurationString` off `GenericConfiguration`.
The component's
hand-written zero default is dropped; the generated schema default
(`0s`) is authoritative.

`RemoteAgentClientConfiguration` is a shared struct still consumed by
several not-yet-migrated
remote-agent components, so it stays on `GenericConfiguration` for now.
It is built at the call
site and passed into `HostTagsConfiguration`, which removes
`GenericConfiguration` from the
component entirely.

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

`make check-all`, `make test`, and `make check-docs` all pass.
Translation of
`expected_tags_duration` into the typed model is already covered by
existing translator and
config-system tests.

- Progresses #1788
- Merges into #1987
webern added a commit that referenced this pull request Jul 10, 2026
It thrashed a bit on preserving the exact behavior that `DurationString`
was providing and on viper `time.Duration` parsing correctness. Overall
the changes it made seem fine to me.

Migrates `HostTagsConfiguration` from the raw `GenericConfiguration` map
to the typed
`SalukiConfiguration` model, continuing the ADP config cutover.

`expected_tags_duration` is witnessed and already modeled at
`shared.tags.expected_tags_duration`, so the component now reads it
directly from the typed
slice instead of parsing a `DurationString` off `GenericConfiguration`.
The component's
hand-written zero default is dropped; the generated schema default
(`0s`) is authoritative.

`RemoteAgentClientConfiguration` is a shared struct still consumed by
several not-yet-migrated
remote-agent components, so it stays on `GenericConfiguration` for now.
It is built at the call
site and passed into `HostTagsConfiguration`, which removes
`GenericConfiguration` from the
component entirely.

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

`make check-all`, `make test`, and `make check-docs` all pass.
Translation of
`expected_tags_duration` into the typed model is already covered by
existing translator and
config-system tests.

- Progresses #1788
- Merges into #1987
webern added a commit that referenced this pull request Jul 13, 2026
It thrashed a bit on preserving the exact behavior that `DurationString`
was providing and on viper `time.Duration` parsing correctness. Overall
the changes it made seem fine to me.

Migrates `HostTagsConfiguration` from the raw `GenericConfiguration` map
to the typed
`SalukiConfiguration` model, continuing the ADP config cutover.

`expected_tags_duration` is witnessed and already modeled at
`shared.tags.expected_tags_duration`, so the component now reads it
directly from the typed
slice instead of parsing a `DurationString` off `GenericConfiguration`.
The component's
hand-written zero default is dropped; the generated schema default
(`0s`) is authoritative.

`RemoteAgentClientConfiguration` is a shared struct still consumed by
several not-yet-migrated
remote-agent components, so it stays on `GenericConfiguration` for now.
It is built at the call
site and passed into `HostTagsConfiguration`, which removes
`GenericConfiguration` from the
component entirely.

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

`make check-all`, `make test`, and `make check-docs` all pass.
Translation of
`expected_tags_duration` into the typed model is already covered by
existing translator and
config-system tests.

- Progresses #1788
- Merges into #1987
webern added a commit that referenced this pull request Jul 13, 2026
It thrashed a bit on preserving the exact behavior that `DurationString`
was providing and on viper `time.Duration` parsing correctness. Overall
the changes it made seem fine to me.

Migrates `HostTagsConfiguration` from the raw `GenericConfiguration` map
to the typed
`SalukiConfiguration` model, continuing the ADP config cutover.

`expected_tags_duration` is witnessed and already modeled at
`shared.tags.expected_tags_duration`, so the component now reads it
directly from the typed
slice instead of parsing a `DurationString` off `GenericConfiguration`.
The component's
hand-written zero default is dropped; the generated schema default
(`0s`) is authoritative.

`RemoteAgentClientConfiguration` is a shared struct still consumed by
several not-yet-migrated
remote-agent components, so it stays on `GenericConfiguration` for now.
It is built at the call
site and passed into `HostTagsConfiguration`, which removes
`GenericConfiguration` from the
component entirely.

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

`make check-all`, `make test`, and `make check-docs` all pass.
Translation of
`expected_tags_duration` into the typed model is already covered by
existing translator and
config-system tests.

- Progresses #1788
- Merges into #1987
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area/config Configuration.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants