Skip to content

chore(config): migrate metrics/service-checks/checks-IPC/MRF gateway to typed config#1990

Merged
webern merged 2 commits into
m/pr5-cutoverfrom
m/enc-src-mrf
Jul 5, 2026
Merged

chore(config): migrate metrics/service-checks/checks-IPC/MRF gateway to typed config#1990
webern merged 2 commits into
m/pr5-cutoverfrom
m/enc-src-mrf

Conversation

@webern

@webern webern commented Jul 5, 2026

Copy link
Copy Markdown
Contributor

AI Summary

Migrates four more pipeline components off the raw GenericConfiguration map
and onto the typed SalukiConfiguration model.

  • Datadog Metrics encoder builds from shared.metrics_encoding and
    shared.endpoints. The model's V3ApiEncoding / V3SeriesMode types convert
    into the encoder's runtime V3ApiConfig / UseV3ApiSeriesConfig via From
    impls in protocol.rs; the additional-endpoints presence check reads the model
    map directly (the now-unused AdditionalEndpoints::is_empty is removed).
  • Datadog Service Checks encoder builds from shared.metrics_encoding and
    shared.endpoints.compression, mirroring the Events encoder.
  • Checks IPC source reads domains.checks.ipc_endpoint and parses it into a
    ListenAddress at the boundary.
  • MRF metrics gateway becomes a dynamic component: it takes
    Live<multi_region_failover::Domain> and re-derives its routing mode from the
    live domain instead of watching raw keys.

Defaults move up to the config layer, following the aggregate-slice pattern
(real default in the model Default, Saluki-only source stays Option with a
conditional seed):

  • MetricsEncoding::default now sets the encoder flush timeout (2s) and
    max-metrics-per-payload (10,000).
  • checks::Domain::default now sets the IPC endpoint (tcp://0.0.0.0:5105).

The component structs no longer carry source serde or their own defaults, and the
per-struct config smoke tests are retired; coverage now lives in the translator
tests and the components' construction tests.

Change Type

  • Non-functional (chore, refactoring, docs)

How did you test this PR?

  • make build-schema-overlay && make fmt (no changes)
  • make check-all
  • make check-docs
  • cargo nextest run --lib --bins for the affected crates
  • New construction/dynamic-update tests for each migrated component

Final AI Review Output

Claude Code operating on behalf of webern — fresh clean-room pass on the current HEAD (fixup included).

The V3 series endpoint-mode sanitization regression from the earlier pass is now fixed and well-covered: strings pass through, bools normalize to "true"/"false", and every other JSON kind records a translation error (rejecting at startup) while valid entries still survive a runtime update. The rest of the cutover looks transparent — checks-IPC default tcp://0.0.0.0:5105 matches the old any_tcp(5105) and still fails startup on a bad address; the metrics/service-checks payload, compression, and flush defaults are preserved (including the 0 → 10ms flush floor and the zstd agent-default→3 swap); the has_additional_endpoints V3 gate matches the old !is_empty(); and the MRF gateway's Live<Domain> cutover is equivalent to the old two-key watchers (build-time mode and the live view both project the same multi_region_failover domain, and Live::changed() only wakes on a real change to that projection).

One non-blocking note on test coverage. This PR retires two per-struct tests that guarded absent-key defaults:

  • use_v2_api_series_default::defaults_to_true_when_absent (guaranteed use_v2_api_series defaults to true)
  • the max_series_points_per_payload default assertion (guaranteed 10_000 when absent)

The replacements only assert that explicit values map through the model — nothing now asserts the effective default when the key is absent. Both are witnessed keys, so the real default arrives from the schema via the witness driver, and the model Default sets use_v2_series_api: false as a placeholder. That's correct today (schema default is true and drive() runs unconditionally), but if the witness wiring ever drifts the default silently flips V2→V1 series routing with no test catching it. The seeded defaults added here (max_metrics_per_payload, checks ipc_endpoint) are guarded by absent_keys_leave_model_defaults, but that test only runs seed(), so it can't cover the witnessed ones.

Suggest adding a translate()-level assertion on an empty config that use_v2_series_api == true (and ideally max_series_points_per_payload == 10_000) to restore the lost guard. Non-blocking — the current behavior is correct.

References

Copilot AI review requested due to automatic review settings July 5, 2026 15:03
@webern webern requested a review from a team as a code owner July 5, 2026 15:03
@dd-octo-sts dd-octo-sts Bot added area/components Sources, transforms, and destinations. encoder/datadog-metrics Datadog Metrics encoder. encoder/datadog-service-checks Datadog Service Checks encoder. labels Jul 5, 2026

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 continues the migration from GenericConfiguration to the typed SalukiConfiguration model by updating several pipeline components (metrics encoder, service checks encoder, checks IPC source, and the MRF gateway) to read from typed shared/domain config and use the Live<T> mechanism for dynamic updates.

Changes:

  • Migrates Datadog Metrics + Service Checks encoders to build from shared.metrics_encoding and shared.endpoints (including new model→runtime From mappings for V3 settings).
  • Migrates Checks IPC source to read domains.checks.ipc_endpoint and parse a ListenAddress at the boundary.
  • Refactors the MRF metrics gateway to watch Live<multi_region_failover::Domain> for runtime updates rather than watching raw config keys.

Reviewed changes

Copilot reviewed 10 out of 10 changed files in this pull request and generated 1 comment.

Show a summary per file
File Description
lib/saluki-components/src/transforms/mrf_gateway/mod.rs Switches MRF gateway from raw-key watchers to Live<Domain> updates and updates tests accordingly.
lib/saluki-components/src/sources/checks_ipc/mod.rs Reads the checks IPC listen endpoint from typed checks domain config and parses it into ListenAddress.
lib/saluki-components/src/encoders/datadog/service_checks/mod.rs Builds service checks encoder config from typed shared MetricsEncoding + Compression and replaces smoke test with a construction test.
lib/saluki-components/src/encoders/datadog/metrics/mod.rs Builds metrics encoder config from typed shared MetricsEncoding + Endpoints, updates flush-timeout handling, and replaces smoke/deser tests with model-mapping tests.
lib/saluki-components/src/common/datadog/protocol.rs Adds From impls to convert typed-model V3 settings into runtime encoder protocol config.
lib/saluki-components/src/common/datadog/endpoints.rs Removes now-unused is_empty helpers related to additional endpoints.
lib/agent-data-plane-config/src/shared.rs Moves encoder defaults (flush timeout, max metrics per payload) into MetricsEncoding::default.
lib/agent-data-plane-config/src/domains/checks.rs Moves checks IPC endpoint default into checks::Domain::default.
lib/agent-data-plane-config-system/src/saluki_only.rs Extends saluki-only config system tests to assert new defaults are present.
bin/agent-data-plane/src/cli/run.rs Updates topology assembly to pass typed config objects (and Live<Domain> where needed) into migrated components.

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

Comment thread lib/saluki-components/src/sources/checks_ipc/mod.rs
@pr-commenter

pr-commenter Bot commented Jul 5, 2026

Copy link
Copy Markdown

Binary Size Analysis (Agent Data Plane)

Baseline: 7b98c6f · Comparison: 1647d4b · diff
Analysis Configuration: stripped binaries · Pass/Fail Threshold: +5%
Sizes: 41.63 MiB (baseline) vs 41.97 MiB (comparison)
Size Change: +344.50 KiB (+0.81%)

✅ Binary size difference within threshold

Changes by Module
Module File Size Symbols
figment -559.99 KiB 375
serde_json +262.51 KiB 520
core +139.37 KiB 9325
datadog_agent_config::generated::datadog_configuration +137.31 KiB 44
alloc +59.14 KiB 1489
serde -55.12 KiB 77
agent_data_plane_config_system::saluki_env_overlay::PathRecorder +50.97 KiB 22
saluki_components::common::datadog +46.65 KiB 556
[sections] +38.47 KiB 7
tonic -37.20 KiB 350
tonic_prost +34.90 KiB 46
otlp_protos::otlp_include::opentelemetry -34.04 KiB 128
agent_data_plane_config_system::translators::datadog_translator +27.80 KiB 21
serde_core +25.42 KiB 896
http_body_util +24.76 KiB 146
agent_data_plane_config_system::saluki_only::_ +23.75 KiB 8
hyper_util +22.29 KiB 36
tracing -17.17 KiB 114
&mut serde_json +15.41 KiB 99
piecemeal +15.04 KiB 43
Detailed Symbol Changes
    FILE SIZE        VM SIZE    
 --------------  -------------- 
  +1.1%  +166Ki  +0.6% +74.2Ki    [33631 Others]
  [NEW] +78.6Ki  [NEW] +78.3Ki    _<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] +56.7Ki  [NEW] +56.6Ki    saluki_components::common::datadog::io::run_endpoint_io_loop::_{{closure}}::h3ef2a484186f0bb8
  [NEW] +45.8Ki  [NEW] +45.5Ki    _<saluki_components::common::datadog::config::_::<impl serde_core::de::Deserialize for saluki_components::common::datadog::config::ForwarderConfiguration>::deserialize::__Visitor as serde_core::de::Visitor>::visit_map::h1e7be2d7ee95fbb8
  [NEW] +44.3Ki  [NEW] +44.2Ki    agent_data_plane::cli::run::handle_run_command::_{{closure}}::he5819430e26508ec
  [NEW] +35.9Ki  [NEW] +35.7Ki    _<saluki_components::forwarders::otlp::OtlpForwarder as saluki_core::components::forwarders::Forwarder>::run::_{{closure}}::h3d7ef516f362b9a8
  [NEW] +32.8Ki  [NEW] +32.6Ki    _<saluki_components::transforms::aggregate::Aggregate as saluki_core::components::transforms::Transform>::run::_{{closure}}::h6809d072204e0804
  [NEW] +30.6Ki  [NEW] +30.5Ki    saluki_components::sources::otlp::metrics::translator::OtlpMetricsTranslator::translate_metrics::hd269a5b16c8f1266
  [NEW] +28.6Ki  [NEW] +28.5Ki    agent_data_plane::cli::dogstatsd::handle_dogstatsd_command::_{{closure}}::hd22ba2289c2b0af8
  [NEW] +28.4Ki  [NEW] +28.3Ki    saluki_components::encoders::datadog::metrics::encode_v3_metrics_batch::h6adf3678c0ac60b0
  [NEW] +27.4Ki  [NEW] +27.3Ki    saluki_components::sources::dogstatsd::drive_stream::_{{closure}}::h16acca5cc1c6ba60
  [NEW] +26.4Ki  [NEW] +26.1Ki    _<saluki_components::sources::dogstatsd::_::<impl serde_core::de::Deserialize for saluki_components::sources::dogstatsd::DogStatsDConfiguration>::deserialize::__Visitor as serde_core::de::Visitor>::visit_map::hba6844531adf2ec6
  [NEW] +26.0Ki  [NEW] +25.8Ki    _<saluki_components::sources::dogstatsd::DogStatsDConfiguration as saluki_core::components::sources::builder::SourceBuilder>::build::_{{closure}}::h6b9140c89e43d005
  [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.8%  +344Ki  +0.7%  +251Ki    TOTAL

@pr-commenter

pr-commenter Bot commented Jul 5, 2026

Copy link
Copy Markdown

Regression Detector (Agent Data Plane)

Run ID: 3f9021c4-273f-4c9b-9c86-6d94c19c4517
Baseline: 7b98c6f1 · Comparison: 7ebd6fcd · diff

Optimization Goals: ✅ No significant changes detected

Fine details of change detection per experiment (3)

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.77 metrics profiles logs
quality_gates_rss_idle memory ⚪ +1.59 metrics profiles logs
quality_gates_rss_dsd_medium memory ⚪ +0.80 metrics profiles logs
Bounds Checks: ✅ Passed (3)
experiment check replicates observed links
quality_gates_rss_dsd_low memory_usage 10/10 ✅ 43.6 MiB ≤ 50 MiB metrics profiles logs
quality_gates_rss_dsd_medium memory_usage 10/10 ✅ 65.5 MiB ≤ 75 MiB metrics profiles logs
quality_gates_rss_idle memory_usage 10/10 ✅ 29.4 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. I found one input-sanitization regression in the V3 series endpoint-mode migration; see the inline comment. The other cutovers preserve the old defaults and reachability, and the MRF live-domain update behavior looks consistent with the previous watchers.

fn from(mode: &agent_data_plane_config::shared::V3SeriesMode) -> Self {
Self {
enabled: mode.mode.clone(),
endpoints: mode.endpoint_modes.clone(),

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.

This copies the model's endpoint-mode map without preserving the old deserialization boundary. Before this cutover, UseV3ApiSeriesConfig accepted only string or boolean values (V3SeriesModeValue); a numeric/null/object mode made as_typed::<DatadogMetricsConfiguration>() fail. The model translator currently stringifies every other JSON value (unwrap_or_else(|mode| mode.to_string())), so e.g. use_v3_api.series.endpoints: {<endpoint>: 1} now starts successfully and silently becomes the invalid string "1", which the runtime treats as false. That makes malformed input more likely to enter the component and changes startup failure into silently disabled V3. Please retain the old String-or-Bool validation (or record a translation error for other value types) before this conversion.

@datadog-prod-us1-3

This comment has been minimized.

webern added 2 commits July 5, 2026 19:12
…to typed config

Build the Datadog Metrics and Service Checks encoders, the Checks IPC source,
and the MRF metrics gateway transform from the typed SalukiConfiguration model
instead of the raw GenericConfiguration map.

- Metrics and service-checks encoders read shared.metrics_encoding and
  shared.endpoints; V3 API / series-mode model types convert into the encoder's
  runtime types via From impls in protocol.rs.
- Checks IPC source reads domains.checks.ipc_endpoint.
- MRF gateway becomes a dynamic component driven by Live<multi_region_failover>.
- Hoist the encoder flush-timeout (2s) and max-metrics-per-payload (10,000)
  defaults into MetricsEncoding::default, and the checks IPC endpoint default
  (tcp://0.0.0.0:5105) into checks::Domain::default, matching the aggregate slice
  pattern; the component structs no longer carry defaults.
- Retire the per-struct config smoke tests; coverage now lives in translator and
  construction tests.

Progresses #1788
The metrics-encoder cutover let use_v3_api.series.endpoints accept any JSON
value and stringified it, weakening validation the old V3SeriesModeValue
deserializer enforced. Restore the string/boolean-only domain in
consume_use_v3_api_series_endpoints, recording a TranslateError for other kinds
while preserving valid entries.
Copilot AI review requested due to automatic review settings July 5, 2026 17:12

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

Copilot reviewed 11 out of 11 changed files in this pull request and generated 1 comment.

Comment on lines 166 to 170
let mut health = context.take_health_handle();
let mut failover_metrics_watcher = self
.configuration
.watch_for_updates("multi_region_failover.failover_metrics");
let mut metric_allowlist_watcher = self
.configuration
.watch_for_updates("multi_region_failover.metric_allowlist");
let mut live = self.live.clone();

health.mark_ready();
debug!(mode = ?self.mode, "MRF metrics gateway transform started.");

@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 — fresh clean-room pass on the current HEAD (fixup included).

The V3 series endpoint-mode sanitization regression from the earlier pass is now fixed and well-covered: strings pass through, bools normalize to "true"/"false", and every other JSON kind records a translation error (rejecting at startup) while valid entries still survive a runtime update. The rest of the cutover looks transparent — checks-IPC default tcp://0.0.0.0:5105 matches the old any_tcp(5105) and still fails startup on a bad address; the metrics/service-checks payload, compression, and flush defaults are preserved (including the 0 → 10ms flush floor and the zstd agent-default→3 swap); the has_additional_endpoints V3 gate matches the old !is_empty(); and the MRF gateway's Live<Domain> cutover is equivalent to the old two-key watchers (build-time mode and the live view both project the same multi_region_failover domain, and Live::changed() only wakes on a real change to that projection).

One non-blocking note on test coverage. This PR retires two per-struct tests that guarded absent-key defaults:

  • use_v2_api_series_default::defaults_to_true_when_absent (guaranteed use_v2_api_series defaults to true)
  • the max_series_points_per_payload default assertion (guaranteed 10_000 when absent)

The replacements only assert that explicit values map through the model — nothing now asserts the effective default when the key is absent. Both are witnessed keys, so the real default arrives from the schema via the witness driver, and the model Default sets use_v2_series_api: false as a placeholder. That's correct today (schema default is true and drive() runs unconditionally), but if the witness wiring ever drifts the default silently flips V2→V1 series routing with no test catching it. The seeded defaults added here (max_metrics_per_payload, checks ipc_endpoint) are guarded by absent_keys_leave_model_defaults, but that test only runs seed(), so it can't cover the witnessed ones.

Suggest adding a translate()-level assertion on an empty config that use_v2_series_api == true (and ideally max_series_points_per_payload == 10_000) to restore the lost guard. Non-blocking — the current behavior is correct.

@webern webern merged commit 95f551b into m/pr5-cutover Jul 5, 2026
82 of 83 checks passed
@webern webern deleted the m/enc-src-mrf branch July 5, 2026 17:30
webern added a commit that referenced this pull request Jul 5, 2026
The forwarder cutover moved additional_endpoints onto the typed model, and
#1990 did the same for the metrics encoder, so AdditionalEndpoints's serde
impl has no production caller. Its deserialization tests were the last consumer
of serde_yaml in this crate; drop the now-unused dependency.
webern added a commit that referenced this pull request Jul 5, 2026
The forwarder cutover moved additional_endpoints onto the typed model, and
#1990 did the same for the metrics encoder, so AdditionalEndpoints's serde
impl has no production caller. Its deserialization tests were the last consumer
of serde_yaml in this crate; drop the now-unused dependency.
webern added a commit that referenced this pull request Jul 8, 2026
…to typed config (#1990)

Migrates four more pipeline components off the raw
`GenericConfiguration` map
and onto the typed `SalukiConfiguration` model.

- **Datadog Metrics encoder** builds from `shared.metrics_encoding` and
`shared.endpoints`. The model's `V3ApiEncoding` / `V3SeriesMode` types
convert
into the encoder's runtime `V3ApiConfig` / `UseV3ApiSeriesConfig` via
`From`
impls in `protocol.rs`; the additional-endpoints presence check reads
the model
map directly (the now-unused `AdditionalEndpoints::is_empty` is
removed).
- **Datadog Service Checks encoder** builds from
`shared.metrics_encoding` and
  `shared.endpoints.compression`, mirroring the Events encoder.
- **Checks IPC source** reads `domains.checks.ipc_endpoint` and parses
it into a
  `ListenAddress` at the boundary.
- **MRF metrics gateway** becomes a dynamic component: it takes
`Live<multi_region_failover::Domain>` and re-derives its routing mode
from the
  live domain instead of watching raw keys.

Defaults move up to the config layer, following the aggregate-slice
pattern
(real default in the model `Default`, Saluki-only source stays `Option`
with a
conditional seed):

- `MetricsEncoding::default` now sets the encoder flush timeout (2s) and
  max-metrics-per-payload (10,000).
- `checks::Domain::default` now sets the IPC endpoint
(`tcp://0.0.0.0:5105`).

The component structs no longer carry source serde or their own
defaults, and the
per-struct config smoke tests are retired; coverage now lives in the
translator
tests and the components' construction tests.

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

- `make build-schema-overlay && make fmt` (no changes)
- `make check-all`
- `make check-docs`
- `cargo nextest run --lib --bins` for the affected crates
- New construction/dynamic-update tests for each migrated component

Claude Code operating on behalf of webern — fresh clean-room pass on the
current HEAD (fixup included).

The V3 series endpoint-mode sanitization regression from the earlier
pass is now fixed and well-covered: strings pass through, bools
normalize to `"true"`/`"false"`, and every other JSON kind records a
translation error (rejecting at startup) while valid entries still
survive a runtime update. The rest of the cutover looks transparent —
checks-IPC default `tcp://0.0.0.0:5105` matches the old `any_tcp(5105)`
and still fails startup on a bad address; the metrics/service-checks
payload, compression, and flush defaults are preserved (including the `0
→ 10ms` flush floor and the zstd agent-default→3 swap); the
`has_additional_endpoints` V3 gate matches the old `!is_empty()`; and
the MRF gateway's `Live<Domain>` cutover is equivalent to the old
two-key watchers (build-time mode and the live view both project the
same `multi_region_failover` domain, and `Live::changed()` only wakes on
a real change to that projection).

One non-blocking note on test coverage. This PR retires two per-struct
tests that guarded **absent-key** defaults:

- `use_v2_api_series_default::defaults_to_true_when_absent` (guaranteed
`use_v2_api_series` defaults to `true`)
- the `max_series_points_per_payload` default assertion (guaranteed
`10_000` when absent)

The replacements only assert that explicit values map through the model
— nothing now asserts the effective default when the key is absent. Both
are witnessed keys, so the real default arrives from the schema via the
witness driver, and the model `Default` sets `use_v2_series_api: false`
as a placeholder. That's correct today (schema default is `true` and
`drive()` runs unconditionally), but if the witness wiring ever drifts
the default silently flips V2→V1 series routing with no test catching
it. The seeded defaults added here (`max_metrics_per_payload`, checks
`ipc_endpoint`) are guarded by `absent_keys_leave_model_defaults`, but
that test only runs `seed()`, so it can't cover the witnessed ones.

Suggest adding a `translate()`-level assertion on an empty config that
`use_v2_series_api == true` (and ideally `max_series_points_per_payload
== 10_000`) to restore the lost guard. Non-blocking — the current
behavior is correct.

- Progresses #1788
- Merges into `m/pr5-cutover`
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. encoder/datadog-metrics Datadog Metrics encoder. encoder/datadog-service-checks Datadog Service Checks encoder.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants