From e593dd3c7b9a8e893a1d31f247c94148791614ea Mon Sep 17 00:00:00 2001 From: Matthew James Briggs Date: Fri, 5 Jun 2026 17:03:37 +0200 Subject: [PATCH 1/4] big squash yo --- .claude/skills/config-management/SKILL.md | 133 + .claude/skills/confkey/README.md | 68 +- .claude/skills/confkey/SKILL.md | 203 +- .claude/skills/confkey/modes/audit-all.md | 255 -- .claude/skills/confkey/modes/audit-one.md | 108 - .claude/skills/confkey/modes/audit.md | 86 + .../skills/confkey/modes/complete-issue.md | 90 - .claude/skills/confkey/modes/create-issue.md | 23 +- .../resources/all-conf-keys.schema.json | 32 - .../confkey/resources/analyze-features.md | 144 +- .../confkey/resources/dogstatsd-doc-guide.md | 157 - .../resources/feature-analysis.schema.json | 39 - .../confkey/resources/find-adpimpl-configs.md | 116 - .../confkey/resources/find-refimpl-configs.md | 133 - .../known-configs-not-applicable.schema.json | 12 - .../resources/known-configs.schema.json | 53 - .gitlab/test.yml | 1 + .../config/vocabularies/technical/accept.txt | 1 + AGENTS.md | 3 + Cargo.lock | 37 + Cargo.toml | 11 +- LICENSE-3rdparty.csv | 71 - bin/agent-data-plane/Cargo.toml | 4 +- bin/agent-data-plane/src/cli/run.rs | 5 +- .../components/dogstatsd_prefix_filter/mod.rs | 19 +- .../configuration/dogstatsd.md | 822 ++-- .../configuration/dogstatsd.md.tmpl | 121 + .../known-configs-not-applicable.json | 2315 ----------- .../dogstatsd/known-configs.json | 2108 ---------- .../commons}/Cargo.toml | 0 .../commons}/src/ipc/client/bearer_auth.rs | 0 .../commons}/src/ipc/client/mod.rs | 0 .../commons}/src/ipc/client/streaming.rs | 0 .../commons}/src/ipc/config.rs | 0 .../commons}/src/ipc/mod.rs | 0 .../commons}/src/ipc/session.rs | 0 .../commons}/src/ipc/tls.rs | 0 .../commons}/src/lib.rs | 0 .../commons}/src/platform/linux_impl.rs | 0 .../commons}/src/platform/macos_impl.rs | 0 .../commons}/src/platform/mod.rs | 0 .../commons}/src/platform/windows_impl.rs | 0 .../config-overlay-model/Cargo.toml | 19 + .../config-overlay-model/src/lib.rs | 701 ++++ .../config-overlay-model/src/saluki_keys.rs | 574 +++ .../config-overlay-model/src/schema_gen.rs | 241 ++ .../src/smoke_test_support.rs | 73 + .../test/fake_overlay.yaml | 157 + .../test/fake_schema.yaml | 44 + .../config-testsupport/Cargo.toml | 23 + lib/datadog-agent/config-testsupport/build.rs | 56 + .../config-testsupport/build/doc_gen.rs | 301 ++ .../config-testsupport/build/registry_gen.rs | 903 +++++ .../config-testsupport/dogstatsd.md | 565 +++ .../src/config_registry/accounting.rs | 46 + .../src/config_registry}/aggregate.rs | 42 +- .../src/config_registry/annotations_index.rs | 61 + .../src/config_registry}/containerd.rs | 14 +- .../src/config_registry/data_plane.rs | 46 + .../src/config_registry}/dogstatsd.rs | 139 +- .../src/config_registry}/dogstatsd_mapper.rs | 24 +- .../dogstatsd_prefix_filter.rs | 26 +- .../src/config_registry}/encoders.rs | 93 +- .../src/config_registry}/forwarder.rs | 99 +- .../src/config_registry}/get_typed.rs | 40 +- .../src/config_registry/mod.rs | 181 + .../src/config_registry}/mrf.rs | 27 +- .../src/config_registry}/otlp.rs | 95 +- .../src/config_registry}/proxy.rs | 26 +- .../src/config_registry}/tag_filterlist.rs | 11 +- .../src/config_registry}/trace_obfuscation.rs | 147 +- .../src/config_registry}/unsupported.rs | 438 ++- .../config-testsupport/src/lib.rs | 7 + .../config-testsupport/src/smoke_test.rs} | 111 +- lib/datadog-agent/config/Cargo.toml | 16 + lib/datadog-agent/config/build.rs | 22 + .../config/build/classifier_gen.rs | 121 + .../config/schema}/core_schema.yaml | 0 .../config/schema/schema_overlay.yaml | 3470 +++++++++++++++++ .../config/src/classifier/classifier.rs | 151 + .../config/src/classifier/classifier_data.rs | 483 +++ .../config/src/classifier/mod.rs | 160 + lib/datadog-agent/config/src/lib.rs | 1 + lib/saluki-components/Cargo.toml | 5 +- lib/saluki-components/build.rs | 288 -- lib/saluki-components/etc/ignored_keys.yaml | 3332 ---------------- .../src/common/datadog/config.rs | 7 +- .../src/common/datadog/proxy.rs | 20 +- .../src/config_registry/classifier.rs | 201 - .../src/config_registry/datadog/mod.rs | 303 -- .../src/config_registry/generated/mod.rs | 8 - .../src/config_registry/mod.rs | 388 -- .../src/decoders/otlp/mod.rs | 18 +- .../src/destinations/dsd_debug_log/mod.rs | 20 +- .../src/encoders/datadog/events/mod.rs | 20 +- .../src/encoders/datadog/logs/mod.rs | 20 +- .../src/encoders/datadog/metrics/mod.rs | 20 +- .../encoders/datadog/service_checks/mod.rs | 20 +- .../src/encoders/datadog/stats/mod.rs | 7 +- .../src/encoders/datadog/traces/mod.rs | 20 +- lib/saluki-components/src/lib.rs | 1 - lib/saluki-components/src/relays/otlp/mod.rs | 20 +- .../src/sources/dogstatsd/mod.rs | 20 +- lib/saluki-components/src/sources/otlp/mod.rs | 16 +- .../src/transforms/aggregate/mod.rs | 7 +- .../src/transforms/dogstatsd_mapper/mod.rs | 20 +- .../src/transforms/trace_obfuscation/mod.rs | 20 +- 107 files changed, 10290 insertions(+), 11435 deletions(-) create mode 100644 .claude/skills/config-management/SKILL.md delete mode 100644 .claude/skills/confkey/modes/audit-all.md delete mode 100644 .claude/skills/confkey/modes/audit-one.md create mode 100644 .claude/skills/confkey/modes/audit.md delete mode 100644 .claude/skills/confkey/modes/complete-issue.md delete mode 100644 .claude/skills/confkey/resources/all-conf-keys.schema.json delete mode 100644 .claude/skills/confkey/resources/dogstatsd-doc-guide.md delete mode 100644 .claude/skills/confkey/resources/feature-analysis.schema.json delete mode 100644 .claude/skills/confkey/resources/find-adpimpl-configs.md delete mode 100644 .claude/skills/confkey/resources/find-refimpl-configs.md delete mode 100644 .claude/skills/confkey/resources/known-configs-not-applicable.schema.json delete mode 100644 .claude/skills/confkey/resources/known-configs.schema.json create mode 100644 docs/agent-data-plane/configuration/dogstatsd.md.tmpl delete mode 100644 docs/agent-data-plane/configuration/dogstatsd/known-configs-not-applicable.json delete mode 100644 docs/agent-data-plane/configuration/dogstatsd/known-configs.json rename lib/{datadog-agent-commons => datadog-agent/commons}/Cargo.toml (100%) rename lib/{datadog-agent-commons => datadog-agent/commons}/src/ipc/client/bearer_auth.rs (100%) rename lib/{datadog-agent-commons => datadog-agent/commons}/src/ipc/client/mod.rs (100%) rename lib/{datadog-agent-commons => datadog-agent/commons}/src/ipc/client/streaming.rs (100%) rename lib/{datadog-agent-commons => datadog-agent/commons}/src/ipc/config.rs (100%) rename lib/{datadog-agent-commons => datadog-agent/commons}/src/ipc/mod.rs (100%) rename lib/{datadog-agent-commons => datadog-agent/commons}/src/ipc/session.rs (100%) rename lib/{datadog-agent-commons => datadog-agent/commons}/src/ipc/tls.rs (100%) rename lib/{datadog-agent-commons => datadog-agent/commons}/src/lib.rs (100%) rename lib/{datadog-agent-commons => datadog-agent/commons}/src/platform/linux_impl.rs (100%) rename lib/{datadog-agent-commons => datadog-agent/commons}/src/platform/macos_impl.rs (100%) rename lib/{datadog-agent-commons => datadog-agent/commons}/src/platform/mod.rs (100%) rename lib/{datadog-agent-commons => datadog-agent/commons}/src/platform/windows_impl.rs (100%) create mode 100644 lib/datadog-agent/config-overlay-model/Cargo.toml create mode 100644 lib/datadog-agent/config-overlay-model/src/lib.rs create mode 100644 lib/datadog-agent/config-overlay-model/src/saluki_keys.rs create mode 100644 lib/datadog-agent/config-overlay-model/src/schema_gen.rs create mode 100644 lib/datadog-agent/config-overlay-model/src/smoke_test_support.rs create mode 100644 lib/datadog-agent/config-overlay-model/test/fake_overlay.yaml create mode 100644 lib/datadog-agent/config-overlay-model/test/fake_schema.yaml create mode 100644 lib/datadog-agent/config-testsupport/Cargo.toml create mode 100644 lib/datadog-agent/config-testsupport/build.rs create mode 100644 lib/datadog-agent/config-testsupport/build/doc_gen.rs create mode 100644 lib/datadog-agent/config-testsupport/build/registry_gen.rs create mode 100644 lib/datadog-agent/config-testsupport/dogstatsd.md create mode 100644 lib/datadog-agent/config-testsupport/src/config_registry/accounting.rs rename lib/{saluki-components/src/config_registry/datadog => datadog-agent/config-testsupport/src/config_registry}/aggregate.rs (82%) create mode 100644 lib/datadog-agent/config-testsupport/src/config_registry/annotations_index.rs rename lib/{saluki-components/src/config_registry/datadog => datadog-agent/config-testsupport/src/config_registry}/containerd.rs (63%) create mode 100644 lib/datadog-agent/config-testsupport/src/config_registry/data_plane.rs rename lib/{saluki-components/src/config_registry/datadog => datadog-agent/config-testsupport/src/config_registry}/dogstatsd.rs (82%) rename lib/{saluki-components/src/config_registry/datadog => datadog-agent/config-testsupport/src/config_registry}/dogstatsd_mapper.rs (66%) rename lib/{saluki-components/src/config_registry/datadog => datadog-agent/config-testsupport/src/config_registry}/dogstatsd_prefix_filter.rs (76%) rename lib/{saluki-components/src/config_registry/datadog => datadog-agent/config-testsupport/src/config_registry}/encoders.rs (64%) rename lib/{saluki-components/src/config_registry/datadog => datadog-agent/config-testsupport/src/config_registry}/forwarder.rs (76%) rename lib/{saluki-components/src/config_registry/datadog => datadog-agent/config-testsupport/src/config_registry}/get_typed.rs (68%) create mode 100644 lib/datadog-agent/config-testsupport/src/config_registry/mod.rs rename lib/{saluki-components/src/config_registry/datadog => datadog-agent/config-testsupport/src/config_registry}/mrf.rs (78%) rename lib/{saluki-components/src/config_registry/datadog => datadog-agent/config-testsupport/src/config_registry}/otlp.rs (80%) rename lib/{saluki-components/src/config_registry/datadog => datadog-agent/config-testsupport/src/config_registry}/proxy.rs (73%) rename lib/{saluki-components/src/config_registry/datadog => datadog-agent/config-testsupport/src/config_registry}/tag_filterlist.rs (68%) rename lib/{saluki-components/src/config_registry/datadog => datadog-agent/config-testsupport/src/config_registry}/trace_obfuscation.rs (70%) rename lib/{saluki-components/src/config_registry/datadog => datadog-agent/config-testsupport/src/config_registry}/unsupported.rs (50%) create mode 100644 lib/datadog-agent/config-testsupport/src/lib.rs rename lib/{saluki-components/src/config_registry/test_support.rs => datadog-agent/config-testsupport/src/smoke_test.rs} (70%) create mode 100644 lib/datadog-agent/config/Cargo.toml create mode 100644 lib/datadog-agent/config/build.rs create mode 100644 lib/datadog-agent/config/build/classifier_gen.rs rename lib/{saluki-components/vendor => datadog-agent/config/schema}/core_schema.yaml (100%) create mode 100644 lib/datadog-agent/config/schema/schema_overlay.yaml create mode 100644 lib/datadog-agent/config/src/classifier/classifier.rs create mode 100644 lib/datadog-agent/config/src/classifier/classifier_data.rs create mode 100644 lib/datadog-agent/config/src/classifier/mod.rs create mode 100644 lib/datadog-agent/config/src/lib.rs delete mode 100644 lib/saluki-components/build.rs delete mode 100644 lib/saluki-components/etc/ignored_keys.yaml delete mode 100644 lib/saluki-components/src/config_registry/classifier.rs delete mode 100644 lib/saluki-components/src/config_registry/datadog/mod.rs delete mode 100644 lib/saluki-components/src/config_registry/generated/mod.rs delete mode 100644 lib/saluki-components/src/config_registry/mod.rs diff --git a/.claude/skills/config-management/SKILL.md b/.claude/skills/config-management/SKILL.md new file mode 100644 index 00000000000..d47f2c25699 --- /dev/null +++ b/.claude/skills/config-management/SKILL.md @@ -0,0 +1,133 @@ +--- +name: config-management +description: > + How to manage Datadog Agent configuration inventory in this repo. A single hand-written YAML + overlay is the source of truth; Rust code and Markdown documentation are generated from it at + build time. Trigger: adding/removing/reclassifying a config key, changing support level or + pipeline attribution, editing the vendored schema, fixing errors in generated files, or + build.rs panics with an overlay validation message. +disable-model-invocation: false +--- + +# /config-management + +## Mental model + +There is one place where config metadata is hand-edited, and everything else flows from it via +`build.rs` code: + +``` + ┌──────────────────────────┐ + vendored, untouched → │ schema/core_schema.yaml │ + └────────────┬─────────────┘ + │ + ┌────────────┴──────────────┐ + hand-edited (SoT) → │ schema/schema_overlay.yaml│ + └────────────┬──────────────┘ + │ + ┌────────────────┼─────────────────┐ + config/build.rs │ │ │ config-testsupport/build.rs + ▼ │ ▼ + PROD │ TEST/DOC + generated Rust: │ generated Rust: generated Markdown: + classifier data, │ config_registry configuration docs + slim entry table │ annotations (via .md.tmpl) + │ + config-overlay-model crate: + overlay types, schema_gen, saluki_keys + (shared build-dep for both build.rs files) +``` + +Doc generation lives in `config-testsupport/build.rs`, not `config/build.rs`, because it is a +dev/CI concern — not a prod build artifact. The generated `dogstatsd.md` is written in-tree by +the testsupport build and checked for staleness in CI. + +The overlay partitions every key in `core_schema.yaml` into exactly one section: `supported`, +`unsupported`, `investigate`, or `ignored`. The model for those sections lives in the +`config-overlay-model` crate; read its `lib.rs` when you need the exact field shape — the doc +comments on the structs are authoritative. + +## The cardinal rule + +Generated files are output, not source. They have a header like +`// @generated by build.rs from ... — DO NOT EDIT`. + +If you see a clippy warning, rustfmt diff, doc-lint error, missing key, or wrong field value in a +generated file, find the upstream source and fix it there. + +The four upstream sources, in rough order of how often you'll touch them: + +1. `schema_overlay.yaml` — per-key support level, pipelines, descriptions, prose documentation, + env-var overrides, aliases, smoke-test JSON, etc. +2. The Markdown template (`*.md.tmpl` next to or above the generated `.md`) — prose layout, section + headers, table columns, top-of-file matter. +3. The generators — code that turns overlay+schema into Rust and Markdown. Edit these when the + shape of generated output needs to change, not the data. + - `config-overlay-model/src/schema_gen.rs`, `saluki_keys.rs` — shared build utilities + - `config/build/classifier_gen.rs` — prod classifier generation + - `config-testsupport/build/registry_gen.rs`, `doc_gen.rs` — test annotations + doc generation +4. `core_schema.yaml` — only when vendoring an updated schema from upstream Datadog. The overlay + validator rejects keys not in the schema, so new keys must be added here first. + +`saluki_keys.rs` lists ADP-only keys that don't exist in the vendored schema. Treat it as an +extension of the overlay for those keys — same review rules apply. + +## Common task: add or change a key + +1. Find the key in `schema_overlay.yaml`. Section order is enforced (`supported`, `unsupported`, + optional `investigate`, `ignored`) and keys within a section are alphabetical. The build will + tell you if you violate this. +2. Make the edit. Required fields differ per section; the overlay-model `lib.rs` is the + authoritative reference. Common gotchas: + - `supported` requires non-empty `used_by` and `pipelines`; `description` ≤ 50 chars. + - `unsupported` with `planned: true` requires an `issue`. + - Multi-line `documentation` strings render as prose blocks below tables; single-line ones + render + inside tables. +3. Build: `cargo build -p datadog-agent-config-testsupport` exercises both `build.rs` files and + performs all overlay validation up front. Read the panic message — it names the rule and the + offending key. +4. Inspect the regenerated outputs (under `config-testsupport/.../config_registry/` and + `docs/agent-data-plane/configuration/`). Spot-check the diff; commit it alongside the overlay + change. + +## Common task: clippy / fmt / doc-lint failure in a generated file + +1. Confirm it's generated: look for the `@generated by build.rs` header. +2. Decide whether the fix belongs in the data (overlay) or the shape (generator/template): + - Wrong description, wrong pipelines, missing entry, wrong support level → overlay. + - Whitespace, table formatting, section ordering, comment headers, import lines, codegen + macros → + generator code in `config/build/` or `config-testsupport/build/`. + - Prose surrounding generated tables in a `.md` → the corresponding `.md.tmpl`. + +## Common task: bumping the vendored schema + +Replace `core_schema.yaml`. The build will fail listing schema keys out of alignment with the +overlay. Add each new key to the appropriate overlay section (`investigate` is the correct holding +pen when uncertain — never silently classify a key as `ignored` or `supported` without human +review). + +## Finding things + +Prefer search over hard-coded paths because pieces of this system rename more than usual: + +- Overlay file: `find lib -name schema_overlay.yaml` +- Prod generator: `ls lib/datadog-agent/config/build/` (classifier only) +- Test/doc generators: `ls lib/datadog-agent/config-testsupport/build/` +- Doc template: `find docs -name '*.md.tmpl'` +- Overlay model + shared build utilities: the `config-overlay-model` crate + (`schema_gen.rs`, `saluki_keys.rs` live here as public modules) +- Saluki-only keys: `config-overlay-model/src/saluki_keys.rs` + +## Self-healing + +If you hit any of the following, propose an edit to this `SKILL.md` before continuing: + +- A path here doesn't exist or has moved. +- You needed multiple `find`/`grep` calls to locate something this skill should point to directly. +- A recipe led you wrong. +- A new generator, template, or artifact exists but isn't mentioned. +- The cardinal rule has a new exception. + +Keep edits conceptual — exact paths churn, the data-flow shape is stable. diff --git a/.claude/skills/confkey/README.md b/.claude/skills/confkey/README.md index b3d89e4b6b8..10a4e781c2a 100644 --- a/.claude/skills/confkey/README.md +++ b/.claude/skills/confkey/README.md @@ -1,55 +1,39 @@ -# Config Skill +# confkey Skill -Tracks configuration key parity between the Datadog Agent and ADP's DogStatsD implementation. -Maintains two ledger files and a documentation page: - -- `docs/agent-data-plane/configuration/dogstatsd.md` — the doc -- `docs/agent-data-plane/configuration/dogstatsd/known-configs.json` — classified keys -- `docs/agent-data-plane/configuration/dogstatsd/known-configs-not-applicable.json` — dismissed keys +Workflows for analyzing individual configuration keys (ConfKeys) for parity between the Datadog +Agent and ADP's DogStatsD implementation. Classification state lives in `schema_overlay.yaml` — see +the `/config-management` skill for the full data model. Glossary: - **ConfKey** — a config key used by the Agent, ADP, or both. - **FeatureState** — implementation reality: `PARITY`, `MISSING`, `DIVERGENT`, `ADP_ONLY`, `NOT_APPLICABLE`, `UNKNOWN`. -- **Action** — what to do: `NONE`, `IMPLEMENT`, `DOCUMENT`, `DOCUMENTED`, `INVESTIGATE`. * * * ## Modes -### `audit-all` - -Full sweep. Discovers all ConfKeys in both codebases, classifies any unreviewed ones, re-analyzes -parity for non-final keys, and updates the doc. - -``` -/confkey audit-all -``` - -Runs a multi-step workflow with user gates at each phase. Expect sub-agents and several -AskUserQuestion prompts. Use when starting fresh or when the ledger may have drifted. - -* * * +### `audit [key ...]` -### `audit-one ` - -Analyzes a single ConfKey via a clean-room sub-agent, shows you the result, and proposes ledger and -doc updates. +Analyzes one or more ConfKeys via a clean-room sub-agent — static code analysis of how each key is +registered and used in both codebases. Shows you the result and proposes overlay updates (e.g. +moving a key from `ignored` to `investigate`, opening an issue). ``` -/confkey audit-one dogstatsd_port -/confkey audit-one dogstatsd_buffer_size -- check if ADP default matches the agent +/confkey audit dogstatsd_port +/confkey audit dogstatsd_buffer_size -- check if ADP default matches the agent ``` -If the key is already in the ledger, shows a side-by-side comparison so you can confirm or correct +If the key is already in the overlay, shows a side-by-side comparison so you can confirm or correct the existing classification. * * * ### `create-issue [key ...]` -Drafts and files GitHub issues for keys that need attention. With no arguments, scans the ledger for -keys where `action` is `IMPLEMENT`, `INVESTIGATE`, or `DOCUMENT` and no issue is linked yet. +Drafts and files GitHub issues for keys that need attention. With no arguments, scans the overlay +for keys in `unsupported` with `planned: true` and no issue yet, or keys in `investigate` with no +linked issue. ``` /confkey create-issue @@ -57,30 +41,8 @@ keys where `action` is `IMPLEMENT`, `INVESTIGATE`, or `DOCUMENT` and no issue is ``` Checks for duplicates, proposes groupings for related keys, iterates on drafts with you, offers to -file with `gh`, and updates the `issue` field in the ledger. - -* * * - -### `complete-issue ` - -For when you've implemented a fix and are ready to close out the ledger. Reads the issue and diffs -the branch against main to determine what actually changed, then proposes ledger and doc updates. - -``` -/confkey complete-issue 1234 -``` - -Optionally runs a fresh parity analysis to confirm the implementation matches expectations before -writing anything. +file with `gh`, and updates the `issue` field in the overlay. * * * -### `freeform ` - -Loads all mode and resource context, then executes whatever you ask. Use when you want to do -something that doesn't fit the other modes — ad-hoc queries, bulk edits, cross-mode workflows. -``` -/confkey freeform how many keys are still MISSING with no linked issue? -/confkey freeform reclassify dogstatsd_origin_detection as DIVERGENT and update the doc -``` diff --git a/.claude/skills/confkey/SKILL.md b/.claude/skills/confkey/SKILL.md index 56a35e4b820..3fccc60a283 100644 --- a/.claude/skills/confkey/SKILL.md +++ b/.claude/skills/confkey/SKILL.md @@ -1,91 +1,77 @@ --- name: confkey description: > - Audit configuration keys (ConfKeys) that are used in agent-data-plane and in the Datadog Agent - looking for differences that should be either documented or fixed. Maintains files at: - - docs/agent-data-plane/configuration/dogstatsd.md - - docs/agent-data-plane/configuration/dogstatsd/ - Available in multiple modes. See .claude/skills/confkey/README.md + Work on individual configuration keys (ConfKeys) used in agent-data-plane and in the Datadog + Agent — analyzing parity, drafting GitHub issues, and recording completion of open issues. Note, this skill is currently specialized for DogStatsD configuration, but may be more general in the future. argument-hint: > - [help|audit-all|audit-one|create-issue|complete-issue|freeform]
+ [help|audit|create-issue]
see .claude/skills/confkey/README.md disable-model-invocation: true allowed-tools: Read, Write, Edit, Grep, Glob, LS, Bash, Agent, Task, AskUserQuestion --- # /confkey +## Source of Truth + +The overlay file is the single source of truth for all ConfKey classification state. Read the +`/config-management` skill (`/Users/matt.briggs/repos/confra/.claude/skills/config-management/SKILL.md`) +before starting any work here. Locate the overlay with: + +```bash +find lib -name schema_overlay.yaml +``` + +The overlay partitions every key in `core_schema.yaml` into `supported`, `unsupported`, +`investigate`, or `ignored`. Classification, support levels, pipeline attribution, descriptions, and +prose documentation all live there. The generated `dogstatsd.md` documentation is output, not +source — edit the overlay, not the generated file. + ## Shared Setup: Path Resolution and Git Check -Resolve three repo paths. `{{saluki}}` is this repo's root. For `{{datadog-agent}}` and -`{{documentation}}`, check `{{saluki}}/../` then `~/dd/`. If not found, ask the user for -a custom path. If still unavailable, report which is missing and stop. +Resolve two repo paths. `{{saluki}}` is this repo's root. For `{{datadog-agent}}`, check +`{{saluki}}/../datadog-agent` then `~/dd/datadog-agent`. If not found, ask the user for a custom +path. If still unavailable, report it and stop. Show a table with: each repo's resolved path, HEAD commit (message + branch), and dirty status. Use AskUserQuestion to confirm before proceeding. -`{{config_docs}}` = `{{saluki}}/docs/agent-data-plane/configuration/dogstatsd` -- the directory that -holds the data files maintained by this skill. The documentation page lives one level up at -`{{saluki}}/docs/agent-data-plane/configuration/dogstatsd.md`. - ## Shared Definitions - **ADP** (Agent Data Plane): The `agent-data-plane` binary and its components. - **RefImpl** (Reference Implementation): The DogStatsD implementation in `datadog-agent`. - **AdpImpl** (ADP Implementation): The DogStatsD implementation in ADP. - **ConfKey** (Configuration Key): A configuration key used by ADP, the Agent, or both. - - The primary Agent index is `{{datadog-agent}}/pkg/config/common_settings.go`, but keys also - appear throughout `{{datadog-agent}}/comp/dogstatsd/` and elsewhere - - ADP has no central registry. DogStatsD keys live primarily in - `{{saluki}}/lib/saluki-components/src/sources/dogstatsd/mod.rs` (serde struct); broader ADP keys - are in `{{saluki}}/bin/agent-data-plane/src/config.rs` - -### FeatureState + - The primary Agent index is `{{datadog-agent}}/pkg/config/common_settings.go`; keys also + appear throughout `{{datadog-agent}}/comp/dogstatsd/` and elsewhere + - ADP keys are registered in `schema_overlay.yaml`; Rust implementation lives across + `lib/datadog-agent/config/` and `lib/saluki-components/` -Two orthogonal enums describe every ConfKey. +### Overlay Classification -**`FEATURE_STATE`** -- implementation reality, machine-derivable from code analysis: +Code analysis determines where a key belongs in the overlay. The four sections: -- **`PARITY`**: Both RefImpl and AdpImpl have it; behavior and effective defaults match. -- **`DIVERGENT`**: Both have it; behavior or defaults differ (intentionally or not). -- **`MISSING`**: RefImpl has it; AdpImpl does not. -- **`ADP_ONLY`**: AdpImpl has it; RefImpl does not. -- **`NOT_APPLICABLE`**: RefImpl has it but it is architecturally outside ADP's scope (e.g. - Go-GC-specific, handled by the core agent tagger or hostname resolver). -- **`UNKNOWN`**: Insufficient data to determine; needs investigation. +**`supported`** — ADP actively reads and uses this key. +- `support_level: full` — behavior matches the Agent (same semantics, same effective default). +- `support_level: partial` — both sides have it but behavior differs; use `documentation` to + describe the divergence for operators. -**`ACTION`** -- human decision about what to do; stable across re-runs until a human changes it: +**`unsupported`** — Key is relevant to ADP's domain but not implemented. +- `severity` (low/medium/high) — operational impact of the gap. +- `planned: true` + `issue` — implementation is committed and tracked. +- `planned: false` — no current plan to implement. -- **`NONE`**: Nothing to do; acceptable as-is. -- **`INVESTIGATE`**: Research needed before deciding. When investigation concludes, update to the - resulting action (`NONE`, `DOCUMENT`, or `IMPLEMENT`) and record the conclusion in `reason`. -- **`IMPLEMENT`**: Code work needed. Should have a GitHub issue. Completion is detected by the skill - on re-run (feature_state updates to PARITY). -- **`DOCUMENT`**: Documentation work needed. No code change required. -- **`DOCUMENTED`**: Terminal state for `DOCUMENT`. The documentation has been written. +**`investigate`** — Classification not yet determined. Use when there is insufficient evidence to +place the key in `supported`, `unsupported`, or `ignored`. Attach an `issue` when a research task +has been filed. -Common combinations: -- `PARITY` + `NONE` -- nominal case -- `ADP_ONLY` + `NONE` -- ADP extension, no parity needed -- `NOT_APPLICABLE` + `NONE` -- outside scope -- `DIVERGENT` + `DOCUMENT` -- intentional known difference -- `MISSING` + `IMPLEMENT` -- tracked gap -- `MISSING` or `UNKNOWN` + `INVESTIGATE` -- needs research +**`ignored`** — Key is outside ADP's domain entirely (e.g. Go-GC-specific, Windows-only, handled +by the core Agent tagger or hostname resolver). Requires a short reason string. Never classify a +key as `ignored` without explicit user confirmation. -### Persistent Ledgers - -Two files in `{{config_docs}}` track classification state across runs: - -**`known-configs.json`** -- full classification records for all DogStatsD-relevant keys. Schema is -defined in `./resources/known-configs.schema.json`. Each entry has `key`, `feature_state`, `action`, -`description`, `reason`, `issue`, and `adp_key`. A key present here is **known**. - -**`known-configs-not-applicable.json`** -- flat JSON array of key name strings for keys confirmed as -outside ADP's scope. Used to skip re-classifying already-dismissed keys on future runs. A key -present here is **not applicable** and should be excluded from all downstream analysis. - -A key present in neither file is **unreviewed** and needs classification. +**`saluki_keys.rs`** — ADP uses a key that has no counterpart in `core_schema.yaml`. These are +ADP-only extensions and live in `config-overlay-model/src/saluki_keys.rs`, not in the overlay. ## Mode Dispatch @@ -99,96 +85,12 @@ separate mode file — follow the **Freeform Mode** instructions below. | Argument | Mode file | Mode description | | --- | --- | --- | -| `audit-all` | `./modes/audit-all.md` | Deep analysis of both codebases casting a wide net for ConfKeys | -| `audit-one` | `./modes/audit-one.md` | Deep analysis of a single, given ConfKey | +| `audit` | `./modes/audit.md` | Analyze one or more ConfKeys against the RefImpl to determine correct overlay classification | | `create-issue` | `./modes/create-issue.md` | Help the user write the text of a GitHub issue for one or more ConfKeys | -| `complete-issue` | `./modes/complete-issue.md` | Help the user update the documentation when finishing work on an open issue | -| `freeform` | (see **Freeform Mode** below) | Bring full skill context online and execute user-directed work | - -## Freeform Mode - -`freeform` has no dedicated mode file. The goal is to bring the agent's full comprehension of the -ConfKey system online so the user can direct arbitrary work without being constrained to a -pre-defined workflow. - -**Context loading sequence — complete all reads before taking any action:** - -1. Read all mode files: `./modes/audit-all.md`, `./modes/audit-one.md`, `./modes/create-issue.md`, - `./modes/complete-issue.md` -2. Read all resource files: `./resources/analyze-features.md`, - `./resources/find-refimpl-configs.md`, `./resources/find-adpimpl-configs.md`, - `./resources/dogstatsd-doc-guide.md`, `./resources/issue-style.md`, - `./resources/known-configs.schema.json` -3. Read both ledger files in `{{config_docs}}`: - - `known-configs.json` (full contents) - - `known-configs-not-applicable.json` (full contents) -4. Read `{{saluki}}/docs/agent-data-plane/configuration/dogstatsd.md` - -With this context loaded, execute the user's request from `
`. Draw freely on any -combination of instructions from the mode files, spawn sub-agents as described, and apply the shared -utilities below. The user is directing the workflow — your job is to bring complete comprehension of -the ConfKey system to bear on whatever they are asking. - -## Shared Utilities - -### Error Row Check - -Before updating `{{saluki}}/docs/agent-data-plane/configuration/dogstatsd.md`, check each key's -`(feature_state, action)` pair against the mapping table in `./resources/dogstatsd-doc-guide.md`. If -any pair maps to an **Error** row, stop immediately — do not modify the doc. List the offending keys -and use AskUserQuestion to ask the user whether to reclassify them with your assistance or manually. -Proceed only when all Error rows are resolved. - -### Ledger Validation - -After writing to any ledger file, validate it by running this Python script with the actual path -substituted for `PATH`: - -```python -import json, sys - -VALID_STATES = {"PARITY", "DIVERGENT", "MISSING", "ADP_ONLY", "UNKNOWN"} -VALID_ACTIONS = {"NONE", "INVESTIGATE", "IMPLEMENT", "DOCUMENT", "DOCUMENTED"} - -with open("PATH") as f: - data = json.load(f) - -errors = [] -for i, entry in enumerate(data): - k = entry.get("key", f"entry[{i}]") - for field in ("key", "feature_state", "action", "description", "reason"): - if field not in entry: - errors.append(f"{k}: missing required field '{field}'") - if entry.get("feature_state") not in VALID_STATES: - errors.append(f"{k}: invalid feature_state '{entry.get('feature_state')}'") - if entry.get("action") not in VALID_ACTIONS: - errors.append(f"{k}: invalid action '{entry.get('action')}'") - if len(entry.get("description", "")) > 50: - errors.append(f"{k}: description too long ({len(entry['description'])} chars, max 50)") - issue = entry.get("issue") - if issue is not None and not (isinstance(issue, str) and issue.startswith("#") and issue[1:].isdigit()): - errors.append(f"{k}: invalid issue format '{issue}' (expected #NNN or null)") - -keys = [e["key"] for e in data] -if keys != sorted(keys): - errors.append("Array not sorted alphabetically by key") - -if errors: - for e in errors: - print(f"ERROR: {e}", file=sys.stderr) - sys.exit(1) - -print(f"OK: {len(data)} entries, all valid") -``` - -Run as: `python3 validate.py` after writing the script to a temp file, or inline via -`python3 -c "$(cat)"`. If the script exits non-zero, fix the reported errors before proceeding. The -not-applicable ledger (`known-configs-not-applicable.json`) only needs `json.load` + sort-order -checks, since it is a flat array of strings. ## Anti-Patterns -**Sub-agent contamination**: Never pass a key's existing ledger entry to a clean-room sub-agent. +**Sub-agent contamination**: Never pass a key's existing overlay entry to a clean-room sub-agent. Sub-agents running `analyze-features.md` must receive only the key name and repo paths. Passing prior classifications biases the result and defeats the clean-room purpose. @@ -196,15 +98,8 @@ prior classifications biases the result and defeats the clean-room purpose. exist to catch divergence between analysis output and user expectations — including cases where the analysis itself is wrong. -**Misrouting NOT_APPLICABLE**: Never write a `known-configs.json` entry with -`feature_state: NOT_APPLICABLE`. NOT_APPLICABLE keys live exclusively in -`known-configs-not-applicable.json`. The schema enforces this; a Ledger Validation run will catch -the mistake. - -**Proceeding past an Error row**: If the Error Row Check finds a violation, stop completely. Do not -partially update the doc and handle the rest later. The check must pass in full before any doc edits -are written. +**Editing generated files**: Never edit `dogstatsd.md` or the generated config registry files +directly. Fix classification in `schema_overlay.yaml` and rebuild. See `/config-management`. -**Re-analyzing final-state keys in a full audit**: In `audit-all`, keys in a final state are already -settled — re-analyzing them wastes sub-agent context. Skip them unless the user explicitly requests -otherwise. Final states: `PARITY + NONE`, `ADP_ONLY + NONE`, `action = DOCUMENTED`. +**Moving keys to `ignored` autonomously**: Never classify a key as `ignored` without explicit user +confirmation. Use `investigate` as the holding pen for uncertain keys. diff --git a/.claude/skills/confkey/modes/audit-all.md b/.claude/skills/confkey/modes/audit-all.md deleted file mode 100644 index ac498ea981f..00000000000 --- a/.claude/skills/confkey/modes/audit-all.md +++ /dev/null @@ -1,255 +0,0 @@ -# Mode: Full Audit - -End-to-end discovery, classification, and documentation update across all DogStatsD ConfKeys. Use -this when starting fresh or when the ledger may have drifted from the codebase. - -You may store temporary files in `{{tmp}}`=`{{saluki}}/target/.temp/dogstatsd-audit`. Delete {{tmp}} -if exists. Create {{tmp}}. - -## Step 1: Gather Background Knowledge - -Build enough understanding of both codebases to recognize config keys and trace their behavior. The -entry points below are good starting points, but the code evolves — follow references, search -broadly, and improvise as needed. - -Known RefImpl entry points: -- `{{documentation}}/content/en/extend/dogstatsd/_index.md` -- feature overview, metric types -- `{{datadog-agent}}/pkg/config/setup/common_settings.go` -- primary config key registry -- `{{datadog-agent}}/comp/dogstatsd/` -- DogStatsD runtime reads and server logic - -Known AdpImpl entry points: -- `{{saluki}}/bin/agent-data-plane/src/config.rs` -- top-level ADP config struct -- `{{saluki}}/bin/agent-data-plane/src/cli/run.rs` -- topology construction, config loading pipeline - -Gate: use AskUserQuestion to briefly summarize your understanding of the audit goal and the two -implementations, and ask the user to confirm or correct before proceeding. - -## Step 2: Discover - -**Collect ALL ConfKeys across the entire codebase, not just DogStatsD-related ones.** DogStatsD keys -can't always be identified by name alone -- filtering happens in a later phase. - -Create a sub-agent for each task. Store output in `{{tmp}}`. - -- Find all ConfKeys in {{datadog-agent}} by running `../resources/find-refimpl-configs.md` - -- Find all ConfKeys in {{saluki}} by running `../resources/find-adpimpl-configs.md` - -- AskUserQuestion - give the user the output filenames and ask the user if they look OK before - proceeding. - -Combine the files. For keys found in multiple locations, prefer the most authoritative source: - -- RefImpl: `common_settings.go` > `pkg/config/` > `cmd/agent/dist/datadog.yaml` > docs -- AdpImpl: config structs > call sites - -### Definition: ConfKey csv - -A ConfKey csv file looks like this: - -```csv -"dogstatsd_tag_cardinality","{{datadog-agent}}/pkg/config/setup/common_settings.go:536" -"system_probe_config.internal_profiling.enabled","{{datadog-agent}}/pkg/config/setup/system_probe.go:109" -``` - -### Building all-conf-keys.json - -Cross-reference the discovered keys against both ledger files. Write to -`{{tmp}}/all-conf-keys.json`. Schema: `../resources/all-conf-keys.schema.json`. - -- If the key is in `known-configs-not-applicable.json` -> **exclude** entirely. -- If the key is in `known-configs.json` -> include with `"Status": "known"`. -- If the key is in neither -> include with `"Status": "unreviewed"`. - -Each entry includes a `"Status"` field: `"known"` or `"unreviewed"`. - -```json -[ - { - "ConfKey": "histogram_aggregates", - "Status": "known", - "RefImpl": null, - "AdpImpl": "lib/saluki-components/src/transforms/aggregate/config.rs:79" - }, - { - "ConfKey": "dogstatsd_workers_count", - "Status": "known", - "RefImpl": "pkg/config/setup/common_settings.go:1596", - "AdpImpl": null - }, - { - "ConfKey": "some_new_key", - "Status": "unreviewed", - "RefImpl": "pkg/config/setup/common_settings.go:400", - "AdpImpl": null - } -] -``` - -## Step 3: Classify Unreviewed Keys - -If `all-conf-keys.json` contains no `"unreviewed"` keys, skip this section. - -The goal is to classify each unreviewed key as relevant or irrelevant to DogStatsD behavior. This -requires code analysis -- name prefixes alone are not sufficient. A key like `forwarder_num_workers` -has no `dogstatsd` prefix but directly affects how DogStatsD metrics are forwarded. - -### Phase 1: Batch Triage - -Filter `all-conf-keys.json` to only `"Status": "unreviewed"` entries. Split them into batches of -~30-50 keys. For each batch, create a sub-agent with the following instructions: - -> For each key in this batch, determine whether it could plausibly affect DogStatsD behavior. Read -> the code at the listed source location(s) and trace how the key is used. A key is relevant to -> DogStatsD if it influences any of: -> -> - Metric reception (listeners, ports, sockets, buffers, protocols) -> - Metric parsing or decoding (DogStatsD wire format, sample rates, timestamps) -> - Metric aggregation, enrichment, or tagging (context resolution, tag cardinality, host tags) -> - Metric forwarding or serialization (forwarder, endpoints, payloads, compression, retry) -> - Origin detection or container enrichment -> - General infrastructure that DogStatsD depends on (API keys, proxy, TLS, secrets, logging that -> would affect DogStatsD components) -> -> Respond with one CSV line per key: `"key_name","true/false","reasoning (20-70 chars)"` -> -> Where `true` means RELEVANT (it does or could affect DogStatsD), and `false` means NOT RELEVANT. -> -> When uncertain, err on the side of `true` (relevant). It is much worse to miss a relevant key than -> to include an irrelevant one. - -Give each sub-agent access to both `{{datadog-agent}}` and `{{saluki}}` so it can read usage sites. - -### Phase 2: Assemble and Review - -Collect all sub-agent CSV outputs and concatenate into `{{tmp}}/new-key-recommendations.csv`: - -```csv -"api_key","true","shared infra: DogStatsD forwarder needs this" -"security_agent.enabled","false","security agent only, no DogStatsD path" -"dogstatsd_port","true","directly configures DogStatsD listener" -"network_config.enable_http_monitoring","false","system probe network monitoring only" -``` - -Use AskUserQuestion: report how many keys were analyzed, how many recommended-relevant vs -recommended-irrelevant, and ask the user to review the file before proceeding. - -### Phase 3: Update Ledgers and all-conf-keys.json - -After the user approves (they may have edited the recommendations file): - -1. For each key recommended as **not applicable**: append the key string to - `{{config_docs}}/known-configs-not-applicable.json`, keeping the array sorted alphabetically. - -2. For each key recommended as **relevant**: append a new entry to - `{{config_docs}}/known-configs.json` with `feature_state: "UNKNOWN"` and `action: "INVESTIGATE"`. - Fill `description` and `reason` from the recommendation. Set `issue` and `adp_key` to `null`. - Keep the array sorted alphabetically by `key`. - -3. Update `{{tmp}}/all-conf-keys.json`: change newly classified keys from `"Status": "unreviewed"` - to `"known"`, and remove entries for keys added to `known-configs-not-applicable.json`. - -After this step, `all-conf-keys.json` should contain only `"Status": "known"` entries -- the -relevant keys that downstream phases will analyze. - -## Step 4: Analyze Feature Parity - -For each relevant key in `all-conf-keys.json`, analyze both codebases to determine FeatureState. - -**Final-state exclusion**: Before building batches, filter out keys that are already in a settled -state. These are skipped unless the user explicitly requests otherwise in `
`. A key is in a -final state if: -- `feature_state == PARITY` AND `action == NONE` — confirmed implemented, nothing pending -- `feature_state == ADP_ONLY` AND `action == NONE` — confirmed no parity needed -- `action == DOCUMENTED` — documentation work is complete - -Log how many keys are excluded vs. included so the user can see the analysis scope. - -### Phase 1: Dispatch Analysis Agents - -Split the non-final keys into batches of 10-15. For each batch, create a sub-agent using -`../resources/analyze-features.md`. Each sub-agent performs clean room analysis -- it independently -searches both codebases. Give it the batch of ConfKey names plus paths to `{{datadog-agent}}`, -`{{saluki}}` and an output path consisting of {{outdir}}/{{outfile}}. - -### Phase 2: Compile Results - -Collect JSON outputs into `{{tmp}}/feature-analysis.json` (single array of all analyzed features). -Schema: `../resources/feature-analysis.schema.json`. - -AskUserQuestion: report summary counts (Implemented, Missing, Divergent, ADP Only) and ask user to -review `feature-analysis.json` before updating documentation. - -### Phase 3: Update docs/agent-data-plane/configuration/dogstatsd.md - -Before making any edits, run the **Error Row Check** defined in `SKILL.md ## Shared Utilities` on -every key in `feature-analysis.json`. Do not produce or modify the doc until all Error rows are -resolved. - -Read the current file at `{{saluki}}/docs/agent-data-plane/configuration/dogstatsd.md`. Apply -analysis with these rules: - -**General preservation rule -- applies to Features table rows AND Discussion sections:** -- If existing content is semantically equivalent to the new analysis, keep the existing text - unchanged. Don't rewrite to match sub-agent wording. -- Only update if the analysis is substantively different (status changed, description wrong, etc.). -- Add new entries for keys/discussions not yet present. -- Never remove existing rows or discussion sections. - -**Features table:** -- Columns: `Config Key | Description | Status | Notes` -- Description and Notes: max 50 characters each. - -**Discussion section:** -- Sub-agents emit `### key_name` markdown for noteworthy features only. Apply the preservation rule - above. - -**Status Legend:** -- Only add UNSURE to the legend if a sub-agent actually used it in the results. - -**Other sections (intro, Action Items, etc.):** Do not modify. - -Update the `Last updated` date at the top. - -## Step 5: Audit Summary - -After updating the doc, compile and present a summary of changes made during this audit run: - -- **New keys classified**: count added to `known-configs.json` and - `known-configs-not-applicable.json` during Step 3 (were `"unreviewed"`, now classified) -- **Feature state changes**: keys whose `feature_state` changed during Step 4 analysis — list each - one with old → new values -- **Action changes**: keys whose `action` changed — list each one with old → new values -- **Newly resolved**: keys that moved to `PARITY + NONE` since last run (potential wins to - highlight) - -Use AskUserQuestion to present this summary and give the user a chance to review before continuing. - -## Step 6: Surface Outstanding Work - -Scan `{{config_docs}}/known-configs.json` for keys with unresolved action items. Present two tables: - -**Keys needing issues** (`action` is `IMPLEMENT`, `INVESTIGATE`, or `DOCUMENT` and `issue` is null): - -| Key | feature_state | action | description | -| --- | --- | --- | --- | - -**Keys with open issues** (`action` is `IMPLEMENT` or `INVESTIGATE` and `issue` is not null): - -| Key | feature_state | action | issue | -| --- | --- | --- | --- | - -If the "needs issues" table is non-empty, use AskUserQuestion to ask the user whether they want to -run `create-issue` mode for any of those keys. If yes, dispatch to `./modes/create-issue.md` with -the selected key names as `
`. - -## Completion Checklist - -Before reporting the audit as complete, verify every item: - -- [ ] No `"unreviewed"` entries remain in `{{tmp}}/all-conf-keys.json` -- [ ] `known-configs.json` passes Ledger Validation (SKILL.md `## Shared Utilities`) -- [ ] `known-configs-not-applicable.json` is valid JSON and sorted alphabetically -- [ ] `dogstatsd.md` `Last updated` date reflects today's date -- [ ] No Error row violations remain (all doc sections consistent with the mapping table) -- [ ] Audit summary presented to user and acknowledged (Step 5) diff --git a/.claude/skills/confkey/modes/audit-one.md b/.claude/skills/confkey/modes/audit-one.md deleted file mode 100644 index 833af721e5e..00000000000 --- a/.claude/skills/confkey/modes/audit-one.md +++ /dev/null @@ -1,108 +0,0 @@ -# Mode: Audit One - -Deep analysis of a single ConfKey. Use this to onboard a key that is missing from the ledger, or to -re-examine a key already in the ledger when the recorded classification is untrusted. - -## Step 1: Parse Input - -Extract the key name(s) from `
`. Often the key is the first token and the remaining text is -free-form context from the user — hints to guide the analysis (e.g. suspected behavior, code -pointers, adjustments to the instructions). Do not treat hints as ground truth. - -If no key name is identifiable in `
`, ask the user which key to analyze before proceeding. - -## Step 2: Check Ledger Status - -Look up the key in both ledger files in `{{config_docs}}`: - -- Found in `known-configs-not-applicable.json` → **Dismissed.** Tell the user the key is already - marked not-applicable. Ask whether to proceed with a fresh analysis anyway. If not, stop. -- Found in `known-configs.json` → **Known.** Note the current entry but do not let it influence the - analysis in Step 3. The goal is a clean-room result to compare against. -- Found in neither → **New.** No prior classification exists. - -## Step 3: Clean-Room Analysis - -Run `../resources/analyze-features.md` as a sub-agent, passing it: -- The key name as a single-element batch -- `{{datadog-agent}}`, `{{saluki}}` -- A temp output path under `{{saluki}}/target/.temp/dogstatsd-audit/` - -Do not pass the existing ledger entry to the sub-agent. Use hints from `
` to direct where -to look, but let the sub-agent form its own conclusions from the code. - -The sub-agent returns a result using its own status terms. Map them to `FEATURE_STATE` as follows: - -| Sub-agent status | FEATURE_STATE | -| --- | --- | -| `Implemented` | `PARITY` | -| `Divergent` | `DIVERGENT` | -| `Missing` | `MISSING` | -| `ADP Only` | `ADP_ONLY` | -| `Unsure` | `UNKNOWN` | - -After mapping, consider whether `NOT_APPLICABLE` is more appropriate than the mapped value. This -applies when the key is architecturally outside ADP's scope (e.g. Go-GC-specific, Windows-only, -handled upstream by the core agent tagger or hostname resolver). `analyze-features.md` cannot make -this determination — it is a judgment call based on the analysis narrative. - -From the result, determine: -- **`FEATURE_STATE`** (mapped above, adjusted for NOT_APPLICABLE if warranted) -- **`ACTION`**: one of `NONE`, `INVESTIGATE`, `IMPLEMENT`, `DOCUMENT`, `DOCUMENTED` — as defined in - SKILL.md -- **description** and **reason** from the sub-agent's Description and Discussion fields - -## Step 4: Present Results and Reconcile - -### New key - -Present the analysis: key name, `FEATURE_STATE`, `ACTION`, description, reason, and any relevant -code locations. - -If `FEATURE_STATE` is `NOT_APPLICABLE`, propose adding the key to -`known-configs-not-applicable.json` instead of `known-configs.json`. Ask the user to confirm. - -Otherwise propose a new entry for `known-configs.json`. Ask the user to confirm or adjust any fields -before writing. - -### Known key (clean-room re-check) - -Show the proposed new classification alongside the current ledger entry as a side-by-side -comparison. Highlight every field that differs. - -If there are no differences, tell the user and stop (unless they want to continue). - -If there are differences, propose the specific updates and ask the user to accept, modify, or reject -them. - -### Dismissed key (re-examined by user request) - -If the analysis confirms it is not applicable, recommend leaving it in -`known-configs-not-applicable.json`. If the analysis finds it is relevant after all, propose -removing it from `known-configs-not-applicable.json` and adding it to `known-configs.json`. Ask the -user to confirm. - -## Step 5: Update Ledger - -Apply the confirmed changes: - -- New or updated entry in `known-configs.json`: keep array sorted alphabetically by `key`. -- New not-applicable entry in `known-configs-not-applicable.json`: keep array sorted alphabetically. -- If moving from not-applicable to known: remove from `known-configs-not-applicable.json` and add to - `known-configs.json`. - -## Step 6: Offer Doc Update - -Ask the user whether to update `{{saluki}}/docs/agent-data-plane/configuration/dogstatsd.md` for -this key. - -If yes: - -1. Run the **Error Row Check** defined in `SKILL.md ## Shared Utilities` on the proposed - `(feature_state, action)` pair. If it returns an Error, stop and report it. -2. Read the current doc. Find the existing row for this key in the Features table, if any. -3. Update or add the row. Preserve existing wording if the new analysis is semantically equivalent; - only rewrite if the classification changed or the description is wrong. -4. If the analysis produced noteworthy detail, update or add a `### key_name` discussion section. - Never remove an existing discussion section. -5. Update the `Last updated` date at the top. diff --git a/.claude/skills/confkey/modes/audit.md b/.claude/skills/confkey/modes/audit.md new file mode 100644 index 00000000000..32f36b961a3 --- /dev/null +++ b/.claude/skills/confkey/modes/audit.md @@ -0,0 +1,86 @@ +# Mode: Audit + +Deep analysis of one or more ConfKeys against the RefImpl codebase. Use this to examine a key that +is missing from the overlay, to re-examine a key whose classification is untrusted, or to surface +work items (e.g. move a key from `ignored` to `investigate` and open an issue). + +## Step 1: Parse Input + +Extract the key name(s) from `
`. Often the key is the first token and the remaining text is +free-form context from the user — hints to guide the analysis (e.g. suspected behavior, code +pointers, adjustments to the instructions). Do not treat hints as ground truth. + +If no key name is identifiable in `
`, ask the user which key(s) to analyze before +proceeding. Multiple keys are processed independently and results are presented together at Step 4. + +## Step 2: Check Overlay Status + +Read `schema_overlay.yaml` (locate with `find lib -name schema_overlay.yaml`). Find the key: + +- Found in `ignored` → **Dismissed.** Tell the user the key is in `ignored`. Ask whether to proceed + with a fresh analysis anyway. If not, stop. +- Found in `investigate`, `supported`, or `unsupported` → **Known.** Note the current entry but do + not let it influence the analysis in Step 3. The goal is a clean-room result to compare against. +- Found in neither → **New.** No prior classification exists; it may also be absent from + `core_schema.yaml` entirely (ADP-only key). + +## Step 3: Clean-Room Analysis + +Run `../resources/analyze-features.md` as a sub-agent, passing it: +- The key name as a single-element batch +- `{{datadog-agent}}`, `{{saluki}}` +- A temp output path under `{{saluki}}/target/.temp/dogstatsd-audit/` + +Do not pass the existing overlay entry to the sub-agent. Use hints from `
` to direct where +to look, but let the sub-agent form its own conclusions from the code. + +The sub-agent returns a `ProposedSection` for each key plus section-specific fields (`SupportLevel`, +`Severity`, `Description`, `Discussion`). These map directly to overlay sections — no translation +needed. Treat the sub-agent's `ProposedSection` as a proposal, not a final decision: + +- `ignored` always requires explicit user confirmation before writing. +- `saluki_keys.rs` means the key has no Agent counterpart; flag it to the user before touching + `saluki_keys.rs`. +- `investigate` is appropriate when the sub-agent could not determine scope or implementation + status; confirm with the user before accepting. + +Refer to `config-overlay-model/src/lib.rs` for required fields per section. + +## Step 4: Present Results and Reconcile + +### New key + +Present the analysis: key name, `ProposedSection`, proposed fields, and relevant code locations. +Propose the specific overlay entry (or `saluki_keys.rs` addition if applicable). Ask the user to +confirm or adjust any fields before writing. + +### Known key (clean-room re-check) + +Show the proposed overlay entry alongside the current one as a side-by-side comparison. Highlight +every field that differs. If there are no differences, tell the user and stop (unless they want to +continue). Otherwise ask the user to accept, modify, or reject the proposed changes. + +### Dismissed key (re-examined by user request) + +If the analysis confirms out-of-scope, recommend leaving it in `ignored`. If the analysis finds it +is relevant after all, propose moving it to `investigate` as the default holding pen. Ask the user +to confirm. + +## Step 5: Update Overlay + +Apply the confirmed changes to `schema_overlay.yaml`. Follow `/config-management` rules: + +- Section order: `supported`, `unsupported`, optional `investigate`, `ignored` +- Keys within each section are alphabetical +- Required fields differ per section; `config-overlay-model/src/lib.rs` is authoritative + +Build to verify: `cargo build -p datadog-agent-config-testsupport`. Read any panic message — it +names the violated rule and the offending key. + +## Step 6: Inspect Generated Output + +After a successful build, spot-check the regenerated outputs: +- Config registry annotations (`config-testsupport/.../config_registry/`) +- Documentation (`docs/agent-data-plane/configuration/`) + +Confirm the diff looks correct. Flag anything unexpected to the user. diff --git a/.claude/skills/confkey/modes/complete-issue.md b/.claude/skills/confkey/modes/complete-issue.md deleted file mode 100644 index 510d096beba..00000000000 --- a/.claude/skills/confkey/modes/complete-issue.md +++ /dev/null @@ -1,90 +0,0 @@ -# Mode: Complete Issue - -A developer has been working on a GitHub issue and is preparing to open or amend a PR. This mode -helps them update the ledger and documentation to reflect the work done. - -## Step 1: Parse Input - -Extract the issue number from `
`. If no issue number is present, ask for it before -proceeding. The remaining text is optional context. - -## Step 2: Read the Issue - -Fetch the issue body: - -```bash -gh issue view --repo DataDog/saluki -``` - -Treat the issue body as informative background — it describes the original intent but may not -reflect decisions made during implementation. Do not use it as the source of truth for what changed. - -## Step 3: Read the Diff - -Diff the current branch against main to see what was actually implemented: - -```bash -git diff main -``` - -This is the source of truth. Use it together with the issue body to understand: -- Which ConfKeys were touched -- What behavior was added, changed, or deliberately left out -- Any decisions that diverged from the original issue description - -## Step 4: Identify Affected ConfKeys - -Find which ledger entries relate to this work: - -- Check `known-configs.json` for entries whose `issue` field references this issue number -- Cross-reference key names and code paths mentioned in the issue body and diff -- If the diff touches files that implement config behavior not yet in the ledger, note those too - -## Step 5: Offer Implementation Audit - -Ask the developer whether they want to audit their work against RefImpl using -`../resources/analyze-features.md` for each affected key. - -- If **yes**: run the sub-agent for each affected key (or as a batch), using the same clean-room - approach as `audit-one`. Use the results to inform the proposed classifications in Step 6. -- If **no**: proceed to Step 6 using the diff and issue body alone to determine proposed state. - -## Step 6: Propose Ledger and Doc Updates - -Before generating the proposed workup, run the **Error Row Check** defined in -`SKILL.md ## Shared Utilities` on each proposed `(feature_state, action)` pair. Resolve any Error -rows before presenting the review to the user. This avoids wasting a review session on changes that -cannot be written. - -Based on the diff, issue body, and any audit results, determine the correct final state for each -affected key. Do not assume `PARITY` + `NONE` — the resolution may be any valid combination: - -- `PARITY` + `NONE` — fully implemented as specified -- `DIVERGENT` + `DOCUMENT` — intentional difference, needs documenting -- `NOT_APPLICABLE` + `NONE` — determined during implementation to be out of scope -- `MISSING` + `IMPLEMENT` — partially addressed; remaining work still tracked -- Any other valid `(FEATURE_STATE, ACTION)` pair from the definitions in SKILL.md - -Present all affected keys at once in a single workup. For each key show: -- Current ledger entry (before) -- Proposed ledger entry (after): updated `feature_state`, `action`, `reason`, and any other changed - fields -- Proposed doc change: updated Features table row and any Discussion section additions or edits - -Ask the developer to review, confirm, or correct any of the proposed values before writing. Enter an -interactive back-and-forth until they are satisfied. - -## Step 7: Apply Confirmed Changes - -Write all confirmed changes: - -- Update entries in `{{config_docs}}/known-configs.json`. Keep array sorted alphabetically by `key`. -- Retain the `issue` field after work is complete. It preserves the historical link back to the - GitHub issue that drove the change. Do not clear it to `null`. -- If any key is reclassified as not-applicable: move it from `known-configs.json` to - `known-configs-not-applicable.json`. Keep both arrays sorted alphabetically. -- Update `{{saluki}}/docs/agent-data-plane/configuration/dogstatsd.md`: - - Update or add Features table rows. Preserve existing wording when semantically equivalent. - - Update or add `### key_name` discussion sections where the analysis produced noteworthy detail. - Do not remove an existing discussion section without asking. - - Update the `Last updated` date at the top. diff --git a/.claude/skills/confkey/modes/create-issue.md b/.claude/skills/confkey/modes/create-issue.md index 8f59ff05f8f..cfeb0e467b7 100644 --- a/.claude/skills/confkey/modes/create-issue.md +++ b/.claude/skills/confkey/modes/create-issue.md @@ -8,9 +8,10 @@ and label conventions from `../resources/issue-style.md`. Extract key names from `
`. Two cases: - **Keys provided**: proceed with those keys. -- **No keys provided**: scan `{{config_docs}}/known-configs.json` for keys that need issues — - entries where `action` is `IMPLEMENT`, `INVESTIGATE`, or `DOCUMENT` and the `issue` field is null - or empty. Present the list to the user and ask which keys they want to work on. +- **No keys provided**: read `schema_overlay.yaml` (locate with `find lib -name schema_overlay.yaml`) + and scan for keys that need issues — entries in `unsupported` with `planned: true` and no `issue` + field, or entries in `investigate` with no linked issue. Present the list to the user and ask + which keys they want to work on. ## Step 2: Duplicate Search @@ -20,9 +21,9 @@ For each key, search for pre-existing open issues to avoid duplicates: gh issue list --repo DataDog/saluki --state open --search "" ``` -Also search by likely title keywords derived from the key name and ledger description. Report any +Also search by likely title keywords derived from the key name and overlay description. Report any potential duplicates to the user before proceeding. If a clear duplicate exists, ask whether to link -the existing issue to the ledger instead of drafting a new one (skip to Step 6). +the existing issue in the overlay instead of drafting a new one (skip to Step 6). ## Step 3: Propose Grouping @@ -41,8 +42,8 @@ For each draft include: - **Body**: problem statement, what needs to happen, relevant code permalinks - **Labels**: selected from the label reference in `../resources/issue-style.md` -Draw on the ledger entry (`description`, `reason`, `feature_state`, `action`) and any code locations -found during prior analysis. If the ledger entry lacks enough detail to write a good issue body, +Draw on the overlay entry (section, fields, description, documentation prose) and any code locations +found during prior analysis. If the overlay entry lacks enough detail to write a good issue body, flag it and ask the user to fill in the gaps. When working with multiple issues, draft all of them before moving to review. @@ -58,13 +59,13 @@ For each approved draft, show the final `gh` command using the template from `../resources/issue-style.md`. Offer to run it. If the user approves, run the command and capture the returned issue URL. -## Step 7: Update Ledger +## Step 7: Update Overlay -After each issue is filed, extract the issue number from the URL and update the `issue` field in the -corresponding `known-configs.json` entries. Keep the array sorted alphabetically by `key`. +After each issue is filed, extract the issue number from the URL and add an `issue` field to the +corresponding entry in `schema_overlay.yaml`. ```bash ISSUE_NUM=$(echo "$ISSUE_URL" | grep -o '[0-9]*$') ``` -Record the issue as `#NNN` in the `issue` field. +Build to verify: `cargo build -p datadog-agent-config-testsupport`. diff --git a/.claude/skills/confkey/resources/all-conf-keys.schema.json b/.claude/skills/confkey/resources/all-conf-keys.schema.json deleted file mode 100644 index 148ceef23e7..00000000000 --- a/.claude/skills/confkey/resources/all-conf-keys.schema.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "$schema": "https://json-schema.org/draft/2020-12/schema", - "$id": "all-conf-keys.schema.json", - "title": "All Config Keys", - "description": "Cross-reference of all discovered config keys with their classification status and source locations. Written to {{tmp}}/all-conf-keys.json during the Discover phase. Keys confirmed as not-applicable are excluded; keys in known-configs.json are Status=known; everything else is Status=unreviewed.", - "type": "array", - "uniqueItems": true, - "items": { - "type": "object", - "required": ["ConfKey", "Status", "RefImpl", "AdpImpl"], - "additionalProperties": false, - "properties": { - "ConfKey": { - "type": "string", - "description": "Exact config key name." - }, - "Status": { - "type": "string", - "enum": ["known", "unreviewed"], - "description": "known = already in known-configs.json; unreviewed = needs classification." - }, - "RefImpl": { - "type": ["string", "null"], - "description": "Source location in datadog-agent, e.g. 'pkg/config/setup/common_settings.go:1596'. Null if key exists only in AdpImpl." - }, - "AdpImpl": { - "type": ["string", "null"], - "description": "Source location in Saluki, e.g. 'lib/saluki-components/src/transforms/aggregate/config.rs:79'. Null if key exists only in RefImpl." - } - } - } -} diff --git a/.claude/skills/confkey/resources/analyze-features.md b/.claude/skills/confkey/resources/analyze-features.md index 252eaff8561..278078f254f 100644 --- a/.claude/skills/confkey/resources/analyze-features.md +++ b/.claude/skills/confkey/resources/analyze-features.md @@ -1,7 +1,8 @@ # Analyze Features -Substep of `/confkey`. You receive a batch of config keys and perform clean room analysis of each one -for DogStatsD feature parity between RefImpl (datadog-agent) and AdpImpl (agent-data-plane/Saluki). +Substep of `/confkey`. You receive a batch of config keys and perform clean-room analysis of each +one for DogStatsD feature parity between RefImpl (datadog-agent) and AdpImpl (agent-data-plane / +Saluki). Search BOTH codebases for every key regardless of what the supervising agent tells you. @@ -14,43 +15,108 @@ Search BOTH codebases for every key regardless of what the supervising agent tel ## Per-Key Analysis -### Where to search +### Tracing a key in RefImpl (`{{datadog-agent}}`) + +**Registration** — DogStatsD keys are in the `dogstatsd()` function in +`pkg/config/setup/common_settings.go`; other subsystem keys are in sibling files. Registration +forms (first string arg is the key): + +```go +config.BindEnvAndSetDefault("key_name", defaultValue) +config.SetDefault("key_name", defaultValue) +config.BindEnv("key_name") +config.ParseEnvSplitComma("key_name") +config.ParseEnvSplitSpace("key_name") +config.ParseEnvJSON("key_name", []interface{}{}) +config.ParseEnvAsStringSlice("key_name", ...) +config.ParseEnvAsMapStringInterface("key_name", ...) +``` + +Check `pkg/config/model/types.go` (`Setup` interface) for the authoritative method list. + +**Read sites** — search `comp/dogstatsd/` and beyond. Accessor methods: + +```go +.GetString .GetBool .GetInt .GetInt32 .GetInt64 +.GetFloat64 .GetFloat64Slice .GetDuration .GetStringSlice +.GetStringMap .GetStringMapString .GetStringMapStringSlice +``` + +**YAML** — `cmd/agent/dist/datadog.yaml` is the example config (large, mostly commented). +Nested keys flatten to dot-separated: `proxy.http`. Commented-out entries still count. -Search broadly in both codebases. The structure evolves — improvise and follow the evidence wherever -it leads. Common patterns that have worked in the past: +### Tracing a key in AdpImpl (`{{saluki}}`) -**RefImpl** (`{{datadog-agent}}`): look for registration calls (`BindEnvAndSetDefault`, -`SetDefault`, `BindEnv`) and runtime reads (`GetString`, `GetBool`, `GetInt`, etc.). Config -registration tends to live under `pkg/config/` and runtime reads under `comp/dogstatsd/`, but do not -limit yourself to these directories. +Config values come from `datadog.yaml` / `DD_`-prefixed env vars, stored in `GenericConfiguration` +(`lib/saluki-config/src/lib.rs`). Env vars split on `__` (double underscore) to produce nested +keys: `DD_FOO__BAR=baz` → `{ "foo": { "bar": "baz" } }`. -**AdpImpl** (`{{saluki}}`): look for serde rename annotations (`#[serde(rename = "key")]`), typed -config reads (`get_typed`, `try_get_typed`, `get_typed_or_default`), and bare struct field names on -Deserialize types. These patterns shift as the codebase matures. +There are two lookup patterns — check both: -Do a deep code analysis on how the configuration setting affects both systems. +**Pattern A: serde Deserialize structs.** A struct derives `Deserialize` and is loaded as a whole +via `config.as_typed::()`. The key is the `rename` string, or the Rust field name if there is no +`rename`: -### Determine Status +```rust +#[derive(Deserialize)] +pub struct DogStatsDConfiguration { + #[serde(rename = "dogstatsd_port", default = "default_port")] + port: u16, // key: "dogstatsd_port" -- **Implemented**: Exists in both, affected behavior functionally equivalent. -- **Missing**: Exists in RefImpl but not AdpImpl. -- **Divergent**: Exists in both, behavior differs meaningfully. -- **ADP Only**: Exists in AdpImpl but not RefImpl. + pub api_key: String, // key: "api_key" (no rename → field name is the key) -Commit to a status. If you truly cannot determine equivalence with confidence after thorough -analysis, use **Unsure** -- but this should be rare. + #[serde(flatten)] + origin: OriginEnrichmentConfiguration, // inline sub-struct — must follow and search it too +} +``` + +Search all `.rs` files under `lib/` and `bin/agent-data-plane/` for `serde(rename`. Also check +`Deserialize` structs for fields WITHOUT `rename`. Follow all `#[serde(flatten)]` attributes +recursively. + +**Pattern B: manual key queries.** Some components call accessor methods directly: + +```rust +config.get_typed("api_key")? +config.try_get_typed("data_plane.enabled")?.unwrap_or(false) +config.get_typed_or_default("log_level") +config.watch_for_updates("key", ...) +``` + +Dotted keys reflect YAML nesting (`data_plane.otlp.enabled` → `data_plane: otlp: enabled:`). + +Search all `.rs` files for each accessor method name followed by `("`. Check `lib/saluki-config/src/lib.rs` +for any accessor methods not listed above. + +### Determine Proposed Overlay Section + +Map your findings to the overlay section the key should land in: + +- **`supported`** — ADP reads and uses the key. + - `support_level: full` when behavior matches the Agent (same semantics, same effective default). + - `support_level: partial` when behavior differs; capture the divergence in `Discussion`. +- **`unsupported`** — Key is relevant to ADP's domain but not implemented. Propose a `severity` + (low/medium/high) based on operational impact. +- **`investigate`** — Evidence is insufficient to classify confidently. Use when you cannot + determine whether the key is implemented, or when you are unsure if it is in scope. Prefer this + over `unsupported` when you cannot rule out that ADP silently handles it some other way. +- **`ignored`** — Key is architecturally outside ADP's scope (Go-GC-specific, Windows-only, + handled by the core Agent tagger, etc.). The supervising agent will confirm with the user before + writing `ignored`. +- **`saluki_keys.rs`** — ADP uses this key but it has no counterpart in `core_schema.yaml` + (ADP-only extension). Flag this in `Discussion`; the key does not go in the overlay. + +Commit to a section. Only use `investigate` when you genuinely cannot determine scope or +implementation status after thorough analysis. ### Write Outputs **Description** (required, max 50 chars): Terse summary of what the key controls. Examples: `UDP listen port`, `Tag cardinality for origin`, `Max cached DSD contexts` -**Notes** (optional, max 50 chars): Only for Divergent or surprising cases. Blank otherwise. -Examples: `ADP default differs: 256 vs 128`, `ADP ignores when standalone` - -**Discussion** (optional, null for most keys): Only for noteworthy features -- divergent behavior, -surprising omissions, subtle semantic differences. Include code snippets from both sides and explain -user-visible impact. Keep focused. +**Discussion** (optional, null for most keys): Only for keys requiring `support_level: partial`, +`investigate`, or `saluki_keys.rs` placement, or for surprising omissions. Include code snippets +from both sides and explain user-visible impact. Keep focused. ## Output Format @@ -60,21 +126,33 @@ JSON array, one object per key: [ { "ConfKey": "dogstatsd_port", - "Status": "Implemented", + "ProposedSection": "supported", + "SupportLevel": "full", + "Severity": null, "Description": "UDP listen port", - "Notes": "", "Discussion": null }, { "ConfKey": "dogstatsd_buffer_size", - "Status": "Divergent", + "ProposedSection": "supported", + "SupportLevel": "partial", + "Severity": null, "Description": "Receive buffer size (bytes)", - "Notes": "ADP default 8192 vs Agent 4096", - "Discussion": "### dogstatsd_buffer_size\n\nIn the Agent...\n```go\n// code\n```\n\nIn ADP...\n```rust\n// code\n```\n\nThe difference is..." + "Discussion": "ADP default 8192, Agent default 4096. Both read the same key; the difference is..." + }, + { + "ConfKey": "some_missing_key", + "ProposedSection": "unsupported", + "SupportLevel": null, + "Severity": "medium", + "Description": "Controls X behaviour", + "Discussion": null } ] ``` +- `ProposedSection`: one of `supported`, `unsupported`, `investigate`, `ignored`, `saluki_keys.rs` +- `SupportLevel`: `full` or `partial` when `ProposedSection` is `supported`; `null` otherwise +- `Severity`: `low`, `medium`, or `high` when `ProposedSection` is `unsupported`; `null` otherwise - `Description`: non-empty, max 50 chars -- `Notes`: max 50 chars, empty string if not needed -- `Discussion`: `null` or markdown string starting with `### key_name` +- `Discussion`: `null` or a prose string; required for `partial`, `investigate`, and `saluki_keys.rs` diff --git a/.claude/skills/confkey/resources/dogstatsd-doc-guide.md b/.claude/skills/confkey/resources/dogstatsd-doc-guide.md deleted file mode 100644 index 6e631a25131..00000000000 --- a/.claude/skills/confkey/resources/dogstatsd-doc-guide.md +++ /dev/null @@ -1,157 +0,0 @@ -# DogStatsD Doc Guide - -This file describes the structure and maintenance rules for -`docs/agent-data-plane/configuration/dogstatsd.md`. Read it before making any edits. - -## Document Purpose - -Customer-facing. Audience: operators who have enabled ADP and want to know whether their DogStatsD -configuration will work or why something is behaving unexpectedly. Limit team tracking to GitHub -issue numbers — no priorities, project status, or internal discussion. - -## Section Structure - -Each section follows this pattern: - -1. A short introductory sentence or two explaining what the section covers. -2. A table for quick scanning. -3. Optional `### \`key_name\`` sub-sections for keys that need prose explanation. - -Add a sub-section only when a one-liner is insufficient — for example, when the behavior difference -has a non-obvious cause, when the customer needs to take a specific action, or when the divergence -involves a unit or semantic change. - -## Section Anchors - -Each section is preceded by an HTML comment anchor that gives the skill an unambiguous location -target. - -| Anchor | Section | -| --- | --- | -| `` | Unsupported Settings -- being worked on | -| `` | Unsupported Settings -- not planned | -| `` | Behavioral Differences | -| `` | Compatibility Unknown | -| `` | ADP-Only Settings | -| `` | Implemented Settings | - -## Common Columns - -These apply to every table unless a schema below says otherwise: -- **Config Key**: backtick-quoted key name -- **Description**: from `known-configs.json` `description` field, max 50 chars - -## Table Schemas - -### Unsupported Settings -- being worked on - -Filter: `feature_state=MISSING`, `action=IMPLEMENT`, open GitHub issue. - -| Config Key | Description | Issue | -| --- | --- | --- | - -- **Issue**: reference-style link, e.g. `[#1331]` - -### Unsupported Settings -- not planned - -Filter: `feature_state=MISSING` or `NOT_APPLICABLE`, `action=NONE`. List only keys a customer might -plausibly expect to work. - -| Config Key | Description | Reason | -| --- | --- | --- | - -- **Reason**: one short customer-facing phrase, e.g. "Windows only", "Go runtime specific", "handled - by core agent" - -### Behavioral Differences - -Filter: `feature_state=DIVERGENT`, `action=DOCUMENT` or `DOCUMENTED`; also `action=INVESTIGATE` -where divergence is confirmed. - -| Config Key | Description | Agent Behavior | ADP Behavior | -| --- | --- | --- | --- | - -- **Agent Behavior** / **ADP Behavior**: one short phrase each. If ADP uses a different key name, - note it in the sub-section, not this column. - -### Compatibility Unknown - -Filter: `feature_state=UNKNOWN` and `action=INVESTIGATE`, or `MISSING`/`DIVERGENT` with -`action=INVESTIGATE` where behavior is unconfirmed. - -| Config Key | Description | -| --- | --- | - -### ADP-Only Settings - -Filter: `feature_state=ADP_ONLY`. - -| Config Key | Description | Default | -| --- | --- | --- | - -- **Default**: the default value, if known and useful - -### Implemented Settings - -Filter: `feature_state=PARITY`. - -| Config Key | Description | -| --- | --- | - -## Mapping: known-configs.json -> Doc Section - -| feature_state | action | Section anchor | -| --- | --- | --- | -| ADP_ONLY | DOCUMENT | section:adp-only | -| ADP_ONLY | DOCUMENTED | section:adp-only | -| ADP_ONLY | IMPLEMENT | section:adp-only | -| ADP_ONLY | INVESTIGATE | section:adp-only | -| ADP_ONLY | NONE | section:adp-only | -| DIVERGENT | DOCUMENT | section:behavioral-differences | -| DIVERGENT | DOCUMENTED | section:behavioral-differences | -| DIVERGENT | IMPLEMENT | section:behavioral-differences | -| DIVERGENT | INVESTIGATE | section:compatibility-unknown | -| DIVERGENT | NONE | section:behavioral-differences | -| MISSING | DOCUMENT | Error: reclassify as DIVERGENT, NOT_APPLICABLE, or ADP_ONLY | -| MISSING | DOCUMENTED | Error: reclassify as DIVERGENT, NOT_APPLICABLE, or ADP_ONLY | -| MISSING | IMPLEMENT | section:unsupported-in-progress | -| MISSING | INVESTIGATE | section:compatibility-unknown | -| MISSING | NONE | section:unsupported-not-planned | -| NOT_APPLICABLE | DOCUMENT | section:behavioral-differences | -| NOT_APPLICABLE | DOCUMENTED | section:behavioral-differences | -| NOT_APPLICABLE | IMPLEMENT | section:unsupported-in-progress | -| NOT_APPLICABLE | INVESTIGATE | section:compatibility-unknown | -| NOT_APPLICABLE | NONE | section:unsupported-not-planned | -| PARITY | DOCUMENT | section:reference | -| PARITY | DOCUMENTED | section:reference | -| PARITY | IMPLEMENT | section:reference | -| PARITY | INVESTIGATE | section:reference | -| PARITY | NONE | section:reference | -| UNKNOWN | DOCUMENT | section:compatibility-unknown | -| UNKNOWN | DOCUMENTED | section:compatibility-unknown | -| UNKNOWN | IMPLEMENT | section:compatibility-unknown | -| UNKNOWN | INVESTIGATE | section:compatibility-unknown | -| UNKNOWN | NONE | section:compatibility-unknown | - -## Link Block - -Define all GitHub issue URLs as Markdown reference links at the very bottom of the doc, after all -content. Use reference-style links everywhere in the document body. - -```markdown -[#1331]: https://github.com/DataDog/saluki/issues/1331 -[#1332]: https://github.com/DataDog/saluki/issues/1332 -``` - -Keep the block sorted numerically by issue number. - -## Preservation Rules - -1. **Table rows** are data. Add rows for new keys, update them when `feature_state` or `action` - changes, remove rows only when a key is removed from `known-configs.json`. -2. **Sub-section prose** is human-authored narrative. Preserve it unless the key's `feature_state` - or `action` changed in a way that makes it factually wrong. Do not rewrite to match sub-agent - wording. -3. **Section intros and headings** are human-authored. Never modify them. -4. **Issue links** should reflect the current open/closed state. A closed issue may warrant moving a - key from "being worked on" to "Implemented", but confirm via `gh issue view` first. diff --git a/.claude/skills/confkey/resources/feature-analysis.schema.json b/.claude/skills/confkey/resources/feature-analysis.schema.json deleted file mode 100644 index 0d50af6c288..00000000000 --- a/.claude/skills/confkey/resources/feature-analysis.schema.json +++ /dev/null @@ -1,39 +0,0 @@ -{ - "$schema": "https://json-schema.org/draft/2020-12/schema", - "$id": "feature-analysis.schema.json", - "title": "Feature Analysis", - "description": "Compiled analysis of DogStatsD feature parity per config key, produced by analyze-features sub-agents and written to {{tmp}}/feature-analysis.json. Each entry is the result of independent clean-room code analysis of both RefImpl and AdpImpl.", - "type": "array", - "uniqueItems": true, - "items": { - "type": "object", - "required": ["ConfKey", "Status", "Description", "Notes", "Discussion"], - "additionalProperties": false, - "properties": { - "ConfKey": { - "type": "string", - "description": "Exact config key name." - }, - "Status": { - "type": "string", - "enum": ["Implemented", "Missing", "Divergent", "ADP Only", "Unsure"], - "description": "Parity verdict from code analysis. 'Unsure' is a last resort when code evidence is genuinely ambiguous." - }, - "Description": { - "type": "string", - "minLength": 1, - "maxLength": 50, - "description": "Terse description of what the key controls. Used verbatim in documentation tables." - }, - "Notes": { - "type": "string", - "maxLength": 50, - "description": "Short annotation for Divergent or surprising cases. Empty string if not needed." - }, - "Discussion": { - "type": ["string", "null"], - "description": "Markdown prose for noteworthy features only. Must start with '### key_name'. Null for most keys." - } - } - } -} diff --git a/.claude/skills/confkey/resources/find-adpimpl-configs.md b/.claude/skills/confkey/resources/find-adpimpl-configs.md deleted file mode 100644 index b46ea1bf94d..00000000000 --- a/.claude/skills/confkey/resources/find-adpimpl-configs.md +++ /dev/null @@ -1,116 +0,0 @@ -# Find AdpImpl Configs - -This is a substep of the `/confkey` skill. Your job is to discover the configuration keys (ConfKeys) -that are used by agent-data-plane and its components at runtime. - -## Input - -- `{{saluki}}` = the path to the root of the Saluki codebase repository -- `{{tmp}}` = your output directory - -## System Overview - -Configuration values originate from `datadog.yaml` and/or `DD_`-prefixed env vars, stored in a map -structure accessed via `GenericConfiguration` (defined in `lib/saluki-config`). - -Environment variable names are split on `__` (double underscore) to create nested objects. For -example, `DD_FOO__BAR=baz` becomes `{ "foo": { "bar": "baz" } }`. This is why some components use -manual `try_get_typed("dotted.key")` calls instead of serde structs -- it avoids requiring users to -type awkward env var names like `DD_DATA_PLANE__OTLP__ENABLED`. - -## Step 1: Discover the Config API Surface - -Read `GenericConfiguration` in `lib/saluki-config/src/lib.rs` and build a complete list of every -public method that takes a config key string argument (e.g. `get_typed`, `try_get_typed`, -`get_typed_or_default`, `as_typed`, `watch_for_updates`). - -Also search for wrapper functions that delegate to `GenericConfiguration` -- these may be the actual -call sites in component code. - -## Step 2: Search for Configuration Keys - -There are two families of patterns. You must search for both. - -### Pattern A: Serde rename on Deserialize structs - -Config structs derive `Deserialize` and use `#[serde(rename = "...")]` to map fields to config key -names. The struct is loaded as a whole via `config.as_typed::()`. - -```rust -#[derive(Deserialize)] -pub struct DogStatsDConfiguration { - #[serde(rename = "dogstatsd_port", default = "default_port")] - port: u16, - - #[serde(rename = "dogstatsd_buffer_size", default = "default_buffer_size")] - buffer_size: usize, - - // flatten embeds another struct's keys into this one - #[serde(flatten)] - origin_enrichment: OriginEnrichmentConfiguration, -} -``` - -**The config key is the string inside `rename = "..."`.** - -If a field has NO `rename` attribute, the Rust field name itself is the key. For example -`pub api_key: String` without a rename means the key is `api_key`. - -**Important:** `#[serde(flatten)]` means a sub-struct's fields are inlined. You must follow these to -find all keys -- they won't appear in the outer struct. - -**Search:** Grep all `.rs` files under `lib/` and `bin/agent-data-plane/` for `serde(rename`. For -each match, extract the string literal as the ConfKey and record file:line. Also check `Deserialize` -structs for fields WITHOUT `rename` -- the Rust field name is the key in those cases. - -### Pattern B: Manual key queries - -Some config structs don't derive `Deserialize`. Instead, their `from_configuration()` method calls -accessor functions on `GenericConfiguration` with string literal key names. - -```rust -// Examples using the methods known at time of writing: -config.get_typed("api_key")? -config.try_get_typed("data_plane.enabled")?.unwrap_or(false) -config.get_typed_or_default("log_level") -``` - -**The config key is the string literal passed to the function.** - -Dotted keys like `data_plane.otlp.enabled` represent YAML nesting: -```yaml -data_plane: - otlp: - enabled: true -``` - -**Search:** Using the full method list you discovered in Step 1, grep all `.rs` files under `lib/` -and `bin/agent-data-plane/` for each method name followed by `("`. For each match, extract the -string literal as the ConfKey and record file:line as the location. - -## Step 3: Validate Completeness - -- Grep for any remaining string literals passed to `GenericConfiguration` methods not already - captured. -- Spot-check 2-3 component `mod.rs` or `config.rs` files for patterns you haven't accounted for. -- If you find a new pattern, search for it comprehensively. - -### What NOT to include - -- Test files (`#[cfg(test)]` modules, files in `tests/` directories) -- Keys that appear only in comments or doc strings -- Internal framework keys that are not user-facing configuration - -## Output - -Write to `{{tmp}}/adpimpl-config-keys.csv`. Each line is a quoted ConfKey and its file:line -location, relative to `{{saluki}}`: - -```csv -"dogstatsd_buffer_size","lib/saluki-components/src/sources/dogstatsd/mod.rs:157" -"dogstatsd_port","lib/saluki-components/src/sources/dogstatsd/mod.rs:175" -"data_plane.enabled","bin/agent-data-plane/src/config.rs:35" -``` - -If the same ConfKey appears in multiple locations, include the most authoritative one -- prefer the -declaration site (serde rename or struct definition) over a secondary read site. diff --git a/.claude/skills/confkey/resources/find-refimpl-configs.md b/.claude/skills/confkey/resources/find-refimpl-configs.md deleted file mode 100644 index f1b889c32ab..00000000000 --- a/.claude/skills/confkey/resources/find-refimpl-configs.md +++ /dev/null @@ -1,133 +0,0 @@ -# Find RefImpl Configs - -This is a substep of the `/confkey` skill. Your job is to discover all configuration keys (ConfKeys) -registered in the datadog-agent Go codebase and in the example datadog.yaml file. - -## Input - -- `{{datadog-agent}}` = the path to the root of the datadog-agent repository -- `{{tmp}}` = your output directory - -## System Overview - -The Datadog Agent uses Viper (via a custom wrapper) for configuration. Keys are registered in Go -source code with default values and env var bindings, and can also appear in the example -`datadog.yaml` configuration file. - -## Step 1: Discover the Config API Surface - -Read `pkg/config/model/types.go` and build a complete list of every method on the `Setup` interface -(registration) and `Reader` interface (accessors). Do not rely solely on the examples in Steps 2-3 --- methods may have been added or renamed. Search for all of them. - -Also check for wrapper functions that delegate to these interfaces (e.g. -`pkg/config/setup/config_accessor.go`). - -## Step 2: Search for Config Key Registration - -The primary config registry is `pkg/config/setup/common_settings.go`. Other files in -`pkg/config/setup/` register keys for specific subsystems (APM, system probe, etc.). - -Search all `.go` files under `pkg/config/` for calls to each `Setup` method from Step 1. The first -string argument is the ConfKey. - -Known registration patterns: - -```go -// Most common (~95% of keys): -config.BindEnvAndSetDefault("dogstatsd_port", 8125) - -// Default without env binding: -config.SetDefault("key_name", defaultValue) - -// Env binding without default: -config.BindEnv("dogstatsd_mapper_profiles") - -// Custom env parsing (key is still the first argument): -config.ParseEnvAsSlice("key_name", func(in string) []interface{} { ... }) -config.ParseEnvAsStringSlice("key_name", func(string) []string { ... }) -config.ParseEnvAsMapStringInterface("key_name", func(string) map[string]interface{} { ... }) -``` - -For each match, extract the first string literal as the ConfKey and record file:line as the -location. - -## Step 3: Search for Config Key Reads - -Some keys may only appear at read sites, not at registration sites. Using the `Reader` interface -methods you discovered in Step 1, search `comp/dogstatsd/` and `pkg/config/setup/` for accessor -calls. - -As of this writing, the known accessor patterns are: - -```go -.GetString("key") -.GetBool("key") -.GetInt("key") -.GetFloat64("key") -.GetDuration("key") -.GetStringSlice("key") -.GetStringMap("key") -.GetStringMapString("key") -``` - -Only include keys from read sites that were NOT already found at registration sites. - -## Step 4: Validate Completeness - -- Verify these known keys appear in your output with correct locations: `dogstatsd_port`, - `dogstatsd_buffer_size`, `use_dogstatsd`, `dogstatsd_socket`, `statsd_metric_namespace`. -- Skim `common_settings.go` for registration patterns you may have missed (loops, helpers, unusual - call patterns). -- If you find a new pattern, search for it comprehensively. - -## Source 2: Example YAML File - -The file `cmd/agent/dist/datadog.yaml` is a ~1600-line example config with most sections commented -out. It uses standard YAML nesting. - -Parse this file to extract all config key paths. Use dot-separated flattening to match the format -used in Go code: - -```yaml -# In the YAML: -proxy: - http: http://example.com - https: https://example.com - -# Becomes these ConfKeys: -# proxy.http -# proxy.https -``` - -Note: commented-out keys (lines starting with `#`) should still be included -- this is an example -file where most settings are intentionally commented out. - -### What NOT to include - -- Test files -- Keys that appear only in comments describing other keys -- Internal/framework keys not meant for user configuration - -## Output - -Write TWO files: - -### `{{tmp}}/refimpl-go-config-keys.csv` - -Keys discovered from Go source code: - -```csv -"dogstatsd_port","pkg/config/setup/common_settings.go:1524" -"dogstatsd_buffer_size","pkg/config/setup/common_settings.go:1526" -"use_dogstatsd","pkg/config/setup/common_settings.go:1523" -``` - -### `{{tmp}}/refimpl-yaml-config-keys.csv` - -Keys discovered from the example YAML file: - -```csv -"api_key","cmd/agent/dist/datadog.yaml:15" -"proxy.http","cmd/agent/dist/datadog.yaml:42" -``` diff --git a/.claude/skills/confkey/resources/known-configs-not-applicable.schema.json b/.claude/skills/confkey/resources/known-configs-not-applicable.schema.json deleted file mode 100644 index 645bedc34ad..00000000000 --- a/.claude/skills/confkey/resources/known-configs-not-applicable.schema.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "$schema": "https://json-schema.org/draft/2020-12/schema", - "$id": "known-configs-not-applicable.schema.json", - "title": "Known Configs -- Not Applicable", - "description": "Keys confirmed as outside ADP's scope for DogStatsD parity. Used by the dogstatsd-audit skill to skip re-classifying already-dismissed keys on future discovery runs.", - "type": "array", - "uniqueItems": true, - "items": { - "type": "string", - "description": "Exact config key name as it appears in the datadog-agent codebase." - } -} diff --git a/.claude/skills/confkey/resources/known-configs.schema.json b/.claude/skills/confkey/resources/known-configs.schema.json deleted file mode 100644 index fdc6675d29d..00000000000 --- a/.claude/skills/confkey/resources/known-configs.schema.json +++ /dev/null @@ -1,53 +0,0 @@ -{ - "$schema": "https://json-schema.org/draft/2020-12/schema", - "$id": "known-configs.schema.json", - "title": "Known Configs", - "description": "Persistent ledger of classified DogStatsD configuration keys. NOT_APPLICABLE keys live in known-configs-not-applicable.json instead.", - "type": "array", - "uniqueItems": true, - "items": { - "type": "object", - "required": ["key", "feature_state", "action", "description", "reason"], - "additionalProperties": false, - "properties": { - "key": { - "type": "string", - "description": "Exact config key name as it appears in the datadog-agent codebase." - }, - "feature_state": { - "type": "string", - "enum": [ - "PARITY", - "DIVERGENT", - "MISSING", - "ADP_ONLY", - "UNKNOWN" - ], - "description": "Implementation reality, machine-derivable from code analysis. NOT_APPLICABLE keys are stored in known-configs-not-applicable.json instead of this file — hence its exclusion from this enum." - }, - "action": { - "type": "string", - "enum": ["NONE", "INVESTIGATE", "IMPLEMENT", "DOCUMENT", "DOCUMENTED"], - "description": "Human decision about what to do with this key. DOCUMENTED is the terminal state for DOCUMENT -- it means the documentation has been written." - }, - "description": { - "type": "string", - "maxLength": 50, - "description": "Short description of what the key does, used verbatim in documentation tables." - }, - "reason": { - "type": "string", - "description": "Internal justification for the classification. Not customer-facing." - }, - "issue": { - "type": ["string", "null"], - "pattern": "^#[0-9]+$", - "description": "GitHub issue reference (e.g. \"#1330\") tracking this work, if one exists." - }, - "adp_key": { - "type": ["string", "null"], - "description": "The ADP-side config key name, when it differs from the agent-side key." - } - } - } -} diff --git a/.gitlab/test.yml b/.gitlab/test.yml index 982e2bb5ee3..85d058717fc 100644 --- a/.gitlab/test.yml +++ b/.gitlab/test.yml @@ -3,6 +3,7 @@ unit-tests-linux-amd64: stage: test script: - make test + - git diff --exit-code && test -z "$(git status --porcelain)" || (echo "Working tree is dirty after build+test. Generated files may be stale — rebuild locally and commit."; git status --short; exit 1) property-tests-linux-amd64: extends: .linux-amd64-test-job-heavy diff --git a/.vale/styles/config/vocabularies/technical/accept.txt b/.vale/styles/config/vocabularies/technical/accept.txt index ee497d33f85..2e9b997ed5d 100644 --- a/.vale/styles/config/vocabularies/technical/accept.txt +++ b/.vale/styles/config/vocabularies/technical/accept.txt @@ -231,3 +231,4 @@ mpmc dhat profiler launchd +testsupport diff --git a/AGENTS.md b/AGENTS.md index 56505e73519..d3c30cea939 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -21,6 +21,7 @@ of software projects, in addition to making them harder to maintain and debug ov - `bin/agent-data-plane`: the primary artifact of this project. A binary that runs alongside the DataDog Agent. +- `lib/datadog-agent/`: Core Agent configuration and IPC communication protocols. - `bin/correctness`: the framework for integration tests. - `lib/`: the production frameworks and common code supporting `agent-data-plane` - `docs/`: Human-oriented documentation. @@ -32,6 +33,8 @@ of software projects, in addition to making them harder to maintain and debug ov not for production use and supporting it need not be a blocker during feature development. - We have customized our use of `cargo fmt` and `clippy`. The `Makefile` is authoritative. - Our Rust code wraps at 120 characters. +- Datadog configuration inventory is managed by `lib/datadog-agent/config/schema/*.yaml` and code is + generated from there. See `.claude/skills/config-management/SKILL.md` for details. ## Building and Testing diff --git a/Cargo.lock b/Cargo.lock index a62c16f5968..92874bcdc61 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -30,6 +30,8 @@ dependencies = [ "colored", "comfy-table", "datadog-agent-commons", + "datadog-agent-config", + "datadog-agent-config-testsupport", "datadog-protos", "derive-where", "foldhash 0.2.0", @@ -1099,6 +1101,40 @@ dependencies = [ "windows-registry", ] +[[package]] +name = "datadog-agent-config" +version = "0.1.0" +dependencies = [ + "datadog-agent-config-overlay-model", + "indexmap", + "serde_json", +] + +[[package]] +name = "datadog-agent-config-overlay-model" +version = "0.1.0" +dependencies = [ + "indexmap", + "serde", + "serde_yaml", + "tempfile", +] + +[[package]] +name = "datadog-agent-config-testsupport" +version = "0.1.0" +dependencies = [ + "datadog-agent-config", + "datadog-agent-config-overlay-model", + "figment", + "indexmap", + "saluki-config", + "serde", + "serde_json", + "serde_yaml", + "tinytemplate", +] + [[package]] name = "datadog-intake" version = "0.1.0" @@ -4215,6 +4251,7 @@ dependencies = [ "bytes", "bytesize", "chrono", + "datadog-agent-config-testsupport", "datadog-protos", "ddsketch", "derive-where", diff --git a/Cargo.toml b/Cargo.toml index d14b68fc623..54f358a2817 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -6,7 +6,10 @@ members = [ "bin/correctness/millstone", "bin/correctness/panoramic", "bin/correctness/stele", - "lib/datadog-agent-commons", + "lib/datadog-agent/commons", + "lib/datadog-agent/config", + "lib/datadog-agent/config-overlay-model", + "lib/datadog-agent/config-testsupport", "lib/ddsketch", "lib/ottl", "lib/process-memory", @@ -39,7 +42,10 @@ license = "Apache-2.0" repository = "https://github.com/DataDog/saluki" [workspace.dependencies] -datadog-agent-commons = { path = "lib/datadog-agent-commons" } +datadog-agent-commons = { path = "lib/datadog-agent/commons" } +datadog-agent-config = { path = "lib/datadog-agent/config" } +datadog-agent-config-overlay-model = { path = "lib/datadog-agent/config-overlay-model" } +datadog-agent-config-testsupport = { path = "lib/datadog-agent/config-testsupport" } datadog-protos = { path = "lib/protos/datadog" } containerd-protos = { path = "lib/protos/containerd" } ddsketch = { path = "lib/ddsketch" } @@ -79,6 +85,7 @@ serde = { version = "1", default-features = false, features = [ "std", ] } snafu = { version = "0.9", default-features = false, features = ["std"] } +tinytemplate = { version = "1", default-features = false } tokio = { version = "1.52.2", default-features = false } tracing = { version = "0.1", default-features = false, features = ["std"] } async-compression = { version = "0.4.42", default-features = false, features = [ diff --git a/LICENSE-3rdparty.csv b/LICENSE-3rdparty.csv index cadb9d092ca..78a1df2b776 100644 --- a/LICENSE-3rdparty.csv +++ b/LICENSE-3rdparty.csv @@ -7,24 +7,17 @@ allocator-api2,https://github.com/zakarumych/allocator-api2,MIT OR Apache-2.0,Za android_system_properties,https://github.com/nical/android_system_properties,MIT OR Apache-2.0,Nicolas Silva anes,https://github.com/zrzka/anes-rs,MIT OR Apache-2.0,Robert Vojta anstyle,https://github.com/rust-cli/anstyle,MIT OR Apache-2.0,The anstyle Authors -antithesis-instrumentation,https://github.com/antithesishq/antithesis-instrumentation-rust,MIT,The antithesis-instrumentation Authors antithesis_sdk,https://github.com/antithesishq/antithesis-sdk-rust,MIT,The antithesis_sdk Authors anyhow,https://github.com/dtolnay/anyhow,MIT OR Apache-2.0,David Tolnay arc-swap,https://github.com/vorner/arc-swap,MIT OR Apache-2.0,Michal 'vorner' Vaner argh,https://github.com/google/argh,BSD-3-Clause,"Taylor Cramer , Benjamin Brittain , Erick Tryzelaar " -argh_derive,https://github.com/google/argh,BSD-3-Clause,"Taylor Cramer , Benjamin Brittain , Erick Tryzelaar " -argh_shared,https://github.com/google/argh,BSD-3-Clause,"Taylor Cramer , Benjamin Brittain , Erick Tryzelaar " arrayvec,https://github.com/bluss/arrayvec,MIT OR Apache-2.0,bluss asn1-rs,https://github.com/rusticata/asn1-rs,MIT OR Apache-2.0,Pierre Chifflier -asn1-rs-derive,https://github.com/rusticata/asn1-rs,MIT OR Apache-2.0,Pierre Chifflier -asn1-rs-impl,https://github.com/rusticata/asn1-rs,MIT OR Apache-2.0,Pierre Chifflier async-compression,https://github.com/Nullus157/async-compression,MIT OR Apache-2.0,"Wim Looman , Allen Bui " async-stream,https://github.com/tokio-rs/async-stream,MIT,Carl Lerche -async-stream-impl,https://github.com/tokio-rs/async-stream,MIT,Carl Lerche async-trait,https://github.com/dtolnay/async-trait,MIT OR Apache-2.0,David Tolnay atomic,https://github.com/Amanieu/atomic-rs,Apache-2.0 OR MIT,Amanieu d'Antras atomic-waker,https://github.com/smol-rs/atomic-waker,Apache-2.0 OR MIT,"Stjepan Glavina , Contributors to futures-rs" -aws-lc-fips-sys,https://github.com/aws/aws-lc-rs,ISC AND (Apache-2.0 OR ISC) AND OpenSSL,AWS-LC aws-lc-rs,https://github.com/aws/aws-lc-rs,ISC AND (Apache-2.0 OR ISC),AWS-LibCrypto aws-lc-sys,https://github.com/aws/aws-lc-rs,ISC AND (Apache-2.0 OR ISC) AND Apache-2.0 AND MIT AND BSD-3-Clause AND (Apache-2.0 OR ISC OR MIT) AND (Apache-2.0 OR ISC OR MIT-0),AWS-LC axum,https://github.com/tokio-rs/axum,MIT,The axum Authors @@ -38,7 +31,6 @@ bitflags,https://github.com/bitflags/bitflags,MIT OR Apache-2.0,The Rust Project bitmask-enum,https://github.com/Lukas3674/rust-bitmask-enum,MIT OR Apache-2.0,Lukas3674 block-buffer,https://github.com/RustCrypto/utils,MIT OR Apache-2.0,RustCrypto Developers bollard,https://github.com/fussybeaver/bollard,Apache-2.0,Bollard contributors -bollard-stubs,https://github.com/fussybeaver/bollard,Apache-2.0,Bollard contributors bs58,https://github.com/Nullus157/bs58-rs,MIT OR Apache-2.0,The bs58 Authors bumpalo,https://github.com/fitzgen/bumpalo,MIT OR Apache-2.0,Nick Fitzgerald byte-unit,https://github.com/magiclen/byte-unit,MIT,Magic Len @@ -48,16 +40,12 @@ bytes,https://github.com/tokio-rs/bytes,MIT,"Carl Lerche , Se bytesize,https://github.com/bytesize-rs/bytesize,Apache-2.0,"Hyunsik Choi , MrCroxx , Rob Ede " cast,https://github.com/japaric/cast.rs,MIT OR Apache-2.0,Jorge Aparicio cc,https://github.com/rust-lang/cc-rs,MIT OR Apache-2.0,Alex Crichton -cexpr,https://github.com/jethrogb/rust-cexpr,Apache-2.0 OR MIT,Jethro Beekman cfg-if,https://github.com/rust-lang/cfg-if,MIT OR Apache-2.0,Alex Crichton chacha20,https://github.com/RustCrypto/stream-ciphers,MIT OR Apache-2.0,RustCrypto Developers chrono,https://github.com/chronotope/chrono,MIT OR Apache-2.0,The chrono Authors chrono-tz,https://github.com/chronotope/chrono-tz,MIT OR Apache-2.0,The chrono-tz Authors chumsky,https://codeberg.org/zesterer/chumsky,MIT,"Joshua Barretto , Elijah Hartvigsen " ciborium,https://github.com/enarx/ciborium,Apache-2.0,Nathaniel McCallum -ciborium-io,https://github.com/enarx/ciborium,Apache-2.0,Nathaniel McCallum -ciborium-ll,https://github.com/enarx/ciborium,Apache-2.0,Nathaniel McCallum -clang-sys,https://github.com/KyleMayes/clang-sys,Apache-2.0,Kyle Mayes clap,https://github.com/clap-rs/clap,MIT OR Apache-2.0,The clap Authors clap_builder,https://github.com/clap-rs/clap,MIT OR Apache-2.0,The clap_builder Authors clap_derive,https://github.com/clap-rs/clap,MIT OR Apache-2.0,The clap_derive Authors @@ -65,12 +53,9 @@ clap_lex,https://github.com/clap-rs/clap,MIT OR Apache-2.0,The clap_lex Authors colored,https://github.com/mackwic/colored,MPL-2.0,Thomas Wickham combine,https://github.com/Marwes/combine,MIT,Markus Westerlind comfy-table,https://github.com/nukesor/comfy-table,MIT,Arne Beer -compression-codecs,https://github.com/Nullus157/async-compression,MIT OR Apache-2.0,"Wim Looman , Allen Bui " -compression-core,https://github.com/Nullus157/async-compression,MIT OR Apache-2.0,"Wim Looman , Allen Bui " const-fnv1a-hash,https://github.com/HindrikStegenga/const-fnv1a-hash,MIT,The const-fnv1a-hash Authors const-hex,https://github.com/danipopes/const-hex,MIT OR Apache-2.0,DaniPopes <57450786+DaniPopes@users.noreply.github.com> core-foundation,https://github.com/servo/core-foundation-rs,MIT OR Apache-2.0,The Servo Project Developers -core-foundation-sys,https://github.com/servo/core-foundation-rs,MIT OR Apache-2.0,The Servo Project Developers cpufeatures,https://github.com/RustCrypto/utils,MIT OR Apache-2.0,RustCrypto Developers crc32fast,https://github.com/srijs/rust-crc32fast,MIT OR Apache-2.0,"Sam Rijs , Alex Crichton " criterion-plot,https://github.com/criterion-rs/criterion.rs,Apache-2.0 OR MIT,"Jorge Aparicio , Brook Heisler " @@ -85,14 +70,11 @@ crossterm_winapi,https://github.com/crossterm-rs/crossterm-winapi,MIT,T. Post crunchy,https://github.com/eira-fransham/crunchy,MIT,Eira Fransham crypto-common,https://github.com/RustCrypto/traits,MIT OR Apache-2.0,RustCrypto Developers darling,https://github.com/TedDriggs/darling,MIT,Ted Driggs -darling_core,https://github.com/TedDriggs/darling,MIT,Ted Driggs -darling_macro,https://github.com/TedDriggs/darling,MIT,Ted Driggs data-encoding,https://github.com/ia0/data-encoding,MIT,Julien Cretin der-parser,https://github.com/rusticata/der-parser,MIT OR Apache-2.0,Pierre Chifflier deranged,https://github.com/jhpratt/deranged,MIT OR Apache-2.0,Jacob Pratt derive-ex,https://github.com/frozenlib/derive-ex,MIT OR Apache-2.0,frozenlib derive_more,https://github.com/JelteF/derive_more,MIT,Jelte Fennema -derive_more-impl,https://github.com/JelteF/derive_more,MIT,Jelte Fennema digest,https://github.com/RustCrypto/traits,MIT OR Apache-2.0,RustCrypto Developers displaydoc,https://github.com/yaahc/displaydoc,MIT OR Apache-2.0,Jane Lusby document-features,https://github.com/slint-ui/document-features,MIT OR Apache-2.0,Slint Developers @@ -115,7 +97,6 @@ flate2,https://github.com/rust-lang/flate2-rs,MIT OR Apache-2.0,"Alex Crichton < float-cmp,https://github.com/mikedilger/float-cmp,MIT,Mike Dilger fnv,https://github.com/servo/rust-fnv,Apache-2.0 OR MIT,Alex Crichton foldhash,https://github.com/orlp/foldhash,Zlib,Orson Peters -form_urlencoded,https://github.com/servo/rust-url,MIT OR Apache-2.0,The rust-url developers fs4,https://github.com/al8n/fs4-rs,MIT OR Apache-2.0,"Dan Burkert , Al Liu " futures,https://github.com/rust-lang/futures-rs,MIT OR Apache-2.0,The futures Authors futures-channel,https://github.com/rust-lang/futures-rs,MIT OR Apache-2.0,The futures-channel Authors @@ -126,7 +107,6 @@ futures-macro,https://github.com/rust-lang/futures-rs,MIT OR Apache-2.0,The futu futures-sink,https://github.com/rust-lang/futures-rs,MIT OR Apache-2.0,The futures-sink Authors futures-task,https://github.com/rust-lang/futures-rs,MIT OR Apache-2.0,The futures-task Authors futures-util,https://github.com/rust-lang/futures-rs,MIT OR Apache-2.0,The futures-util Authors -generator,https://github.com/Xudong-Huang/generator-rs,MIT OR Apache-2.0,Xudong Huang generic-array,https://github.com/fizyk20/generic-array,MIT,"Bartłomiej Kamiński , Aaron Trent " getrandom,https://github.com/rust-random/getrandom,MIT OR Apache-2.0,The Rand Project Developers gimli,https://github.com/gimli-rs/gimli,MIT OR Apache-2.0,The gimli Authors @@ -137,7 +117,6 @@ hash32,https://github.com/japaric/hash32,MIT OR Apache-2.0,Jorge Aparicio hashbrown,https://github.com/rust-lang/hashbrown,MIT OR Apache-2.0,The hashbrown Authors headers,https://github.com/hyperium/headers,MIT,Sean McArthur -headers-core,https://github.com/hyperium/headers,MIT,Sean McArthur heapless,https://github.com/rust-embedded/heapless,MIT OR Apache-2.0,"Jorge Aparicio , Per Lindgren , Emil Fresk " heck,https://github.com/withoutboats/heck,MIT OR Apache-2.0,The heck Authors hex,https://github.com/KokaKiwi/rust-hex,MIT OR Apache-2.0,KokaKiwi @@ -147,7 +126,6 @@ hickory-resolver,https://github.com/hickory-dns/hickory-dns,MIT OR Apache-2.0,Th home,https://github.com/rust-lang/cargo,MIT OR Apache-2.0,Brian Anderson http,https://github.com/hyperium/http,MIT OR Apache-2.0,"Alex Crichton , Carl Lerche , Sean McArthur " http-body,https://github.com/hyperium/http-body,MIT,"Carl Lerche , Lucio Franco , Sean McArthur " -http-body-util,https://github.com/hyperium/http-body,MIT,"Carl Lerche , Lucio Franco , Sean McArthur " http-serde-ext,https://github.com/andrewtoth/http-serde-ext,MIT,Andrew Toth httparse,https://github.com/seanmonstar/httparse,MIT OR Apache-2.0,Sean McArthur httpdate,https://github.com/pyfisch/httpdate,MIT OR Apache-2.0,Pyfisch @@ -171,7 +149,6 @@ icu_provider,https://github.com/unicode-org/icu4x,Unicode-3.0,The ICU4X Project id-arena,https://github.com/fitzgen/id-arena,MIT OR Apache-2.0,"Nick Fitzgerald , Aleksey Kladov " iddqd,https://github.com/oxidecomputer/iddqd,MIT OR Apache-2.0,The iddqd Authors ident_case,https://github.com/TedDriggs/ident_case,MIT OR Apache-2.0,Ted Driggs -idna,https://github.com/servo/rust-url,MIT OR Apache-2.0,The rust-url developers idna_adapter,https://github.com/hsivonen/idna_adapter,Apache-2.0 OR MIT,The rust-url developers impls,https://github.com/nvzqz/impls,MIT OR Apache-2.0,"Nikolai Vazquez, Nadrieril Feneanar" indexmap,https://github.com/indexmap-rs/indexmap,Apache-2.0 OR MIT,The indexmap Authors @@ -181,7 +158,6 @@ ipnet,https://github.com/krisprice/ipnet,MIT OR Apache-2.0,Kris Price jiff,https://github.com/BurntSushi/jiff,Unlicense OR MIT,Andrew Gallant -jiff-static,https://github.com/BurntSushi/jiff,Unlicense OR MIT,Andrew Gallant jni,https://github.com/jni-rs/jni-rs,MIT OR Apache-2.0,jni team jni-macros,https://github.com/jni-rs/jni-rs,MIT OR Apache-2.0,The jni-macros Authors jni-sys,https://github.com/jni-rs/jni-sys,MIT OR Apache-2.0,"Steven Fackler , Robert Bragg " @@ -192,8 +168,6 @@ jsonpath-rust,https://github.com/besok/jsonpath-rust,MIT,BorisZhguchev keccak,https://github.com/RustCrypto/sponges,Apache-2.0 OR MIT,RustCrypto Developers kube,https://github.com/kube-rs/kube,Apache-2.0,"clux , Natalie Klestrup Röijezon , kazk " -kube-client,https://github.com/kube-rs/kube,Apache-2.0,"clux , Natalie Klestrup Röijezon , kazk " -kube-core,https://github.com/kube-rs/kube,Apache-2.0,"clux , Natalie Klestrup Röijezon , kazk " lading-payload,https://github.com/datadog/lading,MIT,"Brian L. Troutwine , George Hahn leb128fmt,https://github.com/bluk/leb128fmt,MIT OR Apache-2.0,Bryant Luk @@ -201,16 +175,11 @@ libc,https://github.com/rust-lang/libc,MIT OR Apache-2.0,The Rust Project Develo libloading,https://github.com/nagisa/rust_libloading,ISC,Simonas Kazlauskas libm,https://github.com/rust-lang/compiler-builtins,MIT,"Alex Crichton , Amanieu d'Antras , Jorge Aparicio , Trevor Gross " linkme,https://github.com/dtolnay/linkme,MIT OR Apache-2.0,David Tolnay -linkme-impl,https://github.com/dtolnay/linkme,MIT OR Apache-2.0,David Tolnay linux-raw-sys,https://github.com/sunfishcode/linux-raw-sys,Apache-2.0 WITH LLVM-exception OR Apache-2.0 OR MIT,Dan Gohman litemap,https://github.com/unicode-org/icu4x,Unicode-3.0,The ICU4X Project Developers litrs,https://github.com/LukasKalbertodt/litrs,MIT OR Apache-2.0,Lukas Kalbertodt -lock_api,https://github.com/Amanieu/parking_lot,MIT OR Apache-2.0,Amanieu d'Antras log,https://github.com/rust-lang/log,MIT OR Apache-2.0,The Rust Project Developers logos,https://github.com/maciejhirsz/logos,MIT OR Apache-2.0,"Maciej Hirsz , Jérome Eertmans (maintainer) " -logos-codegen,https://github.com/maciejhirsz/logos,MIT OR Apache-2.0,"Maciej Hirsz , Jérome Eertmans (maintainer) " -logos-derive,https://github.com/maciejhirsz/logos,MIT OR Apache-2.0,"Maciej Hirsz , Jérome Eertmans (maintainer) " -loom,https://github.com/tokio-rs/loom,MIT,Carl Lerche lru-slab,https://github.com/Ralith/lru-slab,MIT OR Apache-2.0 OR Zlib,Benjamin Saunders mach2,https://github.com/JohnTitor/mach2,BSD-2-Clause OR MIT OR Apache-2.0,The mach2 Authors matchers,https://github.com/hawkw/matchers,MIT,Eliza Weisman @@ -219,7 +188,6 @@ matrixmultiply,https://github.com/bluss/matrixmultiply,MIT OR Apache-2.0,"bluss, memchr,https://github.com/BurntSushi/memchr,Unlicense OR MIT,"Andrew Gallant , bluss" memoffset,https://github.com/Gilnaa/memoffset,MIT,Gilad Naaman metrics,https://github.com/metrics-rs/metrics,MIT,Toby Lawrence -metrics-util,https://github.com/metrics-rs/metrics,MIT,Toby Lawrence mime,https://github.com/hyperium/mime,MIT OR Apache-2.0,Sean McArthur minimal-lexical,https://github.com/Alexhuszagh/minimal-lexical,MIT OR Apache-2.0,Alex Huszagh miniz_oxide,https://github.com/Frommi/miniz_oxide/tree/master/miniz_oxide,MIT OR Zlib OR Apache-2.0,"Frommi , oyvindln , Rich Geldreich richgel99@gmail.com" @@ -254,26 +222,18 @@ ordered-float,https://github.com/reem/rust-ordered-float,MIT,"Jonathan Reem papaya,https://github.com/ibraheemdev/papaya,MIT,Ibraheem Ahmed parking_lot,https://github.com/Amanieu/parking_lot,MIT OR Apache-2.0,Amanieu d'Antras -parking_lot_core,https://github.com/Amanieu/parking_lot,MIT OR Apache-2.0,Amanieu d'Antras pastey,https://github.com/as1100k/pastey,MIT OR Apache-2.0,"Aditya Kumar , David Tolnay " pear,https://github.com/SergioBenitez/Pear,MIT OR Apache-2.0,Sergio Benitez pear_codegen,https://github.com/SergioBenitez/Pear,MIT OR Apache-2.0,Sergio Benitez pem,https://github.com/jcreekmore/pem-rs,MIT,Jonathan Creekmore -percent-encoding,https://github.com/servo/rust-url,MIT OR Apache-2.0,The rust-url developers pest,https://github.com/pest-parser/pest,MIT OR Apache-2.0,Dragoș Tiselice -pest_derive,https://github.com/pest-parser/pest,MIT OR Apache-2.0,Dragoș Tiselice -pest_generator,https://github.com/pest-parser/pest,MIT OR Apache-2.0,Dragoș Tiselice -pest_meta,https://github.com/pest-parser/pest,MIT OR Apache-2.0,Dragoș Tiselice petgraph,https://github.com/petgraph/petgraph,MIT OR Apache-2.0,"bluss, mitchmindtree" phf,https://github.com/rust-phf/rust-phf,MIT,Steven Fackler -phf_shared,https://github.com/rust-phf/rust-phf,MIT,Steven Fackler piecemeal,https://github.com/tobz/piecemeal,Apache-2.0,Toby Lawrence pin-project,https://github.com/taiki-e/pin-project,Apache-2.0 OR MIT,The pin-project Authors pin-project-internal,https://github.com/taiki-e/pin-project,Apache-2.0 OR MIT,The pin-project-internal Authors pin-project-lite,https://github.com/taiki-e/pin-project-lite,Apache-2.0 OR MIT,The pin-project-lite Authors plotters,https://github.com/plotters-rs/plotters,MIT,Hao Hou -plotters-backend,https://github.com/plotters-rs/plotters,MIT,Hao Hou -plotters-svg,https://github.com/plotters-rs/plotters,MIT,Hao Hou portable-atomic,https://github.com/taiki-e/portable-atomic,Apache-2.0 OR MIT,The portable-atomic Authors portable-atomic-util,https://github.com/taiki-e/portable-atomic-util,Apache-2.0 OR MIT,The portable-atomic-util Authors potential_utf,https://github.com/unicode-org/icu4x,Unicode-3.0,The ICU4X Project Developers @@ -285,12 +245,8 @@ proc-macro2,https://github.com/dtolnay/proc-macro2,MIT OR Apache-2.0,"David Toln proc-macro2-diagnostics,https://github.com/SergioBenitez/proc-macro2-diagnostics,MIT OR Apache-2.0,Sergio Benitez proptest,https://github.com/proptest-rs/proptest,MIT OR Apache-2.0,Jason Lingle prost,https://github.com/tokio-rs/prost,Apache-2.0,"Dan Burkert , Lucio Franco , Casper Meijn , Tokio Contributors " -prost-build,https://github.com/tokio-rs/prost,Apache-2.0,"Dan Burkert , Lucio Franco , Casper Meijn , Tokio Contributors " -prost-derive,https://github.com/tokio-rs/prost,Apache-2.0,"Dan Burkert , Lucio Franco , Casper Meijn , Tokio Contributors " -prost-types,https://github.com/tokio-rs/prost,Apache-2.0,"Dan Burkert , Lucio Franco , Casper Meijn , Tokio Contributors " protobuf,https://github.com/stepancheg/rust-protobuf,MIT,Stepan Koltsov protobuf-parse,https://github.com/stepancheg/rust-protobuf/tree/master/protobuf-parse,MIT,Stepan Koltsov -protobuf-support,https://github.com/stepancheg/rust-protobuf,MIT,Stepan Koltsov quanta,https://github.com/metrics-rs/quanta,MIT,Toby Lawrence quick_cache,https://github.com/arthurprs/quick-cache,MIT,Arthur Silva quinn,https://github.com/quinn-rs/quinn,MIT OR Apache-2.0,The quinn Authors @@ -300,7 +256,6 @@ quote,https://github.com/dtolnay/quote,MIT OR Apache-2.0,David Tolnay regex,https://github.com/rust-lang/regex,MIT OR Apache-2.0,"The Rust Project Developers, Andrew Gallant " -regex-automata,https://github.com/rust-lang/regex,MIT OR Apache-2.0,"The Rust Project Developers, Andrew Gallant " -regex-syntax,https://github.com/rust-lang/regex,MIT OR Apache-2.0,"The Rust Project Developers, Andrew Gallant " reqwest,https://github.com/seanmonstar/reqwest,MIT OR Apache-2.0,Sean McArthur resolv-conf,https://github.com/hickory-dns/resolv-conf,MIT OR Apache-2.0,The resolv-conf Authors ring,https://github.com/briansmith/ring,Apache-2.0 AND ISC,The ring Authors @@ -338,25 +291,20 @@ rustversion,https://github.com/dtolnay/rustversion,MIT OR Apache-2.0,David Tolna ryu,https://github.com/dtolnay/ryu,Apache-2.0 OR BSL-1.0,David Tolnay same-file,https://github.com/BurntSushi/same-file,Unlicense OR MIT,Andrew Gallant schannel,https://github.com/steffengy/schannel-rs,MIT,"Steven Fackler , Steffen Butzer " -scoped-tls,https://github.com/alexcrichton/scoped-tls,MIT OR Apache-2.0,Alex Crichton scopeguard,https://github.com/bluss/scopeguard,MIT OR Apache-2.0,bluss secrecy,https://github.com/iqlusioninc/crates/tree/main/secrecy,Apache-2.0 OR MIT,Tony Arcieri security-framework,https://github.com/kornelski/rust-security-framework,MIT OR Apache-2.0,"Steven Fackler , Kornel " -security-framework-sys,https://github.com/kornelski/rust-security-framework,MIT OR Apache-2.0,"Steven Fackler , Kornel " seize,https://github.com/ibraheemdev/seize,MIT,Ibraheem Ahmed semver,https://github.com/dtolnay/semver,MIT OR Apache-2.0,David Tolnay serde,https://github.com/serde-rs/serde,MIT OR Apache-2.0,"Erick Tryzelaar , David Tolnay " serde-value,https://github.com/arcnmx/serde-value,MIT,arcnmx serde_bytes,https://github.com/serde-rs/bytes,MIT OR Apache-2.0,David Tolnay -serde_core,https://github.com/serde-rs/serde,MIT OR Apache-2.0,"Erick Tryzelaar , David Tolnay " -serde_derive,https://github.com/serde-rs/serde,MIT OR Apache-2.0,"Erick Tryzelaar , David Tolnay " serde_html_form,https://github.com/jplatte/serde_html_form,MIT,The serde_html_form Authors serde_json,https://github.com/serde-rs/json,MIT OR Apache-2.0,"Erick Tryzelaar , David Tolnay " serde_path_to_error,https://github.com/dtolnay/path-to-error,MIT OR Apache-2.0,David Tolnay serde_repr,https://github.com/dtolnay/serde-repr,MIT OR Apache-2.0,David Tolnay serde_spanned,https://github.com/toml-rs/toml,MIT OR Apache-2.0,The serde_spanned Authors serde_tuple,https://github.com/kardeiz/serde_tuple,MIT,Jacob Brown -serde_tuple_macros,https://github.com/kardeiz/serde_tuple,MIT,Jacob Brown serde_urlencoded,https://github.com/nox/serde_urlencoded,MIT OR Apache-2.0,Anthony Ramine serde_with,https://github.com/jonasbb/serde_with,MIT OR Apache-2.0,"Jonas Bushart, Marcin Kaźmierczak" serde_with_macros,https://github.com/jonasbb/serde_with,MIT OR Apache-2.0,Jonas Bushart @@ -376,55 +324,42 @@ sketches-ddsketch,https://github.com/mheffner/rust-sketches-ddsketch,Apache-2.0, slab,https://github.com/tokio-rs/slab,MIT,Carl Lerche smallvec,https://github.com/servo/rust-smallvec,MIT OR Apache-2.0,The Servo Project Developers snafu,https://github.com/shepmaster/snafu,MIT OR Apache-2.0,Jake Goulding -snafu-derive,https://github.com/shepmaster/snafu,MIT OR Apache-2.0,Jake Goulding socket2,https://github.com/rust-lang/socket2,MIT OR Apache-2.0,"Alex Crichton , Thomas de Zeeuw " sponge-cursor,https://github.com/RustCrypto/utils,MIT OR Apache-2.0,RustCrypto Developers stable_deref_trait,https://github.com/storyyeller/stable_deref_trait,MIT OR Apache-2.0,Robert Grosse strsim,https://github.com/rapidfuzz/strsim-rs,MIT,"Danny Guo , maxbachmann " structmeta,https://github.com/frozenlib/structmeta,MIT OR Apache-2.0,frozenlib -structmeta-derive,https://github.com/frozenlib/structmeta,MIT OR Apache-2.0,frozenlib subtle,https://github.com/dalek-cryptography/subtle,BSD-3-Clause,"Isis Lovecruft , Henry de Valence " symlink,https://gitlab.com/chris-morgan/symlink,MIT OR Apache-2.0,Chris Morgan syn,https://github.com/dtolnay/syn,MIT OR Apache-2.0,David Tolnay sync_wrapper,https://github.com/Actyx/sync_wrapper,Apache-2.0,Actyx AG synstructure,https://github.com/mystor/synstructure,MIT,Nika Layzell system-configuration,https://github.com/mullvad/system-configuration-rs,MIT OR Apache-2.0,Mullvad VPN -system-configuration-sys,https://github.com/mullvad/system-configuration-rs,MIT OR Apache-2.0,Mullvad VPN tagptr,https://github.com/oliver-giersch/tagptr,MIT OR Apache-2.0,Oliver Giersch target-triple,https://github.com/dtolnay/target-triple,MIT OR Apache-2.0,David Tolnay tempfile,https://github.com/Stebalien/tempfile,MIT OR Apache-2.0,"Steven Allen , The Rust Project Developers, Ashley Mannix , Jason White " termcolor,https://github.com/BurntSushi/termcolor,Unlicense OR MIT,Andrew Gallant thiserror,https://github.com/dtolnay/thiserror,MIT OR Apache-2.0,David Tolnay -thiserror-impl,https://github.com/dtolnay/thiserror,MIT OR Apache-2.0,David Tolnay thousands,https://github.com/tov/thousands-rs,MIT OR Apache-2.0,Jesse A. Tov thread_local,https://github.com/Amanieu/thread_local-rs,MIT OR Apache-2.0,Amanieu d'Antras tikv-jemalloc-sys,https://github.com/tikv/jemallocator,MIT OR Apache-2.0,"Alex Crichton , Gonzalo Brito Gadeschi , The TiKV Project Developers" tikv-jemallocator,https://github.com/tikv/jemallocator,MIT OR Apache-2.0,"Alex Crichton , Gonzalo Brito Gadeschi , Simon Sapin , Steven Fackler , The TiKV Project Developers" time,https://github.com/time-rs/time,MIT OR Apache-2.0,"Jacob Pratt , Time contributors" -time-core,https://github.com/time-rs/time,MIT OR Apache-2.0,"Jacob Pratt , Time contributors" -time-macros,https://github.com/time-rs/time,MIT OR Apache-2.0,"Jacob Pratt , Time contributors" tinystr,https://github.com/unicode-org/icu4x,Unicode-3.0,The ICU4X Project Developers tinytemplate,https://github.com/bheisler/TinyTemplate,Apache-2.0 OR MIT,Brook Heisler tinyvec,https://github.com/Lokathor/tinyvec,Zlib OR Apache-2.0 OR MIT,Lokathor tinyvec_macros,https://github.com/Soveu/tinyvec_macros,MIT OR Apache-2.0 OR Zlib,Soveu tokio,https://github.com/tokio-rs/tokio,MIT,Tokio Contributors -tokio-macros,https://github.com/tokio-rs/tokio,MIT,Tokio Contributors tokio-rustls,https://github.com/rustls/tokio-rustls,MIT OR Apache-2.0,The tokio-rustls Authors -tokio-stream,https://github.com/tokio-rs/tokio,MIT,Tokio Contributors tokio-tungstenite,https://github.com/snapview/tokio-tungstenite,MIT,"Daniel Abramov , Alexey Galakhov " -tokio-util,https://github.com/tokio-rs/tokio,MIT,Tokio Contributors tokio-vsock,https://github.com/rust-vsock/tokio-vsock,Apache-2.0,"fsyncd, rust-vsock" toml,https://github.com/toml-rs/toml,MIT OR Apache-2.0,The toml Authors toml_datetime,https://github.com/toml-rs/toml,MIT OR Apache-2.0,The toml_datetime Authors toml_parser,https://github.com/toml-rs/toml,MIT OR Apache-2.0,The toml_parser Authors toml_writer,https://github.com/toml-rs/toml,MIT OR Apache-2.0,The toml_writer Authors tonic,https://github.com/hyperium/tonic,MIT,Lucio Franco -tonic-build,https://github.com/hyperium/tonic,MIT,Lucio Franco -tonic-prost,https://github.com/hyperium/tonic,MIT,Lucio Franco tower,https://github.com/tower-rs/tower,MIT,Tower Maintainers tower-http,https://github.com/tower-rs/tower-http,MIT,Tower Maintainers -tower-layer,https://github.com/tower-rs/tower,MIT,Tower Maintainers -tower-service,https://github.com/tower-rs/tower,MIT,Tower Maintainers tracing,https://github.com/tokio-rs/tracing,MIT,"Eliza Weisman , Tokio Contributors " tracing-appender,https://github.com/tokio-rs/tracing,MIT,"Zeki Sherif , Tokio Contributors " tracing-attributes,https://github.com/tokio-rs/tracing,MIT,"Tokio Contributors , Eliza Weisman , David Barsky " @@ -475,9 +410,7 @@ webpki-root-certs,https://github.com/rustls/webpki-roots,CDLA-Permissive-2.0,The which,https://github.com/harryfei/which-rs,MIT,Harry Fei widestring,https://github.com/VoidStarKat/widestring-rs,MIT OR Apache-2.0,The widestring Authors winapi,https://github.com/retep998/winapi-rs,MIT OR Apache-2.0,Peter Atashian -winapi-i686-pc-windows-gnu,https://github.com/retep998/winapi-rs,MIT OR Apache-2.0,Peter Atashian winapi-util,https://github.com/BurntSushi/winapi-util,Unlicense OR MIT,Andrew Gallant -winapi-x86_64-pc-windows-gnu,https://github.com/retep998/winapi-rs,MIT OR Apache-2.0,Peter Atashian windows-core,https://github.com/microsoft/windows-rs,MIT OR Apache-2.0,The windows-core Authors windows-implement,https://github.com/microsoft/windows-rs,MIT OR Apache-2.0,The windows-implement Authors windows-interface,https://github.com/microsoft/windows-rs,MIT OR Apache-2.0,The windows-interface Authors @@ -498,9 +431,6 @@ windows_x86_64_gnullvm,https://github.com/microsoft/windows-rs,MIT OR Apache-2.0 windows_x86_64_msvc,https://github.com/microsoft/windows-rs,MIT OR Apache-2.0,Microsoft winnow,https://github.com/winnow-rs/winnow,MIT,The winnow Authors wit-bindgen,https://github.com/bytecodealliance/wit-bindgen,Apache-2.0 WITH LLVM-exception OR Apache-2.0 OR MIT,Alex Crichton -wit-bindgen-core,https://github.com/bytecodealliance/wit-bindgen,Apache-2.0 WITH LLVM-exception OR Apache-2.0 OR MIT,Alex Crichton -wit-bindgen-rust,https://github.com/bytecodealliance/wit-bindgen,Apache-2.0 WITH LLVM-exception OR Apache-2.0 OR MIT,Alex Crichton -wit-bindgen-rust-macro,https://github.com/bytecodealliance/wit-bindgen,Apache-2.0 WITH LLVM-exception OR Apache-2.0 OR MIT,Alex Crichton wit-component,https://github.com/bytecodealliance/wasm-tools/tree/main/crates/wit-component,Apache-2.0 WITH LLVM-exception OR Apache-2.0 OR MIT,Peter Huene wit-parser,https://github.com/bytecodealliance/wasm-tools/tree/main/crates/wit-parser,Apache-2.0 WITH LLVM-exception OR Apache-2.0 OR MIT,Alex Crichton writeable,https://github.com/unicode-org/icu4x,Unicode-3.0,The ICU4X Project Developers @@ -510,7 +440,6 @@ yasna,https://github.com/qnighy/yasna.rs,MIT OR Apache-2.0,Masaki Hara yoke-derive,https://github.com/unicode-org/icu4x,Unicode-3.0,Manish Goregaokar zerocopy,https://github.com/google/zerocopy,BSD-2-Clause OR Apache-2.0 OR MIT,"Joshua Liebow-Feeser , Jack Wrenn " -zerocopy-derive,https://github.com/google/zerocopy,BSD-2-Clause OR Apache-2.0 OR MIT,"Joshua Liebow-Feeser , Jack Wrenn " zerofrom,https://github.com/unicode-org/icu4x,Unicode-3.0,The ICU4X Project Developers zerofrom-derive,https://github.com/unicode-org/icu4x,Unicode-3.0,Manish Goregaokar zeroize,https://github.com/RustCrypto/utils,Apache-2.0 OR MIT,The RustCrypto Project Developers diff --git a/bin/agent-data-plane/Cargo.toml b/bin/agent-data-plane/Cargo.toml index 17103a09ee7..aa34d1625c1 100644 --- a/bin/agent-data-plane/Cargo.toml +++ b/bin/agent-data-plane/Cargo.toml @@ -23,6 +23,7 @@ chrono = { workspace = true } colored = { workspace = true } comfy-table = { workspace = true } datadog-agent-commons = { workspace = true } +datadog-agent-config = { workspace = true } datadog-protos = { workspace = true } foldhash = { workspace = true } futures = { workspace = true } @@ -75,6 +76,7 @@ tikv-jemallocator = { workspace = true, features = [ chrono = { workspace = true } [dev-dependencies] +datadog-agent-config-testsupport = { workspace = true } derive-where = { workspace = true } -saluki-components = { workspace = true, features = ["config-test-support"] } +saluki-components = { workspace = true } saluki-metrics = { workspace = true, features = ["test"] } diff --git a/bin/agent-data-plane/src/cli/run.rs b/bin/agent-data-plane/src/cli/run.rs index 73e02dd7237..9a5f5301805 100644 --- a/bin/agent-data-plane/src/cli/run.rs +++ b/bin/agent-data-plane/src/cli/run.rs @@ -6,13 +6,13 @@ use std::{ use argh::FromArgs; use datadog_agent_commons::platform::PlatformSettings; +use datadog_agent_config::classifier::{ConfigClassifier, Pipeline, PipelineAffinity, Severity, SupportLevel}; use resource_accounting::{ComponentBounds, ComponentRegistry}; use saluki_app::{ accounting::{initialize_memory_bounds, MemoryBoundsConfiguration}, bootstrap::BootstrapGuard, metrics::emit_startup_metrics, }; -use saluki_components::config_registry::{ConfigClassifier, Pipeline, PipelineAffinity, Severity, SupportLevel}; use saluki_components::{ config::{DatadogRemapper, MrfConfiguration, KEY_ALIASES}, decoders::otlp::OtlpDecoderConfiguration, @@ -363,9 +363,6 @@ fn check_and_warn_config( } match classification.support_level { - SupportLevel::Full => { - trace!(key = %key, "Fully supported key with non-default value detected. Proceeding.") - } SupportLevel::Incompatible(Severity::Low) => debug!("Low-severity incompatible key detected. Proceeding."), SupportLevel::Partial => { warn!(key = %key, "Partially supported configuration key. See documentation for details. Proceeding.") diff --git a/bin/agent-data-plane/src/components/dogstatsd_prefix_filter/mod.rs b/bin/agent-data-plane/src/components/dogstatsd_prefix_filter/mod.rs index 2bfbbd993b0..7ca8b31b950 100644 --- a/bin/agent-data-plane/src/components/dogstatsd_prefix_filter/mod.rs +++ b/bin/agent-data-plane/src/components/dogstatsd_prefix_filter/mod.rs @@ -703,17 +703,26 @@ mod tests { #[cfg(test)] mod config_smoke { - use saluki_components::config_registry::{structs, test_support::run_config_smoke_tests}; + use datadog_agent_config_testsupport::config_registry::structs; + use datadog_agent_config_testsupport::run_config_smoke_tests; + use saluki_components::config::{DatadogRemapper, KEY_ALIASES}; use serde_json::json; use super::DogStatsDPrefixFilterConfiguration; #[tokio::test] async fn smoke_test() { - run_config_smoke_tests(structs::DOGSTATSD_PREFIX_FILTER_CONFIGURATION, &[], json!({}), |cfg| { - cfg.as_typed::() - .expect("DogStatsDPrefixFilterConfiguration should deserialize") - }) + run_config_smoke_tests( + structs::DOGSTATSD_PREFIX_FILTER_CONFIGURATION, + &[], + json!({}), + |cfg| { + cfg.as_typed::() + .expect("DogStatsDPrefixFilterConfiguration should deserialize") + }, + KEY_ALIASES, + DatadogRemapper::new, + ) .await } } diff --git a/docs/agent-data-plane/configuration/dogstatsd.md b/docs/agent-data-plane/configuration/dogstatsd.md index cf89cc9a867..b1fc8dee58e 100644 --- a/docs/agent-data-plane/configuration/dogstatsd.md +++ b/docs/agent-data-plane/configuration/dogstatsd.md @@ -1,6 +1,6 @@ # Configuring DogStatsD on Agent Data Plane - + The DogStatsD implementation on ADP has been redesigned in Rust for better resource guarantees and efficiency. Because the architecture is different from the original implementation, certain @@ -24,17 +24,20 @@ If you find an error on this page, please [open an issue]. The following settings are not yet supported in ADP but are planned with GitHub issue links for tracking. -| Config Key | Description | Issue | -| -------------------------------------------- | --------------------------------- | ------- | -| `dogstatsd_capture_depth` | Traffic capture channel depth | [#1381] | -| `dogstatsd_capture_path` | Traffic capture file location | [#1381] | -| `dogstatsd_pipe_name` | Windows named pipe path | [#1466] | -| `dogstatsd_windows_pipe_security_descriptor` | Windows named pipe ACL descriptor | [#1466] | -| `forwarder_http_protocol` | HTTP version (auto/http1) | [#1361] | -| `forwarder_outdated_file_in_days` | Retry file retention (days) | [#1360] | -| `serializer_experimental_use_v3_api.*` | V3 metrics API migration flags | [#1468] | -| `sslkeylogfile` | TLS key log file path | [#1372] | -| `tls_handshake_timeout` | HTTP TLS handshake timeout | [#178] | +| Config Key | Description | Issue | +| ------------------------------------------------------- | ----------------------------------------------- | ------- | +| `dogstatsd_experimental_http.enabled` | Enable experimental HTTP/H2C DSD listener | [#1682] | +| `dogstatsd_experimental_http.listen_address` | Bind address for experimental HTTP DSD listener | [#1682] | +| `dogstatsd_pipe_name` | Windows named pipe path | [#1466] | +| `dogstatsd_windows_pipe_security_descriptor` | Windows named pipe ACL descriptor | [#1466] | +| `forwarder_apikey_validation_interval` | API key check interval (minutes) | [#1357] | +| `serializer_experimental_use_v3_api.compression_level` | V3 API zstd compression level | [#1468] | +| `serializer_experimental_use_v3_api.series.endpoints` | Endpoints enabled for V3 series API | [#1468] | +| `serializer_experimental_use_v3_api.series.validate` | Dual-send v2+v3 series for validation | [#1468] | +| `serializer_experimental_use_v3_api.sketches.endpoints` | Endpoints enabling v3 sketches API | [#1468] | +| `serializer_experimental_use_v3_api.sketches.validate` | Dual-send v2+v3 sketches for validation | [#1468] | +| `sslkeylogfile` | TLS key log file path | [#1372] | +| `tls_handshake_timeout` | HTTP TLS handshake timeout | [#178] | ### Not Planned @@ -42,35 +45,98 @@ tracking. The following settings exist in the core agent but are not planned for ADP, typically because ADP's architecture is fundamentally different or the feature is platform-specific. -| Config Key | Description | Reason | -| ---------------------------------------------- | ---------------------------------- | ------------------------------------------------------------ | -| `config_id` | Fleet Automation config ID tag | Core Agent uses this only on Agent HA telemetry metrics | -| `dogstatsd_host_socket_path` | Host UDS socket dir for DSD | Not read by DSD server; admission controller only | -| `dogstatsd_mem_based_rate_limiter.*` | Memory-based rate limiter | Go GC–specific; ADP uses `memory_limit` (see below) | -| `dogstatsd_no_aggregation_pipeline_batch_size` | No-aggregation pipeline batch size | Fixed in ADP topology | -| `dogstatsd_packet_buffer_flush_timeout` | Packet buffer flush timeout | ADP decodes inline | -| `dogstatsd_packet_buffer_size` | Datagrams per packet buffer | ADP decodes inline | -| `dogstatsd_pipeline_autoadjust` | Auto-adjust pipeline workers | ADP uses async tasks | -| `dogstatsd_pipeline_count` | Parallel processing pipelines | ADP uses async tasks | -| `dogstatsd_queue_size` | Packet channel buffer size | ADP uses async tasks | -| `dogstatsd_telemetry_enabled_listener_id` | Per-listener telemetry tagging | Not feasible to thread through | -| `dogstatsd_workers_count` | Number of DSD processing workers | ADP uses async tasks | -| `enable_json_stream_shared_compressor_buffers` | Shared compressor buffer pool | Rust request builders own fixed-capacity buffers | -| `entity_id` | Agent pod entity ID | ADP internal DogStatsD telemetry uses OpenMetrics | -| `heroku_dyno` | Heroku dyno telemetry mode | Core Agent-owned Heroku Agent heartbeat behavior | -| `use_dogstatsd` | Master DogStatsD enable toggle | Core Agent evaluates and sets `data_plane.dogstatsd.enabled` | - -### Memory-based rate limiter (`dogstatsd_mem_based_rate_limiter.*`) - -The Core Agent exposes configuration under this prefix to apply backpressure when the Go process -approaches its memory limit. They work by manipulating Go's garbage collector -(`debug.SetGCPercent`, `debug.FreeOSMemory`), allocating a large heap ballast to adjust GC -heuristics, and blocking goroutines to slow packet ingestion. None of these mechanisms have -an equivalent in Rust, and ADP does not use a Go runtime. - -ADP takes a different approach to the same problem using explicit static memory accounting and a -process-level RSS limit. All 11 `dogstatsd_mem_based_rate_limiter.*` keys are ignored. See -[Memory Management](../memory.md) for details. +| Config Key | Description | Reason | +| ----------------------------------------------------------------- | ------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `aggregator_buffer_size` | Channel buffer depth for aggregator queues | Saluki topology uses fixed interconnect sizes and construction-time wiring; no per-component config knobs. | +| `aggregator_flush_metrics_and_serialize_in_parallel_buffer_size` | Parallel flush: series/sketch buffer size | Saluki topology uses fixed interconnect sizes; no per-component config knobs. | +| `aggregator_flush_metrics_and_serialize_in_parallel_chan_size` | Parallel flush: channel size | Saluki topology uses fixed interconnect sizes; no per-component config knobs. | +| `aggregator_stop_timeout` | Timeout (s) for aggregator flush on stop | Saluki topology uses fixed interconnect sizes and construction-time wiring; no per-component config knobs. | +| `aggregator_use_tags_store` | Enable shared tag deduplication store | Core agent concept with no ADP analog. | +| `config_id` | Fleet Automation config ID tag | Core Agent uses this only on Agent HA telemetry metrics. | +| `dogstatsd_disable_verbose_logs` | Suppress noisy parse error logs | ADP does not emit the verbose parse-error logs that this key filters in the core Agent, so there is nothing to suppress. | +| `dogstatsd_host_socket_path` | Host UDS socket dir for DSD | Not read by DSD server; admission controller only. | +| `dogstatsd_mem_based_rate_limiter.enabled` | Memory-based rate limiter toggle | See below | +| `dogstatsd_mem_based_rate_limiter.go_gc` | Memory rate limiter GC percent | Go GC-specific; ADP uses `memory_limit` instead. | +| `dogstatsd_mem_based_rate_limiter.high_soft_limit` | Memory rate limiter high soft limit | Go GC-specific; ADP uses `memory_limit` instead. | +| `dogstatsd_mem_based_rate_limiter.low_soft_limit` | Memory rate limiter low soft limit | Go GC-specific; ADP uses `memory_limit` instead. | +| `dogstatsd_mem_based_rate_limiter.memory_ballast` | Memory rate limiter heap ballast size | Go GC-specific; ADP uses `memory_limit` instead. | +| `dogstatsd_mem_based_rate_limiter.rate_check.factor` | Memory rate limiter check factor | Go GC-specific; ADP uses `memory_limit` instead. | +| `dogstatsd_mem_based_rate_limiter.rate_check.max` | Memory rate limiter check max interval | Go GC-specific; ADP uses `memory_limit` instead. | +| `dogstatsd_mem_based_rate_limiter.rate_check.min` | Memory rate limiter check min interval | Go GC-specific; ADP uses `memory_limit` instead. | +| `dogstatsd_mem_based_rate_limiter.soft_limit_freeos_check.factor` | Memory rate limiter FreeOS check factor | Go GC-specific; ADP uses `memory_limit` instead. | +| `dogstatsd_mem_based_rate_limiter.soft_limit_freeos_check.max` | Memory rate limiter FreeOS check max | Go GC-specific; ADP uses `memory_limit` instead. | +| `dogstatsd_mem_based_rate_limiter.soft_limit_freeos_check.min` | Memory rate limiter FreeOS check min | Go GC-specific; ADP uses `memory_limit` instead. | +| `dogstatsd_no_aggregation_pipeline_batch_size` | No-aggregation pipeline batch size | Fixed in ADP topology. | +| `dogstatsd_packet_buffer_flush_timeout` | Packet buffer flush timeout | ADP decodes inline. | +| `dogstatsd_packet_buffer_size` | Datagrams per packet buffer | ADP decodes inline. | +| `dogstatsd_pipeline_autoadjust` | Auto-adjust pipeline workers | ADP uses async tasks. | +| `dogstatsd_pipeline_count` | Parallel processing pipelines | ADP uses async tasks. | +| `dogstatsd_queue_size` | Packet channel buffer size | ADP uses async tasks. | +| `dogstatsd_stats_buffer` | Internal stats buffer size | ADP does not expose the core agent's packet-per-second expvar endpoint, so there is no persistent stats endpoint buffer to configure. | +| `dogstatsd_stats_enable` | Enable internal stats endpoint | See below | +| `dogstatsd_stats_port` | Internal stats endpoint port | ADP does not expose the core agent's packet-per-second expvar endpoint, so `dogstatsd_stats_port` has no effect. | +| `dogstatsd_telemetry_enabled_listener_id` | Per-listener telemetry tagging | Not feasible to thread listener identity through ADP's async decode pipeline. | +| `dogstatsd_workers_count` | Number of DSD processing workers | ADP uses async tasks. | +| `enable_json_stream_shared_compressor_buffers` | Pre-allocate shared compressor buffers | ADP does not use a shared compressor buffer pool; Rust request builders own fixed-capacity scratch and compression buffers. | +| `entity_id` | Agent pod entity ID | ADP internal DogStatsD telemetry uses OpenMetrics. | +| `heroku_dyno` | Heroku dyno telemetry mode | See below | +| `logging_frequency` | Transaction success log interval | The core agent uses `logging_frequency` to throttle repetitive successful transaction logs. ADP logs successful forwarder operations below the default `info` level, so there is no matching info-level success-log stream to throttle. This key is intentionally unused. | +| `use_dogstatsd` | Master DogStatsD enable toggle | Core Agent evaluates and sets `data_plane.dogstatsd.enabled`. | + +### `dogstatsd_mem_based_rate_limiter.enabled` + +The Core Agent exposes 11 keys under this prefix to apply backpressure when the Go +process approaches its memory limit. They work by manipulating Go's garbage collector +(`debug.SetGCPercent`, `debug.FreeOSMemory`), allocating a large heap ballast to adjust +GC heuristics, and blocking goroutines to slow packet ingestion. None of these mechanisms +have an equivalent in Rust, and ADP does not use a Go runtime. + +ADP takes a different approach to the same problem using explicit static memory accounting +and a process-level RSS limit. All 11 `dogstatsd_mem_based_rate_limiter.*` keys are not +planned. See [Memory Management](../memory.md) for details. + +### DogStatsD statistics (`dogstatsd_stats_enable` / `dogstatsd_metrics_stats_enable`) + +The core agent has two DogStatsD statistics mechanisms with different scopes. +`dogstatsd_stats_enable` enables packet-level throughput statistics from a ring buffer, exposed as +Go expvar data on `dogstatsd_stats_port` (default `5000`). Operators must configure an OpenMetrics +check to scrape that endpoint before the data is submitted. `dogstatsd_metrics_stats_enable` +enables runtime-toggleable metric-level debug statistics that track count and last-seen time per +unique metric and tag combination. That data powers the core agent's `dogstatsd-stats` CLI command +and HTTP endpoint. + +ADP does not mirror the packet-level statistics config path. Instead, ADP provides an on-demand +metric-level view through a DogStatsD statistics destination that is always wired into the +topology, but only collects data during a time-bounded request. To collect statistics, run +`agent-data-plane dogstatsd stats --duration-secs N` or call the privileged +`/dogstatsd/stats?collection_duration_secs=N` API. The handler waits for the requested collection +window, then returns count and last-seen time per metric context inline as JSON. The CLI uses the +same API and renders the result as either summary or cardinality analysis. + +ADP also exposes aggregate DogStatsD counters through its internal telemetry scrape endpoint. This +endpoint is separate from `/dogstatsd/stats`: it does not return the per-metric count and last-seen +map, and it is not controlled by the core agent's `dogstatsd_stats_*` keys. See +[Scraping internal telemetry](../telemetry.md) for endpoint details and scrape examples. + +ADP does not expose the core agent's packet-per-second expvar endpoint or a persistent per-metric +DogStatsD statistics endpoint to scrape. You do not need to set up scraper configuration for this +per-metric data. The config keys `dogstatsd_stats_enable`, `dogstatsd_stats_buffer`, and +`dogstatsd_stats_port` have no effect in ADP. See [#1352]. + +### `heroku_dyno` + +The `heroku_dyno` setting affects the core Agent's self-telemetry heartbeat. It changes the Agent +flavor used by the core Agent aggregator so the running heartbeat is emitted as +`datadog.heroku_agent.running`. + +ADP does not run in the supported Heroku Agent package path: the Heroku Agent package excludes the +`agent-data-plane` dependency, and the Heroku Datadog launch script starts the core Agent, trace Agent, and +optionally process Agent without launching an `agent-data-plane` process. ADP also does not emit the +core Agent's `datadog..running` series. + +Because the affected heartbeat is core-Agent-owned and ADP is not part of the supported Heroku +deployment path, ADP does not implement `heroku_dyno`. See [#1753]. + ## Behavioral Differences @@ -79,55 +145,86 @@ process-level RSS limit. All 11 `dogstatsd_mem_based_rate_limiter.*` keys are ig The following settings are recognized by both ADP and the core agent, but with different behavior or default values. -| Config Key | Description | Agent Behavior | ADP Behavior | -| ---------------------------------- | -------------------------------- | ---------------------------------------------- | -------------------------------------------------------------- | -| `dogstatsd_mapper_cache_size` | Mapper result LRU cache size | `0` disables mapping; positive sizes the LRU | `0` disables the cache only; mapping still runs ([#1687]) | -| `dogstatsd_metrics_stats_enable` | Enable per-metric debug stats | Config toggle | Gates debug log; stats API on-demand ([#1352], [#1356]) | -| `dogstatsd_stats_enable` | Enable internal stats endpoint | Config toggle | On-demand via API ([#1352]) | -| `dogstatsd_stats_buffer` | Internal stats buffer size | Configurable | On-demand via API ([#1352]) | -| `dogstatsd_stats_port` | Internal stats endpoint port | Configurable port | On-demand via API ([#1352]) | -| `log_level` | Log verbosity directives | Controls Agent logs | Plain levels control ADP/Saluki-owned targets only | -| `logging_frequency` | Transaction success log interval | Throttles success logs | Intentionally unused | -| `min_tls_version` | Minimum outbound TLS version | Supports TLS 1.0, 1.1, 1.2, and 1.3 | Supports TLS 1.2+ and TLS 1.3-only; clamps TLS 1.0/1.1 to 1.2 | -| `serializer_zstd_compressor_level` | Zstd compression level | Default level 1 | Default level 3 (intentional) | -| `skip_ssl_validation` | Skip TLS cert validation | Disables validation for outbound HTTPS clients | Applies to the shared Datadog forwarder; rejected in FIPS mode | - -### Datadog intake TLS protocol version (`min_tls_version`) +| Config Key | Description | +| ---------------------------------- | ----------------------------------------- | +| `dogstatsd_mapper_cache_size` | Mapper result LRU cache size | +| `dogstatsd_metrics_stats_enable` | Enable per-metric debug stats | +| `log_level` | Log verbosity directives | +| `min_tls_version` | Minimum TLS version for HTTPS connections | +| `multi_region_failover.enabled` | Enable multi-region failover mode | +| `serializer_zstd_compressor_level` | Zstd compression level | +| `skip_ssl_validation` | Skip TLS cert validation | +| `statsd_forward_host` | UDP packet forwarding destination host | + +### `dogstatsd_mapper_cache_size` + +ADP and the core agent both cache mapper results to skip regex evaluation on repeat +metric names. With the default value of `1000`, and with any positive integer, behavior +matches the core agent: results are cached in an LRU keyed by the original metric name, +including a negative-cache entry for names that match no profile. + +The two implementations diverge when this setting is `0`. In the core agent, `0` is +rejected by the underlying LRU library, which causes the entire mapper to be silently +disabled: mapping profiles configured by `dogstatsd_mapper_profiles` are not applied. In +ADP, `0` disables the result cache only; mapping profiles still run, so each metric pays +the regex evaluation cost without amortization. + +If you previously set `dogstatsd_mapper_cache_size: 0` in the core agent to turn off the +mapper, clear `dogstatsd_mapper_profiles` instead when running ADP. + +### `dogstatsd_metrics_stats_enable` + +See `dogstatsd_stats_enable` + +### `log_level` + +ADP accepts `log_level` as the startup logging control. A plain level applies to +ADP-owned and Saluki-owned targets only, including `agent_data_plane`, `saluki_*`, and +runtime crates under `lib/`. + +```yaml +log_level: debug +``` + +This keeps third-party dependencies such as `hyper`, `tokio`, and `tonic` at their +default filtering unless you opt them in. + +To control dependency logs or set a global fallback, use advanced `EnvFilter` directives +in `log_level`. ADP applies those directive strings as configured: + +```yaml +log_level: warn,agent_data_plane=debug,hyper=warn +``` + +### `min_tls_version` ADP supports `min_tls_version` for Datadog intake forwarding through the shared Datadog -forwarder. The default is `tlsv1.2`, which allows TLS 1.2 and TLS 1.3. To require TLS 1.3 -only, set `min_tls_version: tlsv1.3` or `DD_MIN_TLS_VERSION=tlsv1.3`. +forwarder. The default is `tlsv1.2`, which allows TLS 1.2 and TLS 1.3. To require TLS +1.3 only, set `min_tls_version: tlsv1.3` or `DD_MIN_TLS_VERSION=tlsv1.3`. The core agent also accepts `tlsv1.0` and `tlsv1.1`. ADP accepts those values for configuration compatibility, but clamps them to TLS 1.2 because ADP uses `rustls`, which -doesn't support TLS 1.0 or TLS 1.1. - -This setting doesn't affect ADP IPC, local privileged APIs, ADP control-plane clients, OTLP -proxying to the core agent, or unrelated HTTP clients. +does not support TLS 1.0 or TLS 1.1. -### DogStatsD forwarding (`statsd_forward_host` / `statsd_forward_port`) - -ADP supports DogStatsD forwarding when both `statsd_forward_host` and -`statsd_forward_port` are set. ADP forwards each framed DogStatsD message over UDP to the -configured destination before parsing, filtering, mapping, or aggregation. Forwarding doesn't -preserve the core Agent's packet-buffer grouping, so forwarded UDP datagrams may be split -differently while carrying the same DogStatsD messages. ADP logs setup failures and tracks send -failures through telemetry. +This setting does not affect ADP IPC, local privileged APIs, ADP control-plane clients, +OTLP proxying to the core agent, or unrelated HTTP clients. -### Multi-region failover metrics +### `multi_region_failover.enabled` ADP supports multi-region failover for metrics. When `multi_region_failover.enabled` and -`multi_region_failover.failover_metrics` are both `true`, ADP forwards metrics to the primary -Datadog endpoint and to a second MRF endpoint. +`multi_region_failover.failover_metrics` are both `true`, ADP forwards metrics to the +primary Datadog endpoint and to a second MRF endpoint. -To enable the MRF metrics branch at startup, configure `multi_region_failover.api_key` and one of -`multi_region_failover.site` or `multi_region_failover.dd_url`. If the MRF endpoint configuration is -incomplete, ADP skips the MRF branch and continues forwarding to the primary endpoint. +To enable the MRF metrics branch at startup, configure `multi_region_failover.api_key` +and one of `multi_region_failover.site` or `multi_region_failover.dd_url`. If the MRF +endpoint configuration is incomplete, ADP skips the MRF branch and continues forwarding +to the primary endpoint. ADP does not fall back to the primary `api_key`, `site`, or `dd_url` for MRF traffic. `multi_region_failover.enabled` and endpoint selection are resolved at startup. `multi_region_failover.failover_metrics`, `multi_region_failover.metric_allowlist`, and -`multi_region_failover.api_key` can refresh from live configuration after the MRF branch is enabled. +`multi_region_failover.api_key` can refresh from live configuration after the MRF branch +is enabled. | Config Key | Behavior | Default | | ---------------------------------------- | -------------------------------------------------------------------------- | ------- | @@ -138,75 +235,134 @@ ADP does not fall back to the primary `api_key`, `site`, or `dd_url` for MRF tra | `multi_region_failover.site` | Datadog site for the failover region, used as `https://app.mrf.`. | unset | | `multi_region_failover.dd_url` | Explicit failover intake URL. Takes precedence over `site` when set. | unset | -### Datadog intake TLS validation (`skip_ssl_validation`) +### `serializer_zstd_compressor_level` -ADP supports `skip_ssl_validation` for Datadog intake forwarding through the shared Datadog -forwarder. The default is `false`, which preserves normal server certificate validation. To accept -invalid server certificates for Datadog intake requests, set `skip_ssl_validation: true` or -`DD_SKIP_SSL_VALIDATION=true`. +ADP defaults to level 3 vs Agent level 1. ADP intentionally compresses better. Key is recognized by both; default divergence is intentional. -When enabled, this setting affects the Datadog intake clients used by metrics, logs, traces, events, -and service checks that flow through the shared forwarder. +### `skip_ssl_validation` -> [!WARNING] -> Setting `skip_ssl_validation: true` disables TLS server certificate validation for Datadog intake -> forwarding. Use it only when you understand and accept that risk. +ADP supports `skip_ssl_validation` for Datadog intake forwarding through the shared +Datadog forwarder. The default is `false`, which preserves normal server certificate +validation. When enabled, this setting affects the Datadog intake clients used by metrics, +logs, traces, events, and service checks that flow through the shared forwarder. -This setting does not affect ADP IPC, local privileged APIs, ADP control-plane clients, OTLP -proxying to the core agent, or unrelated HTTP clients. In FIPS builds, ADP rejects -`skip_ssl_validation: true` because disabling TLS certificate validation is not FIPS-compliant. +This setting does not affect ADP IPC, local privileged APIs, ADP control-plane clients, +OTLP proxying to the core agent, or unrelated HTTP clients. In FIPS builds, ADP rejects +`skip_ssl_validation: true` because disabling TLS certificate validation is not +FIPS-compliant. -### Logging verbosity (`log_level` / `logging_frequency`) +### `statsd_forward_host` -ADP accepts `log_level` as the startup logging control. A plain level applies to ADP-owned and -Saluki-owned targets only, including `agent_data_plane`, `saluki_*`, and runtime crates under -`lib/`. +ADP supports DogStatsD forwarding when both `statsd_forward_host` and +`statsd_forward_port` are set. ADP forwards each framed DogStatsD message over UDP to the +configured destination before parsing, filtering, mapping, or aggregation. Forwarding +does not preserve the core Agent's packet-buffer grouping, so forwarded UDP datagrams may +be split differently while carrying the same DogStatsD messages. ADP logs setup failures +and tracks send failures through telemetry. -```yaml -log_level: debug -``` -This keeps third-party dependencies such as `hyper`, `tokio`, and `tonic` at their default filtering -unless you opt them in. +## Compatibility Unknown -To control dependency logs or set a global fallback, use advanced `EnvFilter` directives in -`log_level`. ADP applies those directive strings as configured: + -```yaml -log_level: warn,agent_data_plane=debug,hyper=warn -``` +The following settings need further investigation. ADP behavior may differ from the core agent in +ways that are not yet fully characterized. -`logging_frequency` is intentionally unused by ADP. The core agent uses it to throttle repetitive -successful transaction logs. ADP logs successful forwarder operations below the default `info` level, -so there is no matching info-level success-log stream to throttle. +| Config Key | Description | Issue | +| -------------------------------------------------------- | --------------------------------------------- | ------- | +| `autoscaling.failover.enabled` | Enable autoscaling failover metric routing | [#1684] | +| `autoscaling.failover.metrics` | Metric names forwarded to DCA for failover | [#1684] | +| `cluster_agent.enabled` | Enable Cluster Agent communication | [#1684] | +| `forwarder_flush_to_disk_mem_ratio` | Mem-to-disk flush threshold | [#1364] | +| `forwarder_low_prio_buffer_size` | Low-priority request queue size | [#1362] | +| `forwarder_max_concurrent_requests` | Max concurrent HTTP requests | [#1363] | +| `forwarder_requeue_buffer_size` | In-memory re-queue buffer size | [#1755] | +| `forwarder_retry_queue_capacity_time_interval_sec` | Retry queue time-based capacity | [#1365] | +| `forwarder_stop_timeout` | Timeout (s) for forwarder graceful stop | [#1754] | +| `telemetry.dogstatsd.aggregator_channel_latency_buckets` | Histogram buckets: DSD aggregator channel lag | [#1679] | +| `telemetry.dogstatsd.listeners_channel_latency_buckets` | Histogram buckets: listener channel latency | [#1679] | +| `telemetry.dogstatsd.listeners_latency_buckets` | Histogram buckets: listener processing | [#1679] | +| `telemetry.dogstatsd_origin` | Per-origin processed-metrics telemetry | [#1679] | -### DogStatsD statistics (`dogstatsd_stats_enable` / `dogstatsd_metrics_stats_enable`) +## ADP-Only Settings -The core agent has two DogStatsD statistics mechanisms with different scopes. -`dogstatsd_stats_enable` enables packet-level throughput statistics from a ring buffer, exposed as -Go expvar data on `dogstatsd_stats_port` (default `5000`). Operators must configure an OpenMetrics -check to scrape that endpoint before the data is submitted. `dogstatsd_metrics_stats_enable` -enables runtime-toggleable metric-level debug statistics that track count and last-seen time per -unique metric and tag combination. That data powers the core agent's `dogstatsd-stats` CLI command -and HTTP endpoint. + -ADP does not mirror the packet-level statistics config path. Instead, ADP provides an on-demand -metric-level view through a DogStatsD statistics destination that is always wired into the -topology, but only collects data during a time-bounded request. To collect statistics, run -`agent-data-plane dogstatsd stats --duration-secs N` or call the privileged -`/dogstatsd/stats?collection_duration_secs=N` API. The handler waits for the requested collection -window, then returns count and last-seen time per metric context inline as JSON. The CLI uses the -same API and renders the result as either summary or cardinality analysis. +The following settings are specific to ADP and have no equivalent in the core agent. -ADP also exposes aggregate DogStatsD counters through its internal telemetry scrape endpoint. This -endpoint is separate from `/dogstatsd/stats`: it does not return the per-metric count and last-seen -map, and it is not controlled by the core agent's `dogstatsd_stats_*` keys. See -[Scraping internal telemetry](../telemetry.md) for endpoint details and scrape examples. +| Config Key | Description | Default | +| --------------------------------------------------------------- | ------------------------------------------ | ------- | +| `aggregate_context_limit` | Max contexts per aggregation window | | +| `aggregate_flush_interval` | Aggregator flush period | | +| `aggregate_passthrough_idle_flush_timeout` | Passthrough buffer flush delay | | +| `aggregate_window_duration_seconds` | Aggregation window size | | +| `apm_config.obfuscation.sql.dbms` | SQL obfuscation DBMS dialect | | +| `apm_config.obfuscation.sql.dollar_quoted_func` | Preserve dollar-quoted SQL functions | | +| `apm_config.obfuscation.sql.keep_sql_alias` | Preserve SQL aliases in obfuscation | | +| `apm_config.obfuscation.sql.replace_digits` | Replace digits in SQL obfuscation | | +| `apm_config.obfuscation.sql.table_names` | Collect table names during obfuscation | | +| `counter_expiry_seconds` | Idle counter keep-alive duration | 300 | +| `data_plane.remote_agent_enabled` | Enable remote agent mode | true | +| `data_plane.use_new_config_stream_endpoint` | Use new config stream endpoint | | +| `dogstatsd_allow_context_heap_allocs` | Allow heap allocations for contexts | | +| `dogstatsd_autoscale_udp_listeners` | Bind multiple UDP sockets via SO_REUSEPORT | | +| `dogstatsd_buffer_count` | Number of receive buffers | | +| `dogstatsd_cached_contexts_limit` | Max cached metric contexts | | +| `dogstatsd_cached_tagsets_limit` | Max cached tagsets | | +| `dogstatsd_mapper_string_interner_size` | Mapper string interner capacity | | +| `dogstatsd_minimum_sample_rate` | Floor for metric sample rates | | +| `dogstatsd_permissive_decoding` | Relaxes decoder strictness | true | +| `dogstatsd_string_interner_size_bytes` | Explicit byte budget for context interner | | +| `dogstatsd_tcp_port` | TCP listen port for DSD | | +| `flush_timeout_secs` | Encoder flush timeout (secs) | | +| `memory_limit` | Process memory limit | | +| `memory_slop_factor` | Memory accounting slop fraction | 0.25 | +| `otlp_allow_context_heap_allocs` | Allow heap allocations for OTLP contexts | | +| `otlp_cached_contexts_limit` | Max cached OTLP metric contexts | | +| `otlp_cached_tagsets_limit` | Max cached OTLP tagsets | | +| `otlp_config.receiver.protocols.http.transport` | OTLP HTTP receiver transport | | +| `otlp_config.traces.enable_otlp_compute_top_level_by_span_kind` | Enable OTLP top-level-by-span-kind | | +| `otlp_config.traces.ignore_missing_datadog_fields` | Ignore missing Datadog fields in OTLP | | +| `otlp_config.traces.string_interner_size` | OTLP trace string interner capacity | | +| `otlp_string_interner_size` | OTLP context interner capacity | | +| `serializer_max_metrics_per_payload` | Max metrics per payload | | + +### `dogstatsd_minimum_sample_rate` + +ADP enforces a minimum sample rate on incoming metrics to prevent memory exhaustion from extremely low sample rates on histograms and sketches. Sending metrics with a very high inverse sample rate (for example `@0.0000001`) can cause unbounded memory growth in a sketch; this setting prevents that. The default is conservative enough that normal clients are unaffected. + +### `dogstatsd_permissive_decoding` + +By default, ADP parses DogStatsD packets with the same leniency as the core agent, accepting packets that technically violate the spec. Setting this to `false` enables strict mode, which rejects non-conformant packets. Strict mode is not available in the core agent. + +### `memory_limit` / `memory_slop_factor` + +ADP uses an explicit process memory limit (`memory_limit`) rather than relying on Go's garbage collector. The `memory_slop_factor` reserves a fraction of the limit to account for allocations not tracked by ADP's internal accounting. When memory usage approaches `memory_limit`, ADP's global limiter begins exerting backpressure (see `enable_global_limiter`). + +### `memory_slop_factor` + +See `memory_limit` above. + +### `data_plane.remote_agent_enabled` / `data_plane.use_new_config_stream_endpoint` + +These two keys are transitional flags being phased out. Both will be implied by `data_plane.standalone_mode=false` in a future release. Do not rely on them for new deployments. + +### `data_plane.use_new_config_stream_endpoint` + +See `data_plane.remote_agent_enabled` above. -ADP does not expose the core agent's packet-per-second expvar endpoint or a persistent per-metric -DogStatsD statistics endpoint to scrape. You do not need to set up scraper configuration for this -per-metric data. The config keys `dogstatsd_stats_enable`, `dogstatsd_stats_buffer`, and -`dogstatsd_stats_port` have no effect in ADP. See [#1352]. + +## Transparent Settings + + + +The following settings work in ADP with the same behavior as the core agent. + +To enable syslog logging, set `log_to_syslog: true`. Console logging remains controlled by +`log_to_console`; enabling syslog does not disable console or file logging. If `syslog_uri` is empty +while syslog logging is enabled, ADP uses the platform default local syslog socket: +`unixgram:///dev/log` on Linux and `unixgram:///var/run/syslog` on macOS. Set `syslog_rfc: true` +when the receiving syslog daemon expects the Agent's RFC-style header. ### DogStatsD metric debug log @@ -251,271 +407,139 @@ events, and service checks. These logs can contain high-volume customer data, in tags, host and container metadata, event text, and service check messages. Use this setting only while diagnosing payload content. -ADP does not dump the exact encoded JSON or protobuf HTTP request body, and it does not log compressed -wire payload bytes. - -### `dogstatsd_mapper_cache_size` - -ADP and the core agent both cache mapper results to skip regex evaluation on repeat metric names. -With the default value of `1000`, and with any positive integer, behavior matches the core agent: -results are cached in an LRU keyed by the original metric name, including a negative-cache entry for -names that match no profile. - -The two implementations diverge when this setting is `0`. In the core agent, `0` is rejected by the -underlying LRU library, which causes the entire mapper to be silently disabled: mapping profiles -configured by `dogstatsd_mapper_profiles` are not applied. In ADP, `0` disables the result cache -only; mapping profiles still run, so each metric pays the regex evaluation cost without amortization. - -If you previously set `dogstatsd_mapper_cache_size: 0` in the core agent to turn off the mapper, -clear `dogstatsd_mapper_profiles` instead when running ADP. See [#1687]. - -## Heroku dyno telemetry (`heroku_dyno`) - -The `heroku_dyno` setting affects the core Agent's self-telemetry heartbeat. It changes the Agent -flavor used by the core Agent aggregator so the running heartbeat is emitted as -`datadog.heroku_agent.running`. - -ADP does not run in the supported Heroku Agent package path: the Heroku Agent package excludes the -`agent-data-plane` dependency, and the Heroku Datadog launch script starts the core Agent, trace Agent, and -optionally process Agent without launching an `agent-data-plane` process. ADP also does not emit the -core Agent's `datadog..running` series. - -Because the affected heartbeat is core-Agent-owned and ADP is not part of the supported Heroku -deployment path, ADP does not implement `heroku_dyno`. See [#1753]. - -## Compatibility Unknown - - - -The following settings need further investigation. ADP behavior may differ from the core agent in -ways that are not yet fully characterized. - -| Config Key | Description | Issue | -| ---------------------------------------------------------------- | ----------------------------------------------- | ------- | -| `aggregator_buffer_size` | Channel buffer depth for aggregator queues | [#1681] | -| `aggregator_flush_metrics_and_serialize_in_parallel_buffer_size` | Parallel flush: series/sketch buffer size | [#1681] | -| `aggregator_flush_metrics_and_serialize_in_parallel_chan_size` | Parallel flush: channel size | [#1681] | -| `aggregator_stop_timeout` | Timeout (s) for aggregator flush on stop | [#1681] | -| `aggregator_use_tags_store` | Enable shared tag deduplication store | [#1681] | -| `anomaly_detection.enabled` | Enable anomaly detection observer pipeline | [#1683] | -| `anomaly_detection.metrics.enabled` | Enable metric ingestion for anomaly detection | [#1683] | -| `autoscaling.failover.enabled` | Enable autoscaling failover metric routing | [#1684] | -| `autoscaling.failover.metrics` | Metric names forwarded to DCA for failover | [#1684] | -| `dogstatsd_disable_verbose_logs` | Suppress noisy parse error logs | [#1350] | -| `dogstatsd_experimental_http.enabled` | Enable experimental HTTP/H2C DSD listener | [#1682] | -| `dogstatsd_experimental_http.listen_address` | Bind address for experimental HTTP DSD listener | [#1682] | -| `forwarder_apikey_validation_interval` | API key check interval (minutes) | [#1357] | -| `forwarder_flush_to_disk_mem_ratio` | Mem-to-disk flush threshold | [#1364] | -| `forwarder_high_prio_buffer_size` | High-priority request queue size | [#1362] | -| `forwarder_low_prio_buffer_size` | Low-priority request queue size | [#1362] | -| `forwarder_max_concurrent_requests` | Max concurrent HTTP requests | [#1363] | -| `forwarder_requeue_buffer_size` | In-memory re-queue buffer size | [#1755] | -| `forwarder_retry_queue_capacity_time_interval_sec` | Retry queue time-based capacity | [#1365] | -| `forwarder_stop_timeout` | Timeout (s) for forwarder graceful stop | [#1680] | -| `telemetry.dogstatsd.aggregator_channel_latency_buckets` | Histogram buckets: DSD aggregator channel lag | [#1679] | -| `telemetry.dogstatsd.listeners_channel_latency_buckets` | Histogram buckets: listener channel latency | [#1679] | -| `telemetry.dogstatsd.listeners_latency_buckets` | Histogram buckets: listener processing | [#1679] | -| `telemetry.dogstatsd_origin` | Per-origin processed-metrics telemetry | [#1679] | - -## ADP-Only Settings - - - -The following settings are specific to ADP and have no equivalent in the core agent. - -| Config Key | Description | Default | -| ----------------------------------------------------------- | ------------------------------------------ | ------- | -| `agent_ipc_endpoint` | Remote agent IPC URI | | -| `aggregate_flush_interval` | Aggregator flush period | | -| `aggregate_flush_open_windows` | Flush open windows on stop | | -| `aggregate_passthrough_idle_flush_timeout` | Passthrough buffer flush delay | | -| `aggregate_window_duration_seconds` | Aggregation window size | | -| `connect_retry_attempts` | IPC client connect retries | | -| `connect_retry_backoff` | IPC client retry delay | | -| `counter_expiry_seconds` | Idle counter keep-alive duration | 300 | -| `data_plane.api_listen_address` | ADP unprivileged API address | | -| `data_plane.dogstatsd.aggregator_tag_filter_cache_capacity` | Tag-filter deduplication cache size | 100000 | -| `data_plane.remote_agent_enabled` | Register as remote agent | | -| `data_plane.secure_api_listen_address` | ADP privileged API address | | -| `data_plane.standalone_mode` | ADP standalone mode toggle | | -| `data_plane.use_new_config_stream_endpoint` | Use new config stream endpoint | | -| `dogstatsd_allow_context_heap_allocs` | Allow heap allocations for contexts | | -| `dogstatsd_autoscale_udp_listeners` | Bind multiple UDP sockets via SO_REUSEPORT | | -| `dogstatsd_buffer_count` | Number of receive buffers | | -| `dogstatsd_cached_contexts_limit` | Max cached metric contexts | | -| `dogstatsd_cached_tagsets_limit` | Max cached tagsets | | -| `dogstatsd_mapper_string_interner_size` | Mapper string interner capacity | | -| `dogstatsd_minimum_sample_rate` | Floor for metric sample rates | | -| `dogstatsd_permissive_decoding` | Relaxes decoder strictness | true | -| `dogstatsd_string_interner_size_bytes` | Explicit byte budget for context interner | | -| `dogstatsd_tcp_port` | TCP listen port for DSD | | -| `enable_global_limiter` | Toggle global memory limiter | | -| `flush_timeout_secs` | Encoder flush timeout (secs) | | -| `memory_limit` | Process memory limit (bytes) | | -| `memory_mode` | ADP global memory limiter mode | | -| `memory_slop_factor` | Memory headroom fraction | | -| `metrics_level` | ADP internal metrics emission level | | -| `otlp_string_interner_size` | OTLP context interner capacity | | -| `remote_agent_string_interner_size_bytes` | Tag string interner capacity | 512 KB | -| `serializer_max_metrics_per_payload` | Max metrics per payload | | -| `statsd_metric_namespace_blocklist` | Renamed alias for blacklist key | | - -### `memory_limit` / `memory_slop_factor` - -ADP uses an explicit process memory limit (`memory_limit`) rather than relying on Go's garbage -collector. The `memory_slop_factor` reserves a fraction of the limit to account for allocations not -tracked by ADP's internal accounting. When memory usage approaches `memory_limit`, ADP's global -limiter begins exerting backpressure (see `enable_global_limiter`). - -### `dogstatsd_minimum_sample_rate` - -ADP enforces a minimum sample rate on incoming metrics to prevent memory exhaustion from extremely -low sample rates on histograms and sketches. Sending metrics with a very high inverse sample rate -(for example `@0.0000001`) can cause unbounded memory growth in a sketch; this setting prevents that. The -default is conservative enough that normal clients are unaffected. - -### `dogstatsd_permissive_decoding` - -By default, ADP parses DogStatsD packets with the same leniency as the core agent, accepting packets -that technically violate the spec. Setting this to `false` enables strict mode, which rejects -non-conformant packets. Strict mode is not available in the core agent. - -### `data_plane.remote_agent_enabled` / `data_plane.use_new_config_stream_endpoint` - -These two keys are transitional flags being phased out. Both will be implied by -`data_plane.standalone_mode=false` in a future release. Do not rely on them for new deployments. - -## Transparent Settings - - - -The following settings work in ADP with the same behavior as the core agent. - -To enable syslog logging, set `log_to_syslog: true`. Console logging remains controlled by -`log_to_console`; enabling syslog does not disable console or file logging. If `syslog_uri` is empty -while syslog logging is enabled, ADP uses the platform default local syslog socket: -`unixgram:///dev/log` on Linux and `unixgram:///var/run/syslog` on macOS. Set `syslog_rfc: true` -when the receiving syslog daemon expects the Agent's RFC-style header. - -| Config Key | Description | -| ------------------------------------------------- | -------------------------------------------- | -| `additional_endpoints` | Dual-ship to extra endpoints | -| `aggregate_context_limit` | Max contexts per aggregation window | -| `allow_arbitrary_tags` | Relax backend tag validation via HTTP header | -| `api_key` | API key for endpoint auth | -| `auth_token_file_path` | IPC auth token file path | -| `bind_host` | Global listen host fallback | -| `cmd_port` | Agent IPC/CMD API port | -| `container_cgroup_root` | Cgroup filesystem root path | -| `container_proc_root` | Procfs root path for containers | -| `cri_connection_timeout` | CRI runtime connection timeout (s) | -| `cri_query_timeout` | CRI runtime query timeout (s) | -| `cri_socket_path` | CRI/containerd socket path | -| `data_plane.dogstatsd.enabled` | Enable DSD in data plane | -| `data_plane.enabled` | Enable ADP globally | -| `dd_url` | Override intake endpoint URL | -| `dogstatsd_buffer_size` | Receive buffer size (bytes) | -| `dogstatsd_context_expiry_seconds` | Context cache TTL (seconds) | -| `dogstatsd_entity_id_precedence` | Entity ID over auto-detection | -| `dogstatsd_eol_required` | Require newline-terminated messages | -| `dogstatsd_expiry_seconds` | Counter zero-value TTL (secs) | -| `dogstatsd_flush_incomplete_buckets` | Flush open buckets on shutdown | -| `dogstatsd_log_file` | DSD metric debug log path | -| `dogstatsd_log_file_max_rolls` | Max rotated DSD debug log files | -| `dogstatsd_log_file_max_size` | Max DSD debug log file size | -| `dogstatsd_logging_enabled` | Enable DSD metric debug logging | -| `dogstatsd_mapper_profiles` | Metric mapping profile definitions | -| `dogstatsd_no_aggregation_pipeline` | Enable no-aggregation timestamped path | -| `dogstatsd_non_local_traffic` | Accept non-localhost UDP/TCP | -| `dogstatsd_origin_detection` | Enable UDS origin detection | -| `dogstatsd_origin_detection_client` | Honor client origin proto fields | -| `dogstatsd_origin_optout_enabled` | Allow clients to opt out origin | -| `dogstatsd_port` | UDP listen port | -| `dogstatsd_so_rcvbuf` | Socket receive buffer size | -| `dogstatsd_socket` | UDS datagram socket path | -| `dogstatsd_stream_log_too_big` | Log oversized UDS stream frames | -| `dogstatsd_stream_socket` | UDS stream socket path | -| `dogstatsd_string_interner_size` | String interner capacity | -| `dogstatsd_tag_cardinality` | Default tag cardinality level | -| `dogstatsd_tags` | Extra tags added to all DSD data | -| `enable_payloads.events` | Allow sending event payloads | -| `enable_payloads.series` | Allow sending series payloads | -| `enable_payloads.service_checks` | Allow sending service check payloads | -| `enable_payloads.sketches` | Allow sending sketch payloads | -| `expected_tags_duration` | Host tag enrichment duration | -| `extra_tags` | Additional static tags | -| `forwarder_backoff_base` | Retry backoff base (secs) | -| `forwarder_backoff_factor` | Retry backoff jitter factor | -| `forwarder_backoff_max` | Retry backoff ceiling (secs) | -| `forwarder_connection_reset_interval` | HTTP conn reset interval (secs) | -| `forwarder_num_workers` | Concurrent forwarder workers | -| `forwarder_recovery_interval` | Backoff recovery decrease factor | -| `forwarder_recovery_reset` | Reset errors on success | -| `forwarder_retry_queue_max_size` | Retry queue max size (deprecated) | -| `forwarder_retry_queue_payloads_max_size` | Retry queue max size (bytes) | -| `forwarder_storage_max_disk_ratio` | Max disk usage ratio for retry | -| `forwarder_storage_max_size_in_bytes` | Max on-disk retry storage size | -| `forwarder_storage_path` | On-disk retry storage directory | -| `forwarder_timeout` | Forwarder HTTP request timeout | -| `histogram_aggregates` | Histogram aggregate statistics | -| `histogram_copy_to_distribution` | Copy histograms to distributions | -| `histogram_copy_to_distribution_prefix` | Prefix for hist-to-dist copies | -| `histogram_percentiles` | Histogram percentile quantiles | -| `hostname` | Configured hostname override | -| `ipc_cert_file_path` | IPC TLS certificate path | -| `log_file` | Log output file path | -| `log_file_max_rolls` | Max rotated log files kept | -| `log_file_max_size` | Max log file size before rotate | -| `log_format_json` | Use JSON log format | -| `log_payloads` | Debug-log decoded payload contents | -| `log_to_console` | Log to stdout/stderr | -| `log_to_syslog` | Log to syslog daemon | -| `metric_filterlist` | Metric name blocklist | -| `metric_filterlist_match_prefix` | Blocklist uses prefix matching | -| `metric_tag_filterlist` | Per-metric tag include/exclude | -| `no_proxy_nonexact_match` | Domain/CIDR `no_proxy` matching | -| `observability_pipelines_worker.metrics.enabled` | Route metrics to OPW instance | -| `observability_pipelines_worker.metrics.url` | OPW metrics intake URL | -| `origin_detection_unified` | Unified origin detection mode | -| `provider_kind` | Provider kind static tag | -| `proxy` | HTTP/HTTPS proxy configuration | -| `run_path` | Runtime data directory path | -| `secret_backend_command` | Secret resolver executable path | -| `secret_backend_timeout` | Secret backend timeout (seconds) | -| `serializer_compressor_kind` | Payload compression algorithm | -| `serializer_max_payload_size` | Max compressed payload size | -| `serializer_max_series_payload_size` | Max series compressed payload size | -| `serializer_max_series_points_per_payload` | Max data points per series payload | -| `serializer_max_series_uncompressed_payload_size` | Max series uncompressed payload size | -| `serializer_max_uncompressed_payload_size` | Max uncompressed payload size | -| `site` | Datadog site domain | -| `statsd_metric_blocklist` | Metric name blocklist | -| `statsd_metric_blocklist_match_prefix` | Blocklist uses prefix matching | -| `statsd_metric_namespace` | Prefix prepended to all metrics | -| `statsd_metric_namespace_blacklist` | Namespace prefixes exempt (alias) | -| `syslog_rfc` | Use RFC-style syslog header | -| `syslog_uri` | Syslog destination URI | -| `tags` | Global tags (DD_TAGS) | -| `use_proxy_for_cloud_metadata` | Proxy cloud metadata endpoints | -| `use_v2_api.series` | Send series via V2 protobuf endpoint | -| `vector.metrics.enabled` | Route metrics to OPW (legacy alias) | -| `vector.metrics.url` | OPW metrics intake URL (legacy alias) | +ADP does not dump the exact encoded JSON or protobuf HTTP request body, and it does not log +compressed wire payload bytes. + +| Config Key | Description | +| -------------------------------------------------------------- | -------------------------------------------------- | +| `additional_endpoints` | Dual-ship to extra endpoints | +| `allow_arbitrary_tags` | Relax backend tag validation via HTTP header | +| `api_key` | API key for endpoint auth | +| `apm_config.obfuscation.credit_cards.enabled` | apm_config.obfuscation.credit_cards.enabled | +| `apm_config.obfuscation.credit_cards.keep_values` | apm_config.obfuscation.credit_cards.keep_values | +| `apm_config.obfuscation.credit_cards.luhn` | apm_config.obfuscation.credit_cards.luhn | +| `apm_config.obfuscation.elasticsearch.enabled` | apm_config.obfuscation.elasticsearch.enabled | +| `apm_config.obfuscation.elasticsearch.keep_values` | apm_config.obfuscation.elasticsearch.keep_values | +| `apm_config.obfuscation.elasticsearch.obfuscate_sql_values` | Obfuscate SQL values in ES queries | +| `apm_config.obfuscation.http.remove_paths_with_digits` | Strip numeric segments from HTTP paths | +| `apm_config.obfuscation.http.remove_query_string` | apm_config.obfuscation.http.remove_query_string | +| `apm_config.obfuscation.memcached.enabled` | apm_config.obfuscation.memcached.enabled | +| `apm_config.obfuscation.memcached.keep_command` | apm_config.obfuscation.memcached.keep_command | +| `apm_config.obfuscation.mongodb.enabled` | apm_config.obfuscation.mongodb.enabled | +| `apm_config.obfuscation.mongodb.keep_values` | apm_config.obfuscation.mongodb.keep_values | +| `apm_config.obfuscation.mongodb.obfuscate_sql_values` | Obfuscate SQL values in MongoDB queries | +| `apm_config.obfuscation.opensearch.enabled` | apm_config.obfuscation.opensearch.enabled | +| `apm_config.obfuscation.opensearch.keep_values` | apm_config.obfuscation.opensearch.keep_values | +| `apm_config.obfuscation.opensearch.obfuscate_sql_values` | Obfuscate SQL values in OpenSearch queries | +| `apm_config.obfuscation.redis.enabled` | apm_config.obfuscation.redis.enabled | +| `apm_config.obfuscation.redis.remove_all_args` | apm_config.obfuscation.redis.remove_all_args | +| `apm_config.obfuscation.valkey.enabled` | apm_config.obfuscation.valkey.enabled | +| `apm_config.obfuscation.valkey.remove_all_args` | apm_config.obfuscation.valkey.remove_all_args | +| `bind_host` | Global listen host fallback | +| `cmd_port` | Datadog Agent IPC/CMD API port | +| `cri_connection_timeout` | CRI container runtime connection timeout (s) | +| `cri_query_timeout` | CRI container runtime query timeout (s) | +| `data_plane.dogstatsd.aggregator_tag_filter_cache_capacity` | Tag-filter deduplication cache size | +| `dd_url` | Override intake endpoint URL | +| `dogstatsd_buffer_size` | Receive buffer size (bytes) | +| `dogstatsd_capture_depth` | Traffic capture channel depth | +| `dogstatsd_capture_path` | Traffic capture file location | +| `dogstatsd_context_expiry_seconds` | Context cache TTL (seconds) | +| `dogstatsd_entity_id_precedence` | Entity ID over auto-detection | +| `dogstatsd_eol_required` | Require newline-terminated messages | +| `dogstatsd_flush_incomplete_buckets` | Flush open buckets on shutdown | +| `dogstatsd_log_file` | DSD dedicated log file path | +| `dogstatsd_log_file_max_rolls` | DSD log file max roll count | +| `dogstatsd_log_file_max_size` | DSD log file max size | +| `dogstatsd_logging_enabled` | Enables DSD metric logging | +| `dogstatsd_mapper_profiles` | Metric mapping profile definitions | +| `dogstatsd_no_aggregation_pipeline` | Enable no-agg timestamped path | +| `dogstatsd_non_local_traffic` | Accept non-localhost UDP/TCP | +| `dogstatsd_origin_detection` | Enable UDS origin detection | +| `dogstatsd_origin_detection_client` | Honor client origin proto fields | +| `dogstatsd_origin_optout_enabled` | Allow clients to opt out origin | +| `dogstatsd_port` | UDP listen port | +| `dogstatsd_so_rcvbuf` | Socket receive buffer size | +| `dogstatsd_socket` | UDS datagram socket path | +| `dogstatsd_stream_log_too_big` | Log oversized UDS stream frames | +| `dogstatsd_stream_socket` | UDS stream socket path | +| `dogstatsd_string_interner_size` | String interner capacity | +| `dogstatsd_tag_cardinality` | Default tag cardinality level | +| `dogstatsd_tags` | Extra tags added to all DSD data | +| `enable_payloads.events` | Allow sending event payloads | +| `enable_payloads.series` | Allow sending series payloads | +| `enable_payloads.service_checks` | Allow sending service check payloads | +| `enable_payloads.sketches` | Allow sending sketch payloads | +| `env` | Agent environment name | +| `forwarder_backoff_base` | Retry backoff base (secs) | +| `forwarder_backoff_factor` | Retry backoff jitter factor | +| `forwarder_backoff_max` | Retry backoff ceiling (secs) | +| `forwarder_connection_reset_interval` | HTTP conn reset interval (secs) | +| `forwarder_high_prio_buffer_size` | High-priority request queue size | +| `forwarder_http_protocol` | HTTP version selection (auto/http1/http2) | +| `forwarder_num_workers` | Concurrent forwarder workers | +| `forwarder_outdated_file_in_days` | Days before retry files are deleted | +| `forwarder_recovery_interval` | Backoff recovery decrease factor | +| `forwarder_recovery_reset` | Reset errors on success | +| `forwarder_retry_queue_max_size` | Retry queue max size (deprecated) | +| `forwarder_retry_queue_payloads_max_size` | Retry queue max size (bytes) | +| `forwarder_storage_max_disk_ratio` | Max disk usage ratio for retry | +| `forwarder_storage_max_size_in_bytes` | Max on-disk retry storage size | +| `forwarder_storage_path` | On-disk retry storage directory | +| `forwarder_timeout` | Forwarder HTTP request timeout | +| `histogram_aggregates` | Histogram aggregate statistics | +| `histogram_copy_to_distribution` | Copy histograms to distributions | +| `histogram_copy_to_distribution_prefix` | Prefix for hist-to-dist copies | +| `log_format_rfc3339` | Use RFC 3339 timestamps in log output | +| `log_payloads` | Debug-log decoded payload contents before encoding | +| `metric_filterlist` | Metric name blocklist | +| `metric_filterlist_match_prefix` | Blocklist uses prefix matching | +| `multi_region_failover.api_key` | API key for the failover-region endpoint | +| `multi_region_failover.dd_url` | Failover intake URL | +| `multi_region_failover.failover_metrics` | Enable metrics forwarding to failover region | +| `multi_region_failover.metric_allowlist` | Metric name allowlist for MRF forwarding | +| `multi_region_failover.site` | Datadog site for the failover region | +| `no_proxy_nonexact_match` | Domain/CIDR `no_proxy` matching | +| `observability_pipelines_worker.metrics.enabled` | Route metrics to OPW instance | +| `observability_pipelines_worker.metrics.url` | OPW metrics intake URL | +| `origin_detection_unified` | Unified origin detection mode | +| `otlp_config.logs.enabled` | otlp_config.logs.enabled | +| `otlp_config.metrics.enabled` | otlp_config.metrics.enabled | +| `otlp_config.receiver.protocols.grpc.endpoint` | otlp_config.receiver.protocols.grpc.endpoint | +| `otlp_config.receiver.protocols.grpc.max_recv_msg_size_mib` | Max OTLP inbound gRPC message size (MiB) | +| `otlp_config.receiver.protocols.grpc.transport` | otlp_config.receiver.protocols.grpc.transport | +| `otlp_config.receiver.protocols.http.endpoint` | otlp_config.receiver.protocols.http.endpoint | +| `otlp_config.traces.enabled` | otlp_config.traces.enabled | +| `otlp_config.traces.internal_port` | otlp_config.traces.internal_port | +| `otlp_config.traces.probabilistic_sampler.sampling_percentage` | OTLP trace sampling percentage | +| `provider_kind` | Provider kind static tag | +| `proxy.http` | HTTP proxy URL | +| `proxy.https` | HTTPS proxy URL | +| `proxy.no_proxy` | Hosts bypassing proxy | +| `serializer_compressor_kind` | Payload compression algorithm | +| `serializer_max_payload_size` | Max compressed payload size (generic) | +| `serializer_max_series_payload_size` | Max compressed V2 series payload size | +| `serializer_max_series_points_per_payload` | Max data points per series payload | +| `serializer_max_series_uncompressed_payload_size` | Max uncompressed V2 series payload size | +| `serializer_max_uncompressed_payload_size` | Max uncompressed payload size (generic) | +| `site` | Datadog site domain | +| `statsd_forward_port` | UDP packet forwarding destination port | +| `statsd_metric_blocklist` | List of metric names to block/drop | +| `statsd_metric_blocklist_match_prefix` | Treat blocklist entries as prefixes | +| `statsd_metric_namespace` | Prefix prepended to all metric names | +| `statsd_metric_namespace_blacklist` | Prefixes exempt from namespace | +| `syslog_rfc` | Use RFC-style syslog header | +| `syslog_uri` | Syslog destination URI | +| `use_proxy_for_cloud_metadata` | Proxy cloud metadata endpoints | +| `use_v2_api.series` | Send series via V2 protobuf endpoint | +| `vector.metrics.enabled` | Route metrics to OPW (legacy alias) | +| `vector.metrics.url` | OPW metrics intake URL (legacy alias) | +| `vsock_addr` | vsock address for Agent IPC endpoint | [#178]: https://github.com/DataDog/saluki/issues/178 -[#1330]: https://github.com/DataDog/saluki/issues/1330 -[#1331]: https://github.com/DataDog/saluki/issues/1331 -[#1332]: https://github.com/DataDog/saluki/issues/1332 -[#1333]: https://github.com/DataDog/saluki/issues/1333 -[#1334]: https://github.com/DataDog/saluki/issues/1334 -[#1338]: https://github.com/DataDog/saluki/issues/1338 -[#1339]: https://github.com/DataDog/saluki/issues/1339 -[#1342]: https://github.com/DataDog/saluki/issues/1342 [#1350]: https://github.com/DataDog/saluki/issues/1350 [#1352]: https://github.com/DataDog/saluki/issues/1352 -[#1353]: https://github.com/DataDog/saluki/issues/1353 -[#1354]: https://github.com/DataDog/saluki/issues/1354 -[#1356]: https://github.com/DataDog/saluki/issues/1356 [#1357]: https://github.com/DataDog/saluki/issues/1357 [#1360]: https://github.com/DataDog/saluki/issues/1360 [#1361]: https://github.com/DataDog/saluki/issues/1361 @@ -523,35 +547,17 @@ when the receiving syslog daemon expects the Agent's RFC-style header. [#1363]: https://github.com/DataDog/saluki/issues/1363 [#1364]: https://github.com/DataDog/saluki/issues/1364 [#1365]: https://github.com/DataDog/saluki/issues/1365 -[#1366]: https://github.com/DataDog/saluki/issues/1366 -[#1367]: https://github.com/DataDog/saluki/issues/1367 -[#1368]: https://github.com/DataDog/saluki/issues/1368 -[#1370]: https://github.com/DataDog/saluki/issues/1370 -[#1371]: https://github.com/DataDog/saluki/issues/1371 [#1372]: https://github.com/DataDog/saluki/issues/1372 -[#1373]: https://github.com/DataDog/saluki/issues/1373 -[#1380]: https://github.com/DataDog/saluki/issues/1380 [#1381]: https://github.com/DataDog/saluki/issues/1381 -[#1382]: https://github.com/DataDog/saluki/issues/1382 -[#1433]: https://github.com/DataDog/saluki/issues/1433 -[#1434]: https://github.com/DataDog/saluki/issues/1434 [#1466]: https://github.com/DataDog/saluki/issues/1466 [#1468]: https://github.com/DataDog/saluki/issues/1468 -[#1476]: https://github.com/DataDog/saluki/issues/1476 -[#1640]: https://github.com/DataDog/saluki/issues/1640 -[#1667]: https://github.com/DataDog/saluki/issues/1667 -[#1678]: https://github.com/DataDog/saluki/issues/1678 [#1679]: https://github.com/DataDog/saluki/issues/1679 [#1681]: https://github.com/DataDog/saluki/issues/1681 [#1682]: https://github.com/DataDog/saluki/issues/1682 -[#1683]: https://github.com/DataDog/saluki/issues/1683 [#1684]: https://github.com/DataDog/saluki/issues/1684 +[#1687]: https://github.com/DataDog/saluki/issues/1687 [#1749]: https://github.com/DataDog/saluki/issues/1749 -[#1750]: https://github.com/DataDog/saluki/issues/1750 -[#1751]: https://github.com/DataDog/saluki/issues/1751 -[#1752]: https://github.com/DataDog/saluki/issues/1752 [#1753]: https://github.com/DataDog/saluki/issues/1753 [#1754]: https://github.com/DataDog/saluki/issues/1754 [#1755]: https://github.com/DataDog/saluki/issues/1755 -[#1687]: https://github.com/DataDog/saluki/issues/1687 diff --git a/docs/agent-data-plane/configuration/dogstatsd.md.tmpl b/docs/agent-data-plane/configuration/dogstatsd.md.tmpl new file mode 100644 index 00000000000..55113dad41e --- /dev/null +++ b/docs/agent-data-plane/configuration/dogstatsd.md.tmpl @@ -0,0 +1,121 @@ +# Configuring DogStatsD on Agent Data Plane + + + +The DogStatsD implementation on ADP has been redesigned in Rust for better resource guarantees and +efficiency. Because the architecture is different from the original implementation, certain +configuration values may behave differently, be planned but not yet implemented, or not apply at +all. This page documents those nuances. + +ADP is designed to be transparent: customers configure DogStatsD the same way they always have. The +sections below call out the cases where that is either not yet true, or not quite possible. + +If you find an error on this page, please [open an issue]. + + +[open an issue]: https://github.com/DataDog/saluki/issues + + +## Unsupported Settings + + +### Being Worked On + +The following settings are not yet supported in ADP but are planned with GitHub issue links for +tracking. + +{ working_on_table } + +### Not Planned + +The following settings exist in the core agent but are not planned for ADP, typically because ADP's +architecture is fundamentally different or the feature is platform-specific. + +{ not_planned_table } +{ not_planned_docs } +## Behavioral Differences + + + +The following settings are recognized by both ADP and the core agent, but with different behavior or +default values. + +{ behavioral_table } +{ behavioral_docs } +## Compatibility Unknown + + + +The following settings need further investigation. ADP behavior may differ from the core agent in +ways that are not yet fully characterized. + +{ investigate_table } +## ADP-Only Settings + + + +The following settings are specific to ADP and have no equivalent in the core agent. + +{ adp_only_table } +{ adp_only_docs } +## Transparent Settings + + + +The following settings work in ADP with the same behavior as the core agent. + +To enable syslog logging, set `log_to_syslog: true`. Console logging remains controlled by +`log_to_console`; enabling syslog does not disable console or file logging. If `syslog_uri` is empty +while syslog logging is enabled, ADP uses the platform default local syslog socket: +`unixgram:///dev/log` on Linux and `unixgram:///var/run/syslog` on macOS. Set `syslog_rfc: true` +when the receiving syslog daemon expects the Agent's RFC-style header. + +### DogStatsD metric debug log + +ADP supports the core agent's DogStatsD metric debug log. To write this file, set +`dogstatsd_metrics_stats_enable: true`. `dogstatsd_logging_enabled` also must be `true`; it defaults +to `true`, so most configurations only need to enable `dogstatsd_metrics_stats_enable`. + +When `dogstatsd_logging_enabled` is `true`, ADP connects an extra DogStatsD destination to the +decoded metric stream. The destination writes one line per metric sample with the metric name, tags, +count, and last-seen time while `dogstatsd_metrics_stats_enable` is `true`. When +`dogstatsd_metrics_stats_enable` is `false`, the destination drains decoded metrics and drops them. +This lets runtime configuration changes start and stop the debug log without rebuilding the +topology. This feature is for support and troubleshooting. It does not change normal metric +forwarding, and it does not replace the on-demand `/dogstatsd/stats` API. + +Use these settings to control the file: + +| Config Key | Behavior | +| ------------------------------ | ------------------------------------------------------------------------------------------- | +| `dogstatsd_log_file` | Output path. If empty, ADP uses the platform default DogStatsD stats log path. | +| `dogstatsd_log_file_max_rolls` | Number of rotated files to keep. Defaults to `3`. | +| `dogstatsd_log_file_max_size` | Maximum active file size before rotation. Defaults to `10Mb`. | +| `dogstatsd_logging_enabled` | Controls whether ADP wires the debug log destination into the topology. Defaults to `true`. | + +The default `dogstatsd_log_file` path is +`/var/log/datadog/dogstatsd_info/dogstatsd-stats.log` on Linux and other Unix platforms, +`/opt/datadog-agent/logs/dogstatsd_info/dogstatsd-stats.log` on macOS, and +`%ProgramData%\datadog\logs\dogstatsd_info\dogstatsd-stats.log` on Windows. + +This debug log differs from the `dogstatsd_capture_*` settings. The debug log records decoded metric +summaries after DogStatsD parsing. The capture settings record raw DogStatsD traffic for packet-level +investigation, and they remain tracked separately under [#1381]. + +### Payload debug logging (`log_payloads`) + +ADP supports `log_payloads` for debugging metric, event, and service check payload contents before +they enter Datadog encoders. To see these logs, set `log_payloads: true` and run with debug-level +logging enabled. + +When enabled, ADP logs decoded payload objects: scalar series metrics, sketches/distributions, +events, and service checks. These logs can contain high-volume customer data, including metric names, +tags, host and container metadata, event text, and service check messages. Use this setting only +while diagnosing payload content. + +ADP does not dump the exact encoded JSON or protobuf HTTP request body, and it does not log +compressed wire payload bytes. + +{ transparent_table } + +{ issue_references } diff --git a/docs/agent-data-plane/configuration/dogstatsd/known-configs-not-applicable.json b/docs/agent-data-plane/configuration/dogstatsd/known-configs-not-applicable.json deleted file mode 100644 index c2120032686..00000000000 --- a/docs/agent-data-plane/configuration/dogstatsd/known-configs-not-applicable.json +++ /dev/null @@ -1,2315 +0,0 @@ -[ - "GUI_host", - "GUI_port", - "GUI_session_expiration", - "See", - "ac_exclude", - "ac_include", - "ac_load_timeout", - "ad_allowed_env_vars", - "ad_config_poll_interval", - "ad_disable_env_var_resolution", - "ad_tag_completeness_max_wait", - "additional_checksd", - "admission_controller.add_aks_selectors", - "admission_controller.agent_sidecar.cluster_agent.enabled", - "admission_controller.agent_sidecar.cluster_agent.tls_verification.copy_ca_configmap", - "admission_controller.agent_sidecar.cluster_agent.tls_verification.enabled", - "admission_controller.agent_sidecar.container_registry", - "admission_controller.agent_sidecar.enabled", - "admission_controller.agent_sidecar.endpoint", - "admission_controller.agent_sidecar.image_name", - "admission_controller.agent_sidecar.image_tag", - "admission_controller.agent_sidecar.kubelet_api_logging.enabled", - "admission_controller.agent_sidecar.profiles", - "admission_controller.agent_sidecar.provider", - "admission_controller.agent_sidecar.selectors", - "admission_controller.appsec.nginx.init_image", - "admission_controller.appsec.nginx.module_mount_path", - "admission_controller.appsec.sidecar.body_parsing_size_limit", - "admission_controller.appsec.sidecar.health_port", - "admission_controller.appsec.sidecar.image", - "admission_controller.appsec.sidecar.image_tag", - "admission_controller.appsec.sidecar.port", - "admission_controller.appsec.sidecar.resources.limits.cpu", - "admission_controller.appsec.sidecar.resources.limits.memory", - "admission_controller.appsec.sidecar.resources.requests.cpu", - "admission_controller.appsec.sidecar.resources.requests.memory", - "admission_controller.auto_instrumentation.asm.enabled", - "admission_controller.auto_instrumentation.asm_sca.enabled", - "admission_controller.auto_instrumentation.container_registry", - "admission_controller.auto_instrumentation.container_registry_allow_list", - "admission_controller.auto_instrumentation.default_dd_registries", - "admission_controller.auto_instrumentation.enabled", - "admission_controller.auto_instrumentation.endpoint", - "admission_controller.auto_instrumentation.gradual_rollout.cache_ttl", - "admission_controller.auto_instrumentation.gradual_rollout.enabled", - "admission_controller.auto_instrumentation.iast.enabled", - "admission_controller.auto_instrumentation.init_resources.cpu", - "admission_controller.auto_instrumentation.init_resources.memory", - "admission_controller.auto_instrumentation.init_security_context", - "admission_controller.auto_instrumentation.inject_auto_detected_libraries", - "admission_controller.auto_instrumentation.patcher.enabled", - "admission_controller.auto_instrumentation.patcher.fallback_to_file_provider", - "admission_controller.auto_instrumentation.patcher.file_provider_path", - "admission_controller.auto_instrumentation.profiling.enabled", - "admission_controller.certificate.expiration_threshold", - "admission_controller.certificate.secret_name", - "admission_controller.certificate.validity_bound", - "admission_controller.container_registry", - "admission_controller.cws_instrumentation.command_endpoint", - "admission_controller.cws_instrumentation.container_registry", - "admission_controller.cws_instrumentation.enabled", - "admission_controller.cws_instrumentation.exclude", - "admission_controller.cws_instrumentation.image_name", - "admission_controller.cws_instrumentation.image_tag", - "admission_controller.cws_instrumentation.include", - "admission_controller.cws_instrumentation.init_resources.cpu", - "admission_controller.cws_instrumentation.init_resources.memory", - "admission_controller.cws_instrumentation.mode", - "admission_controller.cws_instrumentation.mutate_unlabelled", - "admission_controller.cws_instrumentation.pod_endpoint", - "admission_controller.cws_instrumentation.remote_copy.directory", - "admission_controller.cws_instrumentation.remote_copy.mount_volume", - "admission_controller.cws_instrumentation.timeout", - "admission_controller.enabled", - "admission_controller.failure_policy", - "admission_controller.inject_config.enabled", - "admission_controller.inject_config.endpoint", - "admission_controller.inject_config.local_service_name", - "admission_controller.inject_config.mode", - "admission_controller.inject_config.socket_path", - "admission_controller.inject_config.type_socket_volumes", - "admission_controller.inject_tags.enabled", - "admission_controller.inject_tags.endpoint", - "admission_controller.inject_tags.pod_owners_cache_validity", - "admission_controller.kubernetes_admission_events.enabled", - "admission_controller.mutate_unlabelled", - "admission_controller.mutation.enabled", - "admission_controller.namespace_selector_fallback", - "admission_controller.nccl_profiler.enabled", - "admission_controller.nccl_profiler.init_resources.cpu", - "admission_controller.nccl_profiler.init_resources.memory", - "admission_controller.nccl_profiler.injector_image", - "admission_controller.nccl_profiler.mutate_unlabelled", - "admission_controller.pod_owners_cache_validity", - "admission_controller.port", - "admission_controller.probe.enabled", - "admission_controller.probe.grace_period", - "admission_controller.probe.interval", - "admission_controller.reinvocation_policy", - "admission_controller.service_name", - "admission_controller.timeout_seconds", - "admission_controller.validation.enabled", - "admission_controller.webhook_name", - "agent_ipc.config_refresh_interval", - "agent_ipc.grpc_max_message_size", - "agent_ipc.grpc_warning_message_size", - "agent_ipc.host", - "agent_ipc.port", - "agent_ipc.socket_path", - "agent_ipc.use_socket", - "agent_ipc_grpc_max_message_size", - "agent_telemetry.additional_endpoints", - "agent_telemetry.batch_max_concurrent_send", - "agent_telemetry.batch_max_content_size", - "agent_telemetry.batch_max_size", - "agent_telemetry.batch_wait", - "agent_telemetry.compression_kind", - "agent_telemetry.compression_level", - "agent_telemetry.connection_reset_interval", - "agent_telemetry.dd_url", - "agent_telemetry.dev_mode_no_ssl", - "agent_telemetry.enabled", - "agent_telemetry.input_chan_size", - "agent_telemetry.logs_dd_url", - "agent_telemetry.logs_no_ssl", - "agent_telemetry.sender_backoff_base", - "agent_telemetry.sender_backoff_factor", - "agent_telemetry.sender_backoff_max", - "agent_telemetry.sender_recovery_interval", - "agent_telemetry.sender_recovery_reset", - "agent_telemetry.startup_trace_sampling", - "agent_telemetry.use_compression", - "agent_telemetry.use_v2_api", - "agent_telemetry.zstd_compression_level", - "allow_python_path_heuristics_failure", - "allowed_additional_checks", - "apm_config", - "apm_config.additional_endpoints", - "apm_config.additional_profile_tags", - "apm_config.analyzed_rate_by_service", - "apm_config.analyzed_spans", - "apm_config.apm_dd_url", - "apm_config.apm_non_local_traffic", - "apm_config.bucket_size_seconds", - "apm_config.client_stats_flush_interval", - "apm_config.compute_stats_by_span_kind", - "apm_config.connection_limit", - "apm_config.connection_reset_interval", - "apm_config.dd_agent_bin", - "apm_config.debug", - "apm_config.debug.port", - "apm_config.debug_v1_payloads", - "apm_config.debugger_additional_endpoints", - "apm_config.debugger_api_key", - "apm_config.debugger_dd_url", - "apm_config.debugger_diagnostics_additional_endpoints", - "apm_config.debugger_diagnostics_api_key", - "apm_config.debugger_diagnostics_dd_url", - "apm_config.debugger_logs_enabled_override", - "apm_config.decoder_timeout", - "apm_config.decoders", - "apm_config.default_env", - "apm_config.disable_rare_sampler", - "apm_config.enable_container_tags_buffer", - "apm_config.enable_rare_sampler", - "apm_config.enabled", - "apm_config.env", - "apm_config.error_sampling_enabled", - "apm_config.error_tracking_standalone", - "apm_config.error_tracking_standalone.enabled", - "apm_config.errors_per_second", - "apm_config.extra_sample_rate", - "apm_config.features", - "apm_config.filter_tags", - "apm_config.filter_tags.reject", - "apm_config.filter_tags.require", - "apm_config.filter_tags_regex", - "apm_config.filter_tags_regex.reject", - "apm_config.filter_tags_regex.require", - "apm_config.ignore_resources", - "apm_config.install_id", - "apm_config.install_time", - "apm_config.install_type", - "apm_config.instrumentation", - "apm_config.instrumentation.disabled_namespaces", - "apm_config.instrumentation.enabled", - "apm_config.instrumentation.enabled_namespaces", - "apm_config.instrumentation.injection_mode", - "apm_config.instrumentation.injector_image_tag", - "apm_config.instrumentation.lib_versions", - "apm_config.instrumentation.targets", - "apm_config.internal_profiling.enabled", - "apm_config.log_file", - "apm_config.max_catalog_entries", - "apm_config.max_catalog_services", - "apm_config.max_connections", - "apm_config.max_cpu_percent", - "apm_config.max_events_per_second", - "apm_config.max_memory", - "apm_config.max_payload_size", - "apm_config.max_remote_traces_per_second", - "apm_config.max_sender_retries", - "apm_config.max_traces_per_second", - "apm_config.mode", - "apm_config.obfuscation", - "apm_config.obfuscation.cache", - "apm_config.obfuscation.cache.enabled", - "apm_config.obfuscation.cache.max_size", - "apm_config.obfuscation.credit_cards", - "apm_config.obfuscation.credit_cards.enabled", - "apm_config.obfuscation.credit_cards.keep_values", - "apm_config.obfuscation.credit_cards.luhn", - "apm_config.obfuscation.elasticsearch", - "apm_config.obfuscation.elasticsearch.enabled", - "apm_config.obfuscation.elasticsearch.keep_values", - "apm_config.obfuscation.elasticsearch.obfuscate_sql_values", - "apm_config.obfuscation.es", - "apm_config.obfuscation.es.enabled", - "apm_config.obfuscation.es.keep_values", - "apm_config.obfuscation.es.obfuscate_sql_values", - "apm_config.obfuscation.http", - "apm_config.obfuscation.http.remove_path_digits", - "apm_config.obfuscation.http.remove_paths_with_digits", - "apm_config.obfuscation.http.remove_query_string", - "apm_config.obfuscation.memcached", - "apm_config.obfuscation.memcached.enabled", - "apm_config.obfuscation.memcached.keep_command", - "apm_config.obfuscation.mongo", - "apm_config.obfuscation.mongo.enabled", - "apm_config.obfuscation.mongo.keep_values", - "apm_config.obfuscation.mongo.obfuscate_sql_values", - "apm_config.obfuscation.mongodb", - "apm_config.obfuscation.mongodb.enabled", - "apm_config.obfuscation.mongodb.keep_values", - "apm_config.obfuscation.mongodb.obfuscate_sql_values", - "apm_config.obfuscation.open_search", - "apm_config.obfuscation.open_search.enabled", - "apm_config.obfuscation.open_search.keep_values", - "apm_config.obfuscation.open_search.obfuscate_sql_values", - "apm_config.obfuscation.opensearch", - "apm_config.obfuscation.opensearch.enabled", - "apm_config.obfuscation.opensearch.keep_values", - "apm_config.obfuscation.opensearch.obfuscate_sql_values", - "apm_config.obfuscation.redis", - "apm_config.obfuscation.redis.enabled", - "apm_config.obfuscation.redis.remove_all_args", - "apm_config.obfuscation.remove_stack_traces", - "apm_config.obfuscation.sql", - "apm_config.obfuscation.sql.dbms", - "apm_config.obfuscation.sql.dollar_quoted_func", - "apm_config.obfuscation.sql.keep_sql_alias", - "apm_config.obfuscation.sql.replace_digits", - "apm_config.obfuscation.sql.table_names", - "apm_config.obfuscation.sql_exec_plan", - "apm_config.obfuscation.sql_exec_plan.enabled", - "apm_config.obfuscation.sql_exec_plan.keep_values", - "apm_config.obfuscation.sql_exec_plan.obfuscate_sql_values", - "apm_config.obfuscation.sql_exec_plan_normalize", - "apm_config.obfuscation.sql_exec_plan_normalize.enabled", - "apm_config.obfuscation.sql_exec_plan_normalize.keep_values", - "apm_config.obfuscation.sql_exec_plan_normalize.obfuscate_sql_values", - "apm_config.obfuscation.valkey", - "apm_config.obfuscation.valkey.enabled", - "apm_config.obfuscation.valkey.remove_all_args", - "apm_config.peer_service_aggregation", - "apm_config.peer_tags", - "apm_config.peer_tags_aggregation", - "apm_config.probabilistic_sampler", - "apm_config.probabilistic_sampler.enabled", - "apm_config.probabilistic_sampler.hash_seed", - "apm_config.probabilistic_sampler.sampling_percentage", - "apm_config.profiling_additional_endpoints", - "apm_config.profiling_dd_url", - "apm_config.profiling_max_request_bytes", - "apm_config.profiling_receiver_timeout", - "apm_config.receiver_enabled", - "apm_config.receiver_port", - "apm_config.receiver_socket", - "apm_config.receiver_timeout", - "apm_config.replace_tags", - "apm_config.replace_tags.pattern", - "apm_config.replace_tags.repl", - "apm_config.send_all_internal_stats", - "apm_config.socket_activation.enabled", - "apm_config.socket_activation.handle_tcp_probe", - "apm_config.span_derived_primary_tags", - "apm_config.sql_obfuscation_mode", - "apm_config.stats_writer.connection_limit", - "apm_config.stats_writer.queue_size", - "apm_config.symdb_additional_endpoints", - "apm_config.symdb_api_key", - "apm_config.symdb_dd_url", - "apm_config.sync_flushing", - "apm_config.target_traces_per_second", - "apm_config.telemetry.additional_endpoints", - "apm_config.telemetry.dd_url", - "apm_config.telemetry.enabled", - "apm_config.trace_buffer", - "apm_config.trace_writer.connection_limit", - "apm_config.trace_writer.queue_size", - "apm_config.watchdog_check_delay", - "apm_config.windows_pipe_buffer_size", - "apm_config.windows_pipe_name", - "apm_config.windows_pipe_security_descriptor", - "apm_config.workload_selection", - "apm_enable_rare_sampler", - "apm_error_tracking_standalone_enabled", - "apm_obfuscation_credit_cards_enabled", - "apm_obfuscation_credit_cards_keep_values", - "apm_obfuscation_credit_cards_luhn", - "apm_obfuscation_elasticsearch_enabled", - "apm_obfuscation_elasticsearch_keep_values", - "apm_obfuscation_elasticsearch_obfuscate_sql_values", - "apm_obfuscation_http_remove_paths_with_digits", - "apm_obfuscation_http_remove_query_string", - "apm_obfuscation_memcached_enabled", - "apm_obfuscation_memcached_keep_command", - "apm_obfuscation_mongodb_enabled", - "apm_obfuscation_mongodb_keep_values", - "apm_obfuscation_mongodb_obfuscate_sql_values", - "apm_obfuscation_opensearch_enabled", - "apm_obfuscation_opensearch_keep_values", - "apm_obfuscation_opensearch_obfuscate_sql_values", - "apm_obfuscation_redis_enabled", - "apm_obfuscation_redis_remove_all_args", - "apm_obfuscation_sql_dbms", - "apm_obfuscation_sql_dollar_quoted_func", - "apm_obfuscation_sql_keep_sql_alias", - "apm_obfuscation_sql_replace_digits", - "apm_obfuscation_sql_table_names", - "apm_obfuscation_valkey_enabled", - "apm_obfuscation_valkey_remove_all_args", - "app_key", - "appsec.proxy.auto_detect", - "appsec.proxy.enabled", - "appsec.proxy.processor.address", - "appsec.proxy.processor.port", - "appsec.proxy.proxies", - "auth_init_timeout", - "auto_exit", - "auto_exit.noprocess", - "auto_exit.noprocess.enabled", - "auto_exit.noprocess.excluded_processes", - "auto_exit.validation_period", - "auto_team_tag_collection", - "autoconf_config_files_poll", - "autoconf_config_files_poll_interval", - "autoconf_template_dir", - "autoconfig_exclude_features", - "autoconfig_from_environment", - "autoconfig_include_features", - "autoscaling.cluster.enabled", - "autoscaling.cluster.spot.defaults.min_on_demand_replicas", - "autoscaling.cluster.spot.defaults.percentage", - "autoscaling.cluster.spot.enabled", - "autoscaling.cluster.spot.fallback_duration", - "autoscaling.cluster.spot.rebalance_stabilization_period", - "autoscaling.cluster.spot.schedule_timeout", - "autoscaling.workload.enabled", - "autoscaling.workload.external_recommender.tls.ca_file", - "autoscaling.workload.external_recommender.tls.cert_file", - "autoscaling.workload.external_recommender.tls.key_file", - "autoscaling.workload.in_place_vertical_scaling.enabled", - "autoscaling.workload.limit", - "autoscaling.workload.num_workers", - "azure_hostname_style", - "azure_metadata_api_version", - "azure_metadata_timeout", - "basic_telemetry_add_container_tags", - "batch_max_concurrent_send", - "batch_max_content_size", - "batch_max_size", - "batch_wait", - "bosh_id", - "c_core_dump", - "c_stacktrace_collection", - "ccm_network_config.enabled", - "cel_workload_exclude", - "cf_os_hostname_aliasing", - "check_cancel_timeout", - "check_runner_utilization_monitor_interval", - "check_runner_utilization_threshold", - "check_runner_utilization_warning_cooldown", - "check_runners", - "check_sampler_allow_sketch_bucket_reset", - "check_sampler_bucket_commits_count_expiry", - "check_sampler_context_metrics", - "check_sampler_expire_metrics", - "check_sampler_stateful_metric_expiration_time", - "check_system_probe_startup_time", - "check_system_probe_timeout", - "check_watchdog_warning_timeout", - "checks_ipc_endpoint", - "checks_tag_cardinality", - "clc_runner_enabled", - "clc_runner_host", - "clc_runner_id", - "clc_runner_port", - "clc_runner_remote_tagger_enabled", - "clc_runner_server_readheader_timeout", - "clc_runner_server_write_timeout", - "cloud_foundry", - "cloud_foundry_bbs.ca_file", - "cloud_foundry_bbs.cert_file", - "cloud_foundry_bbs.env_exclude", - "cloud_foundry_bbs.env_include", - "cloud_foundry_bbs.key_file", - "cloud_foundry_bbs.poll_interval", - "cloud_foundry_bbs.url", - "cloud_foundry_buildpack", - "cloud_foundry_cc.apps_batch_size", - "cloud_foundry_cc.client_id", - "cloud_foundry_cc.client_secret", - "cloud_foundry_cc.poll_interval", - "cloud_foundry_cc.skip_ssl_validation", - "cloud_foundry_cc.url", - "cloud_foundry_container_tagger.retry_count", - "cloud_foundry_container_tagger.retry_interval", - "cloud_foundry_container_tagger.shell_path", - "cloud_foundry_garden", - "cloud_foundry_garden.listen_address", - "cloud_foundry_garden.listen_network", - "cloud_provider_account_id", - "cloud_provider_metadata", - "cluster_agent.allow_legacy_tls", - "cluster_agent.appsec.injector.annotations", - "cluster_agent.appsec.injector.base_backoff", - "cluster_agent.appsec.injector.enabled", - "cluster_agent.appsec.injector.istio.namespace", - "cluster_agent.appsec.injector.labels", - "cluster_agent.appsec.injector.max_backoff", - "cluster_agent.appsec.injector.mode", - "cluster_agent.appsec.injector.processor.service.name", - "cluster_agent.appsec.injector.processor.service.namespace", - "cluster_agent.auth_token", - "cluster_agent.client_reconnect_period_seconds", - "cluster_agent.cluster_tagger.grpc_max_message_size", - "cluster_agent.cmd_port", - "cluster_agent.collect_kubernetes_tags", - "cluster_agent.enabled", - "cluster_agent.isolation_segments_tags", - "cluster_agent.kube_metadata_collection.enabled", - "cluster_agent.kube_metadata_collection.resource_annotations_exclude", - "cluster_agent.kube_metadata_collection.resources", - "cluster_agent.kubernetes_resources_collection.deployment_annotations_exclude", - "cluster_agent.kubernetes_resources_collection.pod_annotations_exclude", - "cluster_agent.kubernetes_service_name", - "cluster_agent.language_detection.cleanup.language_ttl", - "cluster_agent.language_detection.cleanup.period", - "cluster_agent.language_detection.patcher.base_backoff", - "cluster_agent.language_detection.patcher.enabled", - "cluster_agent.language_detection.patcher.max_backoff", - "cluster_agent.max_leader_connections", - "cluster_agent.mcp.enabled", - "cluster_agent.mcp.endpoint", - "cluster_agent.refresh_on_cache_miss", - "cluster_agent.serve_nozzle_data", - "cluster_agent.server.idle_timeout_seconds", - "cluster_agent.server.read_timeout_seconds", - "cluster_agent.server.write_timeout_seconds", - "cluster_agent.service_account_name", - "cluster_agent.sidecars_tags", - "cluster_agent.tagging_fallback", - "cluster_agent.token_name", - "cluster_agent.tracing.enabled", - "cluster_agent.tracing.env", - "cluster_agent.tracing.sample_rate", - "cluster_agent.url", - "cluster_checks.advanced_dispatching_enabled", - "cluster_checks.clc_runners_port", - "cluster_checks.cluster_tag_name", - "cluster_checks.crd_collection", - "cluster_checks.enabled", - "cluster_checks.exclude_checks", - "cluster_checks.exclude_checks_from_dispatching", - "cluster_checks.extra_tags", - "cluster_checks.ksm_sharding_enabled", - "cluster_checks.node_expiration_timeout", - "cluster_checks.rebalance_min_percentage_improvement", - "cluster_checks.rebalance_period", - "cluster_checks.rebalance_with_utilization", - "cluster_checks.support_hybrid_ignore_ad_tags", - "cluster_checks.unscheduled_check_threshold", - "cluster_checks.warmup_duration", - "cluster_name", - "cluster_trust_chain.ca_cert_file_path", - "cluster_trust_chain.ca_key_file_path", - "cluster_trust_chain.enable_tls_verification", - "cmd.check.fullsketches", - "cmd_host", - "collect_ccrid", - "collect_ec2_instance_info", - "collect_ec2_tags", - "collect_ec2_tags_use_imds", - "collect_gce_tags", - "collect_gpu_tags", - "collect_kubernetes_events", - "common_root", - "compliance_config", - "compliance_config.check_interval", - "compliance_config.check_max_events_per_run", - "compliance_config.container_exclude", - "compliance_config.container_include", - "compliance_config.database_benchmarks.enabled", - "compliance_config.dir", - "compliance_config.enabled", - "compliance_config.endpoints.additional_endpoints", - "compliance_config.endpoints.batch_max_concurrent_send", - "compliance_config.endpoints.batch_max_content_size", - "compliance_config.endpoints.batch_max_size", - "compliance_config.endpoints.batch_wait", - "compliance_config.endpoints.compression_kind", - "compliance_config.endpoints.compression_level", - "compliance_config.endpoints.connection_reset_interval", - "compliance_config.endpoints.dd_url", - "compliance_config.endpoints.dev_mode_no_ssl", - "compliance_config.endpoints.input_chan_size", - "compliance_config.endpoints.logs_dd_url", - "compliance_config.endpoints.logs_no_ssl", - "compliance_config.endpoints.sender_backoff_base", - "compliance_config.endpoints.sender_backoff_factor", - "compliance_config.endpoints.sender_backoff_max", - "compliance_config.endpoints.sender_recovery_interval", - "compliance_config.endpoints.sender_recovery_reset", - "compliance_config.endpoints.use_compression", - "compliance_config.endpoints.use_v2_api", - "compliance_config.endpoints.zstd_compression_level", - "compliance_config.exclude_pause_container", - "compliance_config.host_benchmarks.enabled", - "compliance_config.metrics.enabled", - "compliance_config.opa.metrics.enabled", - "compliance_config.run_commands_as", - "compliance_config.run_in_system_probe", - "compliance_config.xccdf.enabled", - "compression_kind", - "compression_level", - "conf_path", - "confd_path", - "config_id", - "config_providers", - "config_providers.ca_file", - "config_providers.ca_path", - "config_providers.cert_file", - "config_providers.grace_time_seconds", - "config_providers.key_file", - "config_providers.password", - "config_providers.polling", - "config_providers.template_dir", - "config_providers.template_url", - "config_providers.token", - "config_providers.username", - "connection_reset_interval", - "container_env_as_tags", - "container_exclude", - "container_exclude_logs", - "container_exclude_metrics", - "container_exclude_stopped_age", - "container_image.additional_endpoints", - "container_image.batch_max_concurrent_send", - "container_image.batch_max_content_size", - "container_image.batch_max_size", - "container_image.batch_wait", - "container_image.compression_kind", - "container_image.compression_level", - "container_image.connection_reset_interval", - "container_image.dd_url", - "container_image.dev_mode_no_ssl", - "container_image.enabled", - "container_image.input_chan_size", - "container_image.logs_dd_url", - "container_image.logs_no_ssl", - "container_image.sender_backoff_base", - "container_image.sender_backoff_factor", - "container_image.sender_backoff_max", - "container_image.sender_recovery_interval", - "container_image.sender_recovery_reset", - "container_image.use_compression", - "container_image.use_v2_api", - "container_image.zstd_compression_level", - "container_include", - "container_include_logs", - "container_include_metrics", - "container_labels_as_tags", - "container_lifecycle.additional_endpoints", - "container_lifecycle.batch_max_concurrent_send", - "container_lifecycle.batch_max_content_size", - "container_lifecycle.batch_max_size", - "container_lifecycle.batch_wait", - "container_lifecycle.compression_kind", - "container_lifecycle.compression_level", - "container_lifecycle.connection_reset_interval", - "container_lifecycle.dd_url", - "container_lifecycle.dev_mode_no_ssl", - "container_lifecycle.enabled", - "container_lifecycle.input_chan_size", - "container_lifecycle.logs_dd_url", - "container_lifecycle.logs_no_ssl", - "container_lifecycle.sender_backoff_base", - "container_lifecycle.sender_backoff_factor", - "container_lifecycle.sender_backoff_max", - "container_lifecycle.sender_recovery_interval", - "container_lifecycle.sender_recovery_reset", - "container_lifecycle.use_compression", - "container_lifecycle.use_v2_api", - "container_lifecycle.zstd_compression_level", - "container_pid_mapper", - "containerd_exclude_namespaces", - "containerd_namespace", - "containerd_namespaces", - "convert_dd_site_fqdn.enabled", - "core_agent.enabled", - "csi.driver", - "csi.enabled", - "data_observability.forwarder.additional_endpoints", - "data_observability.forwarder.batch_max_concurrent_send", - "data_observability.forwarder.batch_max_content_size", - "data_observability.forwarder.batch_max_size", - "data_observability.forwarder.batch_wait", - "data_observability.forwarder.compression_kind", - "data_observability.forwarder.compression_level", - "data_observability.forwarder.connection_reset_interval", - "data_observability.forwarder.dd_url", - "data_observability.forwarder.dev_mode_no_ssl", - "data_observability.forwarder.input_chan_size", - "data_observability.forwarder.logs_dd_url", - "data_observability.forwarder.logs_no_ssl", - "data_observability.forwarder.sender_backoff_base", - "data_observability.forwarder.sender_backoff_factor", - "data_observability.forwarder.sender_backoff_max", - "data_observability.forwarder.sender_recovery_interval", - "data_observability.forwarder.sender_recovery_reset", - "data_observability.forwarder.use_compression", - "data_observability.forwarder.use_v2_api", - "data_observability.forwarder.zstd_compression_level", - "data_observability.query_actions.enabled", - "data_plane.checks.enabled", - "data_plane.log_file", - "data_plane.otlp.enabled", - "data_plane.otlp.proxy.enabled", - "data_plane.otlp.proxy.logs.enabled", - "data_plane.otlp.proxy.metrics.enabled", - "data_plane.otlp.proxy.receiver.protocols.grpc.endpoint", - "data_plane.otlp.proxy.traces.enabled", - "data_streams.forwarder.additional_endpoints", - "data_streams.forwarder.batch_max_concurrent_send", - "data_streams.forwarder.batch_max_content_size", - "data_streams.forwarder.batch_max_size", - "data_streams.forwarder.batch_wait", - "data_streams.forwarder.compression_kind", - "data_streams.forwarder.compression_level", - "data_streams.forwarder.connection_reset_interval", - "data_streams.forwarder.dd_url", - "data_streams.forwarder.dev_mode_no_ssl", - "data_streams.forwarder.input_chan_size", - "data_streams.forwarder.logs_dd_url", - "data_streams.forwarder.logs_no_ssl", - "data_streams.forwarder.sender_backoff_base", - "data_streams.forwarder.sender_backoff_factor", - "data_streams.forwarder.sender_backoff_max", - "data_streams.forwarder.sender_recovery_interval", - "data_streams.forwarder.sender_recovery_reset", - "data_streams.forwarder.use_compression", - "data_streams.forwarder.use_v2_api", - "data_streams.forwarder.zstd_compression_level", - "database_monitoring.activity.additional_endpoints", - "database_monitoring.activity.batch_max_concurrent_send", - "database_monitoring.activity.batch_max_content_size", - "database_monitoring.activity.batch_max_size", - "database_monitoring.activity.batch_wait", - "database_monitoring.activity.compression_kind", - "database_monitoring.activity.compression_level", - "database_monitoring.activity.connection_reset_interval", - "database_monitoring.activity.dd_url", - "database_monitoring.activity.dev_mode_no_ssl", - "database_monitoring.activity.input_chan_size", - "database_monitoring.activity.logs_dd_url", - "database_monitoring.activity.logs_no_ssl", - "database_monitoring.activity.sender_backoff_base", - "database_monitoring.activity.sender_backoff_factor", - "database_monitoring.activity.sender_backoff_max", - "database_monitoring.activity.sender_recovery_interval", - "database_monitoring.activity.sender_recovery_reset", - "database_monitoring.activity.use_compression", - "database_monitoring.activity.use_v2_api", - "database_monitoring.activity.zstd_compression_level", - "database_monitoring.autodiscovery.aurora.dbm_tag", - "database_monitoring.autodiscovery.aurora.discovery_interval", - "database_monitoring.autodiscovery.aurora.enabled", - "database_monitoring.autodiscovery.aurora.global_view_db_tag", - "database_monitoring.autodiscovery.aurora.query_timeout", - "database_monitoring.autodiscovery.aurora.region", - "database_monitoring.autodiscovery.aurora.tags", - "database_monitoring.autodiscovery.rds.dbm_tag", - "database_monitoring.autodiscovery.rds.discovery_interval", - "database_monitoring.autodiscovery.rds.enabled", - "database_monitoring.autodiscovery.rds.global_view_db_tag", - "database_monitoring.autodiscovery.rds.query_timeout", - "database_monitoring.autodiscovery.rds.region", - "database_monitoring.autodiscovery.rds.tags", - "database_monitoring.metrics.additional_endpoints", - "database_monitoring.metrics.batch_max_concurrent_send", - "database_monitoring.metrics.batch_max_content_size", - "database_monitoring.metrics.batch_max_size", - "database_monitoring.metrics.batch_wait", - "database_monitoring.metrics.compression_kind", - "database_monitoring.metrics.compression_level", - "database_monitoring.metrics.connection_reset_interval", - "database_monitoring.metrics.dd_url", - "database_monitoring.metrics.dev_mode_no_ssl", - "database_monitoring.metrics.input_chan_size", - "database_monitoring.metrics.logs_dd_url", - "database_monitoring.metrics.logs_no_ssl", - "database_monitoring.metrics.sender_backoff_base", - "database_monitoring.metrics.sender_backoff_factor", - "database_monitoring.metrics.sender_backoff_max", - "database_monitoring.metrics.sender_recovery_interval", - "database_monitoring.metrics.sender_recovery_reset", - "database_monitoring.metrics.use_compression", - "database_monitoring.metrics.use_v2_api", - "database_monitoring.metrics.zstd_compression_level", - "database_monitoring.samples.additional_endpoints", - "database_monitoring.samples.batch_max_concurrent_send", - "database_monitoring.samples.batch_max_content_size", - "database_monitoring.samples.batch_max_size", - "database_monitoring.samples.batch_wait", - "database_monitoring.samples.compression_kind", - "database_monitoring.samples.compression_level", - "database_monitoring.samples.connection_reset_interval", - "database_monitoring.samples.dd_url", - "database_monitoring.samples.dev_mode_no_ssl", - "database_monitoring.samples.input_chan_size", - "database_monitoring.samples.logs_dd_url", - "database_monitoring.samples.logs_no_ssl", - "database_monitoring.samples.sender_backoff_base", - "database_monitoring.samples.sender_backoff_factor", - "database_monitoring.samples.sender_backoff_max", - "database_monitoring.samples.sender_recovery_interval", - "database_monitoring.samples.sender_recovery_reset", - "database_monitoring.samples.use_compression", - "database_monitoring.samples.use_v2_api", - "database_monitoring.samples.zstd_compression_level", - "datadog.agent.running", - "default_integration_http_timeout", - "delegated_auth.aws.region", - "delegated_auth.org_uuid", - "delegated_auth.provider", - "delegated_auth.refresh_interval_mins", - "dev_mode_no_ssl", - "disable_cluster_name_tag_key", - "disable_file_logging", - "disable_py3_validation", - "disable_unsafe_yaml", - "discovery.cpu_usage_update_delay", - "discovery.enabled", - "discovery.service_collection_interval", - "discovery.service_map.enabled", - "discovery.use_system_probe_lite", - "disk_check.use_core_loader", - "djm_config.enabled", - "docker_env_as_tags", - "docker_labels_as_tags", - "docker_query_timeout", - "dogstatsd_host_socket_path", - "dynamic_instrumentation.circuit_breaker.all_probes_cpu_limit", - "dynamic_instrumentation.circuit_breaker.interrupt_overhead", - "dynamic_instrumentation.circuit_breaker.interval", - "dynamic_instrumentation.circuit_breaker.per_probe_cpu_limit", - "dynamic_instrumentation.debug_info_disk_cache.dir", - "dynamic_instrumentation.debug_info_disk_cache.enabled", - "dynamic_instrumentation.debug_info_disk_cache.max_total_bytes", - "dynamic_instrumentation.debug_info_disk_cache.required_disk_space_bytes", - "dynamic_instrumentation.debug_info_disk_cache.required_disk_space_percent", - "dynamic_instrumentation.diagnostics_output_file_path", - "dynamic_instrumentation.enabled", - "dynamic_instrumentation.offline_mode", - "dynamic_instrumentation.probes_file_path", - "dynamic_instrumentation.snapshot_output_file_path", - "dynamic_instrumentation.symdb_upload_enabled", - "ebpf_check.enabled", - "ebpf_check.entry_count.entries_for_iteration_restart_detection", - "ebpf_check.entry_count.max_keys_buffer_size_bytes", - "ebpf_check.entry_count.max_restarts", - "ebpf_check.entry_count.max_values_buffer_size_bytes", - "ebpf_check.kernel_bpf_stats", - "ec2_imdsv2_transition_payload_enabled", - "ec2_metadata_timeout", - "ec2_metadata_token_lifetime", - "ec2_prefer_imdsv2", - "ec2_prioritize_instance_id_as_hostname", - "ec2_use_dmi", - "ec2_use_windows_prefix_detection", - "ecs_agent_container_name", - "ecs_agent_url", - "ecs_collect_resource_tags_ec2", - "ecs_deployment_mode", - "ecs_metadata_retry_initial_interval", - "ecs_metadata_retry_max_elapsed_time", - "ecs_metadata_retry_timeout_factor", - "ecs_metadata_timeout", - "ecs_resource_tags_replace_colon", - "ecs_task_cache_ttl", - "ecs_task_collection_burst", - "ecs_task_collection_enabled", - "ecs_task_collection_rate", - "eks_fargate", - "enable_cluster_agent_metadata_collection", - "enable_gohai", - "enable_metadata_collection", - "enable_payloads", - "enable_payloads.events", - "enable_payloads.json_to_v1_intake", - "enable_payloads.series", - "enable_payloads.service_checks", - "enable_payloads.sketches", - "enable_signing_metadata_collection", - "enabled_rfc1123_compliant_cluster_name_tag", - "enhanced_metrics", - "event_management.forwarder.additional_endpoints", - "event_management.forwarder.batch_max_concurrent_send", - "event_management.forwarder.batch_max_content_size", - "event_management.forwarder.batch_max_size", - "event_management.forwarder.batch_wait", - "event_management.forwarder.compression_kind", - "event_management.forwarder.compression_level", - "event_management.forwarder.connection_reset_interval", - "event_management.forwarder.dd_url", - "event_management.forwarder.dev_mode_no_ssl", - "event_management.forwarder.input_chan_size", - "event_management.forwarder.logs_dd_url", - "event_management.forwarder.logs_no_ssl", - "event_management.forwarder.sender_backoff_base", - "event_management.forwarder.sender_backoff_factor", - "event_management.forwarder.sender_backoff_max", - "event_management.forwarder.sender_recovery_interval", - "event_management.forwarder.sender_recovery_reset", - "event_management.forwarder.use_compression", - "event_management.forwarder.use_v2_api", - "event_management.forwarder.zstd_compression_level", - "event_monitoring_config.capabilities_monitoring.enabled", - "event_monitoring_config.capabilities_monitoring.period", - "event_monitoring_config.custom_sensitive_regexps", - "event_monitoring_config.custom_sensitive_words", - "event_monitoring_config.dentry_cache_size", - "event_monitoring_config.dns_resolution.cache_size", - "event_monitoring_config.dns_resolution.enabled", - "event_monitoring_config.enable_all_probes", - "event_monitoring_config.enable_approvers", - "event_monitoring_config.enable_discarders", - "event_monitoring_config.enable_kernel_filters", - "event_monitoring_config.env_vars_resolution.enabled", - "event_monitoring_config.envs_with_value", - "event_monitoring_config.erpc_dentry_resolution_enabled", - "event_monitoring_config.event_stream.buffer_size", - "event_monitoring_config.event_stream.kretprobe_max_active", - "event_monitoring_config.event_stream.use_fentry", - "event_monitoring_config.event_stream.use_kprobe_fallback", - "event_monitoring_config.event_stream.use_ring_buffer", - "event_monitoring_config.events_stats.polling_interval", - "event_monitoring_config.events_stats.tags_cardinality", - "event_monitoring_config.flush_discarder_window", - "event_monitoring_config.map_dentry_resolution_enabled", - "event_monitoring_config.network.classifier_handle", - "event_monitoring_config.network.classifier_priority", - "event_monitoring_config.network.enabled", - "event_monitoring_config.network.extra_private_ip_ranges", - "event_monitoring_config.network.flow_monitor.enabled", - "event_monitoring_config.network.flow_monitor.period", - "event_monitoring_config.network.flow_monitor.sk_storage.enabled", - "event_monitoring_config.network.ingress.enabled", - "event_monitoring_config.network.lazy_interface_prefixes", - "event_monitoring_config.network.private_ip_ranges", - "event_monitoring_config.network.raw_classifier_handle", - "event_monitoring_config.network.raw_packet.enabled", - "event_monitoring_config.network.raw_packet.filter", - "event_monitoring_config.network.raw_packet.limiter_rate", - "event_monitoring_config.network_process.container_store.enabled", - "event_monitoring_config.network_process.container_store.max_containers_tracked", - "event_monitoring_config.network_process.enabled", - "event_monitoring_config.network_process.max_processes_tracked", - "event_monitoring_config.pid_cache_size", - "event_monitoring_config.runtime_compilation.enabled", - "event_monitoring_config.snapshot_using_listmount", - "event_monitoring_config.span_tracking.cache_size", - "event_monitoring_config.span_tracking.enabled", - "event_monitoring_config.syscalls_monitor.enabled", - "evp_proxy_config.additional_endpoints", - "evp_proxy_config.api_key", - "evp_proxy_config.dd_url", - "evp_proxy_config.delegated_auth.aws.region", - "evp_proxy_config.delegated_auth.org_uuid", - "evp_proxy_config.delegated_auth.provider", - "evp_proxy_config.delegated_auth.refresh_interval_mins", - "evp_proxy_config.enabled", - "evp_proxy_config.max_payload_size", - "evp_proxy_config.receiver_timeout", - "exclude_ec2_tags", - "exclude_gce_tags", - "exclude_pause_container", - "expvar_port", - "external_metrics.aggregator", - "external_metrics_provider.api_key", - "external_metrics_provider.app_key", - "external_metrics_provider.batch_window", - "external_metrics_provider.bucket_size", - "external_metrics_provider.chunk_size", - "external_metrics_provider.config", - "external_metrics_provider.enable_datadogmetric_autogen", - "external_metrics_provider.enabled", - "external_metrics_provider.endpoint", - "external_metrics_provider.endpoints", - "external_metrics_provider.local_copy_refresh_rate", - "external_metrics_provider.max_age", - "external_metrics_provider.max_parallel_queries", - "external_metrics_provider.max_time_window", - "external_metrics_provider.num_workers", - "external_metrics_provider.port", - "external_metrics_provider.query_validity_period", - "external_metrics_provider.refresh_period", - "external_metrics_provider.rollup", - "external_metrics_provider.split_batches_with_backoff", - "external_metrics_provider.use_datadogmetric_crd", - "external_metrics_provider.wpa_controller", - "extra_config_providers", - "extra_listeners", - "fips", - "fips.enabled", - "fips.https", - "fips.local_address", - "fips.port_range_start", - "fips.tls_verify", - "flare.profile_overhead_runtime", - "flare.rc_profiling.blocking_rate", - "flare.rc_profiling.mutex_fraction", - "flare.rc_profiling.profile_duration", - "flare.rc_streamlogs.duration", - "flare_provider_timeout", - "flare_stripped_keys", - "fleet_layers", - "fleet_policies_dir", - "gce_metadata_timeout", - "gce_send_project_id_tag", - "go_core_dump", - "gpu.disabled_collectors", - "gpu.enabled", - "gpu.integrate_with_workloadmeta_processes", - "gpu.nccl.enabled", - "gpu.nccl.host_socket_path", - "gpu.nccl.socket_path", - "gpu.nvml_lib_path", - "gpu.sp_process_metrics_request_timeout", - "gpu.use_sp_process_metrics", - "gpu.workload_tag_cache_size", - "gpu_monitoring.attacher_detailed_logs", - "gpu_monitoring.cgroup_reapply_infinitely", - "gpu_monitoring.cgroup_reapply_interval", - "gpu_monitoring.configure_cgroup_perms", - "gpu_monitoring.device_cache_refresh_interval", - "gpu_monitoring.enable_ebpf_probes", - "gpu_monitoring.enable_fatbin_parsing", - "gpu_monitoring.enabled", - "gpu_monitoring.fatbin_request_queue_size", - "gpu_monitoring.initial_process_sync", - "gpu_monitoring.nvml_lib_path", - "gpu_monitoring.prm_endpoint_enabled", - "gpu_monitoring.process_scan_interval_seconds", - "gpu_monitoring.ring_buffer_pages_per_device", - "gpu_monitoring.ringbuffer_flush_interval", - "gpu_monitoring.ringbuffer_wakeup_size", - "gpu_monitoring.streams.max_active", - "gpu_monitoring.streams.max_kernel_launches", - "gpu_monitoring.streams.max_mem_alloc_events", - "gpu_monitoring.streams.max_pending_kernel_spans", - "gpu_monitoring.streams.max_pending_memory_spans", - "gpu_monitoring.streams.timeout_seconds", - "ha_agent", - "ha_agent.enabled", - "ha_agent.group", - "health_platform.enabled", - "health_platform.forwarder.interval", - "health_platform.persist_on_kubernetes", - "health_port", - "host_aliases", - "hostname_drift_initial_delay", - "hostname_drift_recurring_interval", - "hostname_file", - "hostname_force_config_as_canonical", - "hostname_fqdn", - "hostname_trust_uts_namespace", - "hostprofiler.additional_http_headers", - "hostprofiler.ddprofiling.enabled", - "hostprofiler.ddprofiling.period", - "hostprofiler.debug.verbosity", - "hostprofiler.health_metrics.enabled", - "hostprofiler.health_metrics.target", - "hostprofiler.hpflare.port", - "hpa_configmap_name", - "hpa_watcher_gc_period", - "hpa_watcher_polling_freq", - "http_dial_fallback_delay", - "ibm_metadata_timeout", - "ignore_autoconf", - "ignore_host_etc", - "include_ephemeral_containers", - "infrastructure_mode", - "injector.enable_telemetry", - "input_chan_size", - "installer.gc_interval", - "installer.mirror", - "installer.refresh_interval", - "installer.registry.auth", - "installer.registry.password", - "installer.registry.url", - "installer.registry.username", - "instrumentation_crd_controller.enabled", - "integration.additional", - "integration.basic.allowed", - "integration.enabled", - "integration.end_user_device.allowed", - "integration.excluded", - "integration.full.allowed", - "integration_check_status_enabled", - "integration_file_paths_allowlist", - "integration_ignore_untrusted_file_params", - "integration_profiling", - "integration_security_excluded_checks", - "integration_tracing", - "integration_tracing_exhaustive", - "integration_trusted_providers", - "internal_profiling.block_profile_rate", - "internal_profiling.capture_all_allocations", - "internal_profiling.cpu_duration", - "internal_profiling.custom_attributes", - "internal_profiling.delta_profiles", - "internal_profiling.enable_block_profiling", - "internal_profiling.enable_goroutine_stacktraces", - "internal_profiling.enable_mutex_profiling", - "internal_profiling.enabled", - "internal_profiling.extra_tags", - "internal_profiling.mutex_profile_fraction", - "internal_profiling.period", - "internal_profiling.profile_dd_url", - "internal_profiling.unix_socket", - "inventories_checks_configuration_enabled", - "inventories_collect_cloud_provider_account_id", - "inventories_configuration_enabled", - "inventories_diagnostics_enabled", - "inventories_enabled", - "inventories_first_run_delay", - "inventories_max_interval", - "inventories_min_interval", - "iot_host", - "ipc_address", - "jmx_check_period", - "jmx_collection_timeout", - "jmx_custom_jars", - "jmx_java_tool_options", - "jmx_log_file", - "jmx_max_ram_percentage", - "jmx_max_restarts", - "jmx_reconnection_thread_pool_size", - "jmx_reconnection_timeout", - "jmx_restart_interval", - "jmx_statsd_client_buffer_size", - "jmx_statsd_client_queue_size", - "jmx_statsd_client_socket_timeout", - "jmx_statsd_client_use_non_blocking", - "jmx_statsd_telemetry_enabled", - "jmx_telemetry_enabled", - "jmx_thread_pool_size", - "jmx_use_cgroup_memory_limit", - "jmx_use_container_support", - "kube_cache_sync_timeout_seconds", - "kube_resources_namespace", - "kubeactions.enabled", - "kubelet_auth_token_path", - "kubelet_cache_pods_duration", - "kubelet_client_ca", - "kubelet_client_crt", - "kubelet_client_key", - "kubelet_collector_pull_interval", - "kubelet_core_check_enabled", - "kubelet_tls_verify", - "kubelet_use_api_server", - "kubernetes_ad_tags_disabled", - "kubernetes_apiserver_ca_path", - "kubernetes_apiserver_client_timeout", - "kubernetes_apiserver_informer_client_timeout", - "kubernetes_apiserver_tls_verify", - "kubernetes_apiserver_use_protobuf", - "kubernetes_collect_metadata_tags", - "kubernetes_event_collection_timeout", - "kubernetes_events_source_detection.enabled", - "kubernetes_http_kubelet_port", - "kubernetes_https_kubelet_port", - "kubernetes_informers_resync_period", - "kubernetes_kube_service_ignore_readiness", - "kubernetes_kubeconfig_path", - "kubernetes_kubelet_deviceplugins_cache_duration", - "kubernetes_kubelet_deviceplugins_socketdir", - "kubernetes_kubelet_host", - "kubernetes_kubelet_nodename", - "kubernetes_kubelet_podresources_socket", - "kubernetes_map_services_on_ip", - "kubernetes_metadata_streaming", - "kubernetes_metadata_tag_update_freq", - "kubernetes_namespace_annotations_as_tags", - "kubernetes_namespace_labels_as_tags", - "kubernetes_node_annotations_as_host_aliases", - "kubernetes_node_annotations_as_tags", - "kubernetes_node_label_as_cluster_name", - "kubernetes_node_labels_as_tags", - "kubernetes_persistent_volume_claims_as_tags", - "kubernetes_pod_annotations_as_tags", - "kubernetes_pod_expiration_duration", - "kubernetes_pod_labels_as_tags", - "kubernetes_resources_annotations_as_tags", - "kubernetes_resources_labels_as_tags", - "kubernetes_use_endpoint_slices", - "language_detection.enabled", - "language_detection.reporting.buffer_period", - "language_detection.reporting.enabled", - "language_detection.reporting.refresh_period", - "leader_election", - "leader_election_default_resource", - "leader_election_release_on_shutdown", - "leader_lease_duration", - "leader_lease_name", - "listeners", - "log_all_goroutines_when_unhealthy", - "log_enabled", - "logon_duration.enabled", - "logs_config", - "logs_config.add_logsource_tag", - "logs_config.additional_endpoints", - "logs_config.aggregation_timeout", - "logs_config.api_key", - "logs_config.atomic_registry_write", - "logs_config.auditor_ttl", - "logs_config.auto_multi_line.enable_datetime_detection", - "logs_config.auto_multi_line.enable_json_aggregation", - "logs_config.auto_multi_line.enable_json_detection", - "logs_config.auto_multi_line.pattern_table_match_threshold", - "logs_config.auto_multi_line.pattern_table_max_size", - "logs_config.auto_multi_line.tag_aggregated_json", - "logs_config.auto_multi_line.timestamp_detector_match_threshold", - "logs_config.auto_multi_line.tokenizer_max_input_bytes", - "logs_config.auto_multi_line_default_match_threshold", - "logs_config.auto_multi_line_default_match_timeout", - "logs_config.auto_multi_line_default_sample_size", - "logs_config.auto_multi_line_detection", - "logs_config.auto_multi_line_detection_custom_samples", - "logs_config.auto_multi_line_detection_tagging", - "logs_config.auto_multi_line_extra_patterns", - "logs_config.batch_max_concurrent_send", - "logs_config.batch_max_content_size", - "logs_config.batch_max_size", - "logs_config.batch_wait", - "logs_config.close_timeout", - "logs_config.compression_kind", - "logs_config.compression_level", - "logs_config.connection_reset_interval", - "logs_config.container_collect_all", - "logs_config.container_runtime_waiting_timeout", - "logs_config.dd_port", - "logs_config.dd_url", - "logs_config.dd_url_443", - "logs_config.delegated_auth.aws.region", - "logs_config.delegated_auth.org_uuid", - "logs_config.delegated_auth.provider", - "logs_config.delegated_auth.refresh_interval_mins", - "logs_config.dev_mode_no_ssl", - "logs_config.dev_mode_use_proto", - "logs_config.disable_distributed_senders", - "logs_config.docker_client_read_timeout", - "logs_config.docker_container_force_use_file", - "logs_config.docker_container_use_file", - "logs_config.docker_path_override", - "logs_config.enable_recursive_glob", - "logs_config.expected_tags_duration", - "logs_config.experimental_adaptive_sampling.burst_size", - "logs_config.experimental_adaptive_sampling.enabled", - "logs_config.experimental_adaptive_sampling.exclude", - "logs_config.experimental_adaptive_sampling.include", - "logs_config.experimental_adaptive_sampling.match_threshold", - "logs_config.experimental_adaptive_sampling.max_patterns", - "logs_config.experimental_adaptive_sampling.protect_important_logs", - "logs_config.experimental_adaptive_sampling.rate_limit", - "logs_config.experimental_adaptive_sampling.tokenizer_max_input_bytes", - "logs_config.file_scan_period", - "logs_config.file_wildcard_selection_mode", - "logs_config.fingerprint_config.count", - "logs_config.fingerprint_config.count_to_skip", - "logs_config.fingerprint_config.fingerprint_strategy", - "logs_config.fingerprint_config.max_bytes", - "logs_config.force_auto_multi_line_detection_v1", - "logs_config.force_use_http", - "logs_config.force_use_tcp", - "logs_config.frame_size", - "logs_config.http_connectivity_retry_interval_max", - "logs_config.http_protocol", - "logs_config.http_timeout", - "logs_config.input_chan_size", - "logs_config.integrations_logs_disk_ratio", - "logs_config.integrations_logs_files_max_size", - "logs_config.integrations_logs_total_usage", - "logs_config.k8s_container_use_file", - "logs_config.k8s_container_use_kubelet_api", - "logs_config.kubelet_api_client_read_timeout", - "logs_config.logs_dd_url", - "logs_config.logs_no_ssl", - "logs_config.max_message_size_bytes", - "logs_config.message_channel_size", - "logs_config.open_files_limit", - "logs_config.payload_channel_size", - "logs_config.pipeline_failover.enabled", - "logs_config.pipeline_failover.router_channel_size", - "logs_config.pipelines", - "logs_config.process_exclude_agent", - "logs_config.processing_rules", - "logs_config.processing_rules.name", - "logs_config.processing_rules.pattern", - "logs_config.run_path", - "logs_config.sender_backoff_base", - "logs_config.sender_backoff_factor", - "logs_config.sender_backoff_max", - "logs_config.sender_recovery_interval", - "logs_config.sender_recovery_reset", - "logs_config.socks5_proxy_address", - "logs_config.stop_grace_period", - "logs_config.streaming", - "logs_config.streaming.streamlogs_log_file", - "logs_config.tag_multi_line_logs", - "logs_config.tag_truncated_logs", - "logs_config.tagger_warmup_duration", - "logs_config.use_compression", - "logs_config.use_container_timestamp", - "logs_config.use_http", - "logs_config.use_podman_logs", - "logs_config.use_port_443", - "logs_config.use_sourcehost_tag", - "logs_config.use_tcp", - "logs_config.use_v2_api", - "logs_config.validate_pod_container_id", - "logs_config.windows_open_file_timeout", - "logs_config.zstd_compression_level", - "logs_dd_url", - "logs_enabled", - "logs_no_ssl", - "memtrack_enabled", - "metadata_endpoints_max_hostname_size", - "metadata_ip_resolution_from_hostname", - "metadata_provider_stop_timeout", - "metadata_providers", - "metadata_providers.interval", - "metric_tag_filterlist_adp_only", - "metrics_port", - "multi_region_failover.api_key", - "multi_region_failover.dd_url", - "multi_region_failover.failover_apm", - "multi_region_failover.failover_logs", - "multi_region_failover.logs_service_allowlist", - "multi_region_failover.remote_configuration.clients.cache_bypass_limit", - "multi_region_failover.remote_configuration.clients.ttl_seconds", - "multi_region_failover.remote_configuration.config_root", - "multi_region_failover.remote_configuration.director_root", - "multi_region_failover.remote_configuration.key", - "multi_region_failover.remote_configuration.max_backoff_interval", - "multi_region_failover.remote_configuration.max_backoff_time", - "multi_region_failover.remote_configuration.org_status_refresh_interval", - "multi_region_failover.remote_configuration.refresh_interval", - "multi_region_failover.site", - "multi_secret_backends", - "network.id", - "network_check.use_core_loader", - "network_config.allow_netlink_conntracker_fallback", - "network_config.cert_collection_map_cleaner_interval", - "network_config.closed_buffer_wakeup_count", - "network_config.closed_channel_size", - "network_config.closed_connection_flush_threshold", - "network_config.collect_tcp_v4", - "network_config.collect_tcp_v6", - "network_config.collect_udp_v4", - "network_config.collect_udp_v6", - "network_config.conntrack_init_timeout", - "network_config.direct_send", - "network_config.dns_monitoring_ports", - "network_config.dns_recorded_query_types", - "network_config.enable_cert_collection", - "network_config.enable_cilium_lb_conntracker", - "network_config.enable_co_re", - "network_config.enable_connection_rollup", - "network_config.enable_custom_batching", - "network_config.enable_dns_by_querytype", - "network_config.enable_ebpf_conntracker", - "network_config.enable_ebpfless", - "network_config.enable_fentry", - "network_config.enable_gateway_lookup", - "network_config.enable_http_monitoring", - "network_config.enable_https_monitoring", - "network_config.enable_protocol_classification", - "network_config.enable_ringbuffers", - "network_config.enable_root_netns", - "network_config.enable_sk_tracer", - "network_config.enable_tcp_failed_connections", - "network_config.enabled", - "network_config.http_max_request_fragment", - "network_config.http_notification_threshold", - "network_config.http_replace_rules", - "network_config.ignore_conntrack_init_failure", - "network_config.max_failed_connections_buffered", - "network_config.max_http_stats_buffered", - "network_config.max_tracked_http_connections", - "network_config_management.forwarder.additional_endpoints", - "network_config_management.forwarder.batch_max_concurrent_send", - "network_config_management.forwarder.batch_max_content_size", - "network_config_management.forwarder.batch_max_size", - "network_config_management.forwarder.batch_wait", - "network_config_management.forwarder.compression_kind", - "network_config_management.forwarder.compression_level", - "network_config_management.forwarder.connection_reset_interval", - "network_config_management.forwarder.dd_url", - "network_config_management.forwarder.dev_mode_no_ssl", - "network_config_management.forwarder.input_chan_size", - "network_config_management.forwarder.logs_dd_url", - "network_config_management.forwarder.logs_no_ssl", - "network_config_management.forwarder.sender_backoff_base", - "network_config_management.forwarder.sender_backoff_factor", - "network_config_management.forwarder.sender_backoff_max", - "network_config_management.forwarder.sender_recovery_interval", - "network_config_management.forwarder.sender_recovery_reset", - "network_config_management.forwarder.use_compression", - "network_config_management.forwarder.use_v2_api", - "network_config_management.forwarder.zstd_compression_level", - "network_config_management.rollback.enabled", - "network_devices", - "network_devices.autodiscovery", - "network_devices.autodiscovery.allowed_failures", - "network_devices.autodiscovery.collect_device_metadata", - "network_devices.autodiscovery.collect_topology", - "network_devices.autodiscovery.collect_vpn", - "network_devices.autodiscovery.configs", - "network_devices.autodiscovery.configs.ad_identifier", - "network_devices.autodiscovery.configs.authentications", - "network_devices.autodiscovery.configs.authentications.authKey", - "network_devices.autodiscovery.configs.authentications.authProtocol", - "network_devices.autodiscovery.configs.authentications.community_string", - "network_devices.autodiscovery.configs.authentications.context_name", - "network_devices.autodiscovery.configs.authentications.privKey", - "network_devices.autodiscovery.configs.authentications.privProtocol", - "network_devices.autodiscovery.configs.authentications.user", - "network_devices.autodiscovery.configs.ignored_ip_addresses", - "network_devices.autodiscovery.configs.interface_config", - "network_devices.autodiscovery.configs.interface_config.disabled", - "network_devices.autodiscovery.configs.interface_config.in_speed", - "network_devices.autodiscovery.configs.interface_config.match_value", - "network_devices.autodiscovery.configs.interface_config.out_speed", - "network_devices.autodiscovery.configs.interface_config.tags", - "network_devices.autodiscovery.configs.loader", - "network_devices.autodiscovery.configs.min_collection_interval", - "network_devices.autodiscovery.configs.oid_batch_size", - "network_devices.autodiscovery.configs.ping", - "network_devices.autodiscovery.configs.ping.count", - "network_devices.autodiscovery.configs.ping.enabled", - "network_devices.autodiscovery.configs.ping.interval", - "network_devices.autodiscovery.configs.ping.linux", - "network_devices.autodiscovery.configs.ping.timeout", - "network_devices.autodiscovery.configs.ping.use_raw_socket", - "network_devices.autodiscovery.configs.port", - "network_devices.autodiscovery.configs.tags", - "network_devices.autodiscovery.configs.use_device_id_as_hostname", - "network_devices.autodiscovery.discovery_allowed_failures", - "network_devices.autodiscovery.discovery_interval", - "network_devices.autodiscovery.loader", - "network_devices.autodiscovery.min_collection_interval", - "network_devices.autodiscovery.namespace", - "network_devices.autodiscovery.oid_batch_size", - "network_devices.autodiscovery.ping", - "network_devices.autodiscovery.ping.count", - "network_devices.autodiscovery.ping.enabled", - "network_devices.autodiscovery.ping.interval", - "network_devices.autodiscovery.ping.linux", - "network_devices.autodiscovery.ping.linux.use_raw_socket", - "network_devices.autodiscovery.ping.timeout", - "network_devices.autodiscovery.retries", - "network_devices.autodiscovery.timeout", - "network_devices.autodiscovery.use_deduplication", - "network_devices.autodiscovery.use_device_id_as_hostname", - "network_devices.autodiscovery.workers", - "network_devices.default_scan", - "network_devices.default_scan.enabled", - "network_devices.default_scan.excluded_ips", - "network_devices.metadata.additional_endpoints", - "network_devices.metadata.batch_max_concurrent_send", - "network_devices.metadata.batch_max_content_size", - "network_devices.metadata.batch_max_size", - "network_devices.metadata.batch_wait", - "network_devices.metadata.compression_kind", - "network_devices.metadata.compression_level", - "network_devices.metadata.connection_reset_interval", - "network_devices.metadata.dd_url", - "network_devices.metadata.dev_mode_no_ssl", - "network_devices.metadata.input_chan_size", - "network_devices.metadata.logs_dd_url", - "network_devices.metadata.logs_no_ssl", - "network_devices.metadata.sender_backoff_base", - "network_devices.metadata.sender_backoff_factor", - "network_devices.metadata.sender_backoff_max", - "network_devices.metadata.sender_recovery_interval", - "network_devices.metadata.sender_recovery_reset", - "network_devices.metadata.use_compression", - "network_devices.metadata.use_v2_api", - "network_devices.metadata.zstd_compression_level", - "network_devices.namespace", - "network_devices.netflow", - "network_devices.netflow.aggregator_buffer_size", - "network_devices.netflow.aggregator_flow_context_ttl", - "network_devices.netflow.aggregator_flush_interval", - "network_devices.netflow.aggregator_port_rollup_threshold", - "network_devices.netflow.aggregator_rollup_tracker_refresh_interval", - "network_devices.netflow.enabled", - "network_devices.netflow.forwarder.additional_endpoints", - "network_devices.netflow.forwarder.batch_max_concurrent_send", - "network_devices.netflow.forwarder.batch_max_content_size", - "network_devices.netflow.forwarder.batch_max_size", - "network_devices.netflow.forwarder.batch_wait", - "network_devices.netflow.forwarder.compression_kind", - "network_devices.netflow.forwarder.compression_level", - "network_devices.netflow.forwarder.connection_reset_interval", - "network_devices.netflow.forwarder.dd_url", - "network_devices.netflow.forwarder.dev_mode_no_ssl", - "network_devices.netflow.forwarder.input_chan_size", - "network_devices.netflow.forwarder.logs_dd_url", - "network_devices.netflow.forwarder.logs_no_ssl", - "network_devices.netflow.forwarder.sender_backoff_base", - "network_devices.netflow.forwarder.sender_backoff_factor", - "network_devices.netflow.forwarder.sender_backoff_max", - "network_devices.netflow.forwarder.sender_recovery_interval", - "network_devices.netflow.forwarder.sender_recovery_reset", - "network_devices.netflow.forwarder.use_compression", - "network_devices.netflow.forwarder.use_v2_api", - "network_devices.netflow.forwarder.zstd_compression_level", - "network_devices.netflow.listeners", - "network_devices.netflow.listeners.mapping", - "network_devices.netflow.listeners.mapping.destination", - "network_devices.netflow.listeners.mapping.type", - "network_devices.netflow.listeners.port", - "network_devices.netflow.reverse_dns_enrichment_enabled", - "network_devices.netflow.stop_timeout", - "network_devices.snmp_traps", - "network_devices.snmp_traps.bind_host", - "network_devices.snmp_traps.community_strings", - "network_devices.snmp_traps.enabled", - "network_devices.snmp_traps.forwarder.additional_endpoints", - "network_devices.snmp_traps.forwarder.batch_max_concurrent_send", - "network_devices.snmp_traps.forwarder.batch_max_content_size", - "network_devices.snmp_traps.forwarder.batch_max_size", - "network_devices.snmp_traps.forwarder.batch_wait", - "network_devices.snmp_traps.forwarder.compression_kind", - "network_devices.snmp_traps.forwarder.compression_level", - "network_devices.snmp_traps.forwarder.connection_reset_interval", - "network_devices.snmp_traps.forwarder.dd_url", - "network_devices.snmp_traps.forwarder.dev_mode_no_ssl", - "network_devices.snmp_traps.forwarder.input_chan_size", - "network_devices.snmp_traps.forwarder.logs_dd_url", - "network_devices.snmp_traps.forwarder.logs_no_ssl", - "network_devices.snmp_traps.forwarder.sender_backoff_base", - "network_devices.snmp_traps.forwarder.sender_backoff_factor", - "network_devices.snmp_traps.forwarder.sender_backoff_max", - "network_devices.snmp_traps.forwarder.sender_recovery_interval", - "network_devices.snmp_traps.forwarder.sender_recovery_reset", - "network_devices.snmp_traps.forwarder.use_compression", - "network_devices.snmp_traps.forwarder.use_v2_api", - "network_devices.snmp_traps.forwarder.zstd_compression_level", - "network_devices.snmp_traps.port", - "network_devices.snmp_traps.stop_timeout", - "network_devices.snmp_traps.users", - "network_devices.snmp_traps.users.authKey", - "network_devices.snmp_traps.users.authProtocol", - "network_devices.snmp_traps.users.privKey", - "network_devices.snmp_traps.users.privProtocol", - "network_path.collector.dest_excludes", - "network_path.collector.disable_intra_vpc_collection", - "network_path.collector.disable_windows_driver", - "network_path.collector.e2e_queries", - "network_path.collector.filters", - "network_path.collector.flush_interval", - "network_path.collector.icmp_mode", - "network_path.collector.input_chan_size", - "network_path.collector.max_ttl", - "network_path.collector.monitor_ip_without_domain", - "network_path.collector.pathtest_contexts_limit", - "network_path.collector.pathtest_interval", - "network_path.collector.pathtest_max_burst_duration", - "network_path.collector.pathtest_max_per_minute", - "network_path.collector.pathtest_ttl", - "network_path.collector.processing_chan_size", - "network_path.collector.reverse_dns_enrichment.enabled", - "network_path.collector.reverse_dns_enrichment.timeout", - "network_path.collector.source_excludes", - "network_path.collector.tcp_method", - "network_path.collector.tcp_syn_paris_traceroute_mode", - "network_path.collector.timeout", - "network_path.collector.traceroute_queries", - "network_path.collector.workers", - "network_path.connections_monitoring.enabled", - "network_path.forwarder.additional_endpoints", - "network_path.forwarder.batch_max_concurrent_send", - "network_path.forwarder.batch_max_content_size", - "network_path.forwarder.batch_max_size", - "network_path.forwarder.batch_wait", - "network_path.forwarder.compression_kind", - "network_path.forwarder.compression_level", - "network_path.forwarder.connection_reset_interval", - "network_path.forwarder.dd_url", - "network_path.forwarder.dev_mode_no_ssl", - "network_path.forwarder.input_chan_size", - "network_path.forwarder.logs_dd_url", - "network_path.forwarder.logs_no_ssl", - "network_path.forwarder.sender_backoff_base", - "network_path.forwarder.sender_backoff_factor", - "network_path.forwarder.sender_backoff_max", - "network_path.forwarder.sender_recovery_interval", - "network_path.forwarder.sender_recovery_reset", - "network_path.forwarder.use_compression", - "network_path.forwarder.use_v2_api", - "network_path.forwarder.zstd_compression_level", - "noisy_neighbor.enabled", - "noisy_neighbor.pmu_metrics.branch_misses", - "noisy_neighbor.pmu_metrics.cache_misses", - "noisy_neighbor.pmu_metrics.cache_references", - "noisy_neighbor.pmu_metrics.cpu_migrations", - "noisy_neighbor.pmu_metrics.cycles", - "noisy_neighbor.pmu_metrics.instructions", - "noisy_neighbor.pmu_metrics.itlb_misses", - "notable_events.enabled", - "observability_pipelines_worker", - "observability_pipelines_worker.logs", - "observability_pipelines_worker.logs.enabled", - "observability_pipelines_worker.logs.url", - "observability_pipelines_worker.metrics", - "observability_pipelines_worker.traces", - "observability_pipelines_worker.traces.enabled", - "observability_pipelines_worker.traces.url", - "observability_pipelines_worker_metrics_enabled", - "observability_pipelines_worker_metrics_url", - "ol_proxy_config.additional_endpoints", - "ol_proxy_config.api_key", - "ol_proxy_config.api_version", - "ol_proxy_config.dd_url", - "ol_proxy_config.delegated_auth.aws.region", - "ol_proxy_config.delegated_auth.org_uuid", - "ol_proxy_config.delegated_auth.provider", - "ol_proxy_config.delegated_auth.refresh_interval_mins", - "ol_proxy_config.enabled", - "orchestrator_explorer.collector_discovery.enabled", - "orchestrator_explorer.container_scrubbing.enabled", - "orchestrator_explorer.custom_resources.max_count", - "orchestrator_explorer.custom_resources.ootb.enabled", - "orchestrator_explorer.custom_resources.ootb.gateway_api", - "orchestrator_explorer.custom_resources.ootb.ingress_controllers", - "orchestrator_explorer.custom_resources.ootb.service_mesh", - "orchestrator_explorer.custom_sensitive_annotations_labels", - "orchestrator_explorer.custom_sensitive_words", - "orchestrator_explorer.enabled", - "orchestrator_explorer.extra_tags", - "orchestrator_explorer.kubelet_config_check.enabled", - "orchestrator_explorer.manifest_collection.buffer_flush_interval", - "orchestrator_explorer.manifest_collection.buffer_manifest", - "orchestrator_explorer.manifest_collection.enabled", - "orchestrator_explorer.max_message_bytes", - "orchestrator_explorer.max_per_message", - "orchestrator_explorer.orchestrator_additional_endpoints", - "orchestrator_explorer.orchestrator_dd_url", - "orchestrator_explorer.terminated_pods.enabled", - "orchestrator_explorer.terminated_pods_improved.enabled", - "orchestrator_explorer.terminated_resources.enabled", - "orchestrator_explorer.use_legacy_endpoint", - "otel_standalone", - "otelcollector.converter.enabled", - "otelcollector.converter.features", - "otelcollector.enabled", - "otelcollector.extension_timeout", - "otelcollector.extension_url", - "otelcollector.flare.timeout", - "otelcollector.gateway.mode", - "otelcollector.installation_method", - "otelcollector.submit_dummy_metadata", - "otlp_allow_context_heap_allocs", - "otlp_cached_contexts_limit", - "otlp_cached_tagsets_limit", - "otlp_config", - "otlp_config.debug", - "otlp_config.debug.verbosity", - "otlp_config.grpc_port", - "otlp_config.http_port", - "otlp_config.logs", - "otlp_config.logs.batch", - "otlp_config.logs.batch.flush_timeout", - "otlp_config.logs.batch.max_size", - "otlp_config.logs.batch.min_size", - "otlp_config.logs.enabled", - "otlp_config.metrics", - "otlp_config.metrics.batch", - "otlp_config.metrics.batch.flush_timeout", - "otlp_config.metrics.batch.max_size", - "otlp_config.metrics.batch.min_size", - "otlp_config.metrics.delta_ttl", - "otlp_config.metrics.enabled", - "otlp_config.metrics.histograms", - "otlp_config.metrics.histograms.mode", - "otlp_config.metrics.histograms.send_aggregation_metrics", - "otlp_config.metrics.histograms.send_count_sum_metrics", - "otlp_config.metrics.instrumentation_scope_metadata_as_tags", - "otlp_config.metrics.resource_attributes_as_tags", - "otlp_config.metrics.summaries", - "otlp_config.metrics.summaries.mode", - "otlp_config.metrics.sums", - "otlp_config.metrics.sums.cumulative_monotonic_mode", - "otlp_config.metrics.sums.initial_cumulative_monotonic_value", - "otlp_config.metrics.tag_cardinality", - "otlp_config.metrics.tags", - "otlp_config.receiver", - "otlp_config.receiver.protocols", - "otlp_config.receiver.protocols.grpc", - "otlp_config.receiver.protocols.grpc.endpoint", - "otlp_config.receiver.protocols.grpc.include_metadata", - "otlp_config.receiver.protocols.grpc.keepalive.enforcement_policy.min_time", - "otlp_config.receiver.protocols.grpc.max_concurrent_streams", - "otlp_config.receiver.protocols.grpc.max_recv_msg_size_mib", - "otlp_config.receiver.protocols.grpc.read_buffer_size", - "otlp_config.receiver.protocols.grpc.transport", - "otlp_config.receiver.protocols.grpc.write_buffer_size", - "otlp_config.receiver.protocols.http", - "otlp_config.receiver.protocols.http.cors.allowed_headers", - "otlp_config.receiver.protocols.http.cors.allowed_origins", - "otlp_config.receiver.protocols.http.endpoint", - "otlp_config.receiver.protocols.http.include_metadata", - "otlp_config.receiver.protocols.http.max_request_body_size", - "otlp_config.receiver.protocols.http.transport", - "otlp_config.traces", - "otlp_config.traces.enable_otlp_compute_top_level_by_span_kind", - "otlp_config.traces.enabled", - "otlp_config.traces.ignore_missing_datadog_fields", - "otlp_config.traces.infra_attributes", - "otlp_config.traces.infra_attributes.enabled", - "otlp_config.traces.internal_port", - "otlp_config.traces.probabilistic_sampler", - "otlp_config.traces.probabilistic_sampler.sampling_percentage", - "otlp_config.traces.span_name_as_resource_name", - "otlp_config.traces.span_name_remappings", - "otlp_config.traces.string_interner_size", - "otlp_config_traces_probabilistic_sampler_sampling_percentage", - "ottl_filter_config", - "ottl_transform_config", - "ping.enabled", - "podman_db_path", - "prioritize_go_check_loader", - "private-action-runner-identity", - "private_action_runner", - "private_action_runner.actions_allowlist", - "private_action_runner.default_actions_enabled", - "private_action_runner.enabled", - "private_action_runner.http_allow_imds_endpoint", - "private_action_runner.http_allowlist", - "private_action_runner.http_timeout_seconds", - "private_action_runner.self_enroll", - "private_action_runner.task_concurrency", - "private_action_runner.task_timeout_seconds", - "privileged_logs.enabled", - "proc_root", - "process_config", - "process_config.additional_endpoints", - "process_config.blacklist_patterns", - "process_config.cache_lookupid", - "process_config.cmd_port", - "process_config.container_collection", - "process_config.container_collection.enabled", - "process_config.custom_sensitive_words", - "process_config.dd_agent_bin", - "process_config.dd_agent_env", - "process_config.disable_realtime_checks", - "process_config.drop_check_payloads", - "process_config.enabled", - "process_config.expvar_port", - "process_config.grpc_connection_timeout_secs", - "process_config.ignore_zombie_processes", - "process_config.internal_profiling.enabled", - "process_config.intervals", - "process_config.intervals.connections", - "process_config.intervals.container", - "process_config.intervals.container_realtime", - "process_config.intervals.process", - "process_config.intervals.process_realtime", - "process_config.language_detection.grpc_port", - "process_config.log_file", - "process_config.max_message_bytes", - "process_config.max_per_message", - "process_config.orchestrator_additional_endpoints", - "process_config.orchestrator_dd_url", - "process_config.process_collection", - "process_config.process_collection.enabled", - "process_config.process_dd_url", - "process_config.process_discovery", - "process_config.process_discovery.enabled", - "process_config.process_discovery.hint_frequency", - "process_config.process_discovery.interval", - "process_config.process_queue_bytes", - "process_config.queue_size", - "process_config.rt_queue_size", - "process_config.scrub_args", - "process_config.strip_proc_arguments", - "process_config.windows.use_perf_counters", - "procfs_path", - "prometheus_http_sd.check_template", - "prometheus_http_sd.configs", - "prometheus_http_sd.url", - "prometheus_listen_addr", - "prometheus_scrape", - "prometheus_scrape.checks", - "prometheus_scrape.enabled", - "prometheus_scrape.service_endpoints", - "prometheus_scrape.version", - "python3_linter_timeout", - "python_lazy_loading", - "remote_agent.configstream.consumer.enabled", - "remote_agent.configstream.enabled", - "remote_agent.configstream.sleep_interval", - "remote_agent.registry.enabled", - "remote_agent.registry.idle_timeout", - "remote_agent.registry.query_timeout", - "remote_agent.registry.recommended_refresh_interval", - "remote_configuration", - "remote_configuration.agent_integrations.allow_list", - "remote_configuration.agent_integrations.allow_log_config_scheduling", - "remote_configuration.agent_integrations.block_list", - "remote_configuration.agent_integrations.enabled", - "remote_configuration.api_key", - "remote_configuration.apm_sampling.enabled", - "remote_configuration.clients.cache_bypass_limit", - "remote_configuration.clients.ttl_seconds", - "remote_configuration.config_root", - "remote_configuration.delegated_auth.aws.region", - "remote_configuration.delegated_auth.org_uuid", - "remote_configuration.delegated_auth.provider", - "remote_configuration.delegated_auth.refresh_interval_mins", - "remote_configuration.director_root", - "remote_configuration.enabled", - "remote_configuration.key", - "remote_configuration.max_backoff_interval", - "remote_configuration.no_tls", - "remote_configuration.no_tls_validation", - "remote_configuration.no_websocket_echo", - "remote_configuration.org_status_refresh_interval", - "remote_configuration.rc_dd_url", - "remote_configuration.refresh_interval", - "remote_flags.enabled", - "remote_policies", - "remote_tagger.max_concurrent_sync", - "remote_updates", - "reverse_dns_enrichment", - "reverse_dns_enrichment.cache", - "reverse_dns_enrichment.cache.clean_interval", - "reverse_dns_enrichment.cache.enabled", - "reverse_dns_enrichment.cache.entry_ttl", - "reverse_dns_enrichment.cache.max_retries", - "reverse_dns_enrichment.cache.max_size", - "reverse_dns_enrichment.cache.persist_interval", - "reverse_dns_enrichment.chan_size", - "reverse_dns_enrichment.rate_limiter", - "reverse_dns_enrichment.rate_limiter.enabled", - "reverse_dns_enrichment.rate_limiter.limit_per_sec", - "reverse_dns_enrichment.rate_limiter.limit_throttled_per_sec", - "reverse_dns_enrichment.rate_limiter.recovery_interval", - "reverse_dns_enrichment.rate_limiter.recovery_intervals", - "reverse_dns_enrichment.rate_limiter.throttle_error_threshold", - "reverse_dns_enrichment.workers", - "runtime_security_config.activity_dump.auto_suppression.enabled", - "runtime_security_config.activity_dump.cgroup_differentiate_args", - "runtime_security_config.activity_dump.cgroup_dump_timeout", - "runtime_security_config.activity_dump.cgroup_wait_list_timeout", - "runtime_security_config.activity_dump.cleanup_period", - "runtime_security_config.activity_dump.dump_duration", - "runtime_security_config.activity_dump.enabled", - "runtime_security_config.activity_dump.load_controller_period", - "runtime_security_config.activity_dump.local_storage.compression", - "runtime_security_config.activity_dump.local_storage.formats", - "runtime_security_config.activity_dump.local_storage.max_dumps_count", - "runtime_security_config.activity_dump.local_storage.output_directory", - "runtime_security_config.activity_dump.max_dump_count_per_workload", - "runtime_security_config.activity_dump.max_dump_size", - "runtime_security_config.activity_dump.min_timeout", - "runtime_security_config.activity_dump.rate_limiter", - "runtime_security_config.activity_dump.remote_storage.endpoints.additional_endpoints", - "runtime_security_config.activity_dump.remote_storage.endpoints.batch_max_concurrent_send", - "runtime_security_config.activity_dump.remote_storage.endpoints.batch_max_content_size", - "runtime_security_config.activity_dump.remote_storage.endpoints.batch_max_size", - "runtime_security_config.activity_dump.remote_storage.endpoints.batch_wait", - "runtime_security_config.activity_dump.remote_storage.endpoints.compression_kind", - "runtime_security_config.activity_dump.remote_storage.endpoints.compression_level", - "runtime_security_config.activity_dump.remote_storage.endpoints.connection_reset_interval", - "runtime_security_config.activity_dump.remote_storage.endpoints.dd_url", - "runtime_security_config.activity_dump.remote_storage.endpoints.dev_mode_no_ssl", - "runtime_security_config.activity_dump.remote_storage.endpoints.input_chan_size", - "runtime_security_config.activity_dump.remote_storage.endpoints.logs_dd_url", - "runtime_security_config.activity_dump.remote_storage.endpoints.logs_no_ssl", - "runtime_security_config.activity_dump.remote_storage.endpoints.sender_backoff_base", - "runtime_security_config.activity_dump.remote_storage.endpoints.sender_backoff_factor", - "runtime_security_config.activity_dump.remote_storage.endpoints.sender_backoff_max", - "runtime_security_config.activity_dump.remote_storage.endpoints.sender_recovery_interval", - "runtime_security_config.activity_dump.remote_storage.endpoints.sender_recovery_reset", - "runtime_security_config.activity_dump.remote_storage.endpoints.use_compression", - "runtime_security_config.activity_dump.remote_storage.endpoints.use_v2_api", - "runtime_security_config.activity_dump.remote_storage.endpoints.zstd_compression_level", - "runtime_security_config.activity_dump.silent_workloads.delay", - "runtime_security_config.activity_dump.silent_workloads.ticker", - "runtime_security_config.activity_dump.syscall_monitor.period", - "runtime_security_config.activity_dump.tag_rules.enabled", - "runtime_security_config.activity_dump.tags_resolution_period", - "runtime_security_config.activity_dump.trace_systemd_cgroups", - "runtime_security_config.activity_dump.traced_cgroups_count", - "runtime_security_config.activity_dump.traced_event_types", - "runtime_security_config.activity_dump.workload_deny_list", - "runtime_security_config.cmd_socket", - "runtime_security_config.compliance_module.enabled", - "runtime_security_config.container_exclude", - "runtime_security_config.container_include", - "runtime_security_config.cookie_cache_size", - "runtime_security_config.direct_send_from_system_probe", - "runtime_security_config.ebpfless.enabled", - "runtime_security_config.ebpfless.socket", - "runtime_security_config.enabled", - "runtime_security_config.endpoints.additional_endpoints", - "runtime_security_config.endpoints.batch_max_concurrent_send", - "runtime_security_config.endpoints.batch_max_content_size", - "runtime_security_config.endpoints.batch_max_size", - "runtime_security_config.endpoints.batch_wait", - "runtime_security_config.endpoints.compression_kind", - "runtime_security_config.endpoints.compression_level", - "runtime_security_config.endpoints.connection_reset_interval", - "runtime_security_config.endpoints.dd_url", - "runtime_security_config.endpoints.dev_mode_no_ssl", - "runtime_security_config.endpoints.input_chan_size", - "runtime_security_config.endpoints.logs_dd_url", - "runtime_security_config.endpoints.logs_no_ssl", - "runtime_security_config.endpoints.sender_backoff_base", - "runtime_security_config.endpoints.sender_backoff_factor", - "runtime_security_config.endpoints.sender_backoff_max", - "runtime_security_config.endpoints.sender_recovery_interval", - "runtime_security_config.endpoints.sender_recovery_reset", - "runtime_security_config.endpoints.use_compression", - "runtime_security_config.endpoints.use_v2_api", - "runtime_security_config.endpoints.zstd_compression_level", - "runtime_security_config.enforcement.disarmer.container.enabled", - "runtime_security_config.enforcement.disarmer.container.max_allowed", - "runtime_security_config.enforcement.disarmer.container.period", - "runtime_security_config.enforcement.disarmer.executable.enabled", - "runtime_security_config.enforcement.disarmer.executable.max_allowed", - "runtime_security_config.enforcement.disarmer.executable.period", - "runtime_security_config.enforcement.enabled", - "runtime_security_config.enforcement.exclude_binaries", - "runtime_security_config.enforcement.raw_syscall.enabled", - "runtime_security_config.enforcement.rule_source_allowed", - "runtime_security_config.env_as_tags", - "runtime_security_config.etw_events_channel_size", - "runtime_security_config.event_grpc_server", - "runtime_security_config.event_retry_queue_threshold", - "runtime_security_config.event_sampling.bind.enabled", - "runtime_security_config.event_sampling.bind.rate", - "runtime_security_config.event_sampling.connect.enabled", - "runtime_security_config.event_sampling.connect.rate", - "runtime_security_config.event_sampling.dns.enabled", - "runtime_security_config.event_sampling.dns.rate", - "runtime_security_config.event_sampling.open.enabled", - "runtime_security_config.event_sampling.open.rate", - "runtime_security_config.event_server.burst", - "runtime_security_config.event_server.rate", - "runtime_security_config.event_server.retention", - "runtime_security_config.exclude_pause_container", - "runtime_security_config.file_metadata_resolver.enabled", - "runtime_security_config.fim_enabled", - "runtime_security_config.hash_resolver.cache_size", - "runtime_security_config.hash_resolver.enabled", - "runtime_security_config.hash_resolver.event_types", - "runtime_security_config.hash_resolver.hash_algorithms", - "runtime_security_config.hash_resolver.max_file_size", - "runtime_security_config.hash_resolver.max_hash_rate", - "runtime_security_config.hash_resolver.replace", - "runtime_security_config.imds_ipv4", - "runtime_security_config.internal_monitoring.enabled", - "runtime_security_config.log_patterns", - "runtime_security_config.log_tags", - "runtime_security_config.network_monitoring.enabled", - "runtime_security_config.on_demand.enabled", - "runtime_security_config.on_demand.rate_limiter.enabled", - "runtime_security_config.policies.dir", - "runtime_security_config.policies.monitor.enabled", - "runtime_security_config.policies.monitor.per_rule_enabled", - "runtime_security_config.policies.monitor.report_internal_policies", - "runtime_security_config.policies.rule_cache_enabled", - "runtime_security_config.reduced_proc_pid_cache_size", - "runtime_security_config.remote_configuration.dump_policies", - "runtime_security_config.remote_configuration.enabled", - "runtime_security_config.sbom.enabled", - "runtime_security_config.sbom.enrichment_interval", - "runtime_security_config.sbom.enrichment_ticker", - "runtime_security_config.sbom.forward_interval", - "runtime_security_config.sbom.generate_policies", - "runtime_security_config.sbom.host.enabled", - "runtime_security_config.sbom.refresh_interval", - "runtime_security_config.sbom.workloads_cache_size", - "runtime_security_config.security_profile.anomaly_detection.default_minimum_stable_period", - "runtime_security_config.security_profile.anomaly_detection.enabled", - "runtime_security_config.security_profile.anomaly_detection.event_types", - "runtime_security_config.security_profile.anomaly_detection.minimum_stable_period.dns", - "runtime_security_config.security_profile.anomaly_detection.minimum_stable_period.exec", - "runtime_security_config.security_profile.anomaly_detection.rate_limiter.num_events_allowed", - "runtime_security_config.security_profile.anomaly_detection.rate_limiter.num_keys", - "runtime_security_config.security_profile.anomaly_detection.rate_limiter.period", - "runtime_security_config.security_profile.anomaly_detection.silent_rule_events.enabled", - "runtime_security_config.security_profile.anomaly_detection.tag_rules.enabled", - "runtime_security_config.security_profile.anomaly_detection.unstable_profile_size_threshold", - "runtime_security_config.security_profile.anomaly_detection.unstable_profile_time_threshold", - "runtime_security_config.security_profile.anomaly_detection.workload_warmup_period", - "runtime_security_config.security_profile.auto_suppression.enabled", - "runtime_security_config.security_profile.auto_suppression.event_types", - "runtime_security_config.security_profile.cache_size", - "runtime_security_config.security_profile.dir", - "runtime_security_config.security_profile.dns_match_max_depth", - "runtime_security_config.security_profile.enabled", - "runtime_security_config.security_profile.max_count", - "runtime_security_config.security_profile.max_image_tags", - "runtime_security_config.security_profile.node_eviction_timeout", - "runtime_security_config.security_profile.profile_cleanup_delay", - "runtime_security_config.security_profile.v2.enabled", - "runtime_security_config.security_profile.v2.event_types", - "runtime_security_config.security_profile.watch_dir", - "runtime_security_config.self_test.enabled", - "runtime_security_config.self_test.send_report", - "runtime_security_config.socket", - "runtime_security_config.sysctl.ebpf.enabled", - "runtime_security_config.sysctl.enabled", - "runtime_security_config.sysctl.snapshot.enabled", - "runtime_security_config.sysctl.snapshot.ignored_base_names", - "runtime_security_config.sysctl.snapshot.kernel_compilation_flags", - "runtime_security_config.sysctl.snapshot.period", - "runtime_security_config.use_secruntime_track", - "runtime_security_config.user_sessions.cache_size", - "runtime_security_config.user_sessions.ssh.enabled", - "runtime_security_config.windows_filename_cache_max", - "runtime_security_config.windows_probe_block_on_channel_send", - "runtime_security_config.windows_registry_cache_max", - "runtime_security_config.windows_write_event_rate_limiter_max_allowed", - "runtime_security_config.windows_write_event_rate_limiter_period", - "runtimes", - "sbom", - "sbom.additional_endpoints", - "sbom.batch_max_concurrent_send", - "sbom.batch_max_content_size", - "sbom.batch_max_size", - "sbom.batch_wait", - "sbom.cache.clean_interval", - "sbom.cache.max_disk_size", - "sbom.cache_directory", - "sbom.clear_cache_on_exit", - "sbom.compression_kind", - "sbom.compression_level", - "sbom.compute_dependencies", - "sbom.connection_reset_interval", - "sbom.container.enabled", - "sbom.container_image.additional_directories", - "sbom.container_image.allow_missing_repodigest", - "sbom.container_image.analyzers", - "sbom.container_image.check_disk_usage", - "sbom.container_image.container_exclude", - "sbom.container_image.container_include", - "sbom.container_image.enabled", - "sbom.container_image.exclude_pause_container", - "sbom.container_image.min_available_disk", - "sbom.container_image.overlayfs_direct_scan", - "sbom.container_image.overlayfs_disable_cache", - "sbom.container_image.scan_interval", - "sbom.container_image.scan_timeout", - "sbom.container_image.use_mount", - "sbom.container_image.use_spread_refresher", - "sbom.dd_url", - "sbom.dev_mode_no_ssl", - "sbom.enabled", - "sbom.enrichment.usage.enabled", - "sbom.host", - "sbom.host.additional_directories", - "sbom.host.analyzers", - "sbom.host.enabled", - "sbom.input_chan_size", - "sbom.logs_dd_url", - "sbom.logs_no_ssl", - "sbom.scan_queue.base_backoff", - "sbom.scan_queue.max_backoff", - "sbom.sender_backoff_base", - "sbom.sender_backoff_factor", - "sbom.sender_backoff_max", - "sbom.sender_recovery_interval", - "sbom.sender_recovery_reset", - "sbom.simplify_bom_refs", - "sbom.use_compression", - "sbom.use_v2_api", - "sbom.zstd_compression_level", - "scrubber", - "scrubber.additional_keys", - "secret_allowed_k8s_namespace", - "secret_audit_file_max_size", - "secret_backend_arguments", - "secret_backend_command_allow_group_exec_perm", - "secret_backend_config", - "secret_backend_output_max_size", - "secret_backend_remove_trailing_line_break", - "secret_backend_skip_checks", - "secret_backend_type", - "secret_image_to_handle", - "secret_image_to_handle.webserver", - "secret_refresh_interval", - "secret_refresh_on_api_key_failure_interval", - "secret_refresh_scatter", - "secret_scope_integration_to_their_k8s_namespace", - "security_agent.cmd_port", - "security_agent.disable_thp", - "security_agent.expvar_port", - "security_agent.internal_profiling.api_key", - "security_agent.internal_profiling.block_profile_rate", - "security_agent.internal_profiling.cpu_duration", - "security_agent.internal_profiling.delta_profiles", - "security_agent.internal_profiling.enable_block_profiling", - "security_agent.internal_profiling.enable_goroutine_stacktraces", - "security_agent.internal_profiling.enable_mutex_profiling", - "security_agent.internal_profiling.enabled", - "security_agent.internal_profiling.env", - "security_agent.internal_profiling.extra_tags", - "security_agent.internal_profiling.mutex_profile_fraction", - "security_agent.internal_profiling.period", - "security_agent.internal_profiling.profile_dd_url", - "security_agent.internal_profiling.site", - "security_agent.internal_profiling.unix_socket", - "security_agent.log_file", - "sender_backoff_base", - "sender_backoff_factor", - "sender_backoff_max", - "sender_recovery_interval", - "sender_recovery_reset", - "server_timeout", - "serverless.enabled", - "serverless.logs_enabled", - "serverless.service_mapping", - "serverless.trace_enabled", - "serverless.trace_managed_services", - "service_discovery.forwarder.additional_endpoints", - "service_discovery.forwarder.batch_max_concurrent_send", - "service_discovery.forwarder.batch_max_content_size", - "service_discovery.forwarder.batch_max_size", - "service_discovery.forwarder.batch_wait", - "service_discovery.forwarder.compression_kind", - "service_discovery.forwarder.compression_level", - "service_discovery.forwarder.connection_reset_interval", - "service_discovery.forwarder.dd_url", - "service_discovery.forwarder.dev_mode_no_ssl", - "service_discovery.forwarder.input_chan_size", - "service_discovery.forwarder.logs_dd_url", - "service_discovery.forwarder.logs_no_ssl", - "service_discovery.forwarder.sender_backoff_base", - "service_discovery.forwarder.sender_backoff_factor", - "service_discovery.forwarder.sender_backoff_max", - "service_discovery.forwarder.sender_recovery_interval", - "service_discovery.forwarder.sender_recovery_reset", - "service_discovery.forwarder.use_compression", - "service_discovery.forwarder.use_v2_api", - "service_discovery.forwarder.zstd_compression_level", - "service_monitoring_config.data_channel_size", - "service_monitoring_config.direct_consumer.buffer_wakeup_count_per_cpu", - "service_monitoring_config.direct_consumer.channel_size", - "service_monitoring_config.direct_consumer.kernel_buffer_size_per_cpu", - "service_monitoring_config.disable_map_preallocation", - "service_monitoring_config.enable_connection_rollup", - "service_monitoring_config.enable_event_stream", - "service_monitoring_config.enable_go_tls_support", - "service_monitoring_config.enable_http2_monitoring", - "service_monitoring_config.enable_http_monitoring", - "service_monitoring_config.enable_kafka_monitoring", - "service_monitoring_config.enable_quantization", - "service_monitoring_config.enable_ring_buffers", - "service_monitoring_config.enabled", - "service_monitoring_config.http.enabled", - "service_monitoring_config.http.idle_connection_ttl_seconds", - "service_monitoring_config.http.map_cleaner_interval_seconds", - "service_monitoring_config.http.max_request_fragment", - "service_monitoring_config.http.max_stats_buffered", - "service_monitoring_config.http.max_tracked_connections", - "service_monitoring_config.http.notification_threshold", - "service_monitoring_config.http.replace_rules", - "service_monitoring_config.http.use_direct_consumer", - "service_monitoring_config.http2.dynamic_table_map_cleaner_interval_seconds", - "service_monitoring_config.http2.enabled", - "service_monitoring_config.http2_dynamic_table_map_cleaner_interval_seconds", - "service_monitoring_config.http_idle_connection_ttl_in_s", - "service_monitoring_config.http_map_cleaner_interval_in_s", - "service_monitoring_config.http_max_request_fragment", - "service_monitoring_config.http_notification_threshold", - "service_monitoring_config.http_replace_rules", - "service_monitoring_config.kafka.enabled", - "service_monitoring_config.kafka.max_stats_buffered", - "service_monitoring_config.kernel_buffer_pages", - "service_monitoring_config.max_concurrent_requests", - "service_monitoring_config.max_http_stats_buffered", - "service_monitoring_config.max_kafka_stats_buffered", - "service_monitoring_config.max_tracked_http_connections", - "service_monitoring_config.postgres.enabled", - "service_monitoring_config.postgres.max_stats_buffered", - "service_monitoring_config.postgres.max_telemetry_buffer", - "service_monitoring_config.process_service_inference.enabled", - "service_monitoring_config.process_service_inference.use_windows_service_name", - "service_monitoring_config.redis.enabled", - "service_monitoring_config.redis.max_stats_buffered", - "service_monitoring_config.redis.track_resources", - "service_monitoring_config.tls.go.enabled", - "service_monitoring_config.tls.go.exclude_self", - "service_monitoring_config.tls.istio.enabled", - "service_monitoring_config.tls.istio.envoy_path", - "service_monitoring_config.tls.native.enabled", - "service_monitoring_config.tls.nodejs.enabled", - "shared_library_check.enabled", - "shared_library_check.library_folder_path", - "snmp_listener.allowed_failures", - "snmp_listener.collect_device_metadata", - "snmp_listener.collect_topology", - "snmp_listener.configs", - "snmp_listener.discovery_allowed_failures", - "snmp_listener.discovery_interval", - "snmp_listener.loader", - "snmp_listener.min_collection_interval", - "snmp_listener.namespace", - "snmp_listener.oid_batch_size", - "snmp_listener.ping.count", - "snmp_listener.ping.enabled", - "snmp_listener.ping.interval", - "snmp_listener.ping.linux.use_raw_socket", - "snmp_listener.ping.timeout", - "snmp_listener.retries", - "snmp_listener.timeout", - "snmp_listener.use_device_id_as_hostname", - "snmp_listener.workers", - "software_inventory.enabled", - "software_inventory.forwarder.additional_endpoints", - "software_inventory.forwarder.batch_max_concurrent_send", - "software_inventory.forwarder.batch_max_content_size", - "software_inventory.forwarder.batch_max_size", - "software_inventory.forwarder.batch_wait", - "software_inventory.forwarder.compression_kind", - "software_inventory.forwarder.compression_level", - "software_inventory.forwarder.connection_reset_interval", - "software_inventory.forwarder.dd_url", - "software_inventory.forwarder.dev_mode_no_ssl", - "software_inventory.forwarder.input_chan_size", - "software_inventory.forwarder.logs_dd_url", - "software_inventory.forwarder.logs_no_ssl", - "software_inventory.forwarder.sender_backoff_base", - "software_inventory.forwarder.sender_backoff_factor", - "software_inventory.forwarder.sender_backoff_max", - "software_inventory.forwarder.sender_recovery_interval", - "software_inventory.forwarder.sender_recovery_reset", - "software_inventory.forwarder.use_compression", - "software_inventory.forwarder.use_v2_api", - "software_inventory.forwarder.zstd_compression_level", - "software_inventory.interval", - "software_inventory.jitter", - "synthetics", - "synthetics.collector", - "synthetics.collector.enabled", - "synthetics.collector.flush_interval", - "synthetics.collector.workers", - "synthetics.forwarder.additional_endpoints", - "synthetics.forwarder.batch_max_concurrent_send", - "synthetics.forwarder.batch_max_content_size", - "synthetics.forwarder.batch_max_size", - "synthetics.forwarder.batch_wait", - "synthetics.forwarder.compression_kind", - "synthetics.forwarder.compression_level", - "synthetics.forwarder.connection_reset_interval", - "synthetics.forwarder.dd_url", - "synthetics.forwarder.dev_mode_no_ssl", - "synthetics.forwarder.input_chan_size", - "synthetics.forwarder.logs_dd_url", - "synthetics.forwarder.logs_no_ssl", - "synthetics.forwarder.sender_backoff_base", - "synthetics.forwarder.sender_backoff_factor", - "synthetics.forwarder.sender_backoff_max", - "synthetics.forwarder.sender_recovery_interval", - "synthetics.forwarder.sender_recovery_reset", - "synthetics.forwarder.use_compression", - "synthetics.forwarder.use_v2_api", - "synthetics.forwarder.zstd_compression_level", - "system_probe_config.adjusted", - "system_probe_config.allow_prebuilt_fallback", - "system_probe_config.allow_precompiled_fallback", - "system_probe_config.allow_runtime_compiled_fallback", - "system_probe_config.apt_config_dir", - "system_probe_config.attach_kprobes_with_kprobe_events_abi", - "system_probe_config.bpf_debug", - "system_probe_config.bpf_dir", - "system_probe_config.btf_output_dir", - "system_probe_config.btf_path", - "system_probe_config.closed_channel_size", - "system_probe_config.closed_connection_flush_threshold", - "system_probe_config.collect_dns_domains", - "system_probe_config.collect_dns_stats", - "system_probe_config.collect_local_dns", - "system_probe_config.conntrack_max_state_size", - "system_probe_config.conntrack_rate_limit", - "system_probe_config.debug_port", - "system_probe_config.dest_excludes", - "system_probe_config.disable_dns_inspection", - "system_probe_config.disable_ipv6", - "system_probe_config.disable_tcp", - "system_probe_config.disable_thp", - "system_probe_config.disable_udp", - "system_probe_config.dns_timeout_in_s", - "system_probe_config.enable_co_re", - "system_probe_config.enable_conntrack", - "system_probe_config.enable_conntrack_all_namespaces", - "system_probe_config.enable_kernel_header_download", - "system_probe_config.enable_oom_kill", - "system_probe_config.enable_runtime_compiler", - "system_probe_config.enable_tcp_queue_length", - "system_probe_config.enable_tracepoints", - "system_probe_config.enabled", - "system_probe_config.excluded_linux_versions", - "system_probe_config.expected_tags_duration", - "system_probe_config.external", - "system_probe_config.health_port", - "system_probe_config.http_idle_connection_ttl_in_s", - "system_probe_config.http_map_cleaner_interval_in_s", - "system_probe_config.internal_profiling.api_key", - "system_probe_config.internal_profiling.block_profile_rate", - "system_probe_config.internal_profiling.cpu_duration", - "system_probe_config.internal_profiling.custom_attributes", - "system_probe_config.internal_profiling.delta_profiles", - "system_probe_config.internal_profiling.enable_block_profiling", - "system_probe_config.internal_profiling.enable_goroutine_stacktraces", - "system_probe_config.internal_profiling.enable_mutex_profiling", - "system_probe_config.internal_profiling.enabled", - "system_probe_config.internal_profiling.env", - "system_probe_config.internal_profiling.extra_tags", - "system_probe_config.internal_profiling.mutex_profile_fraction", - "system_probe_config.internal_profiling.period", - "system_probe_config.internal_profiling.profile_dd_url", - "system_probe_config.internal_profiling.site", - "system_probe_config.internal_profiling.unix_socket", - "system_probe_config.kernel_header_dirs", - "system_probe_config.kernel_header_download_dir", - "system_probe_config.language_detection.enabled", - "system_probe_config.log_file", - "system_probe_config.log_level", - "system_probe_config.max_closed_connections_buffered", - "system_probe_config.max_connection_state_buffered", - "system_probe_config.max_conns_per_message", - "system_probe_config.max_dns_stats", - "system_probe_config.max_tracked_connections", - "system_probe_config.memory_controller.enabled", - "system_probe_config.memory_controller.hierarchy", - "system_probe_config.memory_controller.pressure_levels", - "system_probe_config.memory_controller.thresholds", - "system_probe_config.offset_guess_threshold", - "system_probe_config.process_config.enabled", - "system_probe_config.process_service_inference.enabled", - "system_probe_config.process_service_inference.use_improved_algorithm", - "system_probe_config.process_service_inference.use_windows_service_name", - "system_probe_config.remote_config_btf_enabled", - "system_probe_config.runtime_compiler_output_dir", - "system_probe_config.source_excludes", - "system_probe_config.sysprobe_socket", - "system_probe_config.telemetry_enabled", - "system_probe_config.telemetry_perf_buffer_emit_per_cpu", - "system_probe_config.windows.enable_monotonic_count", - "system_probe_config.yum_repos_dir", - "system_probe_config.zypper_repos_dir", - "system_tray.log_file", - "tag_value_split_separator", - "tag_value_split_separator.foo", - "telemetry.checks", - "telemetry.offlinereporter.enabled", - "telemetry.offlinereporter.heartbeat_interval", - "telemetry.python_memory", - "trace_agent_host_socket_path", - "tracemalloc_blacklist", - "tracemalloc_debug", - "tracemalloc_exclude", - "tracemalloc_include", - "tracemalloc_whitelist", - "traceroute.enabled", - "use_compression", - "use_diskv2_check", - "use_dogstatsd", - "use_improved_cgroup_parser", - "use_networkv2_check", - "use_v2_api", - "vector.logs.enabled", - "vector.logs.url", - "vector_metrics_enabled", - "vector_metrics_url", - "win_skip_com_init", - "windows_counter_init_failure_limit", - "windows_counter_refresh_interval", - "windows_crash_detection.enabled", - "windows_use_pythonpath", - "workloadmeta.local_process_collector.collection_interval", - "workloadmeta.remote.recv_without_timeout", - "zstd_compression_level" -] diff --git a/docs/agent-data-plane/configuration/dogstatsd/known-configs.json b/docs/agent-data-plane/configuration/dogstatsd/known-configs.json deleted file mode 100644 index 01d54b4a1c0..00000000000 --- a/docs/agent-data-plane/configuration/dogstatsd/known-configs.json +++ /dev/null @@ -1,2108 +0,0 @@ -[ - { - "key": "additional_endpoints", - "feature_state": "PARITY", - "action": "NONE", - "description": "Dual-ship to extra endpoints", - "reason": "Confirmed implemented in both ADP and core agent.", - "issue": null, - "adp_key": null - }, - { - "key": "agent_ipc_endpoint", - "feature_state": "ADP_ONLY", - "action": "INVESTIGATE", - "description": "Remote agent IPC URI", - "reason": "ADP uses a combined URI key; core agent uses agent_ipc.host+port. Investigation open to migrate to the standard agent_ipc.* namespace.", - "issue": "#1368", - "adp_key": null - }, - { - "key": "aggregate_context_limit", - "feature_state": "PARITY", - "action": "NONE", - "description": "Max contexts per agg window", - "reason": "Filed to raise the default; it is now CLOSED, meaning the fix is done. Feature is in parity.", - "issue": "#1330", - "adp_key": null - }, - { - "key": "aggregate_flush_interval", - "feature_state": "ADP_ONLY", - "action": "NONE", - "description": "Aggregator flush period", - "reason": "Hard-coded in core agent; configurable in ADP for flexibility.", - "issue": null, - "adp_key": null - }, - { - "key": "aggregate_flush_open_windows", - "feature_state": "ADP_ONLY", - "action": "NONE", - "description": "Flush open windows on stop", - "reason": "ADP's own key for dogstatsd_flush_incomplete_buckets. Hard-coded in core agent.", - "issue": null, - "adp_key": null - }, - { - "key": "aggregate_passthrough_idle_flush_timeout", - "feature_state": "ADP_ONLY", - "action": "NONE", - "description": "Passthrough buffer flush delay", - "reason": "ADP-only tuning knob for passthrough pipeline. No core agent equivalent.", - "issue": null, - "adp_key": null - }, - { - "key": "aggregate_window_duration_seconds", - "feature_state": "ADP_ONLY", - "action": "NONE", - "description": "Aggregation window size", - "reason": "Hard-coded in core agent; configurable in ADP.", - "issue": null, - "adp_key": null - }, - { - "key": "aggregator_buffer_size", - "feature_state": "MISSING", - "action": "INVESTIGATE", - "description": "Channel buffer depth for aggregator queues", - "reason": "Saluki topology uses fixed interconnect sizes and construction-time wiring; no per-component config knobs.", - "issue": "#1681", - "adp_key": null - }, - { - "key": "aggregator_flush_metrics_and_serialize_in_parallel_buffer_size", - "feature_state": "MISSING", - "action": "INVESTIGATE", - "description": "Parallel flush: series/sketch buffer size", - "reason": "Saluki topology uses fixed interconnect sizes; no per-component config knobs.", - "issue": "#1681", - "adp_key": null - }, - { - "key": "aggregator_flush_metrics_and_serialize_in_parallel_chan_size", - "feature_state": "MISSING", - "action": "INVESTIGATE", - "description": "Parallel flush: channel size for series/sketches", - "reason": "Saluki topology uses fixed interconnect sizes; no per-component config knobs.", - "issue": "#1681", - "adp_key": null - }, - { - "key": "aggregator_stop_timeout", - "feature_state": "MISSING", - "action": "INVESTIGATE", - "description": "Timeout (seconds) for aggregator flush on stop", - "reason": "Saluki topology uses fixed interconnect sizes and construction-time wiring; no per-component config knobs.", - "issue": "#1681", - "adp_key": null - }, - { - "key": "aggregator_tag_filter_cache_capacity", - "feature_state": "MISSING", - "action": "INVESTIGATE", - "description": "Ring buffer size for tag-filter dedup cache", - "reason": "Controls aggregator tag filter cache used by DogStatsD", - "issue": "#1667", - "adp_key": null - }, - { - "key": "aggregator_use_tags_store", - "feature_state": "MISSING", - "action": "INVESTIGATE", - "description": "Enable shared tag deduplication store", - "reason": "Core agent concept with no ADP analog.", - "issue": "#1681", - "adp_key": null - }, - { - "key": "allow_arbitrary_tags", - "feature_state": "PARITY", - "action": "NONE", - "description": "Relax backend tag validation via HTTP header", - "reason": "Implemented in ADP. When set, the Datadog forwarder adds `Allow-Arbitrary-Tag-Value: true` to outbound intake requests. Behavior matches the core agent.", - "issue": null, - "adp_key": null - }, - { - "key": "anomaly_detection.enabled", - "feature_state": "MISSING", - "action": "INVESTIGATE", - "description": "Enable anomaly detection observer pipeline", - "reason": "New key flagged for investigation.", - "issue": "#1683", - "adp_key": null - }, - { - "key": "anomaly_detection.metrics.enabled", - "feature_state": "MISSING", - "action": "INVESTIGATE", - "description": "Enable metric ingestion for anomaly detection", - "reason": "New key flagged for investigation.", - "issue": "#1683", - "adp_key": null - }, - { - "key": "api_key", - "feature_state": "PARITY", - "action": "NONE", - "description": "API key for endpoint auth", - "reason": "Confirmed implemented in ADP. Behavior matches the core agent.", - "issue": null, - "adp_key": null - }, - { - "key": "auth_token_file_path", - "feature_state": "PARITY", - "action": "NONE", - "description": "IPC auth token file path", - "reason": "Confirmed implemented in ADP. Behavior matches the core agent.", - "issue": null, - "adp_key": null - }, - { - "key": "autoscaling.failover.enabled", - "feature_state": "MISSING", - "action": "INVESTIGATE", - "description": "Enable autoscaling failover metric routing via DCA", - "reason": "Marked for investigation; previously dismissed as not-applicable.", - "issue": "#1684", - "adp_key": null - }, - { - "key": "autoscaling.failover.metrics", - "feature_state": "MISSING", - "action": "INVESTIGATE", - "description": "Metric names forwarded to DCA for autoscaling fail", - "reason": "Marked for investigation; previously dismissed as not-applicable.", - "issue": "#1684", - "adp_key": null - }, - { - "key": "bind_host", - "feature_state": "PARITY", - "action": "NONE", - "description": "Global listen host fallback", - "reason": "Read by the DogStatsD source and used as the bind IP for UDP/TCP listeners. Accepts an IP literal or a hostname resolved via DNS. Precedence matches the core agent: dogstatsd_non_local_traffic=true binds 0.0.0.0, else bind_host is used, else 127.0.0.1.", - "issue": "#1331", - "adp_key": null - }, - { - "key": "cmd_port", - "feature_state": "PARITY", - "action": "NONE", - "description": "Datadog Agent IPC/CMD API port", - "reason": "Read by RemoteAgentClientConfiguration to build the IPC endpoint URI. Takes precedence over agent_ipc_endpoint when set.", - "issue": "#1645", - "adp_key": null - }, - { - "key": "config_id", - "feature_state": "NOT_APPLICABLE", - "action": "NONE", - "description": "Fleet Automation config ID tag for agent", - "reason": "Core Agent only adds config_id to Agent HA telemetry metrics. ADP does not need to stamp it on serialized metric payloads.", - "issue": "#1751", - "adp_key": null - }, - { - "key": "connect_retry_attempts", - "feature_state": "ADP_ONLY", - "action": "NONE", - "description": "IPC client connect retries", - "reason": "ADP-only, needed for fast startup.", - "issue": null, - "adp_key": null - }, - { - "key": "connect_retry_backoff", - "feature_state": "ADP_ONLY", - "action": "NONE", - "description": "IPC client retry delay", - "reason": "ADP-only, needed for fast startup.", - "issue": null, - "adp_key": null - }, - { - "key": "container_cgroup_root", - "feature_state": "PARITY", - "action": "NONE", - "description": "Cgroup filesystem root path", - "reason": "Confirmed implemented in ADP. Behavior matches the core agent.", - "issue": null, - "adp_key": null - }, - { - "key": "container_proc_root", - "feature_state": "PARITY", - "action": "NONE", - "description": "Procfs root path for containers", - "reason": "Confirmed implemented in ADP. Behavior matches the core agent.", - "issue": null, - "adp_key": null - }, - { - "key": "counter_expiry_seconds", - "feature_state": "ADP_ONLY", - "action": "NONE", - "description": "Idle counter keep-alive duration", - "reason": "Alias for dogstatsd_expiry_seconds for pipeline reuse. Both default to 300s.", - "issue": null, - "adp_key": null - }, - { - "key": "cri_connection_timeout", - "feature_state": "PARITY", - "action": "NONE", - "description": "CRI container runtime connection timeout (s)", - "reason": "Confirmed implemented in ADP. Behavior matches the core agent: the value controls the containerd gRPC connection timeout and defaults to 1s.", - "issue": null, - "adp_key": null - }, - { - "key": "cri_query_timeout", - "feature_state": "PARITY", - "action": "NONE", - "description": "CRI container runtime query timeout (s)", - "reason": "Confirmed implemented in ADP. Behavior matches the core agent: the value applies to unary containerd RPCs and defaults to 5s; long-lived event streams remain untimed.", - "issue": null, - "adp_key": null - }, - { - "key": "cri_socket_path", - "feature_state": "PARITY", - "action": "NONE", - "description": "CRI/containerd socket path", - "reason": "Confirmed implemented in ADP. Behavior matches the core agent.", - "issue": null, - "adp_key": null - }, - { - "key": "data_plane.api_listen_address", - "feature_state": "ADP_ONLY", - "action": "NONE", - "description": "ADP unprivileged API address", - "reason": "ADP-only key; core agent has no equivalent. Confirmed fine as-is.", - "issue": null, - "adp_key": null - }, - { - "key": "data_plane.dogstatsd.enabled", - "feature_state": "PARITY", - "action": "NONE", - "description": "Enable DSD in data plane", - "reason": "Implemented in both. ADP reads this key natively. adp_key is itself.", - "issue": null, - "adp_key": null - }, - { - "key": "data_plane.enabled", - "feature_state": "PARITY", - "action": "NONE", - "description": "Enable ADP globally", - "reason": "Implemented in both ADP and core agent.", - "issue": null, - "adp_key": null - }, - { - "key": "data_plane.remote_agent_enabled", - "feature_state": "ADP_ONLY", - "action": "NONE", - "description": "Register as remote agent", - "reason": "ADP-only key; going away, will be implied by standalone_mode=false.", - "issue": null, - "adp_key": null - }, - { - "key": "data_plane.secure_api_listen_address", - "feature_state": "ADP_ONLY", - "action": "NONE", - "description": "ADP privileged API address", - "reason": "ADP-only key; core agent has no equivalent. Confirmed fine as-is.", - "issue": null, - "adp_key": null - }, - { - "key": "data_plane.standalone_mode", - "feature_state": "ADP_ONLY", - "action": "NONE", - "description": "ADP standalone mode toggle", - "reason": "ADP-only key; core agent has no equivalent. Confirmed fine as-is.", - "issue": null, - "adp_key": null - }, - { - "key": "data_plane.use_new_config_stream_endpoint", - "feature_state": "ADP_ONLY", - "action": "NONE", - "description": "Use new config stream endpoint", - "reason": "ADP-only key; going away, will be implied by standalone_mode=false.", - "issue": null, - "adp_key": null - }, - { - "key": "dd_url", - "feature_state": "PARITY", - "action": "NONE", - "description": "Override intake endpoint URL", - "reason": "Confirmed implemented in ADP. Behavior matches the core agent.", - "issue": null, - "adp_key": null - }, - { - "key": "dogstatsd_allow_context_heap_allocs", - "feature_state": "ADP_ONLY", - "action": "NONE", - "description": "Allow heap allocs for contexts", - "reason": "ADP-only memory bounding key. Default is fine.", - "issue": null, - "adp_key": null - }, - { - "key": "dogstatsd_autoscale_udp_listeners", - "feature_state": "ADP_ONLY", - "action": "NONE", - "description": "Bind multiple UDP sockets via SO_REUSEPORT", - "reason": "Controls UDP listener scaling directly in DogStatsD source", - "issue": null, - "adp_key": null - }, - { - "key": "dogstatsd_buffer_count", - "feature_state": "ADP_ONLY", - "action": "INVESTIGATE", - "description": "Number of receive buffers", - "reason": "ADP-only key; default may need re-evaluation for UDS stream workloads.", - "issue": "#1382", - "adp_key": null - }, - { - "key": "dogstatsd_buffer_size", - "feature_state": "PARITY", - "action": "NONE", - "description": "Receive buffer size (bytes)", - "reason": "Confirmed implemented in ADP. Behavior matches the core agent.", - "issue": null, - "adp_key": null - }, - { - "key": "dogstatsd_cached_contexts_limit", - "feature_state": "ADP_ONLY", - "action": "NONE", - "description": "Max cached metric contexts", - "reason": "ADP-only memory bounding key. Defaults are fine.", - "issue": null, - "adp_key": null - }, - { - "key": "dogstatsd_cached_tagsets_limit", - "feature_state": "ADP_ONLY", - "action": "NONE", - "description": "Max cached tagsets", - "reason": "ADP-only memory bounding key. Defaults are fine.", - "issue": null, - "adp_key": null - }, - { - "key": "dogstatsd_capture_depth", - "feature_state": "MISSING", - "action": "IMPLEMENT", - "description": "Depth of in-process packet capture queue", - "reason": "DogStatsD traffic capture not yet implemented in ADP.", - "issue": "#1381", - "adp_key": null - }, - { - "key": "dogstatsd_capture_path", - "feature_state": "MISSING", - "action": "IMPLEMENT", - "description": "File path for DogStatsD traffic capture", - "reason": "DogStatsD traffic capture not yet implemented in ADP.", - "issue": "#1381", - "adp_key": null - }, - { - "key": "dogstatsd_context_expiry_seconds", - "feature_state": "PARITY", - "action": "NONE", - "description": "Context cache TTL (seconds)", - "reason": "ADP reads dogstatsd_context_expiry_seconds and defaults to 20s, matching the core agent. The value drives both the context resolver and tagset resolver idle expirations in ADP's layered cache architecture.", - "issue": "#1340", - "adp_key": null - }, - { - "key": "dogstatsd_disable_verbose_logs", - "feature_state": "MISSING", - "action": "INVESTIGATE", - "description": "Downgrade parse-error logs to debug level", - "reason": "ADP logs parse failures unconditionally at warn; no toggle. Decision needed.", - "issue": "#1350", - "adp_key": null - }, - { - "key": "dogstatsd_entity_id_precedence", - "feature_state": "PARITY", - "action": "NONE", - "description": "Entity ID over auto-detection", - "reason": "Confirmed implemented in ADP. Behavior matches the core agent.", - "issue": null, - "adp_key": null - }, - { - "key": "dogstatsd_eol_required", - "feature_state": "PARITY", - "action": "NONE", - "description": "Require newline-terminated messages", - "reason": "ADP honors the udp and uds values. The named_pipe value is accepted for compatibility, with named pipe listener support tracked separately.", - "issue": null, - "adp_key": null - }, - { - "key": "dogstatsd_experimental_http.enabled", - "feature_state": "MISSING", - "action": "INVESTIGATE", - "description": "Enable experimental HTTP/H2C DSD listener", - "reason": "Experimental HTTP/H2C DogStatsD ingestion endpoint; not needed for ADP.", - "issue": "#1682", - "adp_key": null - }, - { - "key": "dogstatsd_experimental_http.listen_address", - "feature_state": "MISSING", - "action": "INVESTIGATE", - "description": "Bind addr for experimental HTTP DSD listener", - "reason": "Experimental HTTP/H2C DogStatsD ingestion endpoint; not needed for ADP.", - "issue": "#1682", - "adp_key": null - }, - { - "key": "dogstatsd_expiry_seconds", - "feature_state": "PARITY", - "action": "NONE", - "description": "Counter zero-value TTL (secs)", - "reason": "Implemented via serde alias in ADP. Both default to 300s and have the same semantics.", - "issue": null, - "adp_key": null - }, - { - "key": "dogstatsd_flush_incomplete_buckets", - "feature_state": "PARITY", - "action": "NONE", - "description": "Flush open buckets on shutdown", - "reason": "Key naming mismatch fixed in #1498. ADP reads both dogstatsd_flush_incomplete_buckets and aggregate_flush_open_windows.", - "issue": "#1366", - "adp_key": "aggregate_flush_open_windows" - }, - { - "key": "dogstatsd_log_file", - "feature_state": "PARITY", - "action": "NONE", - "description": "DSD dedicated log file path", - "reason": "ADP writes DogStatsD metric debug lines to this file while dogstatsd_metrics_stats_enable is true and the debug log destination is wired. An empty value uses the platform default path.", - "issue": "#1356", - "adp_key": null - }, - { - "key": "dogstatsd_log_file_max_rolls", - "feature_state": "PARITY", - "action": "NONE", - "description": "DSD log file max roll count", - "reason": "ADP keeps this many rotated DogStatsD debug log files.", - "issue": "#1356", - "adp_key": null - }, - { - "key": "dogstatsd_log_file_max_size", - "feature_state": "PARITY", - "action": "NONE", - "description": "DSD log file max size", - "reason": "ADP rotates the active DogStatsD debug log file when it reaches this size.", - "issue": "#1356", - "adp_key": null - }, - { - "key": "dogstatsd_logging_enabled", - "feature_state": "PARITY", - "action": "NONE", - "description": "Enables DSD metric logging", - "reason": "ADP uses this toggle to decide whether to wire the DogStatsD metric debug log destination. The destination writes only while dogstatsd_metrics_stats_enable is true.", - "issue": "#1356", - "adp_key": null - }, - { - "key": "dogstatsd_mapper_cache_size", - "feature_state": "DIVERGENT", - "action": "DOCUMENTED", - "description": "Mapper result LRU cache size", - "reason": "Implementation in lib/saluki-components/src/transforms/dogstatsd_mapper/mod.rs mirrors the agent's per-name result cache (key=metric name, value=mapped name + extra tags, with negative caching). Default 1000 matches the agent. Divergence: at cache_size=0, ADP disables the cache only and keeps mapping profiles active; the agent silently disables mapping entirely because its underlying LRU rejects non-positive sizes.", - "issue": "#1687", - "adp_key": null - }, - { - "key": "dogstatsd_mapper_profiles", - "feature_state": "PARITY", - "action": "NONE", - "description": "Metric mapping profile defs", - "reason": "Confirmed implemented in ADP. Behavior matches the core agent.", - "issue": null, - "adp_key": null - }, - { - "key": "dogstatsd_mapper_profiles.mappings", - "feature_state": "PARITY", - "action": "NONE", - "description": "Mapper mapping rules list", - "reason": "Confirmed implemented in ADP. Behavior matches the core agent.", - "issue": null, - "adp_key": null - }, - { - "key": "dogstatsd_mapper_profiles.mappings.match_type", - "feature_state": "PARITY", - "action": "NONE", - "description": "Mapper match type (regex/wc)", - "reason": "Confirmed implemented in ADP. Behavior matches the core agent.", - "issue": null, - "adp_key": null - }, - { - "key": "dogstatsd_mapper_profiles.mappings.name", - "feature_state": "PARITY", - "action": "NONE", - "description": "Mapper output metric name", - "reason": "Confirmed implemented in ADP. Behavior matches the core agent.", - "issue": null, - "adp_key": null - }, - { - "key": "dogstatsd_mapper_profiles.mappings.tags", - "feature_state": "PARITY", - "action": "NONE", - "description": "Mapper output tags map", - "reason": "Confirmed implemented in ADP. Behavior matches the core agent.", - "issue": null, - "adp_key": null - }, - { - "key": "dogstatsd_mapper_profiles.mappings.tags.task_name", - "feature_state": "PARITY", - "action": "NONE", - "description": "Mapper tag extraction rule", - "reason": "Confirmed implemented in ADP. Behavior matches the core agent.", - "issue": null, - "adp_key": null - }, - { - "key": "dogstatsd_mapper_profiles.mappings.tags.task_type", - "feature_state": "PARITY", - "action": "NONE", - "description": "Mapper tag extraction rule", - "reason": "Confirmed implemented in ADP. Behavior matches the core agent.", - "issue": null, - "adp_key": null - }, - { - "key": "dogstatsd_mapper_profiles.mappings.tags.worker_name", - "feature_state": "PARITY", - "action": "NONE", - "description": "Mapper tag value expression", - "reason": "Confirmed implemented in ADP. Behavior matches the core agent.", - "issue": null, - "adp_key": null - }, - { - "key": "dogstatsd_mapper_profiles.mappings.tags.worker_type", - "feature_state": "PARITY", - "action": "NONE", - "description": "Mapper tag value expression", - "reason": "Confirmed implemented in ADP. Behavior matches the core agent.", - "issue": null, - "adp_key": null - }, - { - "key": "dogstatsd_mapper_profiles.prefix", - "feature_state": "PARITY", - "action": "NONE", - "description": "Mapper profile prefix filter", - "reason": "Confirmed implemented in ADP. Behavior matches the core agent.", - "issue": null, - "adp_key": null - }, - { - "key": "dogstatsd_mapper_string_interner_size", - "feature_state": "ADP_ONLY", - "action": "NONE", - "description": "Mapper string interner capacity", - "reason": "ADP-only tuning knob.", - "issue": null, - "adp_key": null - }, - { - "key": "dogstatsd_mem_based_rate_limiter", - "feature_state": "NOT_APPLICABLE", - "action": "NONE", - "description": "Memory rate limiter group key", - "reason": "Go-GC-specific mechanism (runtime.GC, debug.SetGCPercent) with no Rust equivalent. ADP uses memory_limit/memory_slop_factor instead.", - "issue": null, - "adp_key": null - }, - { - "key": "dogstatsd_mem_based_rate_limiter.enabled", - "feature_state": "NOT_APPLICABLE", - "action": "NONE", - "description": "Enable memory rate limiter", - "reason": "Go-GC-specific mechanism (runtime.GC, debug.SetGCPercent) with no Rust equivalent. ADP uses memory_limit/memory_slop_factor instead.", - "issue": null, - "adp_key": null - }, - { - "key": "dogstatsd_mem_based_rate_limiter.go_gc", - "feature_state": "NOT_APPLICABLE", - "action": "NONE", - "description": "GC percentage for rate limiter", - "reason": "Go-GC-specific mechanism (runtime.GC, debug.SetGCPercent) with no Rust equivalent. ADP uses memory_limit/memory_slop_factor instead.", - "issue": null, - "adp_key": null - }, - { - "key": "dogstatsd_mem_based_rate_limiter.high_soft_limit", - "feature_state": "NOT_APPLICABLE", - "action": "NONE", - "description": "High memory soft limit ratio", - "reason": "Go-GC-specific mechanism (runtime.GC, debug.SetGCPercent) with no Rust equivalent. ADP uses memory_limit/memory_slop_factor instead.", - "issue": null, - "adp_key": null - }, - { - "key": "dogstatsd_mem_based_rate_limiter.low_soft_limit", - "feature_state": "NOT_APPLICABLE", - "action": "NONE", - "description": "Low memory soft limit ratio", - "reason": "Go-GC-specific mechanism (runtime.GC, debug.SetGCPercent) with no Rust equivalent. ADP uses memory_limit/memory_slop_factor instead.", - "issue": null, - "adp_key": null - }, - { - "key": "dogstatsd_mem_based_rate_limiter.memory_ballast", - "feature_state": "NOT_APPLICABLE", - "action": "NONE", - "description": "GC ballast allocation size", - "reason": "Go-GC-specific mechanism (runtime.GC, debug.SetGCPercent) with no Rust equivalent. ADP uses memory_limit/memory_slop_factor instead.", - "issue": null, - "adp_key": null - }, - { - "key": "dogstatsd_mem_based_rate_limiter.rate_check.factor", - "feature_state": "NOT_APPLICABLE", - "action": "NONE", - "description": "Rate check geometric factor", - "reason": "Go-GC-specific mechanism (runtime.GC, debug.SetGCPercent) with no Rust equivalent. ADP uses memory_limit/memory_slop_factor instead.", - "issue": null, - "adp_key": null - }, - { - "key": "dogstatsd_mem_based_rate_limiter.rate_check.max", - "feature_state": "NOT_APPLICABLE", - "action": "NONE", - "description": "Rate check max interval", - "reason": "Go-GC-specific mechanism (runtime.GC, debug.SetGCPercent) with no Rust equivalent. ADP uses memory_limit/memory_slop_factor instead.", - "issue": null, - "adp_key": null - }, - { - "key": "dogstatsd_mem_based_rate_limiter.rate_check.min", - "feature_state": "NOT_APPLICABLE", - "action": "NONE", - "description": "Rate check min interval", - "reason": "Go-GC-specific mechanism (runtime.GC, debug.SetGCPercent) with no Rust equivalent. ADP uses memory_limit/memory_slop_factor instead.", - "issue": null, - "adp_key": null - }, - { - "key": "dogstatsd_mem_based_rate_limiter.soft_limit_freeos_check.factor", - "feature_state": "NOT_APPLICABLE", - "action": "NONE", - "description": "OS free-mem check backoff factor", - "reason": "Go-GC-specific mechanism (runtime.GC, debug.SetGCPercent) with no Rust equivalent. ADP uses memory_limit/memory_slop_factor instead.", - "issue": null, - "adp_key": null - }, - { - "key": "dogstatsd_mem_based_rate_limiter.soft_limit_freeos_check.max", - "feature_state": "NOT_APPLICABLE", - "action": "NONE", - "description": "OS free-mem check max interval", - "reason": "Go-GC-specific mechanism (runtime.GC, debug.SetGCPercent) with no Rust equivalent. ADP uses memory_limit/memory_slop_factor instead.", - "issue": null, - "adp_key": null - }, - { - "key": "dogstatsd_mem_based_rate_limiter.soft_limit_freeos_check.min", - "feature_state": "NOT_APPLICABLE", - "action": "NONE", - "description": "OS free-mem check min interval", - "reason": "Go-GC-specific mechanism (runtime.GC, debug.SetGCPercent) with no Rust equivalent. ADP uses memory_limit/memory_slop_factor instead.", - "issue": null, - "adp_key": null - }, - { - "key": "dogstatsd_metrics_stats_enable", - "feature_state": "DIVERGENT", - "action": "DOCUMENTED", - "description": "Enable per-metric debug stats", - "reason": "ADP uses an on-demand privileged API and CLI flow for metric-level DogStatsD statistics. This key also gates writes in the DogStatsD metric debug log destination from #1356 when dogstatsd_logging_enabled is true.", - "issue": "#1352", - "adp_key": null - }, - { - "key": "dogstatsd_minimum_sample_rate", - "feature_state": "ADP_ONLY", - "action": "NONE", - "description": "Floor for metric sample rates", - "reason": "ADP-only DoS prevention.", - "issue": null, - "adp_key": null - }, - { - "key": "dogstatsd_no_aggregation_pipeline", - "feature_state": "PARITY", - "action": "NONE", - "description": "Enable no-agg timestamped path", - "reason": "Confirmed implemented in ADP. Behavior matches the core agent.", - "issue": null, - "adp_key": null - }, - { - "key": "dogstatsd_no_aggregation_pipeline_batch_size", - "feature_state": "NOT_APPLICABLE", - "action": "NONE", - "description": "No-agg pipeline batch size", - "reason": "Fixed in topology. ADP uses time-based flush instead of count-based.", - "issue": null, - "adp_key": null - }, - { - "key": "dogstatsd_non_local_traffic", - "feature_state": "PARITY", - "action": "NONE", - "description": "Accept non-localhost UDP/TCP", - "reason": "Confirmed implemented in ADP. Behavior matches the core agent.", - "issue": null, - "adp_key": null - }, - { - "key": "dogstatsd_origin_detection", - "feature_state": "PARITY", - "action": "NONE", - "description": "Enable UDS origin detection", - "reason": "Confirmed implemented in ADP. Behavior matches the core agent.", - "issue": null, - "adp_key": null - }, - { - "key": "dogstatsd_origin_detection_client", - "feature_state": "PARITY", - "action": "NONE", - "description": "Honor client origin proto fields", - "reason": "ADP gates parsing of the c: (local data), e: (external data), and card: (cardinality) client-provided fields on this key, defaulting to false, matching the Agent. Implemented in #1426.", - "issue": "#1426", - "adp_key": null - }, - { - "key": "dogstatsd_origin_optout_enabled", - "feature_state": "PARITY", - "action": "NONE", - "description": "Allow clients to opt out origin", - "reason": "Confirmed implemented in ADP. Behavior matches the core agent.", - "issue": null, - "adp_key": null - }, - { - "key": "dogstatsd_packet_buffer_flush_timeout", - "feature_state": "NOT_APPLICABLE", - "action": "NONE", - "description": "Packet buffer flush timeout", - "reason": "ADP decodes inline; no buffering pipeline.", - "issue": null, - "adp_key": null - }, - { - "key": "dogstatsd_packet_buffer_size", - "feature_state": "NOT_APPLICABLE", - "action": "NONE", - "description": "Datagrams per packet buffer", - "reason": "ADP decodes inline; no buffering pipeline.", - "issue": null, - "adp_key": null - }, - { - "key": "dogstatsd_permissive_decoding", - "feature_state": "ADP_ONLY", - "action": "NONE", - "description": "Relaxes decoder strictness", - "reason": "ADP-only key. Matches core agent lax behavior by default.", - "issue": null, - "adp_key": null - }, - { - "key": "dogstatsd_pipe_name", - "feature_state": "MISSING", - "action": "IMPLEMENT", - "description": "Windows named pipe path for DogStatsD", - "reason": "ADP targets Linux for initial GA, this will follow with Windows support", - "issue": "#1466", - "adp_key": null - }, - { - "key": "dogstatsd_pipeline_autoadjust", - "feature_state": "NOT_APPLICABLE", - "action": "NONE", - "description": "Auto-adjust pipeline workers", - "reason": "ADP uses async, not worker pools.", - "issue": null, - "adp_key": null - }, - { - "key": "dogstatsd_pipeline_count", - "feature_state": "NOT_APPLICABLE", - "action": "NONE", - "description": "Parallel processing pipelines", - "reason": "ADP uses async, not worker pools.", - "issue": null, - "adp_key": null - }, - { - "key": "dogstatsd_port", - "feature_state": "PARITY", - "action": "NONE", - "description": "UDP listen port", - "reason": "Confirmed implemented in ADP. Behavior matches the core agent.", - "issue": null, - "adp_key": null - }, - { - "key": "dogstatsd_queue_size", - "feature_state": "NOT_APPLICABLE", - "action": "NONE", - "description": "Packet channel buffer size", - "reason": "ADP uses async, not worker pools.", - "issue": null, - "adp_key": null - }, - { - "key": "dogstatsd_so_rcvbuf", - "feature_state": "PARITY", - "action": "NONE", - "description": "Socket receive buffer size", - "reason": "Implemented in PR #1525. Applies SO_RCVBUF to UDP, UDS datagram, and TCP sockets; 0 preserves OS default.", - "issue": "#1341", - "adp_key": null - }, - { - "key": "dogstatsd_socket", - "feature_state": "PARITY", - "action": "NONE", - "description": "UDS datagram socket path", - "reason": "Confirmed implemented in ADP. Behavior matches the core agent.", - "issue": null, - "adp_key": null - }, - { - "key": "dogstatsd_stats_buffer", - "feature_state": "DIVERGENT", - "action": "DOCUMENTED", - "description": "Internal stats buffer size", - "reason": "ADP does not expose the core agent's packet-per-second expvar endpoint, so there is no persistent stats endpoint buffer to configure.", - "issue": "#1352", - "adp_key": null - }, - { - "key": "dogstatsd_stats_enable", - "feature_state": "DIVERGENT", - "action": "DOCUMENTED", - "description": "Enable internal stats endpoint", - "reason": "ADP does not expose the core agent's packet-per-second expvar endpoint. It provides on-demand metric-level DogStatsD statistics through the privileged API instead.", - "issue": "#1352", - "adp_key": null - }, - { - "key": "dogstatsd_stats_port", - "feature_state": "DIVERGENT", - "action": "DOCUMENTED", - "description": "Internal stats endpoint port", - "reason": "ADP returns metric-level DogStatsD statistics inline from the privileged API request, so there is no persistent stats endpoint port to scrape.", - "issue": "#1352", - "adp_key": null - }, - { - "key": "dogstatsd_stream_log_too_big", - "feature_state": "PARITY", - "action": "NONE", - "description": "Log oversized UDS stream frames", - "reason": "ADP logs oversized UDS stream frames when this setting is enabled.", - "issue": "#1342", - "adp_key": null - }, - { - "key": "dogstatsd_stream_socket", - "feature_state": "PARITY", - "action": "NONE", - "description": "UDS stream socket path", - "reason": "Confirmed implemented in ADP. Behavior matches the core agent.", - "issue": null, - "adp_key": null - }, - { - "key": "dogstatsd_string_interner_size", - "feature_state": "PARITY", - "action": "NONE", - "description": "String interner capacity", - "reason": "CLOSED - rename complete. Agent=4096 entries (count), ADP=2MiB bytes (size). Semantic clash resolved by rename; closed issue indicates work is done.", - "issue": "#1367", - "adp_key": null - }, - { - "key": "dogstatsd_string_interner_size_bytes", - "feature_state": "ADP_ONLY", - "action": "NONE", - "description": "Explicit byte budget for context string interner", - "reason": "Controls string intern pool size in DogStatsD parser", - "issue": null, - "adp_key": null - }, - { - "key": "dogstatsd_tag_cardinality", - "feature_state": "PARITY", - "action": "NONE", - "description": "Default tag cardinality level", - "reason": "Confirmed implemented in ADP. Behavior matches the core agent.", - "issue": null, - "adp_key": null - }, - { - "key": "dogstatsd_tags", - "feature_state": "PARITY", - "action": "NONE", - "description": "Extra tags added to all DSD data", - "reason": "Confirmed implemented in ADP. Behavior matches the core agent.", - "issue": null, - "adp_key": null - }, - { - "key": "dogstatsd_tcp_port", - "feature_state": "ADP_ONLY", - "action": "NONE", - "description": "TCP listen port for DSD", - "reason": "ADP-only extension. Core agent has no TCP DSD listener. Confirmed implemented and fine as-is.", - "issue": null, - "adp_key": null - }, - { - "key": "dogstatsd_telemetry_enabled_listener_id", - "feature_state": "MISSING", - "action": "NONE", - "description": "Tag telemetry with per-listener ID", - "reason": "No analysis recorded; needs triage.", - "issue": null, - "adp_key": null - }, - { - "key": "dogstatsd_windows_pipe_security_descriptor", - "feature_state": "MISSING", - "action": "IMPLEMENT", - "description": "ACL for Windows named pipe listener", - "reason": "Windows support is deferred but planned.", - "issue": "#1466", - "adp_key": null - }, - { - "key": "dogstatsd_workers_count", - "feature_state": "NOT_APPLICABLE", - "action": "NONE", - "description": "Num DSD processing workers", - "reason": "ADP uses async, not worker pools.", - "issue": null, - "adp_key": null - }, - { - "key": "enable_global_limiter", - "feature_state": "ADP_ONLY", - "action": "NONE", - "description": "Toggle global memory limiter", - "reason": "ADP-only key. Controls the MemoryLimiter that exerts backpressure when memory exceeds memory_limit. The core agent has no equivalent; it relies on Go GC.", - "issue": null, - "adp_key": null - }, - { - "key": "enable_json_stream_shared_compressor_buffers", - "feature_state": "NOT_APPLICABLE", - "action": "NONE", - "description": "Pre-allocate shared compressor buffers", - "reason": "ADP does not use a shared compressor buffer pool; Rust request builders own fixed-capacity scratch and compression buffers.", - "issue": "#1749", - "adp_key": null - }, - { - "key": "enable_payloads_events", - "feature_state": "PARITY", - "action": "NONE", - "description": "Allow sending event payloads", - "reason": "Key naming mismatch fixed in #1498. ADP reads enable_payloads.events.", - "issue": "#1366", - "adp_key": null - }, - { - "key": "enable_payloads_series", - "feature_state": "PARITY", - "action": "NONE", - "description": "Allow sending series payloads", - "reason": "Key naming mismatch fixed in #1498. ADP reads enable_payloads.series.", - "issue": "#1366", - "adp_key": null - }, - { - "key": "enable_payloads_service_checks", - "feature_state": "PARITY", - "action": "NONE", - "description": "Allow sending svc check payloads", - "reason": "Key naming mismatch fixed in #1498. ADP reads enable_payloads.service_checks.", - "issue": "#1366", - "adp_key": null - }, - { - "key": "enable_payloads_sketches", - "feature_state": "PARITY", - "action": "NONE", - "description": "Allow sending sketch payloads", - "reason": "Key naming mismatch fixed in #1498. ADP reads enable_payloads.sketches.", - "issue": "#1366", - "adp_key": null - }, - { - "key": "entity_id", - "feature_state": "NOT_APPLICABLE", - "action": "NONE", - "description": "Agent's own pod entity ID (set by DCA webhook)", - "reason": "ADP does not emit internal DogStatsD metrics; its own DogStatsD telemetry is exposed via OpenMetrics.", - "issue": "#1752", - "adp_key": null - }, - { - "key": "env", - "feature_state": "DIVERGENT", - "action": "NONE", - "description": "Agent environment name", - "reason": "ADP reads env but defaults to 'none' instead of the core agent's ''. Scope is narrower in ADP (only traces/stats encoders). Neither implementation uses env directly on the DogStatsD metrics path, so practical impact for DogStatsD parity is minimal. No action needed.", - "issue": null, - "adp_key": null - }, - { - "key": "expected_tags_duration", - "feature_state": "PARITY", - "action": "NONE", - "description": "Host tag enrichment duration", - "reason": "Confirmed implemented in ADP. No divergence noted.", - "issue": null, - "adp_key": null - }, - { - "key": "extra_tags", - "feature_state": "PARITY", - "action": "NONE", - "description": "Additional static tags", - "reason": "ADP does not read the key directly; the core agent's tagger consumes it and surfaces these tags via the host_tags response that ADP fetches over RemoteAgentClient.", - "issue": "#1332", - "adp_key": null - }, - { - "key": "flush_timeout_secs", - "feature_state": "ADP_ONLY", - "action": "NONE", - "description": "Encoder flush timeout (secs)", - "reason": "ADP-only batching optimization key. Controls how long metrics/stats/traces encoders wait before flushing a partial payload. The core agent has no equivalent.", - "issue": null, - "adp_key": null - }, - { - "key": "forwarder_apikey_validation_interval", - "feature_state": "MISSING", - "action": "INVESTIGATE", - "description": "Interval (min) for API key revalidation", - "reason": "Core agent supports runtime API key refresh without restart. ADP has partial infrastructure (config-side listeners) but the forwarder does not act on updates.", - "issue": "#1357", - "adp_key": null - }, - { - "key": "forwarder_backoff_base", - "feature_state": "PARITY", - "action": "NONE", - "description": "Retry backoff base (secs)", - "reason": "Implemented in ADP. No action needed.", - "issue": null, - "adp_key": null - }, - { - "key": "forwarder_backoff_factor", - "feature_state": "PARITY", - "action": "NONE", - "description": "Retry backoff jitter factor", - "reason": "Implemented in ADP. No action needed.", - "issue": null, - "adp_key": null - }, - { - "key": "forwarder_backoff_max", - "feature_state": "PARITY", - "action": "NONE", - "description": "Retry backoff ceiling (secs)", - "reason": "Implemented in ADP. No action needed.", - "issue": null, - "adp_key": null - }, - { - "key": "forwarder_connection_reset_interval", - "feature_state": "PARITY", - "action": "NONE", - "description": "HTTP conn reset interval (secs)", - "reason": "Implemented in ADP. No action needed.", - "issue": null, - "adp_key": null - }, - { - "key": "forwarder_flush_to_disk_mem_ratio", - "feature_state": "MISSING", - "action": "INVESTIGATE", - "description": "Mem ratio threshold to flush queue to disk", - "reason": "Purpose unclear; needs research into what it controls, whether customers use it, and whether ADP needs an equivalent.", - "issue": "#1364", - "adp_key": null - }, - { - "key": "forwarder_high_prio_buffer_size", - "feature_state": "DIVERGENT", - "action": "INVESTIGATE", - "description": "High-priority request queue size", - "reason": "Both ADP and the core agent have this key but defaults diverge: core agent=100, ADP=16. ADP also has no separate high/low priority queues.", - "issue": "#1362", - "adp_key": null - }, - { - "key": "forwarder_http_protocol", - "feature_state": "MISSING", - "action": "IMPLEMENT", - "description": "HTTP version selection (auto/http1/http2)", - "reason": "Core agent allows selecting HTTP protocol version via forwarder_http_protocol. ADP does not support this.", - "issue": "#1361", - "adp_key": null - }, - { - "key": "forwarder_low_prio_buffer_size", - "feature_state": "MISSING", - "action": "INVESTIGATE", - "description": "Max pending requests in low-prio buffer", - "reason": "ADP has no separate low-priority queue - all requests go through one buffer. Covered by the same investigation as forwarder_high_prio_buffer_size.", - "issue": "#1362", - "adp_key": null - }, - { - "key": "forwarder_max_concurrent_requests", - "feature_state": "MISSING", - "action": "INVESTIGATE", - "description": "Max concurrent outbound HTTP requests", - "reason": "ADP uses concurrency to emulate workers. Possible mapping: forwarder_num_workers -> hyper pool size, forwarder_max_concurrent_requests -> max connections. Needs research.", - "issue": "#1363", - "adp_key": null - }, - { - "key": "forwarder_num_workers", - "feature_state": "PARITY", - "action": "NONE", - "description": "Concurrent forwarder workers", - "reason": "Implemented in ADP. No action needed.", - "issue": null, - "adp_key": null - }, - { - "key": "forwarder_outdated_file_in_days", - "feature_state": "MISSING", - "action": "IMPLEMENT", - "description": "Days before retry files are deleted", - "reason": "Core agent exposes forwarder_outdated_file_in_days to clean up stale retry queue files. ADP does not support this.", - "issue": "#1360", - "adp_key": null - }, - { - "key": "forwarder_recovery_interval", - "feature_state": "PARITY", - "action": "NONE", - "description": "Backoff recovery decrease factor", - "reason": "Implemented in ADP. No action needed.", - "issue": null, - "adp_key": null - }, - { - "key": "forwarder_recovery_reset", - "feature_state": "PARITY", - "action": "NONE", - "description": "Reset errors on success", - "reason": "Implemented in ADP. No action needed.", - "issue": null, - "adp_key": null - }, - { - "key": "forwarder_requeue_buffer_size", - "feature_state": "MISSING", - "action": "INVESTIGATE", - "description": "In-memory requeue buffer size for forwarder", - "reason": "Marked for investigation; previously dismissed as not-applicable.", - "issue": "#1755", - "adp_key": null - }, - { - "key": "forwarder_retry_queue_capacity_time_interval_sec", - "feature_state": "MISSING", - "action": "INVESTIGATE", - "description": "Time window for retry queue capacity calc", - "reason": "Purpose unclear; needs research into what this controls.", - "issue": "#1365", - "adp_key": null - }, - { - "key": "forwarder_retry_queue_max_size", - "feature_state": "PARITY", - "action": "NONE", - "description": "Retry queue max size (depr.)", - "reason": "Implemented in ADP. No action needed.", - "issue": null, - "adp_key": null - }, - { - "key": "forwarder_retry_queue_payloads_max_size", - "feature_state": "PARITY", - "action": "NONE", - "description": "Retry queue max size (bytes)", - "reason": "Implemented in ADP. No action needed.", - "issue": null, - "adp_key": null - }, - { - "key": "forwarder_stop_timeout", - "feature_state": "MISSING", - "action": "INVESTIGATE", - "description": "Timeout (sec) for forwarder graceful stop", - "reason": "Marked for investigation; previously dismissed as not-applicable.", - "issue": "#1754", - "adp_key": null - }, - { - "key": "forwarder_storage_max_disk_ratio", - "feature_state": "PARITY", - "action": "NONE", - "description": "Max disk usage ratio for retry", - "reason": "Implemented in ADP. No action needed.", - "issue": null, - "adp_key": null - }, - { - "key": "forwarder_storage_max_size_in_bytes", - "feature_state": "PARITY", - "action": "NONE", - "description": "Max on-disk retry storage size", - "reason": "Implemented in ADP. No action needed.", - "issue": null, - "adp_key": null - }, - { - "key": "forwarder_storage_path", - "feature_state": "PARITY", - "action": "NONE", - "description": "On-disk retry storage directory", - "reason": "Implemented in ADP. No action needed.", - "issue": null, - "adp_key": null - }, - { - "key": "forwarder_timeout", - "feature_state": "PARITY", - "action": "NONE", - "description": "Forwarder HTTP request timeout", - "reason": "Implemented in ADP. No action needed.", - "issue": null, - "adp_key": null - }, - { - "key": "heroku_dyno", - "feature_state": "NOT_APPLICABLE", - "action": "NONE", - "description": "Heroku dyno telemetry mode", - "reason": "Core Agent-owned Heroku Agent heartbeat behavior; ADP is not launched in the supported Heroku Agent package path and does not emit datadog..running.", - "issue": "#1753", - "adp_key": null - }, - { - "key": "histogram_aggregates", - "feature_state": "PARITY", - "action": "NONE", - "description": "Histogram aggregate statistics", - "reason": "Implemented in ADP. No action needed.", - "issue": null, - "adp_key": null - }, - { - "key": "histogram_copy_to_distribution", - "feature_state": "PARITY", - "action": "NONE", - "description": "Copy histograms to distributions", - "reason": "Implemented in ADP. No action needed.", - "issue": null, - "adp_key": null - }, - { - "key": "histogram_copy_to_distribution_prefix", - "feature_state": "PARITY", - "action": "NONE", - "description": "Prefix for hist-to-dist copies", - "reason": "Implemented in ADP. No action needed.", - "issue": null, - "adp_key": null - }, - { - "key": "histogram_percentiles", - "feature_state": "PARITY", - "action": "NONE", - "description": "Histogram percentile quantiles", - "reason": "Implemented in ADP. No action needed.", - "issue": null, - "adp_key": null - }, - { - "key": "hostname", - "feature_state": "PARITY", - "action": "NONE", - "description": "Configured hostname override", - "reason": "Implemented in ADP. ADP reads hostname directly in standalone mode; in agent-paired mode receives it via gRPC. No action needed.", - "issue": null, - "adp_key": null - }, - { - "key": "ipc_cert_file_path", - "feature_state": "PARITY", - "action": "NONE", - "description": "IPC TLS certificate path", - "reason": "Implemented in ADP. No action needed.", - "issue": null, - "adp_key": null - }, - { - "key": "log_file", - "feature_state": "PARITY", - "action": "NONE", - "description": "Log output file path", - "reason": "Implemented in ADP. No action needed.", - "issue": null, - "adp_key": null - }, - { - "key": "log_file_max_rolls", - "feature_state": "PARITY", - "action": "NONE", - "description": "Max rotated log files kept", - "reason": "Implemented in ADP. No action needed.", - "issue": null, - "adp_key": null - }, - { - "key": "log_file_max_size", - "feature_state": "PARITY", - "action": "NONE", - "description": "Max log file size before rotate", - "reason": "Implemented in ADP. No action needed.", - "issue": null, - "adp_key": null - }, - { - "key": "log_format_json", - "feature_state": "PARITY", - "action": "NONE", - "description": "Use JSON log format", - "reason": "Implemented in ADP. No action needed.", - "issue": null, - "adp_key": null - }, - { - "key": "log_format_rfc3339", - "feature_state": "MISSING", - "action": "IMPLEMENT", - "description": "Use RFC 3339 format for log timestamps", - "reason": "Core agent supports log_format_rfc3339 to use RFC3339 timestamps. ADP hardcodes a non-RFC3339 format.", - "issue": "#1373", - "adp_key": null - }, - { - "key": "log_level", - "feature_state": "DIVERGENT", - "action": "NONE", - "description": "Log verbosity level/filter directives", - "reason": "Plain levels apply to ADP and Saluki-owned targets only. Advanced EnvFilter directives remain supported for dependency targets and global fallback behavior.", - "issue": null, - "adp_key": null - }, - { - "key": "log_payloads", - "feature_state": "PARITY", - "action": "NONE", - "description": "Debug-log decoded payload contents before encoding", - "reason": "Implemented in ADP for decoded metrics, sketches, events, and service checks. ADP does not dump encoded HTTP bodies.", - "issue": null, - "adp_key": null - }, - { - "key": "log_to_console", - "feature_state": "PARITY", - "action": "NONE", - "description": "Log to stdout/stderr", - "reason": "Implemented in ADP. No action needed.", - "issue": null, - "adp_key": null - }, - { - "key": "log_to_syslog", - "feature_state": "PARITY", - "action": "NONE", - "description": "Log to syslog daemon", - "reason": "Implemented in ADP. No action needed.", - "issue": null, - "adp_key": null - }, - { - "key": "logging_frequency", - "feature_state": "DIVERGENT", - "action": "NONE", - "description": "Transaction success log interval", - "reason": "Core agent uses logging_frequency to throttle repetitive successful transaction logs. ADP logs successful forwarder operations below the default info level, so this key is intentionally unused.", - "issue": null, - "adp_key": null - }, - { - "key": "memory_limit", - "feature_state": "ADP_ONLY", - "action": "NONE", - "description": "Process memory limit (bytes)", - "reason": "ADP-only memory bounding key. The core agent relies on external container limits and Go's GC.", - "issue": null, - "adp_key": null - }, - { - "key": "memory_mode", - "feature_state": "ADP_ONLY", - "action": "NONE", - "description": "ADP global memory limiter mode", - "reason": "Controls ADP global memory limiter affecting all pipelines", - "issue": null, - "adp_key": null - }, - { - "key": "memory_slop_factor", - "feature_state": "ADP_ONLY", - "action": "NONE", - "description": "Memory headroom fraction", - "reason": "ADP-only concept. Reduces effective memory_limit to account for untracked allocations. No core agent counterpart.", - "issue": null, - "adp_key": null - }, - { - "key": "metric_filterlist", - "feature_state": "PARITY", - "action": "NONE", - "description": "Metric name blocklist", - "reason": "Implemented in both ADP and core agent.", - "issue": null, - "adp_key": null - }, - { - "key": "metric_filterlist_match_prefix", - "feature_state": "PARITY", - "action": "NONE", - "description": "Blocklist uses prefix matching", - "reason": "Implemented in both ADP and core agent.", - "issue": null, - "adp_key": null - }, - { - "key": "metric_tag_filterlist", - "feature_state": "PARITY", - "action": "NONE", - "description": "Per-metric tag include/exclude", - "reason": "Core agent supports per-metric tag include/exclude rules. ADP has support. Moved to PARITY by Jesse in PR #1469.", - "issue": null, - "adp_key": null - }, - { - "key": "metrics_level", - "feature_state": "ADP_ONLY", - "action": "NONE", - "description": "ADP internal metrics emission level", - "reason": "Sets internal metrics emission level for ADP process", - "issue": null, - "adp_key": null - }, - { - "key": "min_tls_version", - "feature_state": "DIVERGENT", - "action": "DOCUMENTED", - "description": "Minimum TLS version for HTTPS connections", - "reason": "Implemented for Datadog intake forwarding. TLS 1.2 and TLS 1.3 behavior matches the core agent; TLS 1.0 and TLS 1.1 values are accepted for config compatibility and clamped to TLS 1.2 because rustls does not support older protocol versions.", - "issue": null, - "adp_key": null - }, - { - "key": "multi_region_failover.enabled", - "feature_state": "MISSING", - "action": "INVESTIGATE", - "description": "Enable multi-region failover mode", - "reason": "Marked for investigation; previously dismissed as not-applicable.", - "issue": "#1678", - "adp_key": null - }, - { - "key": "multi_region_failover.failover_metrics", - "feature_state": "MISSING", - "action": "INVESTIGATE", - "description": "Enable metrics forwarding to failover region", - "reason": "Marked for investigation; previously dismissed as not-applicable.", - "issue": "#1678", - "adp_key": null - }, - { - "key": "multi_region_failover.metric_allowlist", - "feature_state": "MISSING", - "action": "INVESTIGATE", - "description": "Metric name allowlist for MRF forwarding", - "reason": "Marked for investigation; previously dismissed as not-applicable.", - "issue": "#1678", - "adp_key": null - }, - { - "key": "no_proxy_nonexact_match", - "feature_state": "PARITY", - "action": "NONE", - "description": "Domain/CIDR no_proxy matching", - "reason": "Implemented in ADP. No action needed.", - "issue": null, - "adp_key": null - }, - { - "key": "observability_pipelines_worker.metrics.enabled", - "feature_state": "PARITY", - "action": "NONE", - "description": "Route metrics to OPW instance", - "reason": "Implemented in ADP. When enabled with a valid URL, metric series and sketches use OPW as the primary endpoint.", - "issue": null, - "adp_key": null - }, - { - "key": "observability_pipelines_worker.metrics.url", - "feature_state": "PARITY", - "action": "NONE", - "description": "OPW metrics intake URL", - "reason": "Implemented in ADP. Used as the primary metrics endpoint when observability_pipelines_worker.metrics.enabled is true.", - "issue": null, - "adp_key": null - }, - { - "key": "origin_detection_unified", - "feature_state": "PARITY", - "action": "NONE", - "description": "Unified origin detection mode", - "reason": "Implemented in ADP. No action needed.", - "issue": null, - "adp_key": null - }, - { - "key": "otlp_string_interner_size", - "feature_state": "ADP_ONLY", - "action": "NONE", - "description": "OTLP context interner capacity", - "reason": "ADP-only key controlling string interner memory budget for the OTLP pipeline. The core agent has no equivalent.", - "issue": null, - "adp_key": null - }, - { - "key": "provider_kind", - "feature_state": "PARITY", - "action": "NONE", - "description": "Provider kind static tag", - "reason": "Implemented in ADP. Appends provider_kind: as a static tag to all DogStatsD metrics when set via DD_PROVIDER_KIND.", - "issue": "#1640", - "adp_key": null - }, - { - "key": "proxy", - "feature_state": "PARITY", - "action": "NONE", - "description": "Top-level proxy config section", - "reason": "Implemented in ADP. ADP flattens proxy.http/https/no_proxy to underscore variants at config load time. No action needed.", - "issue": null, - "adp_key": null - }, - { - "key": "proxy.http", - "feature_state": "PARITY", - "action": "NONE", - "description": "HTTP proxy URL", - "reason": "Implemented in ADP. No action needed.", - "issue": null, - "adp_key": null - }, - { - "key": "proxy.https", - "feature_state": "PARITY", - "action": "NONE", - "description": "HTTPS proxy URL", - "reason": "Implemented in ADP. No action needed.", - "issue": null, - "adp_key": null - }, - { - "key": "proxy.no_proxy", - "feature_state": "PARITY", - "action": "NONE", - "description": "Hosts bypassing proxy", - "reason": "Implemented in ADP. No action needed.", - "issue": null, - "adp_key": null - }, - { - "key": "proxy_http", - "feature_state": "PARITY", - "action": "NONE", - "description": "HTTP proxy URL", - "reason": "Implemented in ADP. Flat alias for proxy.http used by the DatadogRemapper. No action needed.", - "issue": null, - "adp_key": null - }, - { - "key": "proxy_https", - "feature_state": "PARITY", - "action": "NONE", - "description": "HTTPS proxy URL", - "reason": "Implemented in ADP. Flat alias for proxy.https. No action needed.", - "issue": null, - "adp_key": null - }, - { - "key": "proxy_no_proxy", - "feature_state": "PARITY", - "action": "NONE", - "description": "Proxy bypass host list", - "reason": "Implemented in ADP. Flat alias for proxy.no_proxy. No action needed.", - "issue": null, - "adp_key": null - }, - { - "key": "remote_agent_string_interner_size_bytes", - "feature_state": "ADP_ONLY", - "action": "NONE", - "description": "Tag string interner capacity", - "reason": "ADP-only setting. Controls the string interner used by the remote agent workload provider (default 512KB). No equivalent in the core agent.", - "issue": null, - "adp_key": null - }, - { - "key": "run_path", - "feature_state": "PARITY", - "action": "NONE", - "description": "Runtime data directory path", - "reason": "Both agent and ADP support this key for runtime data directory.", - "issue": null, - "adp_key": null - }, - { - "key": "secret_backend_command", - "feature_state": "PARITY", - "action": "NONE", - "description": "Secret resolver executable path", - "reason": "Confirmed implemented in ADP. Behavior matches the core agent.", - "issue": null, - "adp_key": null - }, - { - "key": "secret_backend_timeout", - "feature_state": "PARITY", - "action": "NONE", - "description": "Secret backend timeout (seconds)", - "reason": "ADP's ExternalProcessResolverConfiguration supports secret_backend_timeout.", - "issue": null, - "adp_key": null - }, - { - "key": "serializer_compressor_kind", - "feature_state": "PARITY", - "action": "NONE", - "description": "Payload compression algorithm", - "reason": "ADP reads serializer_compressor_kind for metric payload compression.", - "issue": null, - "adp_key": null - }, - { - "key": "serializer_experimental_use_v3_api.compression_level", - "feature_state": "MISSING", - "action": "IMPLEMENT", - "description": "V3 API zstd compression level", - "reason": "V2 to V3 migration PR in progress. Feature is missing but actively being addressed.", - "issue": "#1468", - "adp_key": null - }, - { - "key": "serializer_experimental_use_v3_api.series.beta_route", - "feature_state": "MISSING", - "action": "IMPLEMENT", - "description": "V3 beta intake route path for series", - "reason": "Controls series intake beta route for metric forwarding", - "issue": "#1468", - "adp_key": null - }, - { - "key": "serializer_experimental_use_v3_api.series.endpoints", - "feature_state": "MISSING", - "action": "IMPLEMENT", - "description": "Endpoints enabled for V3 series API", - "reason": "V2 to V3 migration PR in progress. Feature is missing but actively being addressed.", - "issue": "#1468", - "adp_key": null - }, - { - "key": "serializer_experimental_use_v3_api.series.shadow_sample_rate", - "feature_state": "MISSING", - "action": "IMPLEMENT", - "description": "Per-flush prob of v3beta shadow sampling", - "reason": "Shadow-traffic sample rate for metric serializer", - "issue": "#1468", - "adp_key": null - }, - { - "key": "serializer_experimental_use_v3_api.series.shadow_sites", - "feature_state": "MISSING", - "action": "IMPLEMENT", - "description": "Sites allowed for v3beta shadow sampling", - "reason": "Shadow-traffic sites for metric serializer", - "issue": "#1468", - "adp_key": null - }, - { - "key": "serializer_experimental_use_v3_api.series.use_beta", - "feature_state": "MISSING", - "action": "IMPLEMENT", - "description": "Use v3beta route instead of v3 for series", - "reason": "Enables V3 beta API for series metric forwarding", - "issue": "#1468", - "adp_key": null - }, - { - "key": "serializer_experimental_use_v3_api.series.validate", - "feature_state": "MISSING", - "action": "IMPLEMENT", - "description": "Dual-send v2+v3 series for validation", - "reason": "V2 to V3 migration PR in progress. Feature is missing but actively being addressed.", - "issue": "#1468", - "adp_key": null - }, - { - "key": "serializer_experimental_use_v3_api.sketches.endpoints", - "feature_state": "MISSING", - "action": "IMPLEMENT", - "description": "Endpoints enabling v3 sketches API", - "reason": "V2 to V3 migration PR in progress. Feature is missing but actively being addressed.", - "issue": "#1468", - "adp_key": null - }, - { - "key": "serializer_experimental_use_v3_api.sketches.validate", - "feature_state": "MISSING", - "action": "IMPLEMENT", - "description": "Dual-send v2+v3 sketches for validation", - "reason": "V2 to V3 migration PR in progress. Feature is missing but actively being addressed.", - "issue": "#1468", - "adp_key": null - }, - { - "key": "serializer_max_metrics_per_payload", - "feature_state": "ADP_ONLY", - "action": "NONE", - "description": "Max metrics per payload", - "reason": "ADP-only key. ADP unifies series+sketches limit under this key.", - "issue": "#1354", - "adp_key": null - }, - { - "key": "serializer_max_payload_size", - "feature_state": "PARITY", - "action": "NONE", - "description": "Max compressed payload size (generic)", - "reason": "ADP reads this Agent key for V1 series, sketches, events, and service check payload compressed size limits. Defaults match the core agent.", - "issue": "#1354", - "adp_key": null - }, - { - "key": "serializer_max_series_payload_size", - "feature_state": "PARITY", - "action": "NONE", - "description": "Max compressed V2 series payload size", - "reason": "ADP reads this Agent key for V2 series payload compressed size limits. Defaults match the core agent.", - "issue": "#1354", - "adp_key": null - }, - { - "key": "serializer_max_series_points_per_payload", - "feature_state": "PARITY", - "action": "NONE", - "description": "Max data points per series payload", - "reason": "ADP reads this Agent key for V2 series payload data point limits. Defaults match the core agent.", - "issue": "#1354", - "adp_key": null - }, - { - "key": "serializer_max_series_uncompressed_payload_size", - "feature_state": "PARITY", - "action": "NONE", - "description": "Max uncompressed V2 series payload size", - "reason": "ADP reads this Agent key for V2 series payload uncompressed size limits. Defaults match the core agent.", - "issue": "#1354", - "adp_key": null - }, - { - "key": "serializer_max_uncompressed_payload_size", - "feature_state": "PARITY", - "action": "NONE", - "description": "Max uncompressed payload size (generic)", - "reason": "ADP reads this Agent key for V1 series, sketches, events, and service check payload uncompressed size limits. Defaults match the core agent.", - "issue": "#1354", - "adp_key": null - }, - { - "key": "serializer_zstd_compressor_level", - "feature_state": "DIVERGENT", - "action": "NONE", - "description": "Zstd compression level", - "reason": "ADP defaults to level 3 vs Agent level 1. ADP intentionally compresses better. Key is recognized by both; default divergence is intentional.", - "issue": null, - "adp_key": null - }, - { - "key": "site", - "feature_state": "PARITY", - "action": "NONE", - "description": "Datadog site domain", - "reason": "ADP reads site for endpoint construction.", - "issue": null, - "adp_key": null - }, - { - "key": "skip_ssl_validation", - "feature_state": "DIVERGENT", - "action": "NONE", - "description": "Skip TLS cert validation", - "reason": "ADP reads skip_ssl_validation for the shared Datadog forwarder and disables TLS certificate validation for Datadog intake forwarding. ADP rejects true in FIPS builds and does not apply the key to IPC, control-plane clients, OTLP proxying, or unrelated HTTP clients.", - "issue": null, - "adp_key": null - }, - { - "key": "sslkeylogfile", - "feature_state": "MISSING", - "action": "IMPLEMENT", - "description": "Write TLS session keys to file", - "reason": "TLS key log file not implemented in ADP.", - "issue": "#1372", - "adp_key": null - }, - { - "key": "statsd_forward_host", - "feature_state": "PARITY", - "action": "NONE", - "description": "UDP packet forwarding destination host", - "reason": "ADP forwards framed DogStatsD messages over UDP to the configured host before parsing.", - "issue": null, - "adp_key": null - }, - { - "key": "statsd_forward_port", - "feature_state": "PARITY", - "action": "NONE", - "description": "UDP packet forwarding destination port", - "reason": "ADP forwards framed DogStatsD messages over UDP to the configured port before parsing.", - "issue": null, - "adp_key": null - }, - { - "key": "statsd_metric_blocklist", - "feature_state": "PARITY", - "action": "NONE", - "description": "List of metric names to block/drop", - "reason": "Confirmed implemented in ADP. Behavior matches the core agent.", - "issue": "#1433", - "adp_key": null - }, - { - "key": "statsd_metric_blocklist_match_prefix", - "feature_state": "PARITY", - "action": "NONE", - "description": "Treat blocklist entries as prefixes", - "reason": "Confirmed implemented in ADP. Behavior matches the core agent.", - "issue": "#1434", - "adp_key": null - }, - { - "key": "statsd_metric_namespace", - "feature_state": "PARITY", - "action": "NONE", - "description": "Prefix prepended to all metric names", - "reason": "Confirmed implemented in ADP. Behavior matches the core agent.", - "issue": null, - "adp_key": null - }, - { - "key": "statsd_metric_namespace_blacklist", - "feature_state": "PARITY", - "action": "NONE", - "description": "Prefixes exempt from namespace", - "reason": "Naming mismatch: Agent uses _blacklist, Saluki introduced _blocklist as a rename. Key silently ignored due to config key rename.", - "issue": "#1353", - "adp_key": null - }, - { - "key": "statsd_metric_namespace_blocklist", - "feature_state": "ADP_ONLY", - "action": "NONE", - "description": "Alias (unused) for blacklist key", - "reason": "This key does not exist in the core agent - Saluki invented it as a rename of _blacklist.", - "issue": "#1353", - "adp_key": null - }, - { - "key": "syslog_rfc", - "feature_state": "PARITY", - "action": "NONE", - "description": "Use RFC-style syslog header", - "reason": "Implemented in ADP as a companion setting for log_to_syslog. No action needed.", - "issue": null, - "adp_key": null - }, - { - "key": "syslog_uri", - "feature_state": "PARITY", - "action": "NONE", - "description": "Syslog destination URI", - "reason": "Implemented in ADP as a companion setting for log_to_syslog. Empty values use the platform default local syslog URI when syslog logging is enabled.", - "issue": null, - "adp_key": null - }, - { - "key": "tags", - "feature_state": "PARITY", - "action": "NONE", - "description": "Global tags (DD_TAGS)", - "reason": "ADP does not read the key directly; the core agent's tagger consumes it and surfaces these tags via the host_tags response that ADP fetches over RemoteAgentClient.", - "issue": "#1333", - "adp_key": null - }, - { - "key": "telemetry.dogstatsd.aggregator_channel_latency_buckets", - "feature_state": "MISSING", - "action": "INVESTIGATE", - "description": "Histogram buckets for DSD aggregator channel lag", - "reason": "Marked for investigation; previously dismissed as not-applicable.", - "issue": "#1679", - "adp_key": null - }, - { - "key": "telemetry.dogstatsd.listeners_channel_latency_buckets", - "feature_state": "MISSING", - "action": "INVESTIGATE", - "description": "Histogram buckets for listener channel latency", - "reason": "Marked for investigation; previously dismissed as not-applicable.", - "issue": "#1679", - "adp_key": null - }, - { - "key": "telemetry.dogstatsd.listeners_latency_buckets", - "feature_state": "MISSING", - "action": "INVESTIGATE", - "description": "Histogram buckets for listener processing latency", - "reason": "Marked for investigation; previously dismissed as not-applicable.", - "issue": "#1679", - "adp_key": null - }, - { - "key": "telemetry.dogstatsd_origin", - "feature_state": "MISSING", - "action": "INVESTIGATE", - "description": "Per-origin processed-metrics telemetry counters", - "reason": "Marked for investigation; previously dismissed as not-applicable.", - "issue": "#1679", - "adp_key": null - }, - { - "key": "tls_handshake_timeout", - "feature_state": "MISSING", - "action": "IMPLEMENT", - "description": "HTTP TLS handshake timeout duration", - "reason": "Existing request timeout covers the gap.", - "issue": "#178", - "adp_key": null - }, - { - "key": "use_dogstatsd", - "feature_state": "MISSING", - "action": "NONE", - "description": "Master toggle for DogStatsD server", - "reason": "ADP uses data_plane.dogstatsd.enabled and does not read use_dogstatsd. Customers disabling DogStatsD via the documented setting won't affect ADP.", - "issue": "#1334", - "adp_key": "data_plane.dogstatsd.enabled" - }, - { - "key": "use_proxy_for_cloud_metadata", - "feature_state": "PARITY", - "action": "NONE", - "description": "Proxy cloud metadata endpoints", - "reason": "ADP honors proxy settings but does not query cloud metadata (the core agent handles that).", - "issue": null, - "adp_key": null - }, - { - "key": "use_v2_api.series", - "feature_state": "PARITY", - "action": "NONE", - "description": "Send series via V2 protobuf endpoint", - "reason": "ADP reads use_v2_api.series via alias use_v2_api_series. Both default to true (V2 protobuf /api/v2/series). When false, both fall back to V1 JSON /api/v1/series.", - "issue": null, - "adp_key": null - }, - { - "key": "vector.metrics.enabled", - "feature_state": "PARITY", - "action": "NONE", - "description": "Route metrics to OPW (legacy alias)", - "reason": "Implemented in ADP as the legacy fallback when observability_pipelines_worker.metrics.enabled is false.", - "issue": null, - "adp_key": null - }, - { - "key": "vector.metrics.url", - "feature_state": "PARITY", - "action": "NONE", - "description": "OPW metrics intake URL (legacy alias)", - "reason": "Implemented in ADP as the legacy fallback URL when observability_pipelines_worker.metrics.enabled is false.", - "issue": null, - "adp_key": null - }, - { - "key": "vsock_addr", - "feature_state": "PARITY", - "action": "NONE", - "description": "vsock address for connecting to the Agent IPC endpoint", - "reason": "Read by RemoteAgentClientConfiguration on Linux to connect to the Agent IPC endpoint via AF_VSOCK. Accepted values: host (CID 2), hypervisor (CID 0), local (CID 3). On non-Linux platforms the setting is accepted but a warning is emitted and a TCP connection is used instead.", - "issue": "#1797", - "adp_key": null - } -] diff --git a/lib/datadog-agent-commons/Cargo.toml b/lib/datadog-agent/commons/Cargo.toml similarity index 100% rename from lib/datadog-agent-commons/Cargo.toml rename to lib/datadog-agent/commons/Cargo.toml diff --git a/lib/datadog-agent-commons/src/ipc/client/bearer_auth.rs b/lib/datadog-agent/commons/src/ipc/client/bearer_auth.rs similarity index 100% rename from lib/datadog-agent-commons/src/ipc/client/bearer_auth.rs rename to lib/datadog-agent/commons/src/ipc/client/bearer_auth.rs diff --git a/lib/datadog-agent-commons/src/ipc/client/mod.rs b/lib/datadog-agent/commons/src/ipc/client/mod.rs similarity index 100% rename from lib/datadog-agent-commons/src/ipc/client/mod.rs rename to lib/datadog-agent/commons/src/ipc/client/mod.rs diff --git a/lib/datadog-agent-commons/src/ipc/client/streaming.rs b/lib/datadog-agent/commons/src/ipc/client/streaming.rs similarity index 100% rename from lib/datadog-agent-commons/src/ipc/client/streaming.rs rename to lib/datadog-agent/commons/src/ipc/client/streaming.rs diff --git a/lib/datadog-agent-commons/src/ipc/config.rs b/lib/datadog-agent/commons/src/ipc/config.rs similarity index 100% rename from lib/datadog-agent-commons/src/ipc/config.rs rename to lib/datadog-agent/commons/src/ipc/config.rs diff --git a/lib/datadog-agent-commons/src/ipc/mod.rs b/lib/datadog-agent/commons/src/ipc/mod.rs similarity index 100% rename from lib/datadog-agent-commons/src/ipc/mod.rs rename to lib/datadog-agent/commons/src/ipc/mod.rs diff --git a/lib/datadog-agent-commons/src/ipc/session.rs b/lib/datadog-agent/commons/src/ipc/session.rs similarity index 100% rename from lib/datadog-agent-commons/src/ipc/session.rs rename to lib/datadog-agent/commons/src/ipc/session.rs diff --git a/lib/datadog-agent-commons/src/ipc/tls.rs b/lib/datadog-agent/commons/src/ipc/tls.rs similarity index 100% rename from lib/datadog-agent-commons/src/ipc/tls.rs rename to lib/datadog-agent/commons/src/ipc/tls.rs diff --git a/lib/datadog-agent-commons/src/lib.rs b/lib/datadog-agent/commons/src/lib.rs similarity index 100% rename from lib/datadog-agent-commons/src/lib.rs rename to lib/datadog-agent/commons/src/lib.rs diff --git a/lib/datadog-agent-commons/src/platform/linux_impl.rs b/lib/datadog-agent/commons/src/platform/linux_impl.rs similarity index 100% rename from lib/datadog-agent-commons/src/platform/linux_impl.rs rename to lib/datadog-agent/commons/src/platform/linux_impl.rs diff --git a/lib/datadog-agent-commons/src/platform/macos_impl.rs b/lib/datadog-agent/commons/src/platform/macos_impl.rs similarity index 100% rename from lib/datadog-agent-commons/src/platform/macos_impl.rs rename to lib/datadog-agent/commons/src/platform/macos_impl.rs diff --git a/lib/datadog-agent-commons/src/platform/mod.rs b/lib/datadog-agent/commons/src/platform/mod.rs similarity index 100% rename from lib/datadog-agent-commons/src/platform/mod.rs rename to lib/datadog-agent/commons/src/platform/mod.rs diff --git a/lib/datadog-agent-commons/src/platform/windows_impl.rs b/lib/datadog-agent/commons/src/platform/windows_impl.rs similarity index 100% rename from lib/datadog-agent-commons/src/platform/windows_impl.rs rename to lib/datadog-agent/commons/src/platform/windows_impl.rs diff --git a/lib/datadog-agent/config-overlay-model/Cargo.toml b/lib/datadog-agent/config-overlay-model/Cargo.toml new file mode 100644 index 00000000000..9c63998e3b2 --- /dev/null +++ b/lib/datadog-agent/config-overlay-model/Cargo.toml @@ -0,0 +1,19 @@ +[package] +name = "datadog-agent-config-overlay-model" +version = "0.1.0" +edition = { workspace = true } +license = { workspace = true } +repository = { workspace = true } + +# Maintain this crate as a leaf node and do not depend on other workspace crates. build.rs files +# depend on this and keeping it as a leaf node simplifies the dependency mental model. +[dependencies] +indexmap = { workspace = true, features = ["serde"] } +serde = { workspace = true } +serde_yaml = { workspace = true } + +[dev-dependencies] +tempfile = { workspace = true } + +[lints] +workspace = true diff --git a/lib/datadog-agent/config-overlay-model/src/lib.rs b/lib/datadog-agent/config-overlay-model/src/lib.rs new file mode 100644 index 00000000000..7e09ae04d9e --- /dev/null +++ b/lib/datadog-agent/config-overlay-model/src/lib.rs @@ -0,0 +1,701 @@ +//! Deserialization types for `schema_overlay.yaml`. +//! +//! This crate provides the model for management of our inventory and metadata around Datadog Agent +//! configuration. It is designed to be used during build processes by `build.rs` and, for +//! simplicity, should not depend on any other crates from our workspace. +//! +//! The overlay is validated in two passes. First, standard serde deserialization enforces its +//! type integrity, then custom validation logic runs. This file is the source of truth on what +//! can and can-not be present in the overlay. + +pub mod saluki_keys; +pub mod schema_gen; +pub mod smoke_test_support; +use std::collections::HashSet; +use std::path::{Path, PathBuf}; + +use indexmap::{IndexMap, IndexSet}; +use serde::Deserialize; + +use crate::smoke_test_support::ConfigurationStruct; + +/// Top-level overlay structure keyed by YAML path. +/// +/// Sections partition every `core_schema.yaml` key into exactly one of: supported, unsupported, +/// investigate, or ignored. +#[derive(Debug, Clone, Deserialize)] +#[serde(rename_all = "snake_case")] +pub struct SchemaOverlay { + /// Keys that ADP actively reads and uses. + pub supported: IndexMap, + + /// Keys that are relevant to ADP's domain, but which are not supported. + pub unsupported: IndexMap, + + /// Keys that should not be in the ignored list but whose classification is not yet determined. + /// Investigation may lead to supported, unsupported, or back to ignored. + #[serde(default)] + pub investigate: IndexMap, + + /// Keys that are irrelevant to ADP's domain. Value is a short reason string. These must not be + /// mechanically added. A human should at least review the key and reason string when it is + /// added to the list of ignored keys. + pub ignored: IndexMap, +} + +/// Metadata for a supported configuration key. +#[derive(Debug, Clone, Deserialize)] +#[serde(rename_all = "snake_case")] +pub struct Supported { + /// Whether the key is fully or partially supported. + pub support_level: SupportLevel, + + /// Which pipelines depend on this key (non-empty). + pub pipelines: PipelineAffinity, + + /// Override the type inferred from the schema. + #[serde(default)] + pub value_type_override: Option, + + // Documentation support + /// Short description for documentation tables (<= 50 chars). + pub description: String, + + /// Extended documentation (appears in generated docs). + #[serde(default)] + pub documentation: Option, + + /// GitHub issue tracking number. + #[serde(default)] + pub issue: Option, + + // Direct deserialization support + // + // These fields support ADP's implementation of the Agent's overlay and deserialization + // mechanism. It is hoped that these may be removed once ADP is fully abstracted from Agent + // configuration logic. + /// Environment variable overrides for this key. Checked by configuration smoke tests. + #[serde(default)] + pub env_var_override: Option>, + + /// Alias YAML paths that map to the same config key. Checked by configuration smoke tests. + #[serde(default)] + pub additional_yaml_paths: Vec, + + // Test support + // + // These fields support logic in the configuration smoke tests. It is hoped that these may be + // removed once ADP is fully abstracted from Agent configuration deserialization which would + // render the smoke tests inert. + /// Config structs that consume this key (non-empty) for configuration smoke tests. + pub used_by: IndexSet, + + /// Literal JSON value for smoke test injection. + #[serde(default)] + pub test_json: Option, + + /// TRANSITIONAL BANDAID. Carries metadata needed only to reproduce the hand-written + /// registry (filename partitioning, Saluki-only schema source/default). Delete with it. + #[serde(default)] + pub additional_attributes: IndexMap, +} + +/// Metadata for an unsupported configuration key. +#[derive(Debug, Clone, Deserialize)] +#[serde(rename_all = "snake_case")] +pub struct Unsupported { + /// How severe the lack of support is. + pub severity: Severity, + + /// Whether support is planned. When true, `issue` must be present. + pub planned: bool, + + /// Pipelines affected by the lack of support. + pub pipelines: PipelineAffinity, + + /// Short description for documentation tables. + pub description: String, + + /// Longer explanation of why it is unsupported and future plans. + #[serde(default)] + pub documentation: Option, + + /// GitHub issue tracking number. + #[serde(default)] + pub issue: Option, +} + +/// A configuration key whose classification has not yet been determined. +/// +/// Keys in this section are known to need investigation but have not been assessed for support +/// level or severity. They are excluded from the runtime classifier and appear only in generated +/// documentation. Once investigated, a key moves to supported, unsupported, or ignored. +#[derive(Debug, Clone, Deserialize)] +#[serde(rename_all = "snake_case")] +pub struct Investigate { + /// Provisional severity carried over from prior classification. When present and the key + /// ultimately lands in unsupported, this value is a starting point. Has no runtime effect. + #[serde(default)] + pub severity: Option, + + /// Short description for documentation tables (<= 50 chars). + pub description: String, + + /// GitHub issue tracking the investigation. + #[serde(default)] + pub issue: Option, +} + +/// Whether a key is fully or partially supported. +#[derive(Debug, Clone, Copy, PartialEq, Eq, Deserialize)] +#[serde(rename_all = "snake_case")] +pub enum SupportLevel { + Full, + Partial, +} + +/// Impact severity of an unsupported key. +#[derive(Debug, Clone, Copy, PartialEq, Eq, Deserialize)] +#[serde(rename_all = "snake_case")] +pub enum Severity { + Low, + Medium, + High, +} + +/// A single pipeline in the ADP vocabulary. +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Deserialize)] +#[serde(rename_all = "snake_case")] +pub enum Pipeline { + #[serde(rename = "dogstatsd")] + DogStatsD, + Checks, + Otlp, + Traces, +} + +/// Which pipelines a config key is associated with. +/// +/// Deserialized from a flat YAML list of pipeline tokens. An empty list is rejected. A list +/// containing only `cross_cutting` folds to [`PipelineAffinity::CrossCutting`]; `cross_cutting` +/// may not appear alongside other tokens. +#[derive(Debug, Clone)] +pub enum PipelineAffinity { + /// The key affects all pipelines / ADP behaviour as a whole. + CrossCutting, + /// The key affects the listed pipelines (non-empty, in declaration order). + Pipelines(Vec), +} + +impl<'de> serde::Deserialize<'de> for PipelineAffinity { + fn deserialize>(d: D) -> Result { + #[derive(Deserialize, PartialEq)] + #[serde(rename_all = "snake_case")] + enum Token { + CrossCutting, + #[serde(rename = "dogstatsd")] + DogStatsD, + Checks, + Otlp, + Traces, + } + + let tokens: Vec = Vec::deserialize(d)?; + + if tokens.is_empty() { + return Err(serde::de::Error::custom("pipelines must be non-empty")); + } + + let has_cc = tokens.iter().any(|t| t == &Token::CrossCutting); + + if has_cc && tokens.len() > 1 { + return Err(serde::de::Error::custom( + "cross_cutting must appear alone in pipelines list", + )); + } + + if has_cc { + return Ok(PipelineAffinity::CrossCutting); + } + + let pipelines = tokens + .into_iter() + .map(|t| match t { + Token::DogStatsD => Pipeline::DogStatsD, + Token::Checks => Pipeline::Checks, + Token::Otlp => Pipeline::Otlp, + Token::Traces => Pipeline::Traces, + Token::CrossCutting => unreachable!(), + }) + .collect(); + + Ok(PipelineAffinity::Pipelines(pipelines)) + } +} + +/// Override type for when the schema under-specifies a key's value type. +#[derive(Debug, Clone, Copy, PartialEq, Eq, Deserialize)] +#[serde(rename_all = "snake_case")] +pub enum ValueType { + Boolean, + Integer, + Float, + String, + StringList, +} + +/// File paths to the two YAML files required as input by this library. +/// +/// Defaults to the canonical location of the required schema files in this library. +pub struct Files { + pub schema: PathBuf, + pub overlay: PathBuf, +} + +impl Default for Files { + fn default() -> Self { + let dir = PathBuf::from(env!("CARGO_MANIFEST_DIR")) + .join("..") + .join("config") + .join("schema"); + let schema = dir.join("core_schema.yaml"); + let overlay = dir.join("schema_overlay.yaml"); + Files { schema, overlay } + } +} + +impl SchemaOverlay { + pub fn load(files: Files) -> Result { + let loaded = Self::from_file(&files.overlay)?; + loaded.validate(&files.schema)?; + Ok(loaded) + } + + /// Deserialize a [`SchemaOverlay`] from a YAML string. + fn from_yaml(s: &str) -> Result { + let yaml: serde_yaml::Value = serde_yaml::from_str(s).map_err(Error::Yaml)?; + Self::lint_yaml(&yaml)?; + serde_yaml::from_value(yaml).map_err(Error::Yaml) + } + + /// Load and deserialize a `SchemaOverlay` from a file path. + fn from_file(path: &Path) -> Result { + let contents = std::fs::read_to_string(path).map_err(|e| Error::Io((path.into(), e)))?; + Self::from_yaml(&contents) + } + + /// Check that the loaded schema overlay is consistent with our required invariants. + fn validate(&self, core_schema: &Path) -> Result<(), Error> { + self.validate_keys_match(core_schema)?; + self.validate_used_by()?; + Ok(()) + } + + /// Ensure our diffs are manageable by requiring a stable ordering of the overlay file. + /// + /// Checks that sections appear in the required order (supported, unsupported, investigate, + /// ignored) and that keys within each section are in alphabetical order. The investigate + /// section is optional. + fn lint_yaml(yaml: &serde_yaml::Value) -> Result<(), Error> { + let mapping = yaml + .as_mapping() + .ok_or_else(|| Error::Validation("overlay must be a YAML mapping".to_string()))?; + + let section_names: Vec<&str> = mapping.keys().filter_map(|k| k.as_str()).collect(); + + let required = ["supported", "unsupported", "ignored"]; + let positions: Vec> = required + .iter() + .map(|&s| section_names.iter().position(|&k| k == s)) + .collect(); + for (i, pos) in positions.iter().enumerate() { + if pos.is_none() { + return Err(Error::Validation(format!( + "overlay missing required section '{}'", + required[i] + ))); + } + } + let (pos_sup, pos_uns, pos_ign) = (positions[0].unwrap(), positions[1].unwrap(), positions[2].unwrap()); + + let pos_inv = section_names.iter().position(|&k| k == "investigate"); + + if let Some(pos_inv) = pos_inv { + if !(pos_sup < pos_uns && pos_uns < pos_inv && pos_inv < pos_ign) { + return Err(Error::Validation( + "sections must appear in order: supported, unsupported, investigate, ignored".to_string(), + )); + } + } else if !(pos_sup < pos_uns && pos_uns < pos_ign) { + return Err(Error::Validation( + "sections must appear in order: supported, unsupported, [investigate,] ignored".to_string(), + )); + } + + let mut lint_sections: Vec<&str> = required.to_vec(); + if pos_inv.is_some() { + lint_sections.push("investigate"); + } + for section_name in &lint_sections { + if let Some(section) = yaml.get(section_name).and_then(|v| v.as_mapping()) { + let mut prev = ""; + for key in section.keys().filter_map(|k| k.as_str()) { + if key < prev { + return Err(Error::Validation(format!( + "{}: key '{}' is out of alphabetical order (after '{}')", + section_name, key, prev + ))); + } + prev = key; + } + } + } + + Ok(()) + } + + /// Ensure that each core schema key appears exactly once in the schema overlay file. + fn validate_keys_match(&self, core_schema: &Path) -> Result<(), Error> { + let schema_keys = Self::schema_keys(core_schema)?; + + type SectionCheck<'a> = (&'a str, &'a dyn Fn(&str) -> bool); + // No key may appear in more than one section. + let sections: &[SectionCheck<'_>] = &[ + ("supported", &|k: &str| self.supported.contains_key(k)), + ("unsupported", &|k: &str| self.unsupported.contains_key(k)), + ("investigate", &|k: &str| self.investigate.contains_key(k)), + ("ignored", &|k: &str| self.ignored.contains_key(k)), + ]; + let all_keys: Vec<(&str, &str)> = self + .supported + .keys() + .map(|k| ("supported", k.as_str())) + .chain(self.unsupported.keys().map(|k| ("unsupported", k.as_str()))) + .chain(self.investigate.keys().map(|k| ("investigate", k.as_str()))) + .chain(self.ignored.keys().map(|k| ("ignored", k.as_str()))) + .collect(); + for &(from_section, key) in &all_keys { + for &(section_name, check_fn) in sections { + if section_name != from_section && check_fn(key) { + return Err(Error::Validation(format!( + "key '{}' appears in more than one overlay section", + key + ))); + } + } + } + + // Every overlay key must exist in the schema. + for key in self + .supported + .keys() + .chain(self.unsupported.keys()) + .chain(self.investigate.keys()) + .chain(self.ignored.keys()) + { + if !schema_keys.contains(key.as_str()) { + return Err(Error::Validation(format!( + "overlay key '{}' is not present in the schema", + key + ))); + } + } + + // Every schema key must be covered by the overlay. + let overlay_keys: HashSet<&str> = self + .supported + .keys() + .chain(self.unsupported.keys()) + .chain(self.investigate.keys()) + .chain(self.ignored.keys()) + .map(|s| s.as_str()) + .collect(); + for key in &schema_keys { + if !overlay_keys.contains(key.as_str()) { + return Err(Error::Validation(format!( + "schema key '{}' is not covered by the overlay", + key + ))); + } + } + + Ok(()) + } + + fn schema_keys(schema_path: &Path) -> Result, Error> { + let contents = std::fs::read_to_string(schema_path).map_err(|e| Error::Io((schema_path.into(), e)))?; + let schema: serde_yaml::Value = serde_yaml::from_str(&contents).map_err(Error::Yaml)?; + let props = schema + .get("properties") + .and_then(|v| v.as_mapping()) + .ok_or_else(|| Error::Validation("schema missing 'properties' section".to_string()))?; + let mut keys = HashSet::new(); + Self::collect_schema_keys(props, "", &mut keys); + Ok(keys) + } + + fn collect_schema_keys(props: &serde_yaml::Mapping, prefix: &str, keys: &mut HashSet) { + for (k, v) in props { + if let Some(name) = k.as_str() { + let full_key = if prefix.is_empty() { + name.to_string() + } else { + format!("{}.{}", prefix, name) + }; + if let Some(sub_props) = v.get("properties").and_then(|p| p.as_mapping()) { + Self::collect_schema_keys(sub_props, &full_key, keys); + } else { + keys.insert(full_key); + } + } + } + } + + /// Ensure that every supported field declares at least one `used_by` struct, that descriptions + /// fit within the 50-character table limit, and that `additional_yaml_paths` contains no + /// duplicates. Pipeline non-emptiness is enforced by `PipelineAffinity`'s custom Deserialize. + fn validate_used_by(&self) -> Result<(), Error> { + for (key, entry) in &self.supported { + if entry.used_by.is_empty() { + return Err(Error::Validation(format!( + "supported key '{}': used_by must be non-empty", + key + ))); + } + if entry.description.len() > 50 { + return Err(Error::Validation(format!( + "supported key '{}': description exceeds 50 chars ({} chars)", + key, + entry.description.len() + ))); + } + let mut seen: HashSet<&str> = HashSet::new(); + for path in &entry.additional_yaml_paths { + if !seen.insert(path.as_str()) { + return Err(Error::Validation(format!( + "supported key '{}': duplicate additional_yaml_path '{}'", + key, path + ))); + } + } + } + for (key, entry) in &self.unsupported { + if entry.description.len() > 50 { + return Err(Error::Validation(format!( + "unsupported key '{}': description exceeds 50 chars ({} chars)", + key, + entry.description.len() + ))); + } + if entry.planned && entry.issue.is_none() { + return Err(Error::Validation(format!( + "unsupported key '{}': planned requires an issue", + key + ))); + } + } + for (key, entry) in &self.investigate { + if entry.description.len() > 50 { + return Err(Error::Validation(format!( + "investigate key '{}': description exceeds 50 chars ({} chars)", + key, + entry.description.len() + ))); + } + } + Ok(()) + } +} + +/// Appended to every `Error::Validation` message so the reader knows what rules apply and where +/// to make the fix. +const VALIDATION_RULES: &str = "\n\ + \n\ + Rules that must hold in schema_overlay.yaml:\n\ + - Every core_schema.yaml key appears in exactly one section (supported / unsupported / investigate / ignored).\n\ + - No key appears in more than one section.\n\ + - Sections appear in order: supported, unsupported, investigate (optional), ignored.\n\ + - Keys within each section are sorted alphabetically.\n\ + - supported entries: pipelines non-empty, used_by non-empty, description <= 50 chars.\n\ + - unsupported entries: pipelines non-empty, description <= 50 chars, planned+issue consistent.\n\ + - investigate entries: description <= 50 chars.\n\ + - additional_yaml_paths: no duplicates within a single entry.\n\ + Fix: edit lib/datadog-agent-config/schema/schema_overlay.yaml."; + +/// Errors that can occur when loading a schema overlay. +#[derive(Debug)] +pub enum Error { + Io((PathBuf, std::io::Error)), + Yaml(serde_yaml::Error), + Validation(String), +} + +impl std::fmt::Display for Error { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + match self { + Error::Io(e) => write!(f, "Error reading {}: {}", e.0.display(), e.1), + Error::Yaml(e) => write!(f, "YAML parse error in overlay: {e}"), + Error::Validation(s) => write!(f, "schema_overlay.yaml validation failed: {s}{VALIDATION_RULES}"), + } + } +} + +impl std::error::Error for Error { + fn source(&self) -> Option<&(dyn std::error::Error + 'static)> { + match self { + Error::Io(e) => Some(&e.1), + Error::Yaml(e) => Some(e), + Error::Validation(_) => None, + } + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn overlay_loads() { + let test_files = Files { + schema: Path::new(env!("CARGO_MANIFEST_DIR")) + .join("test") + .join("fake_schema.yaml"), + overlay: Path::new(env!("CARGO_MANIFEST_DIR")) + .join("test") + .join("fake_overlay.yaml"), + }; + let validated = SchemaOverlay::load(test_files).unwrap(); + assert_eq!(validated.supported.len(), 14); + } + + #[test] + fn pipeline_affinity_cross_cutting() { + let yaml = "pipelines: [cross_cutting]"; + #[derive(Deserialize)] + struct W { + pipelines: PipelineAffinity, + } + let w: W = serde_yaml::from_str(yaml).unwrap(); + assert!(matches!(w.pipelines, PipelineAffinity::CrossCutting)); + } + + #[test] + fn pipeline_affinity_multi() { + let yaml = "pipelines: [dogstatsd, traces]"; + #[derive(Deserialize)] + struct W { + pipelines: PipelineAffinity, + } + let w: W = serde_yaml::from_str(yaml).unwrap(); + if let PipelineAffinity::Pipelines(ps) = w.pipelines { + assert_eq!(ps.len(), 2); + assert!(matches!(ps[0], Pipeline::DogStatsD)); + assert!(matches!(ps[1], Pipeline::Traces)); + } else { + panic!("expected Pipelines"); + } + } + + #[test] + fn pipeline_affinity_cross_cutting_must_be_alone() { + let yaml = "pipelines: [cross_cutting, dogstatsd]"; + #[derive(Deserialize)] + #[allow(dead_code)] + struct W { + pipelines: PipelineAffinity, + } + assert!(serde_yaml::from_str::(yaml).is_err()); + } + + fn load_from_strs(schema: &str, overlay: &str) -> Result { + let dir = tempfile::tempdir().unwrap(); + let schema_path = dir.path().join("schema.yaml"); + let overlay_path = dir.path().join("overlay.yaml"); + std::fs::write(&schema_path, schema).unwrap(); + std::fs::write(&overlay_path, overlay).unwrap(); + SchemaOverlay::load(Files { + schema: schema_path, + overlay: overlay_path, + }) + } + + #[test] + fn validation_rejects_schema_key_missing_from_overlay() { + let schema = "\ +properties: + key_a: + type: string + key_b: + type: string +"; + let overlay = "\ +supported: + key_a: + support_level: full + used_by: [ForwarderConfiguration] + pipelines: [cross_cutting] + description: \"Key A\" +unsupported: {} +ignored: {} +"; + let err = load_from_strs(schema, overlay).unwrap_err(); + assert!( + err.to_string().contains("schema key 'key_b' is not covered"), + "unexpected error: {err}" + ); + } + + #[test] + fn validation_rejects_overlay_key_absent_from_schema() { + let schema = "\ +properties: + key_a: + type: string +"; + let overlay = "\ +supported: + key_a: + support_level: full + used_by: [ForwarderConfiguration] + pipelines: [cross_cutting] + description: \"Key A\" +unsupported: {} +ignored: + key_b: \"not in schema\" +"; + let err = load_from_strs(schema, overlay).unwrap_err(); + assert!( + err.to_string().contains("overlay key 'key_b' is not present"), + "unexpected error: {err}" + ); + } + + #[test] + fn validation_rejects_key_in_two_sections() { + let schema = "\ +properties: + key_a: + type: string + key_b: + type: string +"; + let overlay = "\ +supported: + key_a: + support_level: full + used_by: [ForwarderConfiguration] + pipelines: [cross_cutting] + description: \"Key A\" +unsupported: {} +ignored: + key_a: \"duplicate\" + key_b: \"ok\" +"; + let err = load_from_strs(schema, overlay).unwrap_err(); + assert!( + err.to_string() + .contains("key 'key_a' appears in more than one overlay section"), + "unexpected error: {err}" + ); + } +} diff --git a/lib/datadog-agent/config-overlay-model/src/saluki_keys.rs b/lib/datadog-agent/config-overlay-model/src/saluki_keys.rs new file mode 100644 index 00000000000..5812edf513e --- /dev/null +++ b/lib/datadog-agent/config-overlay-model/src/saluki_keys.rs @@ -0,0 +1,574 @@ +//! ADP-only configuration keys that are not in the Datadog Agent schema. +//! Shared between registry_gen.rs (for config registry annotations) and doc_gen.rs (for the +//! ADP-Only documentation section). + +pub struct SalukiKey { + pub yaml_path: &'static str, + pub description: &'static str, + pub default: &'static str, + /// Multi-line documentation rendered as a prose section below the ADP-Only table. + /// If the text starts with `#`, the heading is taken from the text itself. + pub documentation: Option<&'static str>, + // Fields used only by registry_gen: + pub value_type: &'static str, + pub schema_default: Option<&'static str>, + pub env_vars: &'static [&'static str], + pub env_var_override: Option<&'static [&'static str]>, + pub additional_yaml_paths: &'static [&'static str], + pub used_by: &'static [&'static str], + pub test_json: Option<&'static str>, + pub pipeline_affinity: &'static str, + pub filename: &'static str, +} + +pub static SALUKI_KEYS: &[SalukiKey] = &[ + // ── dogstatsd.rs ───────────────────────────────────────────────────────── + SalukiKey { + yaml_path: "dogstatsd_allow_context_heap_allocs", + description: "Allow heap allocations for contexts", + default: "", + documentation: None, + value_type: "ValueType::Bool", + schema_default: Some("true"), + env_vars: &[], + env_var_override: None, + additional_yaml_paths: &[], + used_by: &["DOGSTATSD_CONFIGURATION"], + test_json: None, + pipeline_affinity: "PipelineAffinity::Pipelines(&[Pipeline::DogStatsD])", + filename: "dogstatsd.rs", + }, + SalukiKey { + yaml_path: "dogstatsd_autoscale_udp_listeners", + description: "Bind multiple UDP sockets via SO_REUSEPORT", + default: "", + documentation: None, + value_type: "ValueType::Bool", + schema_default: Some("false"), + env_vars: &[], + env_var_override: None, + additional_yaml_paths: &[], + used_by: &["DOGSTATSD_CONFIGURATION"], + test_json: None, + pipeline_affinity: "PipelineAffinity::Pipelines(&[Pipeline::DogStatsD])", + filename: "dogstatsd.rs", + }, + SalukiKey { + yaml_path: "dogstatsd_buffer_count", + description: "Number of receive buffers", + default: "", + documentation: None, + value_type: "ValueType::Integer", + schema_default: None, + env_vars: &[], + env_var_override: None, + additional_yaml_paths: &[], + used_by: &["DOGSTATSD_CONFIGURATION"], + test_json: None, + pipeline_affinity: "PipelineAffinity::Pipelines(&[Pipeline::DogStatsD])", + filename: "dogstatsd.rs", + }, + SalukiKey { + yaml_path: "dogstatsd_cached_contexts_limit", + description: "Max cached metric contexts", + default: "", + documentation: None, + value_type: "ValueType::Integer", + schema_default: None, + env_vars: &[], + env_var_override: None, + additional_yaml_paths: &[], + used_by: &["DOGSTATSD_CONFIGURATION"], + test_json: None, + pipeline_affinity: "PipelineAffinity::Pipelines(&[Pipeline::DogStatsD])", + filename: "dogstatsd.rs", + }, + SalukiKey { + yaml_path: "dogstatsd_cached_tagsets_limit", + description: "Max cached tagsets", + default: "", + documentation: None, + value_type: "ValueType::Integer", + schema_default: None, + env_vars: &[], + env_var_override: None, + additional_yaml_paths: &[], + used_by: &["DOGSTATSD_CONFIGURATION"], + test_json: None, + pipeline_affinity: "PipelineAffinity::Pipelines(&[Pipeline::DogStatsD])", + filename: "dogstatsd.rs", + }, + SalukiKey { + yaml_path: "dogstatsd_minimum_sample_rate", + description: "Floor for metric sample rates", + default: "", + documentation: Some( + "ADP enforces a minimum sample rate on incoming metrics to prevent memory exhaustion \ + from extremely low sample rates on histograms and sketches. Sending metrics with a \ + very high inverse sample rate (for example `@0.0000001`) can cause unbounded memory \ + growth in a sketch; this setting prevents that. The default is conservative enough \ + that normal clients are unaffected.", + ), + value_type: "ValueType::Float", + schema_default: None, + env_vars: &[], + env_var_override: None, + additional_yaml_paths: &[], + used_by: &["DOGSTATSD_CONFIGURATION"], + test_json: None, + pipeline_affinity: "PipelineAffinity::Pipelines(&[Pipeline::DogStatsD])", + filename: "dogstatsd.rs", + }, + SalukiKey { + yaml_path: "dogstatsd_permissive_decoding", + description: "Relaxes decoder strictness", + default: "true", + documentation: Some( + "By default, ADP parses DogStatsD packets with the same leniency as the core agent, \ + accepting packets that technically violate the spec. Setting this to `false` enables \ + strict mode, which rejects non-conformant packets. Strict mode is not available in \ + the core agent.", + ), + value_type: "ValueType::Bool", + schema_default: Some("true"), + env_vars: &[], + env_var_override: None, + additional_yaml_paths: &[], + used_by: &["DOGSTATSD_CONFIGURATION"], + test_json: None, + pipeline_affinity: "PipelineAffinity::Pipelines(&[Pipeline::DogStatsD])", + filename: "dogstatsd.rs", + }, + SalukiKey { + yaml_path: "dogstatsd_string_interner_size_bytes", + description: "Explicit byte budget for context interner", + default: "", + documentation: None, + value_type: "ValueType::Integer", + schema_default: None, + env_vars: &[], + env_var_override: None, + additional_yaml_paths: &[], + used_by: &["DOGSTATSD_CONFIGURATION"], + test_json: None, + pipeline_affinity: "PipelineAffinity::Pipelines(&[Pipeline::DogStatsD])", + filename: "dogstatsd.rs", + }, + SalukiKey { + yaml_path: "dogstatsd_tcp_port", + description: "TCP listen port for DSD", + default: "", + documentation: None, + value_type: "ValueType::Integer", + schema_default: None, + env_vars: &[], + env_var_override: None, + additional_yaml_paths: &[], + used_by: &["DOGSTATSD_CONFIGURATION"], + test_json: None, + pipeline_affinity: "PipelineAffinity::Pipelines(&[Pipeline::DogStatsD])", + filename: "dogstatsd.rs", + }, + // ── otlp.rs ────────────────────────────────────────────────────────────── + SalukiKey { + yaml_path: "otlp_config.traces.enable_otlp_compute_top_level_by_span_kind", + description: "Enable OTLP top-level-by-span-kind", + default: "", + documentation: None, + value_type: "ValueType::Bool", + schema_default: Some("true"), + env_vars: &[], + env_var_override: None, + additional_yaml_paths: &[], + used_by: &["OTLP_DECODER_CONFIGURATION", "OTLP_CONFIGURATION"], + test_json: None, + pipeline_affinity: "PipelineAffinity::Pipelines(&[Pipeline::Traces])", + filename: "otlp.rs", + }, + SalukiKey { + yaml_path: "otlp_config.traces.ignore_missing_datadog_fields", + description: "Ignore missing Datadog fields in OTLP", + default: "", + documentation: None, + value_type: "ValueType::Bool", + schema_default: None, + env_vars: &[], + env_var_override: None, + additional_yaml_paths: &[], + used_by: &["OTLP_DECODER_CONFIGURATION", "OTLP_CONFIGURATION"], + test_json: None, + pipeline_affinity: "PipelineAffinity::Pipelines(&[Pipeline::Traces])", + filename: "otlp.rs", + }, + SalukiKey { + yaml_path: "otlp_config.traces.string_interner_size", + description: "OTLP trace string interner capacity", + default: "", + documentation: None, + value_type: "ValueType::Integer", + schema_default: None, + env_vars: &[], + env_var_override: None, + additional_yaml_paths: &[], + used_by: &["OTLP_DECODER_CONFIGURATION", "OTLP_CONFIGURATION"], + test_json: None, + pipeline_affinity: "PipelineAffinity::Pipelines(&[Pipeline::Traces])", + filename: "otlp.rs", + }, + SalukiKey { + yaml_path: "otlp_config.receiver.protocols.http.transport", + description: "OTLP HTTP receiver transport", + default: "", + documentation: None, + value_type: "ValueType::String", + schema_default: None, + env_vars: &[], + env_var_override: None, + additional_yaml_paths: &[], + used_by: &["OTLP_RELAY_CONFIGURATION", "OTLP_CONFIGURATION"], + test_json: None, + pipeline_affinity: "PipelineAffinity::Pipelines(&[Pipeline::Otlp])", + filename: "otlp.rs", + }, + SalukiKey { + yaml_path: "otlp_allow_context_heap_allocs", + description: "Allow heap allocations for OTLP contexts", + default: "", + documentation: None, + value_type: "ValueType::Bool", + schema_default: Some("true"), + env_vars: &[], + env_var_override: None, + additional_yaml_paths: &[], + used_by: &["OTLP_CONFIGURATION"], + test_json: None, + pipeline_affinity: "PipelineAffinity::Pipelines(&[Pipeline::Otlp])", + filename: "otlp.rs", + }, + SalukiKey { + yaml_path: "otlp_cached_contexts_limit", + description: "Max cached OTLP metric contexts", + default: "", + documentation: None, + value_type: "ValueType::Integer", + schema_default: None, + env_vars: &[], + env_var_override: None, + additional_yaml_paths: &[], + used_by: &["OTLP_CONFIGURATION"], + test_json: None, + pipeline_affinity: "PipelineAffinity::Pipelines(&[Pipeline::Otlp])", + filename: "otlp.rs", + }, + SalukiKey { + yaml_path: "otlp_cached_tagsets_limit", + description: "Max cached OTLP tagsets", + default: "", + documentation: None, + value_type: "ValueType::Integer", + schema_default: None, + env_vars: &[], + env_var_override: None, + additional_yaml_paths: &[], + used_by: &["OTLP_CONFIGURATION"], + test_json: None, + pipeline_affinity: "PipelineAffinity::Pipelines(&[Pipeline::Otlp])", + filename: "otlp.rs", + }, + SalukiKey { + yaml_path: "otlp_string_interner_size", + description: "OTLP context interner capacity", + default: "", + documentation: None, + value_type: "ValueType::Integer", + schema_default: None, + env_vars: &[], + env_var_override: None, + additional_yaml_paths: &[], + used_by: &["OTLP_CONFIGURATION"], + test_json: None, + pipeline_affinity: "PipelineAffinity::Pipelines(&[Pipeline::Otlp])", + filename: "otlp.rs", + }, + // ── aggregate.rs ───────────────────────────────────────────────────────── + SalukiKey { + yaml_path: "aggregate_window_duration_seconds", + description: "Aggregation window size", + default: "", + documentation: None, + value_type: "ValueType::Integer", + schema_default: None, + env_vars: &[], + env_var_override: None, + additional_yaml_paths: &[], + used_by: &["AGGREGATE_CONFIGURATION"], + test_json: None, + pipeline_affinity: "PipelineAffinity::Pipelines(&[Pipeline::DogStatsD, Pipeline::Checks])", + filename: "aggregate.rs", + }, + SalukiKey { + yaml_path: "aggregate_flush_interval", + description: "Aggregator flush period", + default: "", + documentation: None, + value_type: "ValueType::String", + schema_default: None, + env_vars: &[], + env_var_override: None, + additional_yaml_paths: &[], + used_by: &["AGGREGATE_CONFIGURATION"], + test_json: Some(r#"{"secs": 42, "nanos": 0}"#), + pipeline_affinity: "PipelineAffinity::Pipelines(&[Pipeline::DogStatsD, Pipeline::Checks])", + filename: "aggregate.rs", + }, + SalukiKey { + yaml_path: "aggregate_context_limit", + description: "Max contexts per aggregation window", + default: "", + documentation: None, + value_type: "ValueType::Integer", + schema_default: None, + env_vars: &[], + env_var_override: None, + additional_yaml_paths: &[], + used_by: &["AGGREGATE_CONFIGURATION"], + test_json: None, + pipeline_affinity: "PipelineAffinity::Pipelines(&[Pipeline::DogStatsD, Pipeline::Checks])", + filename: "aggregate.rs", + }, + SalukiKey { + yaml_path: "counter_expiry_seconds", + description: "Idle counter keep-alive duration", + default: "300", + documentation: None, + value_type: "ValueType::Integer", + schema_default: None, + env_vars: &[], + env_var_override: None, + additional_yaml_paths: &["dogstatsd_expiry_seconds"], + used_by: &["AGGREGATE_CONFIGURATION"], + test_json: None, + pipeline_affinity: "PipelineAffinity::Pipelines(&[Pipeline::DogStatsD, Pipeline::Checks])", + filename: "aggregate.rs", + }, + SalukiKey { + yaml_path: "aggregate_passthrough_idle_flush_timeout", + description: "Passthrough buffer flush delay", + default: "", + documentation: None, + value_type: "ValueType::String", + schema_default: None, + env_vars: &[], + env_var_override: None, + additional_yaml_paths: &[], + used_by: &["AGGREGATE_CONFIGURATION"], + test_json: Some(r#"{"secs": 42, "nanos": 0}"#), + pipeline_affinity: "PipelineAffinity::Pipelines(&[Pipeline::DogStatsD, Pipeline::Checks])", + filename: "aggregate.rs", + }, + // ── trace_obfuscation.rs ───────────────────────────────────────────────── + SalukiKey { + yaml_path: "apm_config.obfuscation.sql.dbms", + description: "SQL obfuscation DBMS dialect", + default: "", + documentation: None, + value_type: "ValueType::String", + schema_default: None, + env_vars: &[], + env_var_override: None, + additional_yaml_paths: &[], + used_by: &["TRACE_OBFUSCATION_CONFIGURATION"], + test_json: None, + pipeline_affinity: "PipelineAffinity::Pipelines(&[Pipeline::Traces])", + filename: "trace_obfuscation.rs", + }, + SalukiKey { + yaml_path: "apm_config.obfuscation.sql.dollar_quoted_func", + description: "Preserve dollar-quoted SQL functions", + default: "", + documentation: None, + value_type: "ValueType::Bool", + schema_default: None, + env_vars: &[], + env_var_override: None, + additional_yaml_paths: &[], + used_by: &["TRACE_OBFUSCATION_CONFIGURATION"], + test_json: None, + pipeline_affinity: "PipelineAffinity::Pipelines(&[Pipeline::Traces])", + filename: "trace_obfuscation.rs", + }, + SalukiKey { + yaml_path: "apm_config.obfuscation.sql.keep_sql_alias", + description: "Preserve SQL aliases in obfuscation", + default: "", + documentation: None, + value_type: "ValueType::Bool", + schema_default: None, + env_vars: &[], + env_var_override: None, + additional_yaml_paths: &[], + used_by: &["TRACE_OBFUSCATION_CONFIGURATION"], + test_json: None, + pipeline_affinity: "PipelineAffinity::Pipelines(&[Pipeline::Traces])", + filename: "trace_obfuscation.rs", + }, + SalukiKey { + yaml_path: "apm_config.obfuscation.sql.replace_digits", + description: "Replace digits in SQL obfuscation", + default: "", + documentation: None, + value_type: "ValueType::Bool", + schema_default: None, + env_vars: &[], + env_var_override: None, + additional_yaml_paths: &[], + used_by: &["TRACE_OBFUSCATION_CONFIGURATION"], + test_json: None, + pipeline_affinity: "PipelineAffinity::Pipelines(&[Pipeline::Traces])", + filename: "trace_obfuscation.rs", + }, + SalukiKey { + yaml_path: "apm_config.obfuscation.sql.table_names", + description: "Collect table names during obfuscation", + default: "", + documentation: None, + value_type: "ValueType::Bool", + schema_default: None, + env_vars: &[], + env_var_override: None, + additional_yaml_paths: &[], + used_by: &["TRACE_OBFUSCATION_CONFIGURATION"], + test_json: None, + pipeline_affinity: "PipelineAffinity::Pipelines(&[Pipeline::Traces])", + filename: "trace_obfuscation.rs", + }, + // ── encoders.rs ────────────────────────────────────────────────────────── + SalukiKey { + yaml_path: "flush_timeout_secs", + description: "Encoder flush timeout (secs)", + default: "", + documentation: None, + value_type: "ValueType::Integer", + schema_default: None, + env_vars: &[], + env_var_override: None, + additional_yaml_paths: &[], + used_by: &[ + "DATADOG_APM_STATS_ENCODER_CONFIGURATION", + "DATADOG_METRICS_CONFIGURATION", + "DATADOG_TRACE_CONFIGURATION", + ], + test_json: None, + pipeline_affinity: "PipelineAffinity::Pipelines(&[Pipeline::Checks, Pipeline::Traces, Pipeline::DogStatsD])", + filename: "encoders.rs", + }, + SalukiKey { + yaml_path: "serializer_max_metrics_per_payload", + description: "Max metrics per payload", + default: "", + documentation: None, + value_type: "ValueType::Integer", + schema_default: None, + env_vars: &[], + env_var_override: None, + additional_yaml_paths: &[], + used_by: &["DATADOG_METRICS_CONFIGURATION"], + test_json: None, + pipeline_affinity: "PipelineAffinity::Pipelines(&[Pipeline::Checks, Pipeline::DogStatsD])", + filename: "encoders.rs", + }, + // ── dogstatsd_mapper.rs ────────────────────────────────────────────────── + SalukiKey { + yaml_path: "dogstatsd_mapper_string_interner_size", + description: "Mapper string interner capacity", + default: "", + documentation: None, + value_type: "ValueType::Integer", + schema_default: None, + env_vars: &[], + env_var_override: None, + additional_yaml_paths: &[], + used_by: &["DOGSTATSD_MAPPER_CONFIGURATION"], + test_json: None, + pipeline_affinity: "PipelineAffinity::Pipelines(&[Pipeline::DogStatsD])", + filename: "dogstatsd_mapper.rs", + }, + // ── accounting.rs ──────────────────────────────────────────────────────── + SalukiKey { + yaml_path: "memory_limit", + description: "Process memory limit", + default: "", + documentation: Some( + "### `memory_limit` / `memory_slop_factor` + +\ + ADP uses an explicit process memory limit (`memory_limit`) rather than relying on \ + Go's garbage collector. The `memory_slop_factor` reserves a fraction of the limit \ + to account for allocations not tracked by ADP's internal accounting. When memory \ + usage approaches `memory_limit`, ADP's global limiter begins exerting backpressure \ + (see `enable_global_limiter`).", + ), + value_type: "ValueType::String", + schema_default: None, + env_vars: &[], + env_var_override: None, + additional_yaml_paths: &[], + used_by: &[], + test_json: None, + pipeline_affinity: "PipelineAffinity::CrossCutting", + filename: "accounting.rs", + }, + SalukiKey { + yaml_path: "memory_slop_factor", + description: "Memory accounting slop fraction", + default: "0.25", + documentation: Some("See `memory_limit` above."), + value_type: "ValueType::Float", + schema_default: Some("0.25"), + env_vars: &[], + env_var_override: None, + additional_yaml_paths: &[], + used_by: &[], + test_json: None, + pipeline_affinity: "PipelineAffinity::CrossCutting", + filename: "accounting.rs", + }, + // ── data_plane.rs ──────────────────────────────────────────────────────── + SalukiKey { + yaml_path: "data_plane.remote_agent_enabled", + description: "Enable remote agent mode", + default: "true", + documentation: Some( + "### `data_plane.remote_agent_enabled` / `data_plane.use_new_config_stream_endpoint` + +\ + These two keys are transitional flags being phased out. Both will be implied by \ + `data_plane.standalone_mode=false` in a future release. Do not rely on them for \ + new deployments.", + ), + value_type: "ValueType::Bool", + schema_default: Some("true"), + env_vars: &[], + env_var_override: None, + additional_yaml_paths: &[], + used_by: &[], + test_json: None, + pipeline_affinity: "PipelineAffinity::CrossCutting", + filename: "data_plane.rs", + }, + SalukiKey { + yaml_path: "data_plane.use_new_config_stream_endpoint", + description: "Use new config stream endpoint", + default: "", + documentation: Some("See `data_plane.remote_agent_enabled` above."), + value_type: "ValueType::Bool", + schema_default: None, + env_vars: &[], + env_var_override: None, + additional_yaml_paths: &[], + used_by: &[], + test_json: None, + pipeline_affinity: "PipelineAffinity::CrossCutting", + filename: "data_plane.rs", + }, +]; diff --git a/lib/datadog-agent/config-overlay-model/src/schema_gen.rs b/lib/datadog-agent/config-overlay-model/src/schema_gen.rs new file mode 100644 index 00000000000..94bd9deea10 --- /dev/null +++ b/lib/datadog-agent/config-overlay-model/src/schema_gen.rs @@ -0,0 +1,241 @@ +//! Schema loading and Rust codegen for the Datadog agent config schema. +//! +//! Parses `core_schema.yaml` (with any overlay applied upstream) into a flat map of +//! `yaml_path → FieldInfo`, then emits `schema.rs` containing one `SchemaEntry` constant +//! per config key. Used exclusively at build time. +use std::path::Path; + +use indexmap::IndexMap; +use serde_yaml::Value; + +/// Value type of a config field, as declared in the schema YAML. +/// +/// `Unknown` is assigned when the YAML `type` is absent or unrecognised; affected fields +/// are emitted with a `// TODO` comment in the generated output. +pub enum FieldType { + String, + Bool, + Integer, + Float, + StringList, + Unknown, +} + +/// Parsed metadata for a single config field. +pub struct FieldInfo { + /// Resolved value type (see [`FieldType`]). + pub value_type: FieldType, + /// Environment variable names that map to this field. Empty when the field carries a + /// `no-env` tag. + pub env_vars: Vec, + /// Default value serialised as a JSON literal, or `None` if the schema omits one. + pub default: Option, +} + +/// Load and flatten the schema at `schema_path` into a `yaml_path → FieldInfo` map. +/// +/// The map is sorted by key. Panics if the file cannot be read or parsed. +pub fn load_schema(schema_path: &Path) -> IndexMap { + let src = std::fs::read_to_string(schema_path) + .unwrap_or_else(|e| panic!("failed to read {}: {}", schema_path.display(), e)); + let doc: Value = serde_yaml::from_str(&src).unwrap_or_else(|e| panic!("failed to parse schema YAML: {}", e)); + let properties = doc + .get("properties") + .and_then(|v| v.as_mapping()) + .expect("schema root must have a 'properties' mapping"); + + let mut entries = Vec::new(); + collect_entries(properties, &[], &mut entries); + entries.sort_by(|a, b| a.0.cmp(&b.0)); + + let mut map = IndexMap::new(); + for (yaml_path, info) in entries { + map.insert(yaml_path, info); + } + map +} + +fn collect_entries(mapping: &serde_yaml::Mapping, path_parts: &[&str], out: &mut Vec<(String, FieldInfo)>) { + for (key, value) in mapping { + let key_str = match key.as_str() { + Some(s) => s, + None => continue, + }; + + let mut parts = path_parts.to_vec(); + parts.push(key_str); + + let node_type = value.get("node_type").and_then(|v| v.as_str()).unwrap_or(""); + + match node_type { + "setting" => out.push(parse_setting(&parts, value)), + "section" => { + if let Some(props) = value.get("properties").and_then(|v| v.as_mapping()) { + collect_entries(props, &parts, out); + } + } + _ => { + if let Some(props) = value.get("properties").and_then(|v| v.as_mapping()) { + collect_entries(props, &parts, out); + } + } + } + } +} + +fn parse_setting(path_parts: &[&str], value: &Value) -> (String, FieldInfo) { + let yaml_path = path_parts.join("."); + + let has_no_env_tag = value + .get("tags") + .and_then(|v| v.as_sequence()) + .map(|tags| tags.iter().any(|t| t.as_str() == Some("no-env"))) + .unwrap_or(false); + + let env_vars: Vec = if has_no_env_tag { + Vec::new() + } else { + value + .get("env_vars") + .and_then(|v| v.as_sequence()) + .map(|seq| seq.iter().filter_map(|v| v.as_str()).map(|s| s.to_string()).collect()) + .unwrap_or_default() + }; + + let value_type = parse_value_type(value); + let default = value.get("default").and_then(yaml_value_to_json_str); + + ( + yaml_path, + FieldInfo { + value_type, + env_vars, + default, + }, + ) +} + +fn parse_value_type(value: &Value) -> FieldType { + match value.get("type").and_then(|v| v.as_str()) { + Some("string") => FieldType::String, + Some("boolean") => FieldType::Bool, + Some("integer") => FieldType::Integer, + Some("number") => FieldType::Float, + Some("array") => { + let item_type = value.get("items").and_then(|v| v.get("type")).and_then(|v| v.as_str()); + if item_type == Some("string") { + FieldType::StringList + } else { + FieldType::Unknown + } + } + _ => FieldType::Unknown, + } +} + +fn yaml_value_to_json_str(value: &serde_yaml::Value) -> Option { + match value { + serde_yaml::Value::Null => None, + serde_yaml::Value::Bool(b) => Some(b.to_string()), + serde_yaml::Value::Number(n) => Some(n.to_string()), + serde_yaml::Value::String(s) => { + let escaped = s.replace('\\', "\\\\").replace('"', "\\\""); + Some(format!("\"{}\"", escaped)) + } + serde_yaml::Value::Sequence(seq) => { + let items: Option> = seq.iter().map(yaml_value_to_json_str).collect(); + items.map(|elems| format!("[{}]", elems.join(","))) + } + serde_yaml::Value::Mapping(map) if map.is_empty() => Some("{}".to_string()), + _ => None, + } +} + +/// Return the `ValueType::*` token string for use in generated Rust source. +pub fn field_type_as_rust(ft: &FieldType) -> &'static str { + match ft { + FieldType::String | FieldType::Unknown => "ValueType::String", + FieldType::Bool => "ValueType::Bool", + FieldType::Integer => "ValueType::Integer", + FieldType::Float => "ValueType::Float", + FieldType::StringList => "ValueType::StringList", + } +} + +/// Return `true` if `ft` is [`FieldType::Unknown`]. +pub fn is_unknown(ft: &FieldType) -> bool { + matches!(ft, FieldType::Unknown) +} + +/// Escape backslashes and double-quotes in `s` for use inside a Rust string literal. +pub fn escape_str(s: &str) -> String { + s.replace('\\', "\\\\").replace('"', "\\\"") +} + +/// Generate `schema.rs` in `dir` from `schema_map`. +/// +/// The file contains one `pub const : SchemaEntry = SchemaEntry { … };` block per +/// entry, sorted alphabetically. Panics if the file cannot be written. +pub fn generate_schema_rs(schema_map: &IndexMap, dir: &Path) { + use std::fmt::Write as _; + + let mut out = String::new(); + writeln!( + out, + "// @generated by build.rs from core_schema.yaml + schema_overlay.yaml — DO NOT EDIT" + ) + .unwrap(); + writeln!(out).unwrap(); + + let mut keys: Vec<&str> = schema_map.keys().map(|s| s.as_str()).collect(); + keys.sort_unstable(); + + for yaml_path in &keys { + let info = &schema_map[*yaml_path]; + let const_name = yaml_path_to_const(yaml_path); + let vt = field_type_as_rust(&info.value_type); + + if is_unknown(&info.value_type) { + writeln!( + out, + "// TODO: unknown type for '{}' — set value_type_override in the annotation", + yaml_path + ) + .unwrap(); + } + + let env_vars_lit = if info.env_vars.is_empty() { + "&[]".to_string() + } else { + let items: Vec = info.env_vars.iter().map(|e| format!("\"{}\"", escape_str(e))).collect(); + format!("&[{}]", items.join(", ")) + }; + + let default_lit = match &info.default { + Some(d) => format!("Some(\"{}\")", escape_str(d)), + None => "None".to_string(), + }; + + writeln!(out, "pub const {}: SchemaEntry = SchemaEntry {{", const_name).unwrap(); + writeln!(out, " schema: Schema::Datadog,").unwrap(); + writeln!(out, " yaml_path: \"{}\",", yaml_path).unwrap(); + writeln!(out, " env_vars: {},", env_vars_lit).unwrap(); + writeln!(out, " value_type: {},", vt).unwrap(); + writeln!(out, " default: {},", default_lit).unwrap(); + writeln!(out, "}};").unwrap(); + writeln!(out).unwrap(); + } + + let path = dir.join("schema.rs"); + std::fs::write(&path, out).unwrap_or_else(|e| panic!("cannot write {}: {}", path.display(), e)); +} + +/// Convert a dotted YAML path (for example, `"dogstatsd.bind_host"`) to a `SCREAMING_SNAKE_CASE` +/// Rust identifier suitable for a `const` name. +pub fn yaml_path_to_const(yaml_path: &str) -> String { + yaml_path + .chars() + .map(|c| if c == '.' || c == '-' { '_' } else { c }) + .collect::() + .to_uppercase() +} diff --git a/lib/datadog-agent/config-overlay-model/src/smoke_test_support.rs b/lib/datadog-agent/config-overlay-model/src/smoke_test_support.rs new file mode 100644 index 00000000000..4fec556d7e4 --- /dev/null +++ b/lib/datadog-agent/config-overlay-model/src/smoke_test_support.rs @@ -0,0 +1,73 @@ +//! Types necessary to keep the configuration smoke tests working. Intended to be transitional +//! until we can get Saluki/ADP to stop deserializing directly from Agent configuration. At that +//! time the smoke tests will be rendered inert and can be removed. +use serde::{Deserialize, Serialize}; + +/// A struct in the Saluki repository that deserializes Datadog Agent configuration. +/// +/// Used as values in `schema_overlay.yaml` `used_by` fields to declare which structs consume a +/// given key. Adding a new struct here is the first step when registering its configuration keys. +/// +/// This construct has been carried over from the original `config_registry` in order to support +/// configuration smoke test code generation. Each variant in this enum should be an exact name +/// match to a struct that consumes its value directly from Agent configuration either by +/// deserializing or by environment variable. +#[derive(Copy, Clone, Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Deserialize, Serialize)] +pub enum ConfigurationStruct { + AggregateConfiguration, + ContainerdConfiguration, + DatadogApmStatsEncoderConfiguration, + DatadogEventsConfiguration, + DatadogLogsConfiguration, + DatadogMetricsConfiguration, + DatadogServiceChecksConfiguration, + DatadogTraceConfiguration, + DogStatsDConfiguration, + DogStatsDDebugLogConfiguration, + DogStatsDMapperConfiguration, + DogStatsDPrefixFilterConfiguration, + ForwarderConfiguration, + MrfConfiguration, + OtlpConfiguration, + OtlpDecoderConfiguration, + OtlpRelayConfiguration, + ProxyConfiguration, + RemoteAgentClientConfiguration, + TagFilterlistConfiguration, + TraceObfuscationConfiguration, + + /// Keys read via `get_typed` / `try_get_typed` rather than struct deserialization. + #[serde(rename = "get_typed")] + GetTyped, +} + +impl ConfigurationStruct { + /// Apparently we travel back and forth between string constant representation and the struct + /// names themselves. This function recovers the string constant name for a struct. + pub fn as_smoke_test_const(&self) -> &'static str { + match self { + ConfigurationStruct::AggregateConfiguration => "AGGREGATE_CONFIGURATION", + ConfigurationStruct::ContainerdConfiguration => "CONTAINERD_CONFIGURATION", + ConfigurationStruct::DatadogApmStatsEncoderConfiguration => "DATADOG_APM_STATS_ENCODER_CONFIGURATION", + ConfigurationStruct::DatadogEventsConfiguration => "DATADOG_EVENTS_CONFIGURATION", + ConfigurationStruct::DatadogLogsConfiguration => "DATADOG_LOGS_CONFIGURATION", + ConfigurationStruct::DatadogMetricsConfiguration => "DATADOG_METRICS_CONFIGURATION", + ConfigurationStruct::DatadogServiceChecksConfiguration => "DATADOG_SERVICE_CHECKS_CONFIGURATION", + ConfigurationStruct::DatadogTraceConfiguration => "DATADOG_TRACE_CONFIGURATION", + ConfigurationStruct::DogStatsDConfiguration => "DOGSTATSD_CONFIGURATION", + ConfigurationStruct::DogStatsDDebugLogConfiguration => "DOGSTATSD_DEBUG_LOG_CONFIGURATION", + ConfigurationStruct::DogStatsDMapperConfiguration => "DOGSTATSD_MAPPER_CONFIGURATION", + ConfigurationStruct::DogStatsDPrefixFilterConfiguration => "DOGSTATSD_PREFIX_FILTER_CONFIGURATION", + ConfigurationStruct::ForwarderConfiguration => "FORWARDER_CONFIGURATION", + ConfigurationStruct::MrfConfiguration => "MRF_CONFIGURATION", + ConfigurationStruct::OtlpConfiguration => "OTLP_CONFIGURATION", + ConfigurationStruct::OtlpDecoderConfiguration => "OTLP_DECODER_CONFIGURATION", + ConfigurationStruct::OtlpRelayConfiguration => "OTLP_RELAY_CONFIGURATION", + ConfigurationStruct::ProxyConfiguration => "PROXY_CONFIGURATION", + ConfigurationStruct::RemoteAgentClientConfiguration => "REMOTE_AGENT_CLIENT_CONFIGURATION", + ConfigurationStruct::TagFilterlistConfiguration => "TAG_FILTERLIST_CONFIGURATION", + ConfigurationStruct::TraceObfuscationConfiguration => "TRACE_OBFUSCATION_CONFIGURATION", + ConfigurationStruct::GetTyped => "GET_TYPED", + } + } +} diff --git a/lib/datadog-agent/config-overlay-model/test/fake_overlay.yaml b/lib/datadog-agent/config-overlay-model/test/fake_overlay.yaml new file mode 100644 index 00000000000..64157e1a52b --- /dev/null +++ b/lib/datadog-agent/config-overlay-model/test/fake_overlay.yaml @@ -0,0 +1,157 @@ +# PLACEHOLDER: for model testing, do not use! +supported: + additional_endpoints: + support_level: full + used_by: [ ForwarderConfiguration ] + pipelines: [ cross_cutting ] + description: "Dual-ship to extra endpoints" + test_json: '{"smoke-host-1.example.com": ["smoke-api-key"]}' + additional_attributes: + config_registry_filename: forwarder.rs + + api_key: + support_level: full + used_by: [ ForwarderConfiguration ] + pipelines: [ cross_cutting ] + description: "Datadog API key" + additional_attributes: + config_registry_filename: forwarder.rs + + apm_enabled: + support_level: full + used_by: [ DatadogTraceConfiguration ] + pipelines: [ dogstatsd, traces ] + description: "Enable APM trace pipeline" + additional_attributes: + config_registry_filename: aggregate.rs + + check_runners: + support_level: full + used_by: [ AggregateConfiguration ] + pipelines: [ checks ] + description: "Number of check runner workers" + additional_attributes: + config_registry_filename: aggregate.rs + + context_expiry_seconds: + support_level: full + used_by: [ AggregateConfiguration ] + pipelines: [ dogstatsd ] + description: "Idle context keep-alive duration" + additional_yaml_paths: [ dogstatsd_expiry_seconds ] + additional_attributes: + config_registry_filename: aggregate.rs + + dd_url: + support_level: full + used_by: [ ForwarderConfiguration ] + pipelines: [ cross_cutting ] + description: "Override intake endpoint URL" + additional_attributes: + config_registry_filename: forwarder.rs + + dogstatsd_entity_id_precedence: + support_level: full + env_var_override: [ DD_DOGSTATSD_ENTITY_ID_PRECEDENCE ] + used_by: [ DogStatsDConfiguration ] + pipelines: [ dogstatsd ] + description: "Entity ID over auto-detection" + additional_attributes: + config_registry_filename: dogstatsd.rs + + dogstatsd_port: + support_level: full + value_type_override: integer + used_by: [ DogStatsDConfiguration ] + pipelines: [ dogstatsd ] + description: "UDP listen port" + additional_attributes: + config_registry_filename: dogstatsd.rs + + log_level: + support_level: full + used_by: [ ForwarderConfiguration ] + pipelines: [ cross_cutting ] + description: "Agent log verbosity" + additional_attributes: + config_registry_filename: forwarder.rs + + log_to_console: + support_level: full + used_by: [ ForwarderConfiguration ] + pipelines: [ cross_cutting ] + description: "Log to stdout instead of file" + additional_attributes: + config_registry_filename: forwarder.rs + + min_tls_version: + support_level: partial + used_by: [ ForwarderConfiguration ] + pipelines: [ cross_cutting ] + description: "Minimum outbound TLS version" + documentation: | + ADP supports TLS 1.2 and TLS 1.3. Values "tlsv1.0" and "tlsv1.1" are accepted for + configuration compatibility but clamped to TLS 1.2 because rustls does not support + those protocol versions. + additional_attributes: + config_registry_filename: forwarder.rs + + no_proxy: + support_level: full + used_by: [ ForwarderConfiguration ] + pipelines: [ cross_cutting ] + description: "Hosts to exclude from proxy routing" + additional_attributes: + config_registry_filename: forwarder.rs + + otlp_flare: + support_level: partial + used_by: [ OtlpConfiguration ] + pipelines: [ otlp ] + description: "Include OTLP data in flare archives" + documentation: | + ADP flare output is limited to gRPC receiver statistics. Full trace/metric + payload capture is not yet available. + issue: "#9999" + additional_attributes: + config_registry_filename: otlp.rs + + site: + support_level: full + used_by: [ ForwarderConfiguration ] + pipelines: [ cross_cutting ] + description: "Datadog intake site" + additional_attributes: + config_registry_filename: forwarder.rs + +unsupported: + runtime_security_enabled: + severity: low + planned: true + pipelines: [ cross_cutting ] + description: "Enable runtime security agent" + documentation: "CSM is managed by the core agent, not ADP." + issue: "#0001" + + tls_handshake_timeout: + severity: medium + planned: true + pipelines: [ cross_cutting ] + description: "HTTP TLS handshake timeout duration" + documentation: "Existing forwarder request timeout covers the gap." + issue: "#178" + + tls_skip_verify: + severity: high + planned: false + pipelines: [ cross_cutting ] + description: "Disable TLS certificate verification" + +investigate: + log_format_json: + description: "JSON-format log output" + issue: "#5555" + +ignored: + api_key_validation_period: "Key validation handled upstream" + cluster_agent.url: "DCA discovery handled by core agent" diff --git a/lib/datadog-agent/config-overlay-model/test/fake_schema.yaml b/lib/datadog-agent/config-overlay-model/test/fake_schema.yaml new file mode 100644 index 00000000000..fcd036c5b13 --- /dev/null +++ b/lib/datadog-agent/config-overlay-model/test/fake_schema.yaml @@ -0,0 +1,44 @@ +# PLACEHOLDER: for model testing, do not use! +properties: + additional_endpoints: + type: object + api_key: + type: string + api_key_validation_period: + type: integer + apm_enabled: + type: boolean + check_runners: + type: integer + cluster_agent.url: + type: string + context_expiry_seconds: + type: integer + dd_url: + type: string + dogstatsd_entity_id_precedence: + type: boolean + dogstatsd_port: + type: integer + log_format_json: + type: boolean + log_level: + type: string + log_to_console: + type: boolean + min_tls_version: + type: string + no_proxy: + type: array + items: + type: string + otlp_flare: + type: boolean + runtime_security_enabled: + type: boolean + site: + type: string + tls_handshake_timeout: + type: string + tls_skip_verify: + type: boolean diff --git a/lib/datadog-agent/config-testsupport/Cargo.toml b/lib/datadog-agent/config-testsupport/Cargo.toml new file mode 100644 index 00000000000..1ba50a90cac --- /dev/null +++ b/lib/datadog-agent/config-testsupport/Cargo.toml @@ -0,0 +1,23 @@ +[package] +name = "datadog-agent-config-testsupport" +version = "0.1.0" +edition = { workspace = true } +license = { workspace = true } +repository = { workspace = true } + +[dependencies] +datadog-agent-config = { workspace = true } +figment = { workspace = true } +saluki-config = { workspace = true } +serde = { workspace = true } +serde_json = { workspace = true } + +[build-dependencies] +datadog-agent-config-overlay-model = { workspace = true } +indexmap = { workspace = true } +serde = { workspace = true } +serde_yaml = { workspace = true } +tinytemplate = { workspace = true } + +[lints] +workspace = true diff --git a/lib/datadog-agent/config-testsupport/build.rs b/lib/datadog-agent/config-testsupport/build.rs new file mode 100644 index 00000000000..fa134e7580b --- /dev/null +++ b/lib/datadog-agent/config-testsupport/build.rs @@ -0,0 +1,56 @@ +use std::path::{Path, PathBuf}; + +use datadog_agent_config_overlay_model::{schema_gen, Files, SchemaOverlay}; + +#[path = "build/registry_gen.rs"] +mod registry_gen; + +#[path = "build/doc_gen.rs"] +mod doc_gen; + +fn main() { + let manifest_dir = PathBuf::from(env!("CARGO_MANIFEST_DIR")); + let doc_dir = manifest_dir + .join("..") + .join("..") + .join("..") + .join("docs") + .join("agent-data-plane") + .join("configuration"); + let template_path = doc_dir.join("dogstatsd.md.tmpl"); + let doc_target = doc_dir.join("dogstatsd.md"); + let config_registry_dir = manifest_dir.join("src/config_registry"); + + let files = Files::default(); + + println!("cargo:rerun-if-changed={}", files.schema.display()); + println!("cargo:rerun-if-changed={}", files.overlay.display()); + println!("cargo:rerun-if-changed={}", template_path.display()); + println!("cargo:rerun-if-changed=build.rs"); + println!("cargo:rerun-if-changed=build/registry_gen.rs"); + println!("cargo:rerun-if-changed=build/doc_gen.rs"); + + let out_dir = PathBuf::from(std::env::var("OUT_DIR").unwrap()); + + let schema_path = files.schema.clone(); + let overlay = SchemaOverlay::load(files).unwrap_or_else(|e| panic!("{e}")); + let schema_map = schema_gen::load_schema(&schema_path); + + // schema.rs is ~480KB — stays in OUT_DIR, never committed. + let registry_out_dir = out_dir.join("config_registry"); + std::fs::create_dir_all(®istry_out_dir).unwrap(); + schema_gen::generate_schema_rs(&schema_map, ®istry_out_dir); + + // Generate annotation subsystem files + annotations_index.rs in-tree for PR diff visibility. + registry_gen::generate_in_tree(&overlay, &schema_map, &config_registry_dir); + + // Generate documentation markdown. + doc_gen::generate(&overlay, &template_path, &out_dir); + write_generated_doc(&out_dir, &doc_target); +} + +fn write_generated_doc(out_dir: &Path, dst: &Path) { + let src = out_dir.join("docs/dogstatsd.md"); + let content = std::fs::read(&src).unwrap_or_else(|e| panic!("cannot read {}: {}", src.display(), e)); + std::fs::write(dst, content).unwrap_or_else(|e| panic!("cannot write {}: {}", dst.display(), e)); +} diff --git a/lib/datadog-agent/config-testsupport/build/doc_gen.rs b/lib/datadog-agent/config-testsupport/build/doc_gen.rs new file mode 100644 index 00000000000..d32711c91ca --- /dev/null +++ b/lib/datadog-agent/config-testsupport/build/doc_gen.rs @@ -0,0 +1,301 @@ +//! Generates the ADP configuration documentation Markdown from a [`SchemaOverlay`]. +//! +//! [`generate`] renders a TinyTemplate source with Markdown tables derived from each overlay +//! section and writes the result to `$OUT_DIR/docs/dogstatsd.md`. + +use std::collections::BTreeMap; +use std::fmt::Write as _; +use std::path::Path; + +use datadog_agent_config_overlay_model::{Investigate, SchemaOverlay, SupportLevel, Supported, Unsupported}; +use tinytemplate::TinyTemplate; + +const ISSUE_BASE_URL: &str = "https://github.com/DataDog/saluki/issues/"; + +// ── Table rendering ───────────────────────────────────────────────────────── + +struct TwoColRow { + key: String, + description: String, +} + +struct ThreeColRow { + key: String, + description: String, + extra: String, +} + +fn render_two_col_table(headers: [&str; 2], rows: &[TwoColRow]) -> String { + if rows.is_empty() { + return String::new(); + } + let w0 = rows.iter().map(|r| r.key.len()).max().unwrap().max(headers[0].len()); + let w1 = rows + .iter() + .map(|r| r.description.len()) + .max() + .unwrap() + .max(headers[1].len()); + let mut out = String::new(); + writeln!(out, "| {: String { + if rows.is_empty() { + return String::new(); + } + let w0 = rows.iter().map(|r| r.key.len()).max().unwrap().max(headers[0].len()); + let w1 = rows + .iter() + .map(|r| r.description.len()) + .max() + .unwrap() + .max(headers[1].len()); + let w2 = rows.iter().map(|r| r.extra.len()).max().unwrap().max(headers[2].len()); + let mut out = String::new(); + writeln!( + out, + "| {: Option { + issue.strip_prefix('#').and_then(|s| s.parse().ok()) +} + +fn collect_issue(issue: &Option, issues: &mut BTreeMap) -> String { + match issue { + Some(i) => { + if let Some(n) = parse_issue_number(i) { + issues.entry(n).or_insert_with(|| i.clone()); + } + format!("[{}]", i) + } + None => String::new(), + } +} + +// ── Documentation block rendering ─────────────────────────────────────────── + +fn render_docs_block(entries: &[(&str, &str)]) -> String { + let mut out = String::new(); + for (key, doc) in entries { + let trimmed = doc.trim(); + if !trimmed.starts_with('#') { + writeln!(out, "### `{}`", key).unwrap(); + writeln!(out).unwrap(); + } + writeln!(out, "{}", trimmed).unwrap(); + writeln!(out).unwrap(); + } + out +} + +// ── Public entry point ────────────────────────────────────────────────────── + +pub fn generate(overlay: &SchemaOverlay, template_path: &Path, out_dir: &Path) { + let template_src = std::fs::read_to_string(template_path) + .unwrap_or_else(|e| panic!("cannot read {}: {}", template_path.display(), e)); + + let mut issues: BTreeMap = BTreeMap::new(); + + // ── Being Worked On (unsupported, planned: true) ──────────────────── + let working_on: Vec<(&str, &Unsupported)> = overlay + .unsupported + .iter() + .filter(|(_, u)| u.planned) + .map(|(k, v)| (k.as_str(), v)) + .collect(); + + let working_on_rows: Vec = working_on + .iter() + .map(|(key, u)| ThreeColRow { + key: format!("`{}`", key), + description: u.description.clone(), + extra: collect_issue(&u.issue, &mut issues), + }) + .collect(); + let working_on_table = render_three_col_table(["Config Key", "Description", "Issue"], &working_on_rows); + + // ── Not Planned (unsupported, planned: false) ─────────────────────── + let not_planned: Vec<(&str, &Unsupported)> = overlay + .unsupported + .iter() + .filter(|(_, u)| !u.planned) + .map(|(k, v)| (k.as_str(), v)) + .collect(); + + let not_planned_rows: Vec = not_planned + .iter() + .map(|(key, u)| { + if let Some(i) = &u.issue { + if let Some(n) = parse_issue_number(i) { + issues.entry(n).or_insert_with(|| i.clone()); + } + } + let reason = match u.documentation.as_deref() { + Some(d) if d.contains('\n') => "See below".to_string(), + Some(d) => d.to_string(), + None => String::new(), + }; + ThreeColRow { + key: format!("`{}`", key), + description: u.description.clone(), + extra: reason, + } + }) + .collect(); + let not_planned_table = render_three_col_table(["Config Key", "Description", "Reason"], ¬_planned_rows); + + let not_planned_doc_entries: Vec<(&str, &str)> = not_planned + .iter() + .filter_map(|(key, u)| { + u.documentation + .as_deref() + .filter(|d| d.contains('\n')) + .map(|d| (*key, d)) + }) + .collect(); + let not_planned_docs = render_docs_block(¬_planned_doc_entries); + + // ── Behavioral Differences (supported, partial) ───────────────────── + let behavioral: Vec<(&str, &Supported)> = overlay + .supported + .iter() + .filter(|(_, s)| s.support_level == SupportLevel::Partial) + .map(|(k, v)| (k.as_str(), v)) + .collect(); + + let behavioral_rows: Vec = behavioral + .iter() + .map(|(key, s)| { + if let Some(i) = &s.issue { + if let Some(n) = parse_issue_number(i) { + issues.entry(n).or_insert_with(|| i.clone()); + } + } + TwoColRow { + key: format!("`{}`", key), + description: s.description.clone(), + } + }) + .collect(); + let behavioral_table = render_two_col_table(["Config Key", "Description"], &behavioral_rows); + + let behavioral_doc_entries: Vec<(&str, &str)> = behavioral + .iter() + .filter_map(|(key, s)| s.documentation.as_deref().map(|d| (*key, d))) + .collect(); + let behavioral_docs = render_docs_block(&behavioral_doc_entries); + + // ── Compatibility Unknown (investigate) ───────────────────────────── + let inv_entries: Vec<(&str, &Investigate)> = overlay.investigate.iter().map(|(k, v)| (k.as_str(), v)).collect(); + + let inv_rows: Vec = inv_entries + .iter() + .map(|(key, inv)| ThreeColRow { + key: format!("`{}`", key), + description: inv.description.clone(), + extra: collect_issue(&inv.issue, &mut issues), + }) + .collect(); + let investigate_table = render_three_col_table(["Config Key", "Description", "Issue"], &inv_rows); + + // ── ADP-Only Settings (saluki_keys) ────────────────────────────────── + let mut adp_rows: Vec = datadog_agent_config_overlay_model::saluki_keys::SALUKI_KEYS + .iter() + .map(|sk| ThreeColRow { + key: format!("`{}`", sk.yaml_path), + description: sk.description.to_string(), + extra: if sk.default.is_empty() { + String::new() + } else { + sk.default.to_string() + }, + }) + .collect(); + adp_rows.sort_by(|a, b| a.key.cmp(&b.key)); + let adp_only_table = render_three_col_table(["Config Key", "Description", "Default"], &adp_rows); + + let adp_doc_entries: Vec<(&str, &str)> = datadog_agent_config_overlay_model::saluki_keys::SALUKI_KEYS + .iter() + .filter_map(|sk| sk.documentation.map(|d| (sk.yaml_path, d))) + .collect(); + let adp_only_docs = render_docs_block(&adp_doc_entries); + + // ── Transparent Settings (supported, full) ────────────────────────── + let transparent: Vec<(&str, &Supported)> = overlay + .supported + .iter() + .filter(|(_, s)| s.support_level == SupportLevel::Full) + .map(|(k, v)| (k.as_str(), v)) + .collect(); + + let transparent_rows: Vec = transparent + .iter() + .map(|(key, s)| { + if let Some(i) = &s.issue { + if let Some(n) = parse_issue_number(i) { + issues.entry(n).or_insert_with(|| i.clone()); + } + } + TwoColRow { + key: format!("`{}`", key), + description: s.description.clone(), + } + }) + .collect(); + let transparent_table = render_two_col_table(["Config Key", "Description"], &transparent_rows); + + // ── Issue references ──────────────────────────────────────────────── + let mut issue_refs = String::new(); + for (n, raw) in &issues { + writeln!(issue_refs, "[{}]: {}{}", raw, ISSUE_BASE_URL, n).unwrap(); + } + + // ── Render template ───────────────────────────────────────────────── + let mut ctx: std::collections::HashMap = std::collections::HashMap::new(); + ctx.insert("working_on_table".to_string(), working_on_table); + ctx.insert("not_planned_table".to_string(), not_planned_table); + ctx.insert("not_planned_docs".to_string(), not_planned_docs); + ctx.insert("behavioral_table".to_string(), behavioral_table); + ctx.insert("behavioral_docs".to_string(), behavioral_docs); + ctx.insert("investigate_table".to_string(), investigate_table); + ctx.insert("adp_only_table".to_string(), adp_only_table); + ctx.insert("adp_only_docs".to_string(), adp_only_docs); + ctx.insert("transparent_table".to_string(), transparent_table); + ctx.insert("issue_references".to_string(), issue_refs); + + let mut tt = TinyTemplate::new(); + tt.set_default_formatter(&tinytemplate::format_unescaped); + tt.add_template("doc", &template_src) + .unwrap_or_else(|e| panic!("template parse error: {}", e)); + + let rendered = tt + .render("doc", &ctx) + .unwrap_or_else(|e| panic!("template render error: {}", e)); + + let docs_dir = out_dir.join("docs"); + std::fs::create_dir_all(&docs_dir).unwrap(); + let out_path = docs_dir.join("dogstatsd.md"); + std::fs::write(&out_path, rendered).unwrap_or_else(|e| panic!("cannot write {}: {}", out_path.display(), e)); +} diff --git a/lib/datadog-agent/config-testsupport/build/registry_gen.rs b/lib/datadog-agent/config-testsupport/build/registry_gen.rs new file mode 100644 index 00000000000..2f1cd8d8761 --- /dev/null +++ b/lib/datadog-agent/config-testsupport/build/registry_gen.rs @@ -0,0 +1,903 @@ +//! Generates the config registry annotation files from [`SchemaOverlay`] and [`SALUKI_KEYS`]. +//! +//! ## Output +//! +//! Each run produces: +//! +//! - **Per-subsystem files** (`dogstatsd.rs`, `forwarder.rs`, etc.)—one `declare_annotations!` +//! block per file, covering supported keys grouped by `config_registry_filename`. +//! - **`unsupported.rs`**—all unsupported overlay keys plus any `investigate` entries that carry +//! a severity, each mapped to `SupportLevel::Incompatible`. +//! - **`schema.rs`**—flat `SchemaEntry` constants for every key (delegated to [`schema_gen`]). +//! - **An aggregation layer**—lazy statics `SUPPORTED_ANNOTATIONS`, `UNSUPPORTED_ANNOTATIONS`, +//! and `ALL_ANNOTATIONS` tying all subsystem slices together. +//! +//! ## Two entry points +//! +//! - [`generate`] writes everything into `OUT_DIR/config_registry/` for `include!()`. Production +//! build path. +//! - [`generate_in_tree`] writes directly to the source tree so generated files appear in PR +//! diffs. Each file gets a `use super::*` preamble so it compiles as a plain module. +//! Produces `annotations_index.rs` instead of `mod.rs`; the hand-written `mod.rs` +//! `include!()`'s it. +//! +//! ## Ordering +//! +//! `GOLDEN_ORDER` preserves the key sequence from the hand-written registry files on `main`, +//! keeping diffs readable. Keys absent from the list sort to the end alphabetically. + +use std::fmt::Write as _; +use std::path::Path; + +use datadog_agent_config_overlay_model::saluki_keys::{SalukiKey, SALUKI_KEYS}; +use datadog_agent_config_overlay_model::schema_gen::{self, FieldInfo}; +use datadog_agent_config_overlay_model::{ + Pipeline, PipelineAffinity, SchemaOverlay, Severity, SupportLevel, ValueType, +}; +use indexmap::IndexMap; + +static SALUKI_ENTRIES: &[SalukiKey] = SALUKI_KEYS; +// Golden ordering: yaml_paths in the order they appeared in the hand-written config_registry +// files on main. Used to sort generated output so the diff is readable. +// Keys not listed here (new keys) sort to the end alphabetically. +static GOLDEN_ORDER: &[(&str, &[&str])] = &[ + ( + "aggregate.rs", + &[ + "aggregate_window_duration_seconds", + "aggregate_flush_interval", + "aggregate_context_limit", + "dogstatsd_flush_incomplete_buckets", + "counter_expiry_seconds", + "dogstatsd_no_aggregation_pipeline", + "aggregate_passthrough_idle_flush_timeout", + "histogram_aggregates", + "histogram_copy_to_distribution", + "histogram_copy_to_distribution_prefix", + ], + ), + ("containerd.rs", &["cri_connection_timeout", "cri_query_timeout"]), + ( + "dogstatsd_mapper.rs", + &[ + "dogstatsd_mapper_cache_size", + "dogstatsd_mapper_profiles", + "dogstatsd_mapper_string_interner_size", + ], + ), + ( + "dogstatsd_prefix_filter.rs", + &[ + "metric_filterlist", + "metric_filterlist_match_prefix", + "statsd_metric_blocklist", + "statsd_metric_blocklist_match_prefix", + "statsd_metric_namespace", + "statsd_metric_namespace_blacklist", + ], + ), + ( + "dogstatsd.rs", + &[ + "bind_host", + "dogstatsd_buffer_size", + "dogstatsd_capture_depth", + "dogstatsd_capture_path", + "dogstatsd_context_expiry_seconds", + "dogstatsd_entity_id_precedence", + "dogstatsd_eol_required", + "dogstatsd_non_local_traffic", + "dogstatsd_origin_detection", + "dogstatsd_origin_detection_client", + "dogstatsd_origin_optout_enabled", + "dogstatsd_port", + "dogstatsd_socket", + "dogstatsd_so_rcvbuf", + "dogstatsd_stream_socket", + "dogstatsd_stream_log_too_big", + "statsd_forward_host", + "statsd_forward_port", + "dogstatsd_string_interner_size", + "dogstatsd_tag_cardinality", + "dogstatsd_tags", + "provider_kind", + "origin_detection_unified", + "dogstatsd_log_file", + "dogstatsd_log_file_max_rolls", + "dogstatsd_log_file_max_size", + "dogstatsd_logging_enabled", + "dogstatsd_metrics_stats_enable", + "dogstatsd_allow_context_heap_allocs", + "dogstatsd_autoscale_udp_listeners", + "dogstatsd_buffer_count", + "dogstatsd_cached_contexts_limit", + "dogstatsd_cached_tagsets_limit", + "dogstatsd_minimum_sample_rate", + "dogstatsd_permissive_decoding", + "dogstatsd_string_interner_size_bytes", + "dogstatsd_tcp_port", + "enable_payloads.events", + "enable_payloads.series", + "enable_payloads.service_checks", + "enable_payloads.sketches", + ], + ), + ( + "encoders.rs", + &[ + "serializer_compressor_kind", + "serializer_zstd_compressor_level", + "flush_timeout_secs", + "serializer_max_metrics_per_payload", + "log_payloads", + "serializer_max_payload_size", + "serializer_max_uncompressed_payload_size", + "serializer_max_series_payload_size", + "serializer_max_series_uncompressed_payload_size", + "serializer_max_series_points_per_payload", + "use_v2_api.series", + "env", + ], + ), + ( + "forwarder.rs", + &[ + "api_key", + "site", + "dd_url", + "observability_pipelines_worker.metrics.enabled", + "observability_pipelines_worker.metrics.url", + "vector.metrics.enabled", + "vector.metrics.url", + "additional_endpoints", + "forwarder_num_workers", + "forwarder_timeout", + "forwarder_high_prio_buffer_size", + "forwarder_connection_reset_interval", + "forwarder_http_protocol", + "skip_ssl_validation", + "min_tls_version", + "allow_arbitrary_tags", + "forwarder_backoff_base", + "forwarder_backoff_factor", + "forwarder_backoff_max", + "forwarder_recovery_interval", + "forwarder_recovery_reset", + "forwarder_retry_queue_max_size", + "forwarder_retry_queue_payloads_max_size", + "forwarder_storage_max_disk_ratio", + "forwarder_storage_max_size_in_bytes", + "forwarder_storage_path", + "forwarder_outdated_file_in_days", + ], + ), + ( + "get_typed.rs", + &[ + "vsock_addr", + "cmd_port", + "log_format_rfc3339", + "syslog_rfc", + "syslog_uri", + ], + ), + ( + "mrf.rs", + &[ + "multi_region_failover.api_key", + "multi_region_failover.dd_url", + "multi_region_failover.enabled", + "multi_region_failover.failover_metrics", + "multi_region_failover.metric_allowlist", + "multi_region_failover.site", + ], + ), + ( + "otlp.rs", + &[ + "otlp_config.receiver.protocols.grpc.endpoint", + "otlp_config.receiver.protocols.grpc.max_recv_msg_size_mib", + "otlp_config.receiver.protocols.grpc.transport", + "otlp_config.receiver.protocols.http.endpoint", + "otlp_config.receiver.protocols.http.transport", + "otlp_config.traces.enabled", + "otlp_config.traces.ignore_missing_datadog_fields", + "otlp_config.traces.enable_otlp_compute_top_level_by_span_kind", + "otlp_config.traces.internal_port", + "otlp_config.traces.probabilistic_sampler.sampling_percentage", + "otlp_config.traces.string_interner_size", + "otlp_config.logs.enabled", + "otlp_config.metrics.enabled", + "otlp_allow_context_heap_allocs", + "otlp_cached_contexts_limit", + "otlp_cached_tagsets_limit", + "otlp_string_interner_size", + ], + ), + ( + "proxy.rs", + &[ + "proxy.http", + "proxy.https", + "proxy.no_proxy", + "no_proxy_nonexact_match", + "use_proxy_for_cloud_metadata", + ], + ), + ( + "tag_filterlist.rs", + &["data_plane.dogstatsd.aggregator_tag_filter_cache_capacity"], + ), + ( + "trace_obfuscation.rs", + &[ + "apm_config.obfuscation.credit_cards.enabled", + "apm_config.obfuscation.credit_cards.keep_values", + "apm_config.obfuscation.credit_cards.luhn", + "apm_config.obfuscation.elasticsearch.enabled", + "apm_config.obfuscation.elasticsearch.keep_values", + "apm_config.obfuscation.elasticsearch.obfuscate_sql_values", + "apm_config.obfuscation.http.remove_paths_with_digits", + "apm_config.obfuscation.http.remove_query_string", + "apm_config.obfuscation.memcached.enabled", + "apm_config.obfuscation.memcached.keep_command", + "apm_config.obfuscation.mongodb.enabled", + "apm_config.obfuscation.mongodb.keep_values", + "apm_config.obfuscation.mongodb.obfuscate_sql_values", + "apm_config.obfuscation.opensearch.enabled", + "apm_config.obfuscation.opensearch.keep_values", + "apm_config.obfuscation.opensearch.obfuscate_sql_values", + "apm_config.obfuscation.redis.enabled", + "apm_config.obfuscation.redis.remove_all_args", + "apm_config.obfuscation.sql.dbms", + "apm_config.obfuscation.sql.dollar_quoted_func", + "apm_config.obfuscation.sql.keep_sql_alias", + "apm_config.obfuscation.sql.replace_digits", + "apm_config.obfuscation.sql.table_names", + "apm_config.obfuscation.valkey.enabled", + "apm_config.obfuscation.valkey.remove_all_args", + ], + ), + ( + "unsupported.rs", + &[ + "dogstatsd_disable_verbose_logs", + "dogstatsd_pipe_name", + "dogstatsd_stats_buffer", + "dogstatsd_stats_enable", + "dogstatsd_stats_port", + "dogstatsd_telemetry_enabled_listener_id", + "dogstatsd_windows_pipe_security_descriptor", + "forwarder_apikey_validation_interval", + "forwarder_flush_to_disk_mem_ratio", + "forwarder_low_prio_buffer_size", + "forwarder_max_concurrent_requests", + "forwarder_retry_queue_capacity_time_interval_sec", + "serializer_experimental_use_v3_api.compression_level", + "serializer_experimental_use_v3_api.series.endpoints", + "serializer_experimental_use_v3_api.series.validate", + "serializer_experimental_use_v3_api.sketches.endpoints", + "serializer_experimental_use_v3_api.sketches.validate", + "sslkeylogfile", + "tls_handshake_timeout", + "aggregator_buffer_size", + "aggregator_flush_metrics_and_serialize_in_parallel_buffer_size", + "aggregator_flush_metrics_and_serialize_in_parallel_chan_size", + "aggregator_stop_timeout", + "aggregator_use_tags_store", + "autoscaling.failover.enabled", + "autoscaling.failover.metrics", + "dogstatsd_experimental_http.enabled", + "dogstatsd_experimental_http.listen_address", + "forwarder_requeue_buffer_size", + "forwarder_stop_timeout", + "heroku_dyno", + "telemetry.dogstatsd.aggregator_channel_latency_buckets", + "telemetry.dogstatsd.listeners_channel_latency_buckets", + "telemetry.dogstatsd.listeners_latency_buckets", + "telemetry.dogstatsd_origin", + "cluster_agent.enabled", + ], + ), +]; + +fn golden_sort_key(filename: &str, yaml_path: &str) -> (usize, String) { + for &(file, paths) in GOLDEN_ORDER { + if file == filename { + if let Some(pos) = paths.iter().position(|&p| p == yaml_path) { + return (pos, String::new()); + } + break; + } + } + (usize::MAX, yaml_path.to_string()) +} + +#[allow(dead_code)] +pub fn generate(overlay: &SchemaOverlay, schema_map: &IndexMap, out_dir: &Path) { + let registry_dir = out_dir.join("config_registry"); + std::fs::create_dir_all(®istry_dir).unwrap(); + + validate_saluki_entries(overlay); + schema_gen::generate_schema_rs(schema_map, ®istry_dir); + generate_subsystem_files(overlay, schema_map, ®istry_dir, ""); + generate_unsupported_rs(overlay, ®istry_dir, ""); + generate_mod_rs(overlay, ®istry_dir); +} + +/// Write generated registry files directly into the source tree for PR diff visibility. +/// +/// Each subsystem file gets `use super::*;` and `use super::schema;` prepended so +/// it compiles as a file-based Rust module. The `annotations_index.rs` is designed to be +/// `include!()`'d from the hand-written `mod.rs` which already has types in scope. +pub fn generate_in_tree(overlay: &SchemaOverlay, schema_map: &IndexMap, src_dir: &Path) { + std::fs::create_dir_all(src_dir).unwrap(); + + validate_saluki_entries(overlay); + + let preamble = "#[allow(unused_imports)]\nuse super::schema;\n#[allow(unused_imports)]\nuse super::*;\n\n"; + generate_subsystem_files(overlay, schema_map, src_dir, preamble); + generate_unsupported_rs(overlay, src_dir, preamble); + generate_annotations_index(overlay, src_dir); +} + +fn validate_saluki_entries(overlay: &SchemaOverlay) { + for entry in SALUKI_ENTRIES { + if overlay.supported.contains_key(entry.yaml_path) + || overlay.unsupported.contains_key(entry.yaml_path) + || overlay.ignored.contains_key(entry.yaml_path) + { + panic!( + "Saluki entry '{}' collides with a vendored schema key in the overlay — \ + it should use the schema entry instead of a hard-coded SchemaEntry", + entry.yaml_path + ); + } + } +} + +fn generate_subsystem_files( + overlay: &SchemaOverlay, schema_map: &IndexMap, dir: &Path, preamble: &str, +) { + let mut datadog_by_file: IndexMap> = + IndexMap::new(); + for (yaml_path, entry) in &overlay.supported { + let filename = entry + .additional_attributes + .get("config_registry_filename") + .unwrap_or_else(|| panic!("supported key '{}' missing config_registry_filename", yaml_path)); + datadog_by_file + .entry(filename.clone()) + .or_default() + .push((yaml_path.as_str(), entry)); + } + + let mut saluki_by_file: IndexMap<&str, Vec<&SalukiKey>> = IndexMap::new(); + for entry in SALUKI_ENTRIES { + saluki_by_file.entry(entry.filename).or_default().push(entry); + } + + let mut all_files: Vec = datadog_by_file.keys().cloned().collect(); + for &f in saluki_by_file.keys() { + if !all_files.iter().any(|x| x == f) { + all_files.push(f.to_string()); + } + } + all_files.sort_unstable(); + + for filename in &all_files { + let datadog_entries = datadog_by_file + .get(filename.as_str()) + .map(|v| v.as_slice()) + .unwrap_or(&[]); + let saluki_entries = saluki_by_file + .get(filename.as_str()) + .map(|v| v.as_slice()) + .unwrap_or(&[]); + generate_one_file(filename, datadog_entries, saluki_entries, schema_map, dir, preamble); + } +} + +enum AnnotationEntry<'a> { + Datadog(&'a str, &'a datadog_agent_config_overlay_model::Supported), + Saluki(&'a SalukiKey), +} + +impl<'a> AnnotationEntry<'a> { + fn yaml_path(&self) -> &str { + match self { + Self::Datadog(p, _) => p, + Self::Saluki(se) => se.yaml_path, + } + } +} + +fn generate_one_file( + filename: &str, datadog_entries: &[(&str, &datadog_agent_config_overlay_model::Supported)], + saluki_entries: &[&SalukiKey], schema_map: &IndexMap, dir: &Path, preamble: &str, +) { + let mut entries: Vec = Vec::new(); + for &(yaml_path, entry) in datadog_entries { + entries.push(AnnotationEntry::Datadog(yaml_path, entry)); + } + for &se in saluki_entries { + entries.push(AnnotationEntry::Saluki(se)); + } + entries.sort_by_key(|a| golden_sort_key(filename, a.yaml_path())); + + let mut out = String::new(); + writeln!(out, "// @generated by build.rs from schema_overlay.yaml — DO NOT EDIT").unwrap(); + out.push_str(preamble); + + for entry in &entries { + if let AnnotationEntry::Saluki(se) = entry { + let const_name = format!("{}_SCHEMA", schema_gen::yaml_path_to_const(se.yaml_path)); + let default_lit = match se.schema_default { + Some(d) => format!("Some(\"{}\")", schema_gen::escape_str(d)), + None => "None".to_string(), + }; + let env_vars_lit = if se.env_vars.is_empty() { + "&[]".to_string() + } else { + let items: Vec = se.env_vars.iter().map(|e| format!("\"{}\"", e)).collect(); + format!("&[{}]", items.join(", ")) + }; + writeln!(out, "static {}: SchemaEntry = SchemaEntry {{", const_name).unwrap(); + writeln!(out, " schema: Schema::Saluki,").unwrap(); + writeln!(out, " yaml_path: \"{}\",", se.yaml_path).unwrap(); + writeln!(out, " env_vars: {},", env_vars_lit).unwrap(); + writeln!(out, " value_type: {},", se.value_type).unwrap(); + writeln!(out, " default: {},", default_lit).unwrap(); + writeln!(out, "}};").unwrap(); + writeln!(out).unwrap(); + } + } + + writeln!(out, "crate::declare_annotations! {{").unwrap(); + + for entry in &entries { + match entry { + AnnotationEntry::Datadog(yaml_path, e) => { + emit_datadog_annotation(&mut out, yaml_path, e, schema_map); + } + AnnotationEntry::Saluki(se) => { + emit_saluki_annotation(&mut out, se); + } + } + } + + writeln!(out, "}}").unwrap(); + + let path = dir.join(filename); + std::fs::write(&path, out).unwrap_or_else(|e| panic!("cannot write {}: {}", path.display(), e)); +} + +fn emit_datadog_annotation( + out: &mut String, yaml_path: &str, entry: &datadog_agent_config_overlay_model::Supported, + _schema_map: &IndexMap, +) { + let const_name = schema_gen::yaml_path_to_const(yaml_path); + let support_level = overlay_support_level(&entry.support_level); + let pipeline_affinity = overlay_pipeline_affinity_expr(&entry.pipelines); + + let alias_paths = &entry.additional_yaml_paths; + let alias_lit = if alias_paths.is_empty() { + "&[]".to_string() + } else { + let items: Vec = alias_paths.iter().map(|p| format!("\"{}\"", p)).collect(); + format!("&[{}]", items.join(", ")) + }; + + let env_override = match &entry.env_var_override { + None => "None".to_string(), + Some(vars) => { + let items: Vec = vars + .iter() + .map(|v| format!("\"{}\"", schema_gen::escape_str(v))) + .collect(); + format!("Some(&[{}])", items.join(", ")) + } + }; + + let used_by_lit = { + let items: Vec = entry + .used_by + .iter() + .map(|u| format!("structs::{}", u.as_smoke_test_const())) + .collect(); + format!("&[{}]", items.join(", ")) + }; + + let vt_override = match &entry.value_type_override { + None => "None".to_string(), + Some(vt) => format!("Some({})", overlay_value_type(vt)), + }; + + let test_json_lit = match &entry.test_json { + None => "None".to_string(), + Some(s) => format_test_json(s), + }; + + let description = &entry.description; + + writeln!(out, " /// `{}`-{}", yaml_path, description).unwrap(); + writeln!(out, " {} = SalukiAnnotation {{", const_name).unwrap(); + writeln!(out, " schema: &schema::{},", const_name).unwrap(); + writeln!(out, " support_level: {},", support_level).unwrap(); + writeln!(out, " additional_yaml_paths: {},", alias_lit).unwrap(); + writeln!(out, " env_var_override: {},", env_override).unwrap(); + writeln!(out, " used_by: {},", used_by_lit).unwrap(); + writeln!(out, " value_type_override: {},", vt_override).unwrap(); + writeln!(out, " test_json: {},", test_json_lit).unwrap(); + writeln!(out, " pipeline_affinity: {},", pipeline_affinity).unwrap(); + writeln!(out, " }};").unwrap(); +} + +fn emit_saluki_annotation(out: &mut String, se: &SalukiKey) { + let const_name = schema_gen::yaml_path_to_const(se.yaml_path); + let schema_const = format!("{}_SCHEMA", const_name); + + let alias_lit = if se.additional_yaml_paths.is_empty() { + "&[]".to_string() + } else { + let items: Vec = se.additional_yaml_paths.iter().map(|p| format!("\"{}\"", p)).collect(); + format!("&[{}]", items.join(", ")) + }; + + let env_override = match se.env_var_override { + None => "None".to_string(), + Some(vars) => { + let items: Vec = vars.iter().map(|v| format!("\"{}\"", v)).collect(); + format!("Some(&[{}])", items.join(", ")) + } + }; + + let used_by_lit = { + let items: Vec = se.used_by.iter().map(|u| format!("structs::{}", u)).collect(); + format!("&[{}]", items.join(", ")) + }; + + let test_json_lit = match se.test_json { + None => "None".to_string(), + Some(s) => format_test_json(s), + }; + + writeln!(out, " /// `{}`", se.yaml_path).unwrap(); + writeln!(out, " {} = SalukiAnnotation {{", const_name).unwrap(); + writeln!(out, " schema: &{},", schema_const).unwrap(); + writeln!(out, " support_level: SupportLevel::Full,").unwrap(); + writeln!(out, " additional_yaml_paths: {},", alias_lit).unwrap(); + writeln!(out, " env_var_override: {},", env_override).unwrap(); + writeln!(out, " used_by: {},", used_by_lit).unwrap(); + writeln!(out, " value_type_override: None,").unwrap(); + writeln!(out, " test_json: {},", test_json_lit).unwrap(); + writeln!(out, " pipeline_affinity: {},", se.pipeline_affinity).unwrap(); + writeln!(out, " }};").unwrap(); +} + +fn generate_unsupported_rs(overlay: &SchemaOverlay, dir: &Path, preamble: &str) { + enum UnsupportedEntry<'a> { + Unsupported(&'a str, &'a datadog_agent_config_overlay_model::Unsupported), + Investigate(&'a str, &'a datadog_agent_config_overlay_model::Investigate), + } + impl<'a> UnsupportedEntry<'a> { + fn yaml_path(&self) -> &str { + match self { + Self::Unsupported(p, _) => p, + Self::Investigate(p, _) => p, + } + } + } + + let mut entries: Vec = Vec::new(); + for (yaml_path, entry) in &overlay.unsupported { + entries.push(UnsupportedEntry::Unsupported(yaml_path, entry)); + } + for (yaml_path, entry) in &overlay.investigate { + if entry.severity.is_some() { + entries.push(UnsupportedEntry::Investigate(yaml_path, entry)); + } + } + entries.sort_by(|a, b| { + golden_sort_key("unsupported.rs", a.yaml_path()).cmp(&golden_sort_key("unsupported.rs", b.yaml_path())) + }); + + let mut out = String::new(); + writeln!(out, "// @generated by build.rs from schema_overlay.yaml — DO NOT EDIT").unwrap(); + out.push_str(preamble); + writeln!(out, "crate::declare_annotations! {{").unwrap(); + + for entry in &entries { + match entry { + UnsupportedEntry::Unsupported(yaml_path, e) => { + let const_name = schema_gen::yaml_path_to_const(yaml_path); + let severity = match e.severity { + Severity::Low => "Severity::Low", + Severity::Medium => "Severity::Medium", + Severity::High => "Severity::High", + }; + let pipeline_affinity = overlay_pipeline_affinity_expr(&e.pipelines); + + writeln!(out, " /// `{}`-{}", yaml_path, e.description).unwrap(); + writeln!(out, " {} = SalukiAnnotation {{", const_name).unwrap(); + writeln!(out, " schema: &schema::{},", const_name).unwrap(); + writeln!(out, " support_level: SupportLevel::Incompatible({}),", severity).unwrap(); + writeln!(out, " additional_yaml_paths: &[],").unwrap(); + writeln!(out, " env_var_override: None,").unwrap(); + writeln!(out, " used_by: &[],").unwrap(); + writeln!(out, " value_type_override: None,").unwrap(); + writeln!(out, " test_json: None,").unwrap(); + writeln!(out, " pipeline_affinity: {},", pipeline_affinity).unwrap(); + writeln!(out, " }};").unwrap(); + } + UnsupportedEntry::Investigate(yaml_path, e) => { + let severity = match e.severity { + Some(Severity::Low) => "Severity::Low", + Some(Severity::Medium) => "Severity::Medium", + Some(Severity::High) => "Severity::High", + None => unreachable!(), + }; + let const_name = schema_gen::yaml_path_to_const(yaml_path); + + writeln!(out, " /// `{}`-{}", yaml_path, e.description).unwrap(); + writeln!(out, " {} = SalukiAnnotation {{", const_name).unwrap(); + writeln!(out, " schema: &schema::{},", const_name).unwrap(); + writeln!(out, " support_level: SupportLevel::Incompatible({}),", severity).unwrap(); + writeln!(out, " additional_yaml_paths: &[],").unwrap(); + writeln!(out, " env_var_override: None,").unwrap(); + writeln!(out, " used_by: &[],").unwrap(); + writeln!(out, " value_type_override: None,").unwrap(); + writeln!(out, " test_json: None,").unwrap(); + writeln!(out, " pipeline_affinity: PipelineAffinity::CrossCutting,").unwrap(); + writeln!(out, " }};").unwrap(); + } + } + } + + writeln!(out, "}}").unwrap(); + + let path = dir.join("unsupported.rs"); + std::fs::write(&path, out).unwrap_or_else(|e| panic!("cannot write {}: {}", path.display(), e)); +} + +#[allow(dead_code)] +fn generate_mod_rs(overlay: &SchemaOverlay, dir: &Path) { + let supported_files: Vec = { + let mut files: std::collections::HashSet = overlay + .supported + .values() + .filter_map(|e| e.additional_attributes.get("config_registry_filename").cloned()) + .collect(); + for se in SALUKI_ENTRIES { + files.insert(se.filename.to_string()); + } + let mut files: Vec = files.into_iter().collect(); + files.sort_unstable(); + files + }; + + let mut out = String::new(); + writeln!(out, "// @generated by build.rs from schema_overlay.yaml — DO NOT EDIT").unwrap(); + writeln!(out).unwrap(); + writeln!( + out, + "use crate::config_registry::{{Pipeline, PipelineAffinity, SalukiAnnotation, Schema, SchemaEntry, Severity, SupportLevel, ValueType, structs}};" + ) + .unwrap(); + writeln!(out).unwrap(); + + writeln!(out, "#[allow(dead_code)]").unwrap(); + writeln!(out, "mod schema {{").unwrap(); + writeln!(out, " #[allow(unused_imports)]").unwrap(); + writeln!(out, " use super::*;").unwrap(); + writeln!( + out, + " include!(concat!(env!(\"OUT_DIR\"), \"/config_registry/schema.rs\"));" + ) + .unwrap(); + writeln!(out, "}}").unwrap(); + writeln!(out).unwrap(); + + for filename in &supported_files { + let stem = filename.trim_end_matches(".rs"); + writeln!(out, "mod {} {{", stem).unwrap(); + writeln!(out, " #[allow(unused_imports)]").unwrap(); + writeln!(out, " use super::*;").unwrap(); + writeln!( + out, + " include!(concat!(env!(\"OUT_DIR\"), \"/config_registry/{}\"));", + filename + ) + .unwrap(); + writeln!(out, "}}").unwrap(); + writeln!(out).unwrap(); + } + + writeln!(out, "pub(super) mod unsupported {{").unwrap(); + writeln!(out, " #[allow(unused_imports)]").unwrap(); + writeln!(out, " use super::*;").unwrap(); + writeln!( + out, + " include!(concat!(env!(\"OUT_DIR\"), \"/config_registry/unsupported.rs\"));" + ) + .unwrap(); + writeln!(out, "}}").unwrap(); + writeln!(out).unwrap(); + + writeln!(out, "use std::sync::LazyLock;").unwrap(); + writeln!(out).unwrap(); + + writeln!( + out, + "pub static SUPPORTED_ANNOTATIONS: LazyLock> = LazyLock::new(|| {{" + ) + .unwrap(); + writeln!(out, " let mut v: Vec<&'static SalukiAnnotation> = Vec::new();").unwrap(); + for filename in &supported_files { + let stem = filename.trim_end_matches(".rs"); + writeln!(out, " v.extend_from_slice({}::ALL);", stem).unwrap(); + } + writeln!(out, " v").unwrap(); + writeln!(out, "}});").unwrap(); + writeln!(out).unwrap(); + + writeln!( + out, + "pub static UNSUPPORTED_ANNOTATIONS: LazyLock> = LazyLock::new(|| {{" + ) + .unwrap(); + writeln!(out, " let mut v: Vec<&'static SalukiAnnotation> = Vec::new();").unwrap(); + writeln!(out, " v.extend_from_slice(unsupported::ALL);").unwrap(); + writeln!(out, " v").unwrap(); + writeln!(out, "}});").unwrap(); + writeln!(out).unwrap(); + + writeln!( + out, + "pub static ALL_ANNOTATIONS: LazyLock> = LazyLock::new(|| {{" + ) + .unwrap(); + writeln!(out, " let mut v = SUPPORTED_ANNOTATIONS.clone();").unwrap(); + writeln!(out, " v.extend_from_slice(&UNSUPPORTED_ANNOTATIONS);").unwrap(); + writeln!(out, " v").unwrap(); + writeln!(out, "}});").unwrap(); + + let path = dir.join("mod.rs"); + std::fs::write(&path, out).unwrap_or_else(|e| panic!("cannot write {}: {}", path.display(), e)); +} + +/// Generate `annotations_index.rs`, designed to be `include!()`'d from the hand-written `mod.rs`. +/// +/// Contains: `mod schema` (include!'ing OUT_DIR/schema.rs), plain `mod` declarations for each +/// subsystem file, and the LazyLock aggregation statics. +fn generate_annotations_index(overlay: &SchemaOverlay, dir: &Path) { + let supported_files: Vec = { + let mut files: std::collections::HashSet = overlay + .supported + .values() + .filter_map(|e| e.additional_attributes.get("config_registry_filename").cloned()) + .collect(); + for se in SALUKI_ENTRIES { + files.insert(se.filename.to_string()); + } + let mut files: Vec = files.into_iter().collect(); + files.sort_unstable(); + files + }; + + let mut out = String::new(); + writeln!(out, "// @generated by build.rs from schema_overlay.yaml — DO NOT EDIT").unwrap(); + writeln!( + out, + "// This file is include!()'d from mod.rs — types are already in scope." + ) + .unwrap(); + writeln!(out).unwrap(); + + writeln!(out, "#[allow(dead_code)]").unwrap(); + writeln!(out, "mod schema {{").unwrap(); + writeln!(out, " #[allow(unused_imports)]").unwrap(); + writeln!(out, " use super::*;").unwrap(); + writeln!( + out, + " include!(concat!(env!(\"OUT_DIR\"), \"/config_registry/schema.rs\"));" + ) + .unwrap(); + writeln!(out, "}}").unwrap(); + writeln!(out).unwrap(); + + for filename in &supported_files { + let stem = filename.trim_end_matches(".rs"); + writeln!(out, "mod {};", stem).unwrap(); + } + writeln!(out).unwrap(); + + writeln!(out, "pub(super) mod unsupported;").unwrap(); + writeln!(out).unwrap(); + + writeln!(out, "use std::sync::LazyLock;").unwrap(); + writeln!(out).unwrap(); + + writeln!( + out, + "pub static SUPPORTED_ANNOTATIONS: LazyLock> = LazyLock::new(|| {{" + ) + .unwrap(); + writeln!(out, " let mut v: Vec<&'static SalukiAnnotation> = Vec::new();").unwrap(); + for filename in &supported_files { + let stem = filename.trim_end_matches(".rs"); + writeln!(out, " v.extend_from_slice({}::ALL);", stem).unwrap(); + } + writeln!(out, " v").unwrap(); + writeln!(out, "}});").unwrap(); + writeln!(out).unwrap(); + + writeln!( + out, + "pub static UNSUPPORTED_ANNOTATIONS: LazyLock> = LazyLock::new(|| {{" + ) + .unwrap(); + writeln!(out, " let mut v: Vec<&'static SalukiAnnotation> = Vec::new();").unwrap(); + writeln!(out, " v.extend_from_slice(unsupported::ALL);").unwrap(); + writeln!(out, " v").unwrap(); + writeln!(out, "}});").unwrap(); + writeln!(out).unwrap(); + + writeln!( + out, + "pub static ALL_ANNOTATIONS: LazyLock> = LazyLock::new(|| {{" + ) + .unwrap(); + writeln!(out, " let mut v = SUPPORTED_ANNOTATIONS.clone();").unwrap(); + writeln!(out, " v.extend_from_slice(&UNSUPPORTED_ANNOTATIONS);").unwrap(); + writeln!(out, " v").unwrap(); + writeln!(out, "}});").unwrap(); + + let path = dir.join("annotations_index.rs"); + std::fs::write(&path, out).unwrap_or_else(|e| panic!("cannot write {}: {}", path.display(), e)); +} + +fn overlay_support_level(sl: &SupportLevel) -> &'static str { + match sl { + SupportLevel::Full => "SupportLevel::Full", + SupportLevel::Partial => "SupportLevel::Partial", + } +} + +fn overlay_pipeline_affinity_expr(pa: &PipelineAffinity) -> String { + match pa { + PipelineAffinity::CrossCutting => "PipelineAffinity::CrossCutting".to_string(), + PipelineAffinity::Pipelines(ps) => { + let parts: Vec<&str> = ps + .iter() + .map(|p| match p { + Pipeline::DogStatsD => "Pipeline::DogStatsD", + Pipeline::Checks => "Pipeline::Checks", + Pipeline::Otlp => "Pipeline::Otlp", + Pipeline::Traces => "Pipeline::Traces", + }) + .collect(); + format!("PipelineAffinity::Pipelines(&[{}])", parts.join(", ")) + } + } +} + +fn overlay_value_type(vt: &ValueType) -> &'static str { + match vt { + ValueType::Boolean => "ValueType::Bool", + ValueType::Integer => "ValueType::Integer", + ValueType::Float => "ValueType::Float", + ValueType::String => "ValueType::String", + ValueType::StringList => "ValueType::StringList", + } +} + +/// Format a `test_json` value using raw string literals when the value contains quotes, +/// matching the style used in the hand-written `config_registry` files on main. +fn format_test_json(s: &str) -> String { + if s.contains('"') { + format!("Some(r#\"{}\"#)", s) + } else { + format!("Some(\"{}\")", s) + } +} diff --git a/lib/datadog-agent/config-testsupport/dogstatsd.md b/lib/datadog-agent/config-testsupport/dogstatsd.md new file mode 100644 index 00000000000..0f3d23d347b --- /dev/null +++ b/lib/datadog-agent/config-testsupport/dogstatsd.md @@ -0,0 +1,565 @@ +# Configuring DogStatsD on Agent Data Plane + + + +The DogStatsD implementation on ADP has been redesigned in Rust for better resource guarantees and +efficiency. Because the architecture is different from the original implementation, certain +configuration values may behave differently, be planned but not yet implemented, or not apply at +all. This page documents those nuances. + +ADP is designed to be transparent: customers configure DogStatsD the same way they always have. The +sections below call out the cases where that is either not yet true, or not quite possible. + +If you find an error on this page, please [open an issue]. + + +[open an issue]: https://github.com/DataDog/saluki/issues + + +## Unsupported Settings + + +### Being Worked On + +The following settings are not yet supported in ADP but are planned with GitHub issue links for +tracking. + +| Config Key | Description | Issue | +| ------------------------------------------------------- | ----------------------------------------------- | ------- | +| `dogstatsd_experimental_http.enabled` | Enable experimental HTTP/H2C DSD listener | [#1682] | +| `dogstatsd_experimental_http.listen_address` | Bind address for experimental HTTP DSD listener | [#1682] | +| `dogstatsd_pipe_name` | Windows named pipe path | [#1466] | +| `dogstatsd_windows_pipe_security_descriptor` | Windows named pipe ACL descriptor | [#1466] | +| `forwarder_apikey_validation_interval` | API key check interval (minutes) | [#1357] | +| `serializer_experimental_use_v3_api.compression_level` | V3 API zstd compression level | [#1468] | +| `serializer_experimental_use_v3_api.series.endpoints` | Endpoints enabled for V3 series API | [#1468] | +| `serializer_experimental_use_v3_api.series.validate` | Dual-send v2+v3 series for validation | [#1468] | +| `serializer_experimental_use_v3_api.sketches.endpoints` | Endpoints enabling v3 sketches API | [#1468] | +| `serializer_experimental_use_v3_api.sketches.validate` | Dual-send v2+v3 sketches for validation | [#1468] | +| `sslkeylogfile` | TLS key log file path | [#1372] | +| `tls_handshake_timeout` | HTTP TLS handshake timeout | [#178] | + + +### Not Planned + +The following settings exist in the core agent but are not planned for ADP, typically because ADP's +architecture is fundamentally different or the feature is platform-specific. + +| Config Key | Description | Reason | +| ----------------------------------------------------------------- | ------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `aggregator_buffer_size` | Channel buffer depth for aggregator queues | Saluki topology uses fixed interconnect sizes and construction-time wiring; no per-component config knobs. | +| `aggregator_flush_metrics_and_serialize_in_parallel_buffer_size` | Parallel flush: series/sketch buffer size | Saluki topology uses fixed interconnect sizes; no per-component config knobs. | +| `aggregator_flush_metrics_and_serialize_in_parallel_chan_size` | Parallel flush: channel size | Saluki topology uses fixed interconnect sizes; no per-component config knobs. | +| `aggregator_stop_timeout` | Timeout (s) for aggregator flush on stop | Saluki topology uses fixed interconnect sizes and construction-time wiring; no per-component config knobs. | +| `aggregator_use_tags_store` | Enable shared tag deduplication store | Core agent concept with no ADP analog. | +| `config_id` | Fleet Automation config ID tag | Core Agent uses this only on Agent HA telemetry metrics. | +| `dogstatsd_disable_verbose_logs` | Suppress noisy parse error logs | ADP does not emit the verbose parse-error logs that this key filters in the core Agent, so there is nothing to suppress. | +| `dogstatsd_host_socket_path` | Host UDS socket dir for DSD | Not read by DSD server; admission controller only. | +| `dogstatsd_mem_based_rate_limiter.enabled` | Memory-based rate limiter toggle | See below | +| `dogstatsd_mem_based_rate_limiter.go_gc` | Memory rate limiter GC percent | Go GC-specific; ADP uses `memory_limit` instead. | +| `dogstatsd_mem_based_rate_limiter.high_soft_limit` | Memory rate limiter high soft limit | Go GC-specific; ADP uses `memory_limit` instead. | +| `dogstatsd_mem_based_rate_limiter.low_soft_limit` | Memory rate limiter low soft limit | Go GC-specific; ADP uses `memory_limit` instead. | +| `dogstatsd_mem_based_rate_limiter.memory_ballast` | Memory rate limiter heap ballast size | Go GC-specific; ADP uses `memory_limit` instead. | +| `dogstatsd_mem_based_rate_limiter.rate_check.factor` | Memory rate limiter check factor | Go GC-specific; ADP uses `memory_limit` instead. | +| `dogstatsd_mem_based_rate_limiter.rate_check.max` | Memory rate limiter check max interval | Go GC-specific; ADP uses `memory_limit` instead. | +| `dogstatsd_mem_based_rate_limiter.rate_check.min` | Memory rate limiter check min interval | Go GC-specific; ADP uses `memory_limit` instead. | +| `dogstatsd_mem_based_rate_limiter.soft_limit_freeos_check.factor` | Memory rate limiter FreeOS check factor | Go GC-specific; ADP uses `memory_limit` instead. | +| `dogstatsd_mem_based_rate_limiter.soft_limit_freeos_check.max` | Memory rate limiter FreeOS check max | Go GC-specific; ADP uses `memory_limit` instead. | +| `dogstatsd_mem_based_rate_limiter.soft_limit_freeos_check.min` | Memory rate limiter FreeOS check min | Go GC-specific; ADP uses `memory_limit` instead. | +| `dogstatsd_no_aggregation_pipeline_batch_size` | No-aggregation pipeline batch size | Fixed in ADP topology. | +| `dogstatsd_packet_buffer_flush_timeout` | Packet buffer flush timeout | ADP decodes inline. | +| `dogstatsd_packet_buffer_size` | Datagrams per packet buffer | ADP decodes inline. | +| `dogstatsd_pipeline_autoadjust` | Auto-adjust pipeline workers | ADP uses async tasks. | +| `dogstatsd_pipeline_count` | Parallel processing pipelines | ADP uses async tasks. | +| `dogstatsd_queue_size` | Packet channel buffer size | ADP uses async tasks. | +| `dogstatsd_stats_buffer` | Internal stats buffer size | ADP does not expose the core agent's packet-per-second expvar endpoint, so there is no persistent stats endpoint buffer to configure. | +| `dogstatsd_stats_enable` | Enable internal stats endpoint | See below | +| `dogstatsd_stats_port` | Internal stats endpoint port | ADP does not expose the core agent's packet-per-second expvar endpoint, so `dogstatsd_stats_port` has no effect. | +| `dogstatsd_telemetry_enabled_listener_id` | Per-listener telemetry tagging | Not feasible to thread listener identity through ADP's async decode pipeline. | +| `dogstatsd_workers_count` | Number of DSD processing workers | ADP uses async tasks. | +| `enable_json_stream_shared_compressor_buffers` | Pre-allocate shared compressor buffers | ADP does not use a shared compressor buffer pool; Rust request builders own fixed-capacity scratch and compression buffers. | +| `entity_id` | Agent pod entity ID | ADP internal DogStatsD telemetry uses OpenMetrics. | +| `heroku_dyno` | Heroku dyno telemetry mode | See below | +| `logging_frequency` | Transaction success log interval | The core agent uses `logging_frequency` to throttle repetitive successful transaction logs. ADP logs successful forwarder operations below the default `info` level, so there is no matching info-level success-log stream to throttle. This key is intentionally unused. | +| `use_dogstatsd` | Master DogStatsD enable toggle | Core Agent evaluates and sets `data_plane.dogstatsd.enabled`. | + +### `dogstatsd_mem_based_rate_limiter.enabled` + +The Core Agent exposes 11 keys under this prefix to apply backpressure when the Go +process approaches its memory limit. They work by manipulating Go's garbage collector +(`debug.SetGCPercent`, `debug.FreeOSMemory`), allocating a large heap ballast to adjust +GC heuristics, and blocking goroutines to slow packet ingestion. None of these mechanisms +have an equivalent in Rust, and ADP does not use a Go runtime. + +ADP takes a different approach to the same problem using explicit static memory accounting +and a process-level RSS limit. All 11 `dogstatsd_mem_based_rate_limiter.*` keys are not +planned. See [Memory Management](../memory.md) for details. + +### DogStatsD statistics (`dogstatsd_stats_enable` / `dogstatsd_metrics_stats_enable`) + +The core agent has two DogStatsD statistics mechanisms with different scopes. +`dogstatsd_stats_enable` enables packet-level throughput statistics from a ring buffer, exposed as +Go expvar data on `dogstatsd_stats_port` (default `5000`). Operators must configure an OpenMetrics +check to scrape that endpoint before the data is submitted. `dogstatsd_metrics_stats_enable` +enables runtime-toggleable metric-level debug statistics that track count and last-seen time per +unique metric and tag combination. That data powers the core agent's `dogstatsd-stats` CLI command +and HTTP endpoint. + +ADP does not mirror the packet-level statistics config path. Instead, ADP provides an on-demand +metric-level view through a DogStatsD statistics destination that is always wired into the +topology, but only collects data during a time-bounded request. To collect statistics, run +`agent-data-plane dogstatsd stats --duration-secs N` or call the privileged +`/dogstatsd/stats?collection_duration_secs=N` API. The handler waits for the requested collection +window, then returns count and last-seen time per metric context inline as JSON. The CLI uses the +same API and renders the result as either summary or cardinality analysis. + +ADP also exposes internal DogStatsD telemetry through its OpenMetrics endpoint, always-on at +`http:///metrics` (the unprivileged API endpoint; default port `5100`). Scrape +that endpoint to collect aggregate DogStatsD counters such as processed message counts, packet and +byte counts, packet pool usage, and channel latency. This endpoint is separate from +`/dogstatsd/stats`: it does not return the per-metric count and last-seen map, and it is not +controlled by the core agent's `dogstatsd_stats_*` keys. + +ADP does not expose the core agent's packet-per-second expvar endpoint or a persistent per-metric +DogStatsD statistics endpoint to scrape. You do not need to set up scraper configuration for this +per-metric data. The config keys `dogstatsd_stats_enable`, `dogstatsd_stats_buffer`, and +`dogstatsd_stats_port` have no effect in ADP. See [#1352]. + +### `heroku_dyno` + +The `heroku_dyno` setting affects the core Agent's self-telemetry heartbeat. It changes the Agent +flavor used by the core Agent aggregator so the running heartbeat is emitted as +`datadog.heroku_agent.running`. + +ADP does not run in the supported Heroku Agent package path: the Heroku Agent package excludes the +`agent-data-plane` dependency, and the Heroku Datadog launch script starts the core Agent, trace Agent, and +optionally process Agent without launching an `agent-data-plane` process. ADP also does not emit the +core Agent's `datadog..running` series. + +Because the affected heartbeat is core-Agent-owned and ADP is not part of the supported Heroku +deployment path, ADP does not implement `heroku_dyno`. See [#1753]. + + +## Behavioral Differences + + + +The following settings are recognized by both ADP and the core agent, but with different behavior or +default values. + +| Config Key | Description | +| ---------------------------------- | ----------------------------------------- | +| `dogstatsd_mapper_cache_size` | Mapper result LRU cache size | +| `dogstatsd_metrics_stats_enable` | Enable per-metric debug stats | +| `log_level` | Log verbosity directives | +| `min_tls_version` | Minimum TLS version for HTTPS connections | +| `multi_region_failover.enabled` | Enable multi-region failover mode | +| `serializer_zstd_compressor_level` | Zstd compression level | +| `skip_ssl_validation` | Skip TLS cert validation | +| `statsd_forward_host` | UDP packet forwarding destination host | + +### `dogstatsd_mapper_cache_size` + +ADP and the core agent both cache mapper results to skip regex evaluation on repeat +metric names. With the default value of `1000`, and with any positive integer, behavior +matches the core agent: results are cached in an LRU keyed by the original metric name, +including a negative-cache entry for names that match no profile. + +The two implementations diverge when this setting is `0`. In the core agent, `0` is +rejected by the underlying LRU library, which causes the entire mapper to be silently +disabled: mapping profiles configured by `dogstatsd_mapper_profiles` are not applied. In +ADP, `0` disables the result cache only; mapping profiles still run, so each metric pays +the regex evaluation cost without amortization. + +If you previously set `dogstatsd_mapper_cache_size: 0` in the core agent to turn off the +mapper, clear `dogstatsd_mapper_profiles` instead when running ADP. + +### `dogstatsd_metrics_stats_enable` + +See `dogstatsd_stats_enable` + +### `log_level` + +ADP accepts `log_level` as the startup logging control. A plain level applies to +ADP-owned and Saluki-owned targets only, including `agent_data_plane`, `saluki_*`, and +runtime crates under `lib/`. + +```yaml +log_level: debug +``` + +This keeps third-party dependencies such as `hyper`, `tokio`, and `tonic` at their +default filtering unless you opt them in. + +To control dependency logs or set a global fallback, use advanced `EnvFilter` directives +in `log_level`. ADP applies those directive strings as configured: + +```yaml +log_level: warn,agent_data_plane=debug,hyper=warn +``` + +### `min_tls_version` + +ADP supports `min_tls_version` for Datadog intake forwarding through the shared Datadog +forwarder. The default is `tlsv1.2`, which allows TLS 1.2 and TLS 1.3. To require TLS +1.3 only, set `min_tls_version: tlsv1.3` or `DD_MIN_TLS_VERSION=tlsv1.3`. + +The core agent also accepts `tlsv1.0` and `tlsv1.1`. ADP accepts those values for +configuration compatibility, but clamps them to TLS 1.2 because ADP uses `rustls`, which +does not support TLS 1.0 or TLS 1.1. + +This setting does not affect ADP IPC, local privileged APIs, ADP control-plane clients, +OTLP proxying to the core agent, or unrelated HTTP clients. + +### `multi_region_failover.enabled` + +ADP supports multi-region failover for metrics. When `multi_region_failover.enabled` and +`multi_region_failover.failover_metrics` are both `true`, ADP forwards metrics to the +primary Datadog endpoint and to a second MRF endpoint. + +To enable the MRF metrics branch at startup, configure `multi_region_failover.api_key` +and one of `multi_region_failover.site` or `multi_region_failover.dd_url`. If the MRF +endpoint configuration is incomplete, ADP skips the MRF branch and continues forwarding +to the primary endpoint. + +ADP does not fall back to the primary `api_key`, `site`, or `dd_url` for MRF traffic. +`multi_region_failover.enabled` and endpoint selection are resolved at startup. +`multi_region_failover.failover_metrics`, `multi_region_failover.metric_allowlist`, and +`multi_region_failover.api_key` can refresh from live configuration after the MRF branch +is enabled. + +| Config Key | Behavior | Default | +| ---------------------------------------- | -------------------------------------------------------------------------- | ------- | +| `multi_region_failover.enabled` | Enables multi-region failover mode. | `false` | +| `multi_region_failover.failover_metrics` | Enables metrics forwarding to the failover region when MRF is enabled. | `false` | +| `multi_region_failover.metric_allowlist` | Exact metric names to forward to MRF. Empty or unset forwards all metrics. | `[]` | +| `multi_region_failover.api_key` | API key for the failover-region endpoint. | unset | +| `multi_region_failover.site` | Datadog site for the failover region, used as `https://app.mrf.`. | unset | +| `multi_region_failover.dd_url` | Explicit failover intake URL. Takes precedence over `site` when set. | unset | + +### `serializer_zstd_compressor_level` + +ADP defaults to level 3 vs Agent level 1. ADP intentionally compresses better. Key is recognized by both; default divergence is intentional. + +### `skip_ssl_validation` + +ADP supports `skip_ssl_validation` for Datadog intake forwarding through the shared +Datadog forwarder. The default is `false`, which preserves normal server certificate +validation. When enabled, this setting affects the Datadog intake clients used by metrics, +logs, traces, events, and service checks that flow through the shared forwarder. + +This setting does not affect ADP IPC, local privileged APIs, ADP control-plane clients, +OTLP proxying to the core agent, or unrelated HTTP clients. In FIPS builds, ADP rejects +`skip_ssl_validation: true` because disabling TLS certificate validation is not +FIPS-compliant. + +### `statsd_forward_host` + +ADP supports DogStatsD forwarding when both `statsd_forward_host` and +`statsd_forward_port` are set. ADP forwards each framed DogStatsD message over UDP to the +configured destination before parsing, filtering, mapping, or aggregation. Forwarding +does not preserve the core Agent's packet-buffer grouping, so forwarded UDP datagrams may +be split differently while carrying the same DogStatsD messages. ADP logs setup failures +and tracks send failures through telemetry. + + +## Compatibility Unknown + + + +The following settings need further investigation. ADP behavior may differ from the core agent in +ways that are not yet fully characterized. + +| Config Key | Description | Issue | +| -------------------------------------------------------- | --------------------------------------------- | ------- | +| `autoscaling.failover.enabled` | Enable autoscaling failover metric routing | [#1684] | +| `autoscaling.failover.metrics` | Metric names forwarded to DCA for failover | [#1684] | +| `cluster_agent.enabled` | Enable Cluster Agent communication | [#1684] | +| `forwarder_flush_to_disk_mem_ratio` | Mem-to-disk flush threshold | [#1364] | +| `forwarder_low_prio_buffer_size` | Low-priority request queue size | [#1362] | +| `forwarder_max_concurrent_requests` | Max concurrent HTTP requests | [#1363] | +| `forwarder_requeue_buffer_size` | In-memory re-queue buffer size | [#1755] | +| `forwarder_retry_queue_capacity_time_interval_sec` | Retry queue time-based capacity | [#1365] | +| `forwarder_stop_timeout` | Timeout (s) for forwarder graceful stop | [#1754] | +| `telemetry.dogstatsd.aggregator_channel_latency_buckets` | Histogram buckets: DSD aggregator channel lag | [#1679] | +| `telemetry.dogstatsd.listeners_channel_latency_buckets` | Histogram buckets: listener channel latency | [#1679] | +| `telemetry.dogstatsd.listeners_latency_buckets` | Histogram buckets: listener processing | [#1679] | +| `telemetry.dogstatsd_origin` | Per-origin processed-metrics telemetry | [#1679] | + +## ADP-Only Settings + + + +The following settings are specific to ADP and have no equivalent in the core agent. + +| Config Key | Description | Default | +| --------------------------------------------------------------- | ------------------------------------------ | ------- | +| `aggregate_context_limit` | Max contexts per aggregation window | | +| `aggregate_flush_interval` | Aggregator flush period | | +| `aggregate_passthrough_idle_flush_timeout` | Passthrough buffer flush delay | | +| `aggregate_window_duration_seconds` | Aggregation window size | | +| `apm_config.obfuscation.sql.dbms` | SQL obfuscation DBMS dialect | | +| `apm_config.obfuscation.sql.dollar_quoted_func` | Preserve dollar-quoted SQL functions | | +| `apm_config.obfuscation.sql.keep_sql_alias` | Preserve SQL aliases in obfuscation | | +| `apm_config.obfuscation.sql.replace_digits` | Replace digits in SQL obfuscation | | +| `apm_config.obfuscation.sql.table_names` | Collect table names during obfuscation | | +| `counter_expiry_seconds` | Idle counter keep-alive duration | 300 | +| `data_plane.remote_agent_enabled` | Enable remote agent mode | true | +| `data_plane.use_new_config_stream_endpoint` | Use new config stream endpoint | | +| `dogstatsd_allow_context_heap_allocs` | Allow heap allocations for contexts | | +| `dogstatsd_autoscale_udp_listeners` | Bind multiple UDP sockets via SO_REUSEPORT | | +| `dogstatsd_buffer_count` | Number of receive buffers | | +| `dogstatsd_cached_contexts_limit` | Max cached metric contexts | | +| `dogstatsd_cached_tagsets_limit` | Max cached tagsets | | +| `dogstatsd_mapper_string_interner_size` | Mapper string interner capacity | | +| `dogstatsd_minimum_sample_rate` | Floor for metric sample rates | | +| `dogstatsd_permissive_decoding` | Relaxes decoder strictness | true | +| `dogstatsd_string_interner_size_bytes` | Explicit byte budget for context interner | | +| `dogstatsd_tcp_port` | TCP listen port for DSD | | +| `flush_timeout_secs` | Encoder flush timeout (secs) | | +| `memory_limit` | Process memory limit | | +| `memory_slop_factor` | Memory accounting slop fraction | 0.25 | +| `otlp_allow_context_heap_allocs` | Allow heap allocations for OTLP contexts | | +| `otlp_cached_contexts_limit` | Max cached OTLP metric contexts | | +| `otlp_cached_tagsets_limit` | Max cached OTLP tagsets | | +| `otlp_config.receiver.protocols.http.transport` | OTLP HTTP receiver transport | | +| `otlp_config.traces.enable_otlp_compute_top_level_by_span_kind` | Enable OTLP top-level-by-span-kind | | +| `otlp_config.traces.ignore_missing_datadog_fields` | Ignore missing Datadog fields in OTLP | | +| `otlp_config.traces.string_interner_size` | OTLP trace string interner capacity | | +| `otlp_string_interner_size` | OTLP context interner capacity | | +| `serializer_max_metrics_per_payload` | Max metrics per payload | | + +### `dogstatsd_minimum_sample_rate` + +ADP enforces a minimum sample rate on incoming metrics to prevent memory exhaustion from extremely low sample rates on histograms and sketches. Sending metrics with a very high inverse sample rate (for example `@0.0000001`) can cause unbounded memory growth in a sketch; this setting prevents that. The default is conservative enough that normal clients are unaffected. + +### `dogstatsd_permissive_decoding` + +By default, ADP parses DogStatsD packets with the same leniency as the core agent, accepting packets that technically violate the spec. Setting this to `false` enables strict mode, which rejects non-conformant packets. Strict mode is not available in the core agent. + +### `memory_limit` / `memory_slop_factor` + +ADP uses an explicit process memory limit (`memory_limit`) rather than relying on Go's garbage collector. The `memory_slop_factor` reserves a fraction of the limit to account for allocations not tracked by ADP's internal accounting. When memory usage approaches `memory_limit`, ADP's global limiter begins exerting backpressure (see `enable_global_limiter`). + +### `memory_slop_factor` + +See `memory_limit` above. + +### `data_plane.remote_agent_enabled` / `data_plane.use_new_config_stream_endpoint` + +These two keys are transitional flags being phased out. Both will be implied by `data_plane.standalone_mode=false` in a future release. Do not rely on them for new deployments. + +### `data_plane.use_new_config_stream_endpoint` + +See `data_plane.remote_agent_enabled` above. + + +## Transparent Settings + + + +The following settings work in ADP with the same behavior as the core agent. + +To enable syslog logging, set `log_to_syslog: true`. Console logging remains controlled by +`log_to_console`; enabling syslog does not disable console or file logging. If `syslog_uri` is empty +while syslog logging is enabled, ADP uses the platform default local syslog socket: +`unixgram:///dev/log` on Linux and `unixgram:///var/run/syslog` on macOS. Set `syslog_rfc: true` +when the receiving syslog daemon expects the Agent's RFC-style header. + +### DogStatsD metric debug log + +ADP supports the core agent's DogStatsD metric debug log. To write this file, set +`dogstatsd_metrics_stats_enable: true`. `dogstatsd_logging_enabled` also must be `true`; it defaults +to `true`, so most configurations only need to enable `dogstatsd_metrics_stats_enable`. + +When `dogstatsd_logging_enabled` is `true`, ADP connects an extra DogStatsD destination to the +decoded metric stream. The destination writes one line per metric sample with the metric name, tags, +count, and last-seen time while `dogstatsd_metrics_stats_enable` is `true`. When +`dogstatsd_metrics_stats_enable` is `false`, the destination drains decoded metrics and drops them. +This lets runtime configuration changes start and stop the debug log without rebuilding the +topology. This feature is for support and troubleshooting. It does not change normal metric +forwarding, and it does not replace the on-demand `/dogstatsd/stats` API. + +Use these settings to control the file: + +| Config Key | Behavior | +| ------------------------------ | ------------------------------------------------------------------------------------------- | +| `dogstatsd_log_file` | Output path. If empty, ADP uses the platform default DogStatsD stats log path. | +| `dogstatsd_log_file_max_rolls` | Number of rotated files to keep. Defaults to `3`. | +| `dogstatsd_log_file_max_size` | Maximum active file size before rotation. Defaults to `10Mb`. | +| `dogstatsd_logging_enabled` | Controls whether ADP wires the debug log destination into the topology. Defaults to `true`. | + +The default `dogstatsd_log_file` path is +`/var/log/datadog/dogstatsd_info/dogstatsd-stats.log` on Linux and other Unix platforms, +`/opt/datadog-agent/logs/dogstatsd_info/dogstatsd-stats.log` on macOS, and +`%ProgramData%\datadog\logs\dogstatsd_info\dogstatsd-stats.log` on Windows. + +This debug log differs from the `dogstatsd_capture_*` settings. The debug log records decoded metric +summaries after DogStatsD parsing. The capture settings record raw DogStatsD traffic for packet-level +investigation, and they remain tracked separately under [#1381]. + +### Payload debug logging (`log_payloads`) + +ADP supports `log_payloads` for debugging metric, event, and service check payload contents before +they enter Datadog encoders. To see these logs, set `log_payloads: true` and run with debug-level +logging enabled. + +When enabled, ADP logs decoded payload objects: scalar series metrics, sketches/distributions, +events, and service checks. These logs can contain high-volume customer data, including metric names, +tags, host and container metadata, event text, and service check messages. Use this setting only +while diagnosing payload content. + +ADP does not dump the exact encoded JSON or protobuf HTTP request body, and it does not log +compressed wire payload bytes. + +| Config Key | Description | +| -------------------------------------------------------------- | -------------------------------------------------- | +| `additional_endpoints` | Dual-ship to extra endpoints | +| `allow_arbitrary_tags` | Relax backend tag validation via HTTP header | +| `api_key` | API key for endpoint auth | +| `apm_config.obfuscation.credit_cards.enabled` | apm_config.obfuscation.credit_cards.enabled | +| `apm_config.obfuscation.credit_cards.keep_values` | apm_config.obfuscation.credit_cards.keep_values | +| `apm_config.obfuscation.credit_cards.luhn` | apm_config.obfuscation.credit_cards.luhn | +| `apm_config.obfuscation.elasticsearch.enabled` | apm_config.obfuscation.elasticsearch.enabled | +| `apm_config.obfuscation.elasticsearch.keep_values` | apm_config.obfuscation.elasticsearch.keep_values | +| `apm_config.obfuscation.elasticsearch.obfuscate_sql_values` | Obfuscate SQL values in ES queries | +| `apm_config.obfuscation.http.remove_paths_with_digits` | Strip numeric segments from HTTP paths | +| `apm_config.obfuscation.http.remove_query_string` | apm_config.obfuscation.http.remove_query_string | +| `apm_config.obfuscation.memcached.enabled` | apm_config.obfuscation.memcached.enabled | +| `apm_config.obfuscation.memcached.keep_command` | apm_config.obfuscation.memcached.keep_command | +| `apm_config.obfuscation.mongodb.enabled` | apm_config.obfuscation.mongodb.enabled | +| `apm_config.obfuscation.mongodb.keep_values` | apm_config.obfuscation.mongodb.keep_values | +| `apm_config.obfuscation.mongodb.obfuscate_sql_values` | Obfuscate SQL values in MongoDB queries | +| `apm_config.obfuscation.opensearch.enabled` | apm_config.obfuscation.opensearch.enabled | +| `apm_config.obfuscation.opensearch.keep_values` | apm_config.obfuscation.opensearch.keep_values | +| `apm_config.obfuscation.opensearch.obfuscate_sql_values` | Obfuscate SQL values in OpenSearch queries | +| `apm_config.obfuscation.redis.enabled` | apm_config.obfuscation.redis.enabled | +| `apm_config.obfuscation.redis.remove_all_args` | apm_config.obfuscation.redis.remove_all_args | +| `apm_config.obfuscation.valkey.enabled` | apm_config.obfuscation.valkey.enabled | +| `apm_config.obfuscation.valkey.remove_all_args` | apm_config.obfuscation.valkey.remove_all_args | +| `bind_host` | Global listen host fallback | +| `cmd_port` | Datadog Agent IPC/CMD API port | +| `cri_connection_timeout` | CRI container runtime connection timeout (s) | +| `cri_query_timeout` | CRI container runtime query timeout (s) | +| `data_plane.dogstatsd.aggregator_tag_filter_cache_capacity` | Tag-filter deduplication cache size | +| `dd_url` | Override intake endpoint URL | +| `dogstatsd_buffer_size` | Receive buffer size (bytes) | +| `dogstatsd_capture_depth` | Traffic capture channel depth | +| `dogstatsd_capture_path` | Traffic capture file location | +| `dogstatsd_context_expiry_seconds` | Context cache TTL (seconds) | +| `dogstatsd_entity_id_precedence` | Entity ID over auto-detection | +| `dogstatsd_eol_required` | Require newline-terminated messages | +| `dogstatsd_flush_incomplete_buckets` | Flush open buckets on shutdown | +| `dogstatsd_log_file` | DSD dedicated log file path | +| `dogstatsd_log_file_max_rolls` | DSD log file max roll count | +| `dogstatsd_log_file_max_size` | DSD log file max size | +| `dogstatsd_logging_enabled` | Enables DSD metric logging | +| `dogstatsd_mapper_profiles` | Metric mapping profile definitions | +| `dogstatsd_no_aggregation_pipeline` | Enable no-agg timestamped path | +| `dogstatsd_non_local_traffic` | Accept non-localhost UDP/TCP | +| `dogstatsd_origin_detection` | Enable UDS origin detection | +| `dogstatsd_origin_detection_client` | Honor client origin proto fields | +| `dogstatsd_origin_optout_enabled` | Allow clients to opt out origin | +| `dogstatsd_port` | UDP listen port | +| `dogstatsd_so_rcvbuf` | Socket receive buffer size | +| `dogstatsd_socket` | UDS datagram socket path | +| `dogstatsd_stream_log_too_big` | Log oversized UDS stream frames | +| `dogstatsd_stream_socket` | UDS stream socket path | +| `dogstatsd_string_interner_size` | String interner capacity | +| `dogstatsd_tag_cardinality` | Default tag cardinality level | +| `dogstatsd_tags` | Extra tags added to all DSD data | +| `enable_payloads.events` | Allow sending event payloads | +| `enable_payloads.series` | Allow sending series payloads | +| `enable_payloads.service_checks` | Allow sending service check payloads | +| `enable_payloads.sketches` | Allow sending sketch payloads | +| `env` | Agent environment name | +| `forwarder_backoff_base` | Retry backoff base (secs) | +| `forwarder_backoff_factor` | Retry backoff jitter factor | +| `forwarder_backoff_max` | Retry backoff ceiling (secs) | +| `forwarder_connection_reset_interval` | HTTP conn reset interval (secs) | +| `forwarder_high_prio_buffer_size` | High-priority request queue size | +| `forwarder_http_protocol` | HTTP version selection (auto/http1/http2) | +| `forwarder_num_workers` | Concurrent forwarder workers | +| `forwarder_outdated_file_in_days` | Days before retry files are deleted | +| `forwarder_recovery_interval` | Backoff recovery decrease factor | +| `forwarder_recovery_reset` | Reset errors on success | +| `forwarder_retry_queue_max_size` | Retry queue max size (deprecated) | +| `forwarder_retry_queue_payloads_max_size` | Retry queue max size (bytes) | +| `forwarder_storage_max_disk_ratio` | Max disk usage ratio for retry | +| `forwarder_storage_max_size_in_bytes` | Max on-disk retry storage size | +| `forwarder_storage_path` | On-disk retry storage directory | +| `forwarder_timeout` | Forwarder HTTP request timeout | +| `histogram_aggregates` | Histogram aggregate statistics | +| `histogram_copy_to_distribution` | Copy histograms to distributions | +| `histogram_copy_to_distribution_prefix` | Prefix for hist-to-dist copies | +| `log_format_rfc3339` | Use RFC 3339 timestamps in log output | +| `log_payloads` | Debug-log decoded payload contents before encoding | +| `metric_filterlist` | Metric name blocklist | +| `metric_filterlist_match_prefix` | Blocklist uses prefix matching | +| `multi_region_failover.api_key` | API key for the failover-region endpoint | +| `multi_region_failover.dd_url` | Failover intake URL | +| `multi_region_failover.failover_metrics` | Enable metrics forwarding to failover region | +| `multi_region_failover.metric_allowlist` | Metric name allowlist for MRF forwarding | +| `multi_region_failover.site` | Datadog site for the failover region | +| `no_proxy_nonexact_match` | Domain/CIDR `no_proxy` matching | +| `observability_pipelines_worker.metrics.enabled` | Route metrics to OPW instance | +| `observability_pipelines_worker.metrics.url` | OPW metrics intake URL | +| `origin_detection_unified` | Unified origin detection mode | +| `otlp_config.logs.enabled` | otlp_config.logs.enabled | +| `otlp_config.metrics.enabled` | otlp_config.metrics.enabled | +| `otlp_config.receiver.protocols.grpc.endpoint` | otlp_config.receiver.protocols.grpc.endpoint | +| `otlp_config.receiver.protocols.grpc.max_recv_msg_size_mib` | Max OTLP inbound gRPC message size (MiB) | +| `otlp_config.receiver.protocols.grpc.transport` | otlp_config.receiver.protocols.grpc.transport | +| `otlp_config.receiver.protocols.http.endpoint` | otlp_config.receiver.protocols.http.endpoint | +| `otlp_config.traces.enabled` | otlp_config.traces.enabled | +| `otlp_config.traces.internal_port` | otlp_config.traces.internal_port | +| `otlp_config.traces.probabilistic_sampler.sampling_percentage` | OTLP trace sampling percentage | +| `provider_kind` | Provider kind static tag | +| `proxy.http` | HTTP proxy URL | +| `proxy.https` | HTTPS proxy URL | +| `proxy.no_proxy` | Hosts bypassing proxy | +| `serializer_compressor_kind` | Payload compression algorithm | +| `serializer_max_payload_size` | Max compressed payload size (generic) | +| `serializer_max_series_payload_size` | Max compressed V2 series payload size | +| `serializer_max_series_points_per_payload` | Max data points per series payload | +| `serializer_max_series_uncompressed_payload_size` | Max uncompressed V2 series payload size | +| `serializer_max_uncompressed_payload_size` | Max uncompressed payload size (generic) | +| `site` | Datadog site domain | +| `statsd_forward_port` | UDP packet forwarding destination port | +| `statsd_metric_blocklist` | List of metric names to block/drop | +| `statsd_metric_blocklist_match_prefix` | Treat blocklist entries as prefixes | +| `statsd_metric_namespace` | Prefix prepended to all metric names | +| `statsd_metric_namespace_blacklist` | Prefixes exempt from namespace | +| `syslog_rfc` | Use RFC-style syslog header | +| `syslog_uri` | Syslog destination URI | +| `use_proxy_for_cloud_metadata` | Proxy cloud metadata endpoints | +| `use_v2_api.series` | Send series via V2 protobuf endpoint | +| `vector.metrics.enabled` | Route metrics to OPW (legacy alias) | +| `vector.metrics.url` | OPW metrics intake URL (legacy alias) | +| `vsock_addr` | vsock address for Agent IPC endpoint | + + +[#178]: https://github.com/DataDog/saluki/issues/178 +[#1350]: https://github.com/DataDog/saluki/issues/1350 +[#1352]: https://github.com/DataDog/saluki/issues/1352 +[#1357]: https://github.com/DataDog/saluki/issues/1357 +[#1360]: https://github.com/DataDog/saluki/issues/1360 +[#1361]: https://github.com/DataDog/saluki/issues/1361 +[#1362]: https://github.com/DataDog/saluki/issues/1362 +[#1363]: https://github.com/DataDog/saluki/issues/1363 +[#1364]: https://github.com/DataDog/saluki/issues/1364 +[#1365]: https://github.com/DataDog/saluki/issues/1365 +[#1372]: https://github.com/DataDog/saluki/issues/1372 +[#1381]: https://github.com/DataDog/saluki/issues/1381 +[#1466]: https://github.com/DataDog/saluki/issues/1466 +[#1468]: https://github.com/DataDog/saluki/issues/1468 +[#1679]: https://github.com/DataDog/saluki/issues/1679 +[#1681]: https://github.com/DataDog/saluki/issues/1681 +[#1682]: https://github.com/DataDog/saluki/issues/1682 +[#1684]: https://github.com/DataDog/saluki/issues/1684 +[#1687]: https://github.com/DataDog/saluki/issues/1687 +[#1749]: https://github.com/DataDog/saluki/issues/1749 +[#1753]: https://github.com/DataDog/saluki/issues/1753 +[#1754]: https://github.com/DataDog/saluki/issues/1754 +[#1755]: https://github.com/DataDog/saluki/issues/1755 + diff --git a/lib/datadog-agent/config-testsupport/src/config_registry/accounting.rs b/lib/datadog-agent/config-testsupport/src/config_registry/accounting.rs new file mode 100644 index 00000000000..d052d7fc0ed --- /dev/null +++ b/lib/datadog-agent/config-testsupport/src/config_registry/accounting.rs @@ -0,0 +1,46 @@ +// @generated by build.rs from schema_overlay.yaml — DO NOT EDIT +#[allow(unused_imports)] +use super::schema; +#[allow(unused_imports)] +use super::*; + +static MEMORY_LIMIT_SCHEMA: SchemaEntry = SchemaEntry { + schema: Schema::Saluki, + yaml_path: "memory_limit", + env_vars: &[], + value_type: ValueType::String, + default: None, +}; + +static MEMORY_SLOP_FACTOR_SCHEMA: SchemaEntry = SchemaEntry { + schema: Schema::Saluki, + yaml_path: "memory_slop_factor", + env_vars: &[], + value_type: ValueType::Float, + default: Some("0.25"), +}; + +crate::declare_annotations! { + /// `memory_limit` + MEMORY_LIMIT = SalukiAnnotation { + schema: &MEMORY_LIMIT_SCHEMA, + support_level: SupportLevel::Full, + additional_yaml_paths: &[], + env_var_override: None, + used_by: &[], + value_type_override: None, + test_json: None, + pipeline_affinity: PipelineAffinity::CrossCutting, + }; + /// `memory_slop_factor` + MEMORY_SLOP_FACTOR = SalukiAnnotation { + schema: &MEMORY_SLOP_FACTOR_SCHEMA, + support_level: SupportLevel::Full, + additional_yaml_paths: &[], + env_var_override: None, + used_by: &[], + value_type_override: None, + test_json: None, + pipeline_affinity: PipelineAffinity::CrossCutting, + }; +} diff --git a/lib/saluki-components/src/config_registry/datadog/aggregate.rs b/lib/datadog-agent/config-testsupport/src/config_registry/aggregate.rs similarity index 82% rename from lib/saluki-components/src/config_registry/datadog/aggregate.rs rename to lib/datadog-agent/config-testsupport/src/config_registry/aggregate.rs index 1985d237001..8462e88c0eb 100644 --- a/lib/saluki-components/src/config_registry/datadog/aggregate.rs +++ b/lib/datadog-agent/config-testsupport/src/config_registry/aggregate.rs @@ -1,10 +1,9 @@ -//! Annotations for the aggregate transform configuration keys. -use crate::config_registry::{ - generated::schema, structs, Pipeline, PipelineAffinity, SalukiAnnotation, Schema, SchemaEntry, SupportLevel, - ValueType, -}; +// @generated by build.rs from schema_overlay.yaml — DO NOT EDIT +#[allow(unused_imports)] +use super::schema; +#[allow(unused_imports)] +use super::*; -// ADP-specific keys not present in the vendored Agent schema. static AGGREGATE_WINDOW_DURATION_SECONDS_SCHEMA: SchemaEntry = SchemaEntry { schema: Schema::Saluki, yaml_path: "aggregate_window_duration_seconds", @@ -46,7 +45,7 @@ static AGGREGATE_PASSTHROUGH_IDLE_FLUSH_TIMEOUT_SCHEMA: SchemaEntry = SchemaEntr }; crate::declare_annotations! { - /// `aggregate_window_duration`—size of each aggregation window. + /// `aggregate_window_duration_seconds` AGGREGATE_WINDOW_DURATION_SECONDS = SalukiAnnotation { schema: &AGGREGATE_WINDOW_DURATION_SECONDS_SCHEMA, support_level: SupportLevel::Full, @@ -57,8 +56,7 @@ crate::declare_annotations! { test_json: None, pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::DogStatsD, Pipeline::Checks]), }; - - /// `aggregate_flush_interval`—how often to flush aggregation buckets. + /// `aggregate_flush_interval` AGGREGATE_FLUSH_INTERVAL = SalukiAnnotation { schema: &AGGREGATE_FLUSH_INTERVAL_SCHEMA, support_level: SupportLevel::Full, @@ -69,8 +67,7 @@ crate::declare_annotations! { test_json: Some(r#"{"secs": 42, "nanos": 0}"#), pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::DogStatsD, Pipeline::Checks]), }; - - /// `aggregate_context_limit`—max distinct metric contexts per window. + /// `aggregate_context_limit` AGGREGATE_CONTEXT_LIMIT = SalukiAnnotation { schema: &AGGREGATE_CONTEXT_LIMIT_SCHEMA, support_level: SupportLevel::Full, @@ -81,9 +78,8 @@ crate::declare_annotations! { test_json: None, pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::DogStatsD, Pipeline::Checks]), }; - - /// `dogstatsd_flush_incomplete_buckets`—flush open buckets on shutdown. - AGGREGATE_FLUSH_OPEN_WINDOWS = SalukiAnnotation { + /// `dogstatsd_flush_incomplete_buckets`-Flush open buckets on shutdown + DOGSTATSD_FLUSH_INCOMPLETE_BUCKETS = SalukiAnnotation { schema: &schema::DOGSTATSD_FLUSH_INCOMPLETE_BUCKETS, support_level: SupportLevel::Full, additional_yaml_paths: &["aggregate_flush_open_windows"], @@ -93,8 +89,7 @@ crate::declare_annotations! { test_json: None, pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::DogStatsD, Pipeline::Checks]), }; - - /// `counter_expiry_seconds`—idle counter lifetime before removal. + /// `counter_expiry_seconds` COUNTER_EXPIRY_SECONDS = SalukiAnnotation { schema: &COUNTER_EXPIRY_SECONDS_SCHEMA, support_level: SupportLevel::Full, @@ -105,8 +100,7 @@ crate::declare_annotations! { test_json: None, pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::DogStatsD, Pipeline::Checks]), }; - - /// `dogstatsd_no_aggregation_pipeline`—pass through pre-timestamped metrics immediately. + /// `dogstatsd_no_aggregation_pipeline`-Enable no-agg timestamped path DOGSTATSD_NO_AGGREGATION_PIPELINE = SalukiAnnotation { schema: &schema::DOGSTATSD_NO_AGGREGATION_PIPELINE, support_level: SupportLevel::Full, @@ -117,8 +111,7 @@ crate::declare_annotations! { test_json: None, pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::DogStatsD, Pipeline::Checks]), }; - - /// `aggregate_passthrough_idle_flush_timeout`—max buffer time for passthrough metrics. + /// `aggregate_passthrough_idle_flush_timeout` AGGREGATE_PASSTHROUGH_IDLE_FLUSH_TIMEOUT = SalukiAnnotation { schema: &AGGREGATE_PASSTHROUGH_IDLE_FLUSH_TIMEOUT_SCHEMA, support_level: SupportLevel::Full, @@ -129,8 +122,7 @@ crate::declare_annotations! { test_json: Some(r#"{"secs": 42, "nanos": 0}"#), pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::DogStatsD, Pipeline::Checks]), }; - - /// `histogram_aggregates`—list of aggregates to compute for histogram metrics. + /// `histogram_aggregates`-Histogram aggregate statistics HISTOGRAM_AGGREGATES = SalukiAnnotation { schema: &schema::HISTOGRAM_AGGREGATES, support_level: SupportLevel::Full, @@ -141,8 +133,7 @@ crate::declare_annotations! { test_json: Some(r#"["count"]"#), pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::DogStatsD, Pipeline::Checks]), }; - - /// `histogram_copy_to_distribution`—also emit histograms as distributions. + /// `histogram_copy_to_distribution`-Copy histograms to distributions HISTOGRAM_COPY_TO_DISTRIBUTION = SalukiAnnotation { schema: &schema::HISTOGRAM_COPY_TO_DISTRIBUTION, support_level: SupportLevel::Full, @@ -153,8 +144,7 @@ crate::declare_annotations! { test_json: None, pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::DogStatsD, Pipeline::Checks]), }; - - /// `histogram_copy_to_distribution_prefix`—prefix for distribution copies of histograms. + /// `histogram_copy_to_distribution_prefix`-Prefix for hist-to-dist copies HISTOGRAM_COPY_TO_DISTRIBUTION_PREFIX = SalukiAnnotation { schema: &schema::HISTOGRAM_COPY_TO_DISTRIBUTION_PREFIX, support_level: SupportLevel::Full, diff --git a/lib/datadog-agent/config-testsupport/src/config_registry/annotations_index.rs b/lib/datadog-agent/config-testsupport/src/config_registry/annotations_index.rs new file mode 100644 index 00000000000..dccb11d4590 --- /dev/null +++ b/lib/datadog-agent/config-testsupport/src/config_registry/annotations_index.rs @@ -0,0 +1,61 @@ +// @generated by build.rs from schema_overlay.yaml — DO NOT EDIT +// This file is include!()'d from mod.rs — types are already in scope. + +#[allow(dead_code)] +mod schema { + #[allow(unused_imports)] + use super::*; + include!(concat!(env!("OUT_DIR"), "/config_registry/schema.rs")); +} + +mod accounting; +mod aggregate; +mod containerd; +mod data_plane; +mod dogstatsd; +mod dogstatsd_mapper; +mod dogstatsd_prefix_filter; +mod encoders; +mod forwarder; +mod get_typed; +mod mrf; +mod otlp; +mod proxy; +mod tag_filterlist; +mod trace_obfuscation; + +pub(super) mod unsupported; + +use std::sync::LazyLock; + +pub static SUPPORTED_ANNOTATIONS: LazyLock> = LazyLock::new(|| { + let mut v: Vec<&'static SalukiAnnotation> = Vec::new(); + v.extend_from_slice(accounting::ALL); + v.extend_from_slice(aggregate::ALL); + v.extend_from_slice(containerd::ALL); + v.extend_from_slice(data_plane::ALL); + v.extend_from_slice(dogstatsd::ALL); + v.extend_from_slice(dogstatsd_mapper::ALL); + v.extend_from_slice(dogstatsd_prefix_filter::ALL); + v.extend_from_slice(encoders::ALL); + v.extend_from_slice(forwarder::ALL); + v.extend_from_slice(get_typed::ALL); + v.extend_from_slice(mrf::ALL); + v.extend_from_slice(otlp::ALL); + v.extend_from_slice(proxy::ALL); + v.extend_from_slice(tag_filterlist::ALL); + v.extend_from_slice(trace_obfuscation::ALL); + v +}); + +pub static UNSUPPORTED_ANNOTATIONS: LazyLock> = LazyLock::new(|| { + let mut v: Vec<&'static SalukiAnnotation> = Vec::new(); + v.extend_from_slice(unsupported::ALL); + v +}); + +pub static ALL_ANNOTATIONS: LazyLock> = LazyLock::new(|| { + let mut v = SUPPORTED_ANNOTATIONS.clone(); + v.extend_from_slice(&UNSUPPORTED_ANNOTATIONS); + v +}); diff --git a/lib/saluki-components/src/config_registry/datadog/containerd.rs b/lib/datadog-agent/config-testsupport/src/config_registry/containerd.rs similarity index 63% rename from lib/saluki-components/src/config_registry/datadog/containerd.rs rename to lib/datadog-agent/config-testsupport/src/config_registry/containerd.rs index 7c91deef174..7ac749cc57f 100644 --- a/lib/saluki-components/src/config_registry/datadog/containerd.rs +++ b/lib/datadog-agent/config-testsupport/src/config_registry/containerd.rs @@ -1,8 +1,11 @@ -//! Annotations for ContainerdConfiguration keys. -use crate::config_registry::{generated::schema, structs, PipelineAffinity, SalukiAnnotation, SupportLevel}; +// @generated by build.rs from schema_overlay.yaml — DO NOT EDIT +#[allow(unused_imports)] +use super::schema; +#[allow(unused_imports)] +use super::*; crate::declare_annotations! { - /// `cri_connection_timeout` - CRI runtime connection timeout, in seconds. + /// `cri_connection_timeout`-CRI container runtime connection timeout (s) CRI_CONNECTION_TIMEOUT = SalukiAnnotation { schema: &schema::CRI_CONNECTION_TIMEOUT, support_level: SupportLevel::Full, @@ -11,11 +14,9 @@ crate::declare_annotations! { used_by: &[structs::CONTAINERD_CONFIGURATION], value_type_override: None, test_json: None, - // Seems like these could affect any system that needs to talk to CRI. pipeline_affinity: PipelineAffinity::CrossCutting, }; - - /// `cri_query_timeout` - CRI runtime query timeout, in seconds. + /// `cri_query_timeout`-CRI container runtime query timeout (s) CRI_QUERY_TIMEOUT = SalukiAnnotation { schema: &schema::CRI_QUERY_TIMEOUT, support_level: SupportLevel::Full, @@ -24,7 +25,6 @@ crate::declare_annotations! { used_by: &[structs::CONTAINERD_CONFIGURATION], value_type_override: None, test_json: None, - // Seems like these could affect any system that needs to talk to CRI. pipeline_affinity: PipelineAffinity::CrossCutting, }; } diff --git a/lib/datadog-agent/config-testsupport/src/config_registry/data_plane.rs b/lib/datadog-agent/config-testsupport/src/config_registry/data_plane.rs new file mode 100644 index 00000000000..5812d26e875 --- /dev/null +++ b/lib/datadog-agent/config-testsupport/src/config_registry/data_plane.rs @@ -0,0 +1,46 @@ +// @generated by build.rs from schema_overlay.yaml — DO NOT EDIT +#[allow(unused_imports)] +use super::schema; +#[allow(unused_imports)] +use super::*; + +static DATA_PLANE_REMOTE_AGENT_ENABLED_SCHEMA: SchemaEntry = SchemaEntry { + schema: Schema::Saluki, + yaml_path: "data_plane.remote_agent_enabled", + env_vars: &[], + value_type: ValueType::Bool, + default: Some("true"), +}; + +static DATA_PLANE_USE_NEW_CONFIG_STREAM_ENDPOINT_SCHEMA: SchemaEntry = SchemaEntry { + schema: Schema::Saluki, + yaml_path: "data_plane.use_new_config_stream_endpoint", + env_vars: &[], + value_type: ValueType::Bool, + default: None, +}; + +crate::declare_annotations! { + /// `data_plane.remote_agent_enabled` + DATA_PLANE_REMOTE_AGENT_ENABLED = SalukiAnnotation { + schema: &DATA_PLANE_REMOTE_AGENT_ENABLED_SCHEMA, + support_level: SupportLevel::Full, + additional_yaml_paths: &[], + env_var_override: None, + used_by: &[], + value_type_override: None, + test_json: None, + pipeline_affinity: PipelineAffinity::CrossCutting, + }; + /// `data_plane.use_new_config_stream_endpoint` + DATA_PLANE_USE_NEW_CONFIG_STREAM_ENDPOINT = SalukiAnnotation { + schema: &DATA_PLANE_USE_NEW_CONFIG_STREAM_ENDPOINT_SCHEMA, + support_level: SupportLevel::Full, + additional_yaml_paths: &[], + env_var_override: None, + used_by: &[], + value_type_override: None, + test_json: None, + pipeline_affinity: PipelineAffinity::CrossCutting, + }; +} diff --git a/lib/saluki-components/src/config_registry/datadog/dogstatsd.rs b/lib/datadog-agent/config-testsupport/src/config_registry/dogstatsd.rs similarity index 82% rename from lib/saluki-components/src/config_registry/datadog/dogstatsd.rs rename to lib/datadog-agent/config-testsupport/src/config_registry/dogstatsd.rs index ea9300b547b..08e860578f8 100644 --- a/lib/saluki-components/src/config_registry/datadog/dogstatsd.rs +++ b/lib/datadog-agent/config-testsupport/src/config_registry/dogstatsd.rs @@ -1,8 +1,8 @@ -//! Annotations for DogStatsD source configuration keys. -use crate::config_registry::{ - generated::schema, structs, Pipeline, PipelineAffinity, SalukiAnnotation, Schema, SchemaEntry, SupportLevel, - ValueType, -}; +// @generated by build.rs from schema_overlay.yaml — DO NOT EDIT +#[allow(unused_imports)] +use super::schema; +#[allow(unused_imports)] +use super::*; static DOGSTATSD_ALLOW_CONTEXT_HEAP_ALLOCS_SCHEMA: SchemaEntry = SchemaEntry { schema: Schema::Saluki, @@ -77,9 +77,7 @@ static DOGSTATSD_TCP_PORT_SCHEMA: SchemaEntry = SchemaEntry { }; crate::declare_annotations! { - // ── Schema-based ────────────────────────────────────────────────────────── - - /// `bind_host`—host address to bind UDP/TCP listeners to. + /// `bind_host`-Global listen host fallback BIND_HOST = SalukiAnnotation { schema: &schema::BIND_HOST, support_level: SupportLevel::Full, @@ -90,8 +88,7 @@ crate::declare_annotations! { test_json: None, pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::DogStatsD]), }; - - /// `dogstatsd_buffer_size`—receive buffer size in bytes. Schema says Float; field is usize. + /// `dogstatsd_buffer_size`-Receive buffer size (bytes) DOGSTATSD_BUFFER_SIZE = SalukiAnnotation { schema: &schema::DOGSTATSD_BUFFER_SIZE, support_level: SupportLevel::Full, @@ -102,8 +99,7 @@ crate::declare_annotations! { test_json: None, pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::DogStatsD]), }; - - /// `dogstatsd_capture_depth` - traffic capture channel depth. + /// `dogstatsd_capture_depth`-Traffic capture channel depth DOGSTATSD_CAPTURE_DEPTH = SalukiAnnotation { schema: &schema::DOGSTATSD_CAPTURE_DEPTH, support_level: SupportLevel::Full, @@ -114,8 +110,7 @@ crate::declare_annotations! { test_json: None, pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::DogStatsD]), }; - - /// `dogstatsd_capture_path` - traffic capture file location. + /// `dogstatsd_capture_path`-Traffic capture file location DOGSTATSD_CAPTURE_PATH = SalukiAnnotation { schema: &schema::DOGSTATSD_CAPTURE_PATH, support_level: SupportLevel::Full, @@ -126,8 +121,7 @@ crate::declare_annotations! { test_json: None, pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::DogStatsD]), }; - - /// `dogstatsd_context_expiry_seconds` - context cache TTL. + /// `dogstatsd_context_expiry_seconds`-Context cache TTL (seconds) DOGSTATSD_CONTEXT_EXPIRY_SECONDS = SalukiAnnotation { schema: &schema::DOGSTATSD_CONTEXT_EXPIRY_SECONDS, support_level: SupportLevel::Full, @@ -138,8 +132,7 @@ crate::declare_annotations! { test_json: None, pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::DogStatsD]), }; - - /// `dogstatsd_entity_id_precedence`—client entity ID takes precedence over UDS origin. + /// `dogstatsd_entity_id_precedence`-Entity ID over auto-detection DOGSTATSD_ENTITY_ID_PRECEDENCE = SalukiAnnotation { schema: &schema::DOGSTATSD_ENTITY_ID_PRECEDENCE, support_level: SupportLevel::Full, @@ -150,8 +143,7 @@ crate::declare_annotations! { test_json: None, pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::DogStatsD]), }; - - /// `dogstatsd_eol_required`—require newline-terminated messages for selected listener types. + /// `dogstatsd_eol_required`-Require newline-terminated messages DOGSTATSD_EOL_REQUIRED = SalukiAnnotation { schema: &schema::DOGSTATSD_EOL_REQUIRED, support_level: SupportLevel::Full, @@ -162,8 +154,7 @@ crate::declare_annotations! { test_json: Some(r#"["udp"]"#), pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::DogStatsD]), }; - - /// `dogstatsd_non_local_traffic`—accept packets from non-localhost addresses. + /// `dogstatsd_non_local_traffic`-Accept non-localhost UDP/TCP DOGSTATSD_NON_LOCAL_TRAFFIC = SalukiAnnotation { schema: &schema::DOGSTATSD_NON_LOCAL_TRAFFIC, support_level: SupportLevel::Full, @@ -174,8 +165,7 @@ crate::declare_annotations! { test_json: None, pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::DogStatsD]), }; - - /// `dogstatsd_origin_detection`—enable UDS-based origin detection. + /// `dogstatsd_origin_detection`-Enable UDS origin detection DOGSTATSD_ORIGIN_DETECTION = SalukiAnnotation { schema: &schema::DOGSTATSD_ORIGIN_DETECTION, support_level: SupportLevel::Full, @@ -186,8 +176,7 @@ crate::declare_annotations! { test_json: None, pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::DogStatsD]), }; - - /// `dogstatsd_origin_detection_client`—enable container enrichment fields. + /// `dogstatsd_origin_detection_client`-Honor client origin proto fields DOGSTATSD_ORIGIN_DETECTION_CLIENT = SalukiAnnotation { schema: &schema::DOGSTATSD_ORIGIN_DETECTION_CLIENT, support_level: SupportLevel::Full, @@ -198,8 +187,7 @@ crate::declare_annotations! { test_json: None, pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::DogStatsD]), }; - - /// `dogstatsd_origin_optout_enabled`—skip enrichment when cardinality=none. + /// `dogstatsd_origin_optout_enabled`-Allow clients to opt out origin DOGSTATSD_ORIGIN_OPTOUT_ENABLED = SalukiAnnotation { schema: &schema::DOGSTATSD_ORIGIN_OPTOUT_ENABLED, support_level: SupportLevel::Full, @@ -210,8 +198,7 @@ crate::declare_annotations! { test_json: None, pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::DogStatsD]), }; - - /// `dogstatsd_port`—UDP port. Schema says Float; field is u16. + /// `dogstatsd_port`-UDP listen port DOGSTATSD_PORT = SalukiAnnotation { schema: &schema::DOGSTATSD_PORT, support_level: SupportLevel::Full, @@ -222,8 +209,7 @@ crate::declare_annotations! { test_json: None, pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::DogStatsD]), }; - - /// `dogstatsd_socket`—UDS datagram socket path. + /// `dogstatsd_socket`-UDS datagram socket path DOGSTATSD_SOCKET = SalukiAnnotation { schema: &schema::DOGSTATSD_SOCKET, support_level: SupportLevel::Full, @@ -234,8 +220,7 @@ crate::declare_annotations! { test_json: None, pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::DogStatsD]), }; - - /// `dogstatsd_so_rcvbuf`—DogStatsD UDP/UDS socket receive buffer size. Schema Float; field usize. + /// `dogstatsd_so_rcvbuf`-Socket receive buffer size DOGSTATSD_SO_RCVBUF = SalukiAnnotation { schema: &schema::DOGSTATSD_SO_RCVBUF, support_level: SupportLevel::Full, @@ -246,8 +231,7 @@ crate::declare_annotations! { test_json: None, pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::DogStatsD]), }; - - /// `dogstatsd_stream_socket`—UDS stream socket path. + /// `dogstatsd_stream_socket`-UDS stream socket path DOGSTATSD_STREAM_SOCKET = SalukiAnnotation { schema: &schema::DOGSTATSD_STREAM_SOCKET, support_level: SupportLevel::Full, @@ -258,8 +242,7 @@ crate::declare_annotations! { test_json: None, pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::DogStatsD]), }; - - /// `dogstatsd_stream_log_too_big`—log oversized UDS stream frames. + /// `dogstatsd_stream_log_too_big`-Log oversized UDS stream frames DOGSTATSD_STREAM_LOG_TOO_BIG = SalukiAnnotation { schema: &schema::DOGSTATSD_STREAM_LOG_TOO_BIG, support_level: SupportLevel::Full, @@ -270,11 +253,10 @@ crate::declare_annotations! { test_json: None, pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::DogStatsD]), }; - - /// `statsd_forward_host`—host for DogStatsD message forwarding. + /// `statsd_forward_host`-UDP packet forwarding destination host STATSD_FORWARD_HOST = SalukiAnnotation { schema: &schema::STATSD_FORWARD_HOST, - support_level: SupportLevel::Full, + support_level: SupportLevel::Partial, additional_yaml_paths: &[], env_var_override: None, used_by: &[structs::DOGSTATSD_CONFIGURATION], @@ -282,8 +264,7 @@ crate::declare_annotations! { test_json: Some(r#""127.0.0.1""#), pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::DogStatsD]), }; - - /// `statsd_forward_port`—port for DogStatsD message forwarding. + /// `statsd_forward_port`-UDP packet forwarding destination port STATSD_FORWARD_PORT = SalukiAnnotation { schema: &schema::STATSD_FORWARD_PORT, support_level: SupportLevel::Full, @@ -294,8 +275,7 @@ crate::declare_annotations! { test_json: Some("9125"), pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::DogStatsD]), }; - - /// `dogstatsd_string_interner_size`—context interner entry count. Schema Float; field u64. + /// `dogstatsd_string_interner_size`-String interner capacity DOGSTATSD_STRING_INTERNER_SIZE = SalukiAnnotation { schema: &schema::DOGSTATSD_STRING_INTERNER_SIZE, support_level: SupportLevel::Full, @@ -306,9 +286,7 @@ crate::declare_annotations! { test_json: None, pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::DogStatsD]), }; - - /// `dogstatsd_tag_cardinality`—default tag cardinality for origin enrichment. - /// Default is "Low"; inject "high" as test value to differ from default. + /// `dogstatsd_tag_cardinality`-Default tag cardinality level DOGSTATSD_TAG_CARDINALITY = SalukiAnnotation { schema: &schema::DOGSTATSD_TAG_CARDINALITY, support_level: SupportLevel::Full, @@ -319,8 +297,7 @@ crate::declare_annotations! { test_json: Some(r#""high""#), pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::DogStatsD]), }; - - /// `dogstatsd_tags`—additional tags applied to all ingested metrics. + /// `dogstatsd_tags`-Extra tags added to all DSD data DOGSTATSD_TAGS = SalukiAnnotation { schema: &schema::DOGSTATSD_TAGS, support_level: SupportLevel::Full, @@ -331,8 +308,7 @@ crate::declare_annotations! { test_json: None, pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::DogStatsD]), }; - - /// `provider_kind`—appended as a static tag (`provider_kind:`) to all DogStatsD metrics. + /// `provider_kind`-Provider kind static tag PROVIDER_KIND = SalukiAnnotation { schema: &schema::PROVIDER_KIND, support_level: SupportLevel::Full, @@ -343,8 +319,7 @@ crate::declare_annotations! { test_json: None, pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::DogStatsD]), }; - - /// `origin_detection_unified`—use unified entity ID resolution for origin enrichment. + /// `origin_detection_unified`-Unified origin detection mode ORIGIN_DETECTION_UNIFIED = SalukiAnnotation { schema: &schema::ORIGIN_DETECTION_UNIFIED, support_level: SupportLevel::Full, @@ -355,8 +330,7 @@ crate::declare_annotations! { test_json: None, pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::DogStatsD]), }; - - /// `dogstatsd_log_file`—path to the DogStatsD metric debug log file. + /// `dogstatsd_log_file`-DSD dedicated log file path DOGSTATSD_LOG_FILE = SalukiAnnotation { schema: &schema::DOGSTATSD_LOG_FILE, support_level: SupportLevel::Full, @@ -367,8 +341,7 @@ crate::declare_annotations! { test_json: None, pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::DogStatsD]), }; - - /// `dogstatsd_log_file_max_rolls`—number of rotated debug log files to keep. Schema Float; field usize. + /// `dogstatsd_log_file_max_rolls`-DSD log file max roll count DOGSTATSD_LOG_FILE_MAX_ROLLS = SalukiAnnotation { schema: &schema::DOGSTATSD_LOG_FILE_MAX_ROLLS, support_level: SupportLevel::Full, @@ -379,8 +352,7 @@ crate::declare_annotations! { test_json: None, pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::DogStatsD]), }; - - /// `dogstatsd_log_file_max_size`—max active debug log file size before rotation. + /// `dogstatsd_log_file_max_size`-DSD log file max size DOGSTATSD_LOG_FILE_MAX_SIZE = SalukiAnnotation { schema: &schema::DOGSTATSD_LOG_FILE_MAX_SIZE, support_level: SupportLevel::Full, @@ -391,8 +363,7 @@ crate::declare_annotations! { test_json: Some(r#""42MB""#), pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::DogStatsD]), }; - - /// `dogstatsd_logging_enabled`—enable writing DogStatsD metric debug stats to a file. + /// `dogstatsd_logging_enabled`-Enables DSD metric logging DOGSTATSD_LOGGING_ENABLED = SalukiAnnotation { schema: &schema::DOGSTATSD_LOGGING_ENABLED, support_level: SupportLevel::Full, @@ -403,8 +374,7 @@ crate::declare_annotations! { test_json: None, pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::DogStatsD]), }; - - /// `dogstatsd_metrics_stats_enable`—enable metric-level DogStatsD debug statistics. + /// `dogstatsd_metrics_stats_enable`-Enable per-metric debug stats DOGSTATSD_METRICS_STATS_ENABLE = SalukiAnnotation { schema: &schema::DOGSTATSD_METRICS_STATS_ENABLE, support_level: SupportLevel::Partial, @@ -415,10 +385,7 @@ crate::declare_annotations! { test_json: None, pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::DogStatsD]), }; - - // ── ADP-specific ────────────────────────────────────────────────────────── - - /// `dogstatsd_allow_context_heap_allocs`—allow heap allocations when interner is full. + /// `dogstatsd_allow_context_heap_allocs` DOGSTATSD_ALLOW_CONTEXT_HEAP_ALLOCS = SalukiAnnotation { schema: &DOGSTATSD_ALLOW_CONTEXT_HEAP_ALLOCS_SCHEMA, support_level: SupportLevel::Full, @@ -429,8 +396,7 @@ crate::declare_annotations! { test_json: None, pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::DogStatsD]), }; - - /// `dogstatsd_autoscale_udp_listeners`—bind multiple UDP sockets with SO_REUSEPORT for kernel load balancing. + /// `dogstatsd_autoscale_udp_listeners` DOGSTATSD_AUTOSCALE_UDP_LISTENERS = SalukiAnnotation { schema: &DOGSTATSD_AUTOSCALE_UDP_LISTENERS_SCHEMA, support_level: SupportLevel::Full, @@ -441,8 +407,7 @@ crate::declare_annotations! { test_json: None, pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::DogStatsD]), }; - - /// `dogstatsd_buffer_count`—number of message buffers to pre-allocate. + /// `dogstatsd_buffer_count` DOGSTATSD_BUFFER_COUNT = SalukiAnnotation { schema: &DOGSTATSD_BUFFER_COUNT_SCHEMA, support_level: SupportLevel::Full, @@ -453,8 +418,7 @@ crate::declare_annotations! { test_json: None, pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::DogStatsD]), }; - - /// `dogstatsd_cached_contexts_limit`—max cached metric contexts. + /// `dogstatsd_cached_contexts_limit` DOGSTATSD_CACHED_CONTEXTS_LIMIT = SalukiAnnotation { schema: &DOGSTATSD_CACHED_CONTEXTS_LIMIT_SCHEMA, support_level: SupportLevel::Full, @@ -465,8 +429,7 @@ crate::declare_annotations! { test_json: None, pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::DogStatsD]), }; - - /// `dogstatsd_cached_tagsets_limit`—max cached tag sets. + /// `dogstatsd_cached_tagsets_limit` DOGSTATSD_CACHED_TAGSETS_LIMIT = SalukiAnnotation { schema: &DOGSTATSD_CACHED_TAGSETS_LIMIT_SCHEMA, support_level: SupportLevel::Full, @@ -477,8 +440,7 @@ crate::declare_annotations! { test_json: None, pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::DogStatsD]), }; - - /// `dogstatsd_minimum_sample_rate`—minimum allowed sample rate. + /// `dogstatsd_minimum_sample_rate` DOGSTATSD_MINIMUM_SAMPLE_RATE = SalukiAnnotation { schema: &DOGSTATSD_MINIMUM_SAMPLE_RATE_SCHEMA, support_level: SupportLevel::Full, @@ -489,8 +451,7 @@ crate::declare_annotations! { test_json: None, pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::DogStatsD]), }; - - /// `dogstatsd_permissive_decoding`—relax decoding strictness for Agent `compat`. + /// `dogstatsd_permissive_decoding` DOGSTATSD_PERMISSIVE_DECODING = SalukiAnnotation { schema: &DOGSTATSD_PERMISSIVE_DECODING_SCHEMA, support_level: SupportLevel::Full, @@ -501,8 +462,7 @@ crate::declare_annotations! { test_json: None, pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::DogStatsD]), }; - - /// `dogstatsd_string_interner_size_bytes`—explicit interner byte budget (overrides entry count). + /// `dogstatsd_string_interner_size_bytes` DOGSTATSD_STRING_INTERNER_SIZE_BYTES = SalukiAnnotation { schema: &DOGSTATSD_STRING_INTERNER_SIZE_BYTES_SCHEMA, support_level: SupportLevel::Full, @@ -513,8 +473,7 @@ crate::declare_annotations! { test_json: None, pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::DogStatsD]), }; - - /// `dogstatsd_tcp_port`—TCP port (0 = disabled). + /// `dogstatsd_tcp_port` DOGSTATSD_TCP_PORT = SalukiAnnotation { schema: &DOGSTATSD_TCP_PORT_SCHEMA, support_level: SupportLevel::Full, @@ -525,8 +484,7 @@ crate::declare_annotations! { test_json: None, pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::DogStatsD]), }; - - /// `enable_payloads.events`—forward event payloads. + /// `enable_payloads.events`-Allow sending event payloads ENABLE_PAYLOADS_EVENTS = SalukiAnnotation { schema: &schema::ENABLE_PAYLOADS_EVENTS, support_level: SupportLevel::Full, @@ -537,8 +495,7 @@ crate::declare_annotations! { test_json: None, pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::DogStatsD]), }; - - /// `enable_payloads.series`—forward series (counter/gauge/rate) payloads. + /// `enable_payloads.series`-Allow sending series payloads ENABLE_PAYLOADS_SERIES = SalukiAnnotation { schema: &schema::ENABLE_PAYLOADS_SERIES, support_level: SupportLevel::Full, @@ -549,8 +506,7 @@ crate::declare_annotations! { test_json: None, pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::DogStatsD]), }; - - /// `enable_payloads.service_checks`—forward service check payloads. + /// `enable_payloads.service_checks`-Allow sending service check payloads ENABLE_PAYLOADS_SERVICE_CHECKS = SalukiAnnotation { schema: &schema::ENABLE_PAYLOADS_SERVICE_CHECKS, support_level: SupportLevel::Full, @@ -561,8 +517,7 @@ crate::declare_annotations! { test_json: None, pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::DogStatsD]), }; - - /// `enable_payloads.sketches`—forward sketch (distribution) payloads. + /// `enable_payloads.sketches`-Allow sending sketch payloads ENABLE_PAYLOADS_SKETCHES = SalukiAnnotation { schema: &schema::ENABLE_PAYLOADS_SKETCHES, support_level: SupportLevel::Full, diff --git a/lib/saluki-components/src/config_registry/datadog/dogstatsd_mapper.rs b/lib/datadog-agent/config-testsupport/src/config_registry/dogstatsd_mapper.rs similarity index 66% rename from lib/saluki-components/src/config_registry/datadog/dogstatsd_mapper.rs rename to lib/datadog-agent/config-testsupport/src/config_registry/dogstatsd_mapper.rs index c2ccbcee482..34d52d96409 100644 --- a/lib/saluki-components/src/config_registry/datadog/dogstatsd_mapper.rs +++ b/lib/datadog-agent/config-testsupport/src/config_registry/dogstatsd_mapper.rs @@ -1,10 +1,9 @@ -//! Annotations for DogStatsD mapper transform configuration keys. -use crate::config_registry::{ - generated::schema, structs, Pipeline, PipelineAffinity, SalukiAnnotation, Schema, SchemaEntry, SupportLevel, - ValueType, -}; +// @generated by build.rs from schema_overlay.yaml — DO NOT EDIT +#[allow(unused_imports)] +use super::schema; +#[allow(unused_imports)] +use super::*; -// ADP-specific keys not present in the vendored Agent schema. static DOGSTATSD_MAPPER_STRING_INTERNER_SIZE_SCHEMA: SchemaEntry = SchemaEntry { schema: Schema::Saluki, yaml_path: "dogstatsd_mapper_string_interner_size", @@ -14,11 +13,10 @@ static DOGSTATSD_MAPPER_STRING_INTERNER_SIZE_SCHEMA: SchemaEntry = SchemaEntry { }; crate::declare_annotations! { - /// `dogstatsd_mapper_cache_size`—per-name result cache capacity for the mapper transform. - /// Schema Float; field usize. + /// `dogstatsd_mapper_cache_size`-Mapper result LRU cache size DOGSTATSD_MAPPER_CACHE_SIZE = SalukiAnnotation { schema: &schema::DOGSTATSD_MAPPER_CACHE_SIZE, - support_level: SupportLevel::Full, + support_level: SupportLevel::Partial, additional_yaml_paths: &[], env_var_override: None, used_by: &[structs::DOGSTATSD_MAPPER_CONFIGURATION], @@ -26,9 +24,7 @@ crate::declare_annotations! { test_json: None, pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::DogStatsD]), }; - - /// `dogstatsd_mapper_profiles`—JSON-encoded list of DogStatsD metric mapping profiles. - /// Uses a custom test value since the generic String test value isn't valid mapper JSON. + /// `dogstatsd_mapper_profiles`-Metric mapping profile definitions DOGSTATSD_MAPPER_PROFILES = SalukiAnnotation { schema: &schema::DOGSTATSD_MAPPER_PROFILES, support_level: SupportLevel::Full, @@ -39,9 +35,7 @@ crate::declare_annotations! { test_json: Some(r#"[{"name":"test","prefix":"test.","mappings":[]}]"#), pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::DogStatsD]), }; - - /// `dogstatsd_mapper_string_interner_size`—interner byte budget for the mapper transform. - /// ADP-specific key, not in the Agent schema. + /// `dogstatsd_mapper_string_interner_size` DOGSTATSD_MAPPER_STRING_INTERNER_SIZE = SalukiAnnotation { schema: &DOGSTATSD_MAPPER_STRING_INTERNER_SIZE_SCHEMA, support_level: SupportLevel::Full, diff --git a/lib/saluki-components/src/config_registry/datadog/dogstatsd_prefix_filter.rs b/lib/datadog-agent/config-testsupport/src/config_registry/dogstatsd_prefix_filter.rs similarity index 76% rename from lib/saluki-components/src/config_registry/datadog/dogstatsd_prefix_filter.rs rename to lib/datadog-agent/config-testsupport/src/config_registry/dogstatsd_prefix_filter.rs index d2b11e19da0..7d012571ad4 100644 --- a/lib/saluki-components/src/config_registry/datadog/dogstatsd_prefix_filter.rs +++ b/lib/datadog-agent/config-testsupport/src/config_registry/dogstatsd_prefix_filter.rs @@ -1,8 +1,11 @@ -//! Annotations for DogStatsD prefix filter transform configuration keys. -use crate::config_registry::{generated::schema, structs, Pipeline, PipelineAffinity, SalukiAnnotation, SupportLevel}; +// @generated by build.rs from schema_overlay.yaml — DO NOT EDIT +#[allow(unused_imports)] +use super::schema; +#[allow(unused_imports)] +use super::*; crate::declare_annotations! { - /// `metric_filterlist`—explicit list of metric names to allow through the filter. + /// `metric_filterlist`-Metric name blocklist METRIC_FILTERLIST = SalukiAnnotation { schema: &schema::METRIC_FILTERLIST, support_level: SupportLevel::Full, @@ -13,8 +16,7 @@ crate::declare_annotations! { test_json: None, pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::DogStatsD]), }; - - /// `metric_filterlist_match_prefix`—whether filterlist entries match as prefixes. + /// `metric_filterlist_match_prefix`-Blocklist uses prefix matching METRIC_FILTERLIST_MATCH_PREFIX = SalukiAnnotation { schema: &schema::METRIC_FILTERLIST_MATCH_PREFIX, support_level: SupportLevel::Full, @@ -25,8 +27,7 @@ crate::declare_annotations! { test_json: None, pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::DogStatsD]), }; - - /// `statsd_metric_blocklist`—metric names to block. + /// `statsd_metric_blocklist`-List of metric names to block/drop STATSD_METRIC_BLOCKLIST = SalukiAnnotation { schema: &schema::STATSD_METRIC_BLOCKLIST, support_level: SupportLevel::Full, @@ -37,8 +38,7 @@ crate::declare_annotations! { test_json: None, pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::DogStatsD]), }; - - /// `statsd_metric_blocklist_match_prefix`—whether blocklist entries match as prefixes. + /// `statsd_metric_blocklist_match_prefix`-Treat blocklist entries as prefixes STATSD_METRIC_BLOCKLIST_MATCH_PREFIX = SalukiAnnotation { schema: &schema::STATSD_METRIC_BLOCKLIST_MATCH_PREFIX, support_level: SupportLevel::Full, @@ -49,8 +49,7 @@ crate::declare_annotations! { test_json: None, pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::DogStatsD]), }; - - /// `statsd_metric_namespace`—prefix to prepend to every metric name. + /// `statsd_metric_namespace`-Prefix prepended to all metric names STATSD_METRIC_NAMESPACE = SalukiAnnotation { schema: &schema::STATSD_METRIC_NAMESPACE, support_level: SupportLevel::Full, @@ -61,9 +60,8 @@ crate::declare_annotations! { test_json: None, pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::DogStatsD]), }; - - /// `statsd_metric_namespace_blacklist` / `statsd_metric_namespace_blocklist`—namespace prefixes to block from forwarding. - STATSD_METRIC_NAMESPACE_BLOCKLIST = SalukiAnnotation { + /// `statsd_metric_namespace_blacklist`-Prefixes exempt from namespace + STATSD_METRIC_NAMESPACE_BLACKLIST = SalukiAnnotation { schema: &schema::STATSD_METRIC_NAMESPACE_BLACKLIST, support_level: SupportLevel::Full, additional_yaml_paths: &["statsd_metric_namespace_blocklist"], diff --git a/lib/saluki-components/src/config_registry/datadog/encoders.rs b/lib/datadog-agent/config-testsupport/src/config_registry/encoders.rs similarity index 64% rename from lib/saluki-components/src/config_registry/datadog/encoders.rs rename to lib/datadog-agent/config-testsupport/src/config_registry/encoders.rs index 4b3834c2e27..cc408a70356 100644 --- a/lib/saluki-components/src/config_registry/datadog/encoders.rs +++ b/lib/datadog-agent/config-testsupport/src/config_registry/encoders.rs @@ -1,8 +1,8 @@ -//! Annotations for shared Datadog encoder configuration keys. -use crate::config_registry::{ - generated::schema, structs, Pipeline, PipelineAffinity, SalukiAnnotation, Schema, SchemaEntry, SupportLevel, - ValueType, -}; +// @generated by build.rs from schema_overlay.yaml — DO NOT EDIT +#[allow(unused_imports)] +use super::schema; +#[allow(unused_imports)] +use super::*; static FLUSH_TIMEOUT_SECS_SCHEMA: SchemaEntry = SchemaEntry { schema: Schema::Saluki, @@ -21,60 +21,40 @@ static SERIALIZER_MAX_METRICS_PER_PAYLOAD_SCHEMA: SchemaEntry = SchemaEntry { }; crate::declare_annotations! { - /// `serializer_compressor_kind`—compression algorithm for encoder request payloads. + /// `serializer_compressor_kind`-Payload compression algorithm SERIALIZER_COMPRESSOR_KIND = SalukiAnnotation { schema: &schema::SERIALIZER_COMPRESSOR_KIND, support_level: SupportLevel::Full, additional_yaml_paths: &[], env_var_override: None, - used_by: &[ - structs::DATADOG_EVENTS_CONFIGURATION, - structs::DATADOG_LOGS_CONFIGURATION, - structs::DATADOG_METRICS_CONFIGURATION, - structs::DATADOG_SERVICE_CHECKS_CONFIGURATION, - structs::DATADOG_TRACE_CONFIGURATION, - ], + used_by: &[structs::DATADOG_EVENTS_CONFIGURATION, structs::DATADOG_LOGS_CONFIGURATION, structs::DATADOG_METRICS_CONFIGURATION, structs::DATADOG_SERVICE_CHECKS_CONFIGURATION, structs::DATADOG_TRACE_CONFIGURATION], value_type_override: None, test_json: None, pipeline_affinity: PipelineAffinity::CrossCutting, }; - - /// `serializer_zstd_compressor_level`—zstd compression level for encoder request payloads. - /// Schema declares Float; field is i32. + /// `serializer_zstd_compressor_level`-Zstd compression level SERIALIZER_ZSTD_COMPRESSOR_LEVEL = SalukiAnnotation { schema: &schema::SERIALIZER_ZSTD_COMPRESSOR_LEVEL, - support_level: SupportLevel::Full, + support_level: SupportLevel::Partial, additional_yaml_paths: &[], env_var_override: None, - used_by: &[ - structs::DATADOG_EVENTS_CONFIGURATION, - structs::DATADOG_LOGS_CONFIGURATION, - structs::DATADOG_METRICS_CONFIGURATION, - structs::DATADOG_SERVICE_CHECKS_CONFIGURATION, - structs::DATADOG_TRACE_CONFIGURATION, - ], + used_by: &[structs::DATADOG_EVENTS_CONFIGURATION, structs::DATADOG_LOGS_CONFIGURATION, structs::DATADOG_METRICS_CONFIGURATION, structs::DATADOG_SERVICE_CHECKS_CONFIGURATION, structs::DATADOG_TRACE_CONFIGURATION], value_type_override: Some(ValueType::Integer), test_json: None, pipeline_affinity: PipelineAffinity::CrossCutting, }; - - /// `flush_timeout_secs`—how long to wait before force-flushing an in-flight payload. ADP-specific. + /// `flush_timeout_secs` FLUSH_TIMEOUT_SECS = SalukiAnnotation { schema: &FLUSH_TIMEOUT_SECS_SCHEMA, support_level: SupportLevel::Full, additional_yaml_paths: &[], env_var_override: None, - used_by: &[ - structs::DATADOG_APM_STATS_ENCODER_CONFIGURATION, - structs::DATADOG_METRICS_CONFIGURATION, - structs::DATADOG_TRACE_CONFIGURATION, - ], + used_by: &[structs::DATADOG_APM_STATS_ENCODER_CONFIGURATION, structs::DATADOG_METRICS_CONFIGURATION, structs::DATADOG_TRACE_CONFIGURATION], value_type_override: None, test_json: None, pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::Checks, Pipeline::Traces, Pipeline::DogStatsD]), }; - - /// `serializer_max_metrics_per_payload`—max metrics per encoded request payload. ADP-specific. + /// `serializer_max_metrics_per_payload` SERIALIZER_MAX_METRICS_PER_PAYLOAD = SalukiAnnotation { schema: &SERIALIZER_MAX_METRICS_PER_PAYLOAD_SCHEMA, support_level: SupportLevel::Full, @@ -85,56 +65,40 @@ crate::declare_annotations! { test_json: None, pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::Checks, Pipeline::DogStatsD]), }; - - /// `log_payloads`—debug-log decoded metric, event, and service check payload contents before encoding. + /// `log_payloads`-Debug-log decoded payload contents before encoding LOG_PAYLOADS = SalukiAnnotation { schema: &schema::LOG_PAYLOADS, support_level: SupportLevel::Full, additional_yaml_paths: &[], env_var_override: None, - used_by: &[ - structs::DATADOG_EVENTS_CONFIGURATION, - structs::DATADOG_METRICS_CONFIGURATION, - structs::DATADOG_SERVICE_CHECKS_CONFIGURATION, - ], + used_by: &[structs::DATADOG_EVENTS_CONFIGURATION, structs::DATADOG_METRICS_CONFIGURATION, structs::DATADOG_SERVICE_CHECKS_CONFIGURATION], value_type_override: None, test_json: None, pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::Checks, Pipeline::DogStatsD, Pipeline::Traces]), }; - - /// `serializer_max_payload_size`—max compressed generic payload size. + /// `serializer_max_payload_size`-Max compressed payload size (generic) SERIALIZER_MAX_PAYLOAD_SIZE = SalukiAnnotation { schema: &schema::SERIALIZER_MAX_PAYLOAD_SIZE, support_level: SupportLevel::Full, additional_yaml_paths: &[], env_var_override: None, - used_by: &[ - structs::DATADOG_EVENTS_CONFIGURATION, - structs::DATADOG_METRICS_CONFIGURATION, - structs::DATADOG_SERVICE_CHECKS_CONFIGURATION, - ], + used_by: &[structs::DATADOG_EVENTS_CONFIGURATION, structs::DATADOG_METRICS_CONFIGURATION, structs::DATADOG_SERVICE_CHECKS_CONFIGURATION], value_type_override: Some(ValueType::Integer), test_json: None, pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::Checks, Pipeline::DogStatsD]), }; - - /// `serializer_max_uncompressed_payload_size`—max uncompressed generic payload size. + /// `serializer_max_uncompressed_payload_size`-Max uncompressed payload size (generic) SERIALIZER_MAX_UNCOMPRESSED_PAYLOAD_SIZE = SalukiAnnotation { schema: &schema::SERIALIZER_MAX_UNCOMPRESSED_PAYLOAD_SIZE, support_level: SupportLevel::Full, additional_yaml_paths: &[], env_var_override: None, - used_by: &[ - structs::DATADOG_EVENTS_CONFIGURATION, - structs::DATADOG_METRICS_CONFIGURATION, - structs::DATADOG_SERVICE_CHECKS_CONFIGURATION, - ], + used_by: &[structs::DATADOG_EVENTS_CONFIGURATION, structs::DATADOG_METRICS_CONFIGURATION, structs::DATADOG_SERVICE_CHECKS_CONFIGURATION], value_type_override: Some(ValueType::Integer), test_json: None, pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::Checks, Pipeline::DogStatsD]), }; - - /// `serializer_max_series_payload_size`—max compressed V2 series payload size. + /// `serializer_max_series_payload_size`-Max compressed V2 series payload size SERIALIZER_MAX_SERIES_PAYLOAD_SIZE = SalukiAnnotation { schema: &schema::SERIALIZER_MAX_SERIES_PAYLOAD_SIZE, support_level: SupportLevel::Full, @@ -145,8 +109,7 @@ crate::declare_annotations! { test_json: None, pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::Checks, Pipeline::DogStatsD]), }; - - /// `serializer_max_series_uncompressed_payload_size`—max uncompressed V2 series payload size. + /// `serializer_max_series_uncompressed_payload_size`-Max uncompressed V2 series payload size SERIALIZER_MAX_SERIES_UNCOMPRESSED_PAYLOAD_SIZE = SalukiAnnotation { schema: &schema::SERIALIZER_MAX_SERIES_UNCOMPRESSED_PAYLOAD_SIZE, support_level: SupportLevel::Full, @@ -157,8 +120,7 @@ crate::declare_annotations! { test_json: None, pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::Checks, Pipeline::DogStatsD]), }; - - /// `serializer_max_series_points_per_payload`—max data points across all series in a single series request payload. + /// `serializer_max_series_points_per_payload`-Max data points per series payload SERIALIZER_MAX_SERIES_POINTS_PER_PAYLOAD = SalukiAnnotation { schema: &schema::SERIALIZER_MAX_SERIES_POINTS_PER_PAYLOAD, support_level: SupportLevel::Full, @@ -169,8 +131,7 @@ crate::declare_annotations! { test_json: None, pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::Checks, Pipeline::DogStatsD]), }; - - /// `use_v2_api.series`—when `false`, send series metrics to the legacy V1 JSON intake at `/api/v1/series`. + /// `use_v2_api.series`-Send series via V2 protobuf endpoint USE_V2_API_SERIES = SalukiAnnotation { schema: &schema::USE_V2_API_SERIES, support_level: SupportLevel::Full, @@ -181,17 +142,13 @@ crate::declare_annotations! { test_json: None, pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::Checks, Pipeline::DogStatsD]), }; - - /// `env`—the environment name attached to all emitted telemetry. + /// `env`-Agent environment name ENV = SalukiAnnotation { schema: &schema::ENV, support_level: SupportLevel::Full, additional_yaml_paths: &[], env_var_override: None, - used_by: &[ - structs::DATADOG_APM_STATS_ENCODER_CONFIGURATION, - structs::DATADOG_TRACE_CONFIGURATION, - ], + used_by: &[structs::DATADOG_APM_STATS_ENCODER_CONFIGURATION, structs::DATADOG_TRACE_CONFIGURATION], value_type_override: None, test_json: None, pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::Traces]), diff --git a/lib/saluki-components/src/config_registry/datadog/forwarder.rs b/lib/datadog-agent/config-testsupport/src/config_registry/forwarder.rs similarity index 76% rename from lib/saluki-components/src/config_registry/datadog/forwarder.rs rename to lib/datadog-agent/config-testsupport/src/config_registry/forwarder.rs index e34379a072d..647c5b39ea5 100644 --- a/lib/saluki-components/src/config_registry/datadog/forwarder.rs +++ b/lib/datadog-agent/config-testsupport/src/config_registry/forwarder.rs @@ -1,11 +1,11 @@ -//! Annotations for ForwarderConfiguration keys (endpoint, retry, and forwarder settings). -use crate::config_registry::{generated::schema, structs, PipelineAffinity, SalukiAnnotation, SupportLevel, ValueType}; +// @generated by build.rs from schema_overlay.yaml — DO NOT EDIT +#[allow(unused_imports)] +use super::schema; +#[allow(unused_imports)] +use super::*; -// All keys are labeled as CrossCutting because the forwarder configuration can affect any pipeline. crate::declare_annotations! { - // ── Endpoint ────────────────────────────────────────────────────────────── - - /// `api_key`—Datadog API key for authentication. + /// `api_key`-API key for endpoint auth API_KEY = SalukiAnnotation { schema: &schema::API_KEY, support_level: SupportLevel::Full, @@ -16,8 +16,7 @@ crate::declare_annotations! { test_json: None, pipeline_affinity: PipelineAffinity::CrossCutting, }; - - /// `site`—Datadog site domain (for example, `datadoghq.com`). + /// `site`-Datadog site domain SITE = SalukiAnnotation { schema: &schema::SITE, support_level: SupportLevel::Full, @@ -28,8 +27,7 @@ crate::declare_annotations! { test_json: None, pipeline_affinity: PipelineAffinity::CrossCutting, }; - - /// `dd_url`—explicit intake URL, overrides `site`. + /// `dd_url`-Override intake endpoint URL DD_URL = SalukiAnnotation { schema: &schema::DD_URL, support_level: SupportLevel::Full, @@ -40,8 +38,7 @@ crate::declare_annotations! { test_json: None, pipeline_affinity: PipelineAffinity::CrossCutting, }; - - /// `observability_pipelines_worker.metrics.enabled`—route metrics to OPW. + /// `observability_pipelines_worker.metrics.enabled`-Route metrics to OPW instance OBSERVABILITY_PIPELINES_WORKER_METRICS_ENABLED = SalukiAnnotation { schema: &schema::OBSERVABILITY_PIPELINES_WORKER_METRICS_ENABLED, support_level: SupportLevel::Full, @@ -52,8 +49,7 @@ crate::declare_annotations! { test_json: None, pipeline_affinity: PipelineAffinity::CrossCutting, }; - - /// `observability_pipelines_worker.metrics.url`—OPW metrics intake URL. + /// `observability_pipelines_worker.metrics.url`-OPW metrics intake URL OBSERVABILITY_PIPELINES_WORKER_METRICS_URL = SalukiAnnotation { schema: &schema::OBSERVABILITY_PIPELINES_WORKER_METRICS_URL, support_level: SupportLevel::Full, @@ -64,8 +60,7 @@ crate::declare_annotations! { test_json: None, pipeline_affinity: PipelineAffinity::CrossCutting, }; - - /// `vector.metrics.enabled`—route metrics to OPW (legacy alias). + /// `vector.metrics.enabled`-Route metrics to OPW (legacy alias) VECTOR_METRICS_ENABLED = SalukiAnnotation { schema: &schema::VECTOR_METRICS_ENABLED, support_level: SupportLevel::Full, @@ -76,8 +71,7 @@ crate::declare_annotations! { test_json: None, pipeline_affinity: PipelineAffinity::CrossCutting, }; - - /// `vector.metrics.url`—OPW metrics intake URL (legacy alias). + /// `vector.metrics.url`-OPW metrics intake URL (legacy alias) VECTOR_METRICS_URL = SalukiAnnotation { schema: &schema::VECTOR_METRICS_URL, support_level: SupportLevel::Full, @@ -88,9 +82,7 @@ crate::declare_annotations! { test_json: None, pipeline_affinity: PipelineAffinity::CrossCutting, }; - - /// `additional_endpoints`—extra intake endpoints (JSON map of host → API keys). - /// Uses a structured `test_json` because the field uses PickFirst<(DisplayFromStr, _)>. + /// `additional_endpoints`-Dual-ship to extra endpoints ADDITIONAL_ENDPOINTS = SalukiAnnotation { schema: &schema::ADDITIONAL_ENDPOINTS, support_level: SupportLevel::Full, @@ -101,10 +93,7 @@ crate::declare_annotations! { test_json: Some(r#"{"smoke-host-1.example.com": ["smoke-api-key"]}"#), pipeline_affinity: PipelineAffinity::CrossCutting, }; - - // ── ForwarderConfiguration direct fields ────────────────────────────────── - - /// `forwarder_num_workers`—max concurrent requests per endpoint. Schema Float; field usize. + /// `forwarder_num_workers`-Concurrent forwarder workers FORWARDER_NUM_WORKERS = SalukiAnnotation { schema: &schema::FORWARDER_NUM_WORKERS, support_level: SupportLevel::Full, @@ -115,8 +104,7 @@ crate::declare_annotations! { test_json: None, pipeline_affinity: PipelineAffinity::CrossCutting, }; - - /// `forwarder_timeout`—request timeout in seconds. Schema Float; field u64. + /// `forwarder_timeout`-Forwarder HTTP request timeout FORWARDER_TIMEOUT = SalukiAnnotation { schema: &schema::FORWARDER_TIMEOUT, support_level: SupportLevel::Full, @@ -127,8 +115,7 @@ crate::declare_annotations! { test_json: None, pipeline_affinity: PipelineAffinity::CrossCutting, }; - - /// `forwarder_high_prio_buffer_size`—max pending requests per endpoint. Schema Float; field usize. + /// `forwarder_high_prio_buffer_size`-High-priority request queue size FORWARDER_HIGH_PRIO_BUFFER_SIZE = SalukiAnnotation { schema: &schema::FORWARDER_HIGH_PRIO_BUFFER_SIZE, support_level: SupportLevel::Full, @@ -139,8 +126,7 @@ crate::declare_annotations! { test_json: None, pipeline_affinity: PipelineAffinity::CrossCutting, }; - - /// `forwarder_connection_reset_interval`—seconds between connection resets. Schema Float; field u64. + /// `forwarder_connection_reset_interval`-HTTP conn reset interval (secs) FORWARDER_CONNECTION_RESET_INTERVAL = SalukiAnnotation { schema: &schema::FORWARDER_CONNECTION_RESET_INTERVAL, support_level: SupportLevel::Full, @@ -151,8 +137,7 @@ crate::declare_annotations! { test_json: None, pipeline_affinity: PipelineAffinity::CrossCutting, }; - - /// `forwarder_http_protocol`—HTTP version selection for outgoing forwarder requests. + /// `forwarder_http_protocol`-HTTP version selection (auto/http1/http2) FORWARDER_HTTP_PROTOCOL = SalukiAnnotation { schema: &schema::FORWARDER_HTTP_PROTOCOL, support_level: SupportLevel::Full, @@ -160,14 +145,13 @@ crate::declare_annotations! { env_var_override: None, used_by: &[structs::FORWARDER_CONFIGURATION], value_type_override: None, - test_json: Some("\"http1\""), + test_json: Some(r#""http1""#), pipeline_affinity: PipelineAffinity::CrossCutting, }; - - /// `skip_ssl_validation`—disables TLS certificate validation for Datadog intake forwarding. + /// `skip_ssl_validation`-Skip TLS cert validation SKIP_SSL_VALIDATION = SalukiAnnotation { schema: &schema::SKIP_SSL_VALIDATION, - support_level: SupportLevel::Full, + support_level: SupportLevel::Partial, additional_yaml_paths: &[], env_var_override: Some(&["DD_SKIP_SSL_VALIDATION"]), used_by: &[structs::FORWARDER_CONFIGURATION], @@ -175,8 +159,7 @@ crate::declare_annotations! { test_json: None, pipeline_affinity: PipelineAffinity::CrossCutting, }; - - /// `min_tls_version`—minimum TLS version for Datadog intake forwarding. + /// `min_tls_version`-Minimum TLS version for HTTPS connections MIN_TLS_VERSION = SalukiAnnotation { schema: &schema::MIN_TLS_VERSION, support_level: SupportLevel::Partial, @@ -187,8 +170,7 @@ crate::declare_annotations! { test_json: None, pipeline_affinity: PipelineAffinity::CrossCutting, }; - - /// `allow_arbitrary_tags`—signals backend tag validation relaxation. + /// `allow_arbitrary_tags`-Relax backend tag validation via HTTP header ALLOW_ARBITRARY_TAGS = SalukiAnnotation { schema: &schema::ALLOW_ARBITRARY_TAGS, support_level: SupportLevel::Full, @@ -199,10 +181,7 @@ crate::declare_annotations! { test_json: None, pipeline_affinity: PipelineAffinity::CrossCutting, }; - - // ── RetryConfiguration fields ───────────────────────────────────────────── - - /// `forwarder_backoff_base`—base growth rate for retry backoff in seconds. + /// `forwarder_backoff_base`-Retry backoff base (secs) FORWARDER_BACKOFF_BASE = SalukiAnnotation { schema: &schema::FORWARDER_BACKOFF_BASE, support_level: SupportLevel::Full, @@ -213,8 +192,7 @@ crate::declare_annotations! { test_json: None, pipeline_affinity: PipelineAffinity::CrossCutting, }; - - /// `forwarder_backoff_factor`—jitter factor for retry backoff. + /// `forwarder_backoff_factor`-Retry backoff jitter factor FORWARDER_BACKOFF_FACTOR = SalukiAnnotation { schema: &schema::FORWARDER_BACKOFF_FACTOR, support_level: SupportLevel::Full, @@ -225,8 +203,7 @@ crate::declare_annotations! { test_json: None, pipeline_affinity: PipelineAffinity::CrossCutting, }; - - /// `forwarder_backoff_max`—maximum retry backoff duration in seconds. + /// `forwarder_backoff_max`-Retry backoff ceiling (secs) FORWARDER_BACKOFF_MAX = SalukiAnnotation { schema: &schema::FORWARDER_BACKOFF_MAX, support_level: SupportLevel::Full, @@ -237,8 +214,7 @@ crate::declare_annotations! { test_json: None, pipeline_affinity: PipelineAffinity::CrossCutting, }; - - /// `forwarder_recovery_interval`—error count decrease on success. Schema Float; field u32. + /// `forwarder_recovery_interval`-Backoff recovery decrease factor FORWARDER_RECOVERY_INTERVAL = SalukiAnnotation { schema: &schema::FORWARDER_RECOVERY_INTERVAL, support_level: SupportLevel::Full, @@ -249,8 +225,7 @@ crate::declare_annotations! { test_json: None, pipeline_affinity: PipelineAffinity::CrossCutting, }; - - /// `forwarder_recovery_reset`—reset error count on successful request. + /// `forwarder_recovery_reset`-Reset errors on success FORWARDER_RECOVERY_RESET = SalukiAnnotation { schema: &schema::FORWARDER_RECOVERY_RESET, support_level: SupportLevel::Full, @@ -261,8 +236,7 @@ crate::declare_annotations! { test_json: None, pipeline_affinity: PipelineAffinity::CrossCutting, }; - - /// `forwarder_retry_queue_max_size`—(deprecated) max in-memory retry queue size in bytes. Schema Float; field `Option`. + /// `forwarder_retry_queue_max_size`-Retry queue max size (deprecated) FORWARDER_RETRY_QUEUE_MAX_SIZE = SalukiAnnotation { schema: &schema::FORWARDER_RETRY_QUEUE_MAX_SIZE, support_level: SupportLevel::Full, @@ -273,8 +247,7 @@ crate::declare_annotations! { test_json: None, pipeline_affinity: PipelineAffinity::CrossCutting, }; - - /// `forwarder_retry_queue_payloads_max_size`—max in-memory retry queue size in bytes. Schema Float; field `Option`. + /// `forwarder_retry_queue_payloads_max_size`-Retry queue max size (bytes) FORWARDER_RETRY_QUEUE_PAYLOADS_MAX_SIZE = SalukiAnnotation { schema: &schema::FORWARDER_RETRY_QUEUE_PAYLOADS_MAX_SIZE, support_level: SupportLevel::Full, @@ -285,8 +258,7 @@ crate::declare_annotations! { test_json: None, pipeline_affinity: PipelineAffinity::CrossCutting, }; - - /// `forwarder_storage_max_disk_ratio`—max disk usage fraction before stopping on-disk queue. + /// `forwarder_storage_max_disk_ratio`-Max disk usage ratio for retry FORWARDER_STORAGE_MAX_DISK_RATIO = SalukiAnnotation { schema: &schema::FORWARDER_STORAGE_MAX_DISK_RATIO, support_level: SupportLevel::Full, @@ -297,8 +269,7 @@ crate::declare_annotations! { test_json: None, pipeline_affinity: PipelineAffinity::CrossCutting, }; - - /// `forwarder_storage_max_size_in_bytes`—max on-disk retry queue size. Schema Float; field u64. + /// `forwarder_storage_max_size_in_bytes`-Max on-disk retry storage size FORWARDER_STORAGE_MAX_SIZE_IN_BYTES = SalukiAnnotation { schema: &schema::FORWARDER_STORAGE_MAX_SIZE_IN_BYTES, support_level: SupportLevel::Full, @@ -309,8 +280,7 @@ crate::declare_annotations! { test_json: None, pipeline_affinity: PipelineAffinity::CrossCutting, }; - - /// `forwarder_storage_path`—directory for on-disk retry queue. + /// `forwarder_storage_path`-On-disk retry storage directory FORWARDER_STORAGE_PATH = SalukiAnnotation { schema: &schema::FORWARDER_STORAGE_PATH, support_level: SupportLevel::Full, @@ -321,8 +291,7 @@ crate::declare_annotations! { test_json: None, pipeline_affinity: PipelineAffinity::CrossCutting, }; - - /// `forwarder_outdated_file_in_days`—maximum age in days for retry files before deletion at startup. + /// `forwarder_outdated_file_in_days`-Days before retry files are deleted FORWARDER_OUTDATED_FILE_IN_DAYS = SalukiAnnotation { schema: &schema::FORWARDER_OUTDATED_FILE_IN_DAYS, support_level: SupportLevel::Full, diff --git a/lib/saluki-components/src/config_registry/datadog/get_typed.rs b/lib/datadog-agent/config-testsupport/src/config_registry/get_typed.rs similarity index 68% rename from lib/saluki-components/src/config_registry/datadog/get_typed.rs rename to lib/datadog-agent/config-testsupport/src/config_registry/get_typed.rs index 3a73460c465..1f52e42c4ef 100644 --- a/lib/saluki-components/src/config_registry/datadog/get_typed.rs +++ b/lib/datadog-agent/config-testsupport/src/config_registry/get_typed.rs @@ -1,9 +1,11 @@ -//! Annotations for keys consumed via `get_typed` / `try_get_typed` rather than struct -//! deserialization. -use crate::config_registry::{generated::schema, structs, PipelineAffinity, SalukiAnnotation, SupportLevel}; +// @generated by build.rs from schema_overlay.yaml — DO NOT EDIT +#[allow(unused_imports)] +use super::schema; +#[allow(unused_imports)] +use super::*; crate::declare_annotations! { - /// `vsock_addr`—vsock address for connecting to the Agent IPC endpoint. + /// `vsock_addr`-vsock address for Agent IPC endpoint VSOCK_ADDR = SalukiAnnotation { schema: &schema::VSOCK_ADDR, support_level: SupportLevel::Full, @@ -11,12 +13,10 @@ crate::declare_annotations! { env_var_override: None, used_by: &[structs::REMOTE_AGENT_CLIENT_CONFIGURATION], value_type_override: None, - test_json: Some("\"host\""), - // Affects how ADP connects to the Agent IPC endpoint. + test_json: Some(r#""host""#), pipeline_affinity: PipelineAffinity::CrossCutting, }; - - /// `cmd_port`—port for the Datadog Agent IPC/CMD API server. + /// `cmd_port`-Datadog Agent IPC/CMD API port CMD_PORT = SalukiAnnotation { schema: &schema::CMD_PORT, support_level: SupportLevel::Full, @@ -25,11 +25,9 @@ crate::declare_annotations! { used_by: &[structs::REMOTE_AGENT_CLIENT_CONFIGURATION], value_type_override: None, test_json: Some("5101"), - // Affects how ADP receives commands. pipeline_affinity: PipelineAffinity::CrossCutting, }; - - /// `log_format_rfc3339`—use RFC 3339 timestamp format in log output. + /// `log_format_rfc3339`-Use RFC 3339 timestamps in log output LOG_FORMAT_RFC3339 = SalukiAnnotation { schema: &schema::LOG_FORMAT_RFC3339, support_level: SupportLevel::Full, @@ -38,11 +36,9 @@ crate::declare_annotations! { used_by: &[structs::GET_TYPED], value_type_override: None, test_json: None, - // Logging is process-wide. pipeline_affinity: PipelineAffinity::CrossCutting, }; - - /// `syslog_rfc`—use RFC 5424 syslog format when syslog logging is enabled. + /// `syslog_rfc`-Use RFC-style syslog header SYSLOG_RFC = SalukiAnnotation { schema: &schema::SYSLOG_RFC, support_level: SupportLevel::Full, @@ -51,11 +47,9 @@ crate::declare_annotations! { used_by: &[structs::GET_TYPED], value_type_override: None, test_json: None, - // Affects how ADP writes logs. pipeline_affinity: PipelineAffinity::CrossCutting, }; - - /// `syslog_uri`—destination URI for syslog output. + /// `syslog_uri`-Syslog destination URI SYSLOG_URI = SalukiAnnotation { schema: &schema::SYSLOG_URI, support_level: SupportLevel::Full, @@ -64,7 +58,17 @@ crate::declare_annotations! { used_by: &[structs::GET_TYPED], value_type_override: None, test_json: None, - // Affects how ADP access the syslog. + pipeline_affinity: PipelineAffinity::CrossCutting, + }; + /// `log_level`-Log verbosity directives + LOG_LEVEL = SalukiAnnotation { + schema: &schema::LOG_LEVEL, + support_level: SupportLevel::Partial, + additional_yaml_paths: &[], + env_var_override: None, + used_by: &[structs::GET_TYPED], + value_type_override: None, + test_json: None, pipeline_affinity: PipelineAffinity::CrossCutting, }; } diff --git a/lib/datadog-agent/config-testsupport/src/config_registry/mod.rs b/lib/datadog-agent/config-testsupport/src/config_registry/mod.rs new file mode 100644 index 00000000000..9bc200e880b --- /dev/null +++ b/lib/datadog-agent/config-testsupport/src/config_registry/mod.rs @@ -0,0 +1,181 @@ +/// Datadog Agent configuration annotations, generated from `schema_overlay.yaml`. +/// +/// Type definitions live here (hand-written); generated annotation constants and statics +/// live in `annotations_index.rs` (generated in-tree by `build.rs`). +pub use datadog_agent_config::classifier::{structs, Pipeline, PipelineAffinity, Severity}; + +/// Support level for a configuration key, as recorded in the testsupport annotation layer. +/// +/// Unlike the prod [`datadog_agent_config::classifier::SupportLevel`], this enum includes +/// [`Full`][SupportLevel::Full] so that generated annotation constants can express keys that work +/// identically to the core agent. The prod classifier omits `Full` because fully supported keys +/// require no diagnostic action. +#[derive(Clone, Copy, Debug, PartialEq, Eq)] +pub enum SupportLevel { + /// Fully supported with identical behavior to the core agent. + Full, + /// Supported but with behavioral or default-value differences. + Partial, + /// Explicitly incompatible; ADP does not support this key. + Incompatible(Severity), + /// Intentionally ignored. + #[allow(unused)] + Ignored, + /// Unrecognized by ADP. + #[allow(unused)] + Unrecognized, +} + +/// Declares a set of [`SalukiAnnotation`] constants and generates a companion `ALL` slice. +/// +/// Each entry declares one named `pub const` annotation. The macro also emits: +/// +/// ```ignore +/// pub const ALL: &[&SalukiAnnotation] = &[&NAME1, &NAME2, ...]; +/// ``` +/// +/// so that `annotations_index.rs` can aggregate submodules with a single +/// `v.extend_from_slice(my_module::ALL)` line rather than listing every constant by name. +#[macro_export] +macro_rules! declare_annotations { + ( $( $(#[$attr:meta])* $name:ident = $val:expr ;)+ ) => { + $( + $(#[$attr])* + pub const $name: $crate::config_registry::SalukiAnnotation = $val; + )+ + + /// All annotations declared in this module, in declaration order. + pub const ALL: &[$crate::config_registry::SalukiAnnotationRef] = &[ + $( &$name, )+ + ]; + }; +} + +/// The shape of a configuration value. +#[derive(Clone, Copy, Debug, PartialEq, Eq)] +pub enum ValueType { + /// A boolean (`true` / `false`). + Bool, + /// A UTF-8 string. + String, + /// An unsigned integer. + Integer, + /// A floating-point number. + Float, + /// A list of strings (YAML sequence or space-separated env var string). + StringList, +} + +/// Which schema source of truth defined the `SchemaEntry` +#[derive(Debug, Clone, Copy, Eq, PartialEq, Hash)] +#[repr(u8)] +pub(crate) enum Schema { + /// Saluki defined the `SchemaEntry`. + Saluki, + /// The vendored Datadog config schema defines the `SchemaEntry`. + Datadog, +} + +/// Schema-derived metadata for a single configuration key. +#[derive(Debug)] +pub struct SchemaEntry { + /// The source of truth from which this entry was derived. + #[allow(dead_code)] + pub(crate) schema: Schema, + + /// Canonical dot-separated YAML path for this key (for example, `"proxy.http"`). + pub yaml_path: &'static str, + + /// Environment variables that deliver this value, as declared in the schema. + pub env_vars: &'static [&'static str], + + /// Shape of the value. + pub value_type: ValueType, + + /// JSON-encoded default value from the Agent schema, if present. + pub default: Option<&'static str>, +} + +/// Saluki-specific annotation for a single configuration key. +#[derive(Debug)] +pub struct SalukiAnnotation { + /// The schema entry this annotation enriches. + pub schema: &'static SchemaEntry, + + /// How well saluki supports this key. + pub support_level: SupportLevel, + + /// Additional YAML paths beyond the canonical one in the schema (aliases). + pub additional_yaml_paths: &'static [&'static str], + + /// Overrides the schema's `env_vars` list entirely when `Some`. + pub env_var_override: Option<&'static [&'static str]>, + + /// Config structs that incorporate this key, as [`structs`] constants. + pub used_by: &'static [&'static str], + + /// Overrides the schema's `value_type` when `Some`. + pub value_type_override: Option, + + /// Overrides the smoke-test injected value entirely when `Some`. + pub test_json: Option<&'static str>, + + /// Which pipelines this key affects. + pub pipeline_affinity: PipelineAffinity, +} + +/// A reference to a [`SalukiAnnotation`], used as the element type of `ALL` slices generated by +/// [`declare_annotations!`]. +pub type SalukiAnnotationRef = &'static SalukiAnnotation; + +impl SalukiAnnotation { + /// The canonical YAML path for this key (from the schema). + pub fn yaml_path(&self) -> &'static str { + self.schema.yaml_path + } + + /// All YAML paths for this key: canonical first, then any aliases. + pub fn all_yaml_paths(&self) -> impl Iterator { + std::iter::once(self.schema.yaml_path).chain(self.additional_yaml_paths.iter().copied()) + } + + /// Effective env vars: the override list if set, otherwise the schema's list. + pub fn effective_env_vars(&self) -> &'static [&'static str] { + self.env_var_override.unwrap_or(self.schema.env_vars) + } + + /// Shape of the value: override if set, otherwise from the schema. + pub fn value_type(&self) -> ValueType { + self.value_type_override.unwrap_or(self.schema.value_type) + } +} + +/// A fully resolved configuration key. +#[derive(Debug)] +pub struct ConfigKey { + /// All dot-separated YAML paths that deliver this value. + pub yaml_paths: Vec<&'static str>, + + /// All environment variables that deliver this value. + pub env_vars: Vec<&'static str>, + + /// Shape of the value. + pub value_type: ValueType, + + /// Config structs that incorporate this key, as [`structs`] constants. + pub used_by: &'static [&'static str], +} + +impl From<&SalukiAnnotation> for ConfigKey { + fn from(a: &SalukiAnnotation) -> Self { + ConfigKey { + yaml_paths: a.all_yaml_paths().collect(), + env_vars: a.effective_env_vars().to_vec(), + value_type: a.value_type(), + used_by: a.used_by, + } + } +} + +// Generated module containing all annotation constants and the aggregation statics. +include!("annotations_index.rs"); diff --git a/lib/saluki-components/src/config_registry/datadog/mrf.rs b/lib/datadog-agent/config-testsupport/src/config_registry/mrf.rs similarity index 78% rename from lib/saluki-components/src/config_registry/datadog/mrf.rs rename to lib/datadog-agent/config-testsupport/src/config_registry/mrf.rs index d6dddd5addd..a8372702dfd 100644 --- a/lib/saluki-components/src/config_registry/datadog/mrf.rs +++ b/lib/datadog-agent/config-testsupport/src/config_registry/mrf.rs @@ -1,9 +1,11 @@ -//! Annotations for multi-region failover configuration keys. - -use crate::config_registry::{generated::schema, structs, PipelineAffinity, SalukiAnnotation, SupportLevel, ValueType}; +// @generated by build.rs from schema_overlay.yaml — DO NOT EDIT +#[allow(unused_imports)] +use super::schema; +#[allow(unused_imports)] +use super::*; crate::declare_annotations! { - /// `multi_region_failover.api_key` - API key for the MRF failover region. + /// `multi_region_failover.api_key`-API key for the failover-region endpoint MULTI_REGION_FAILOVER_API_KEY = SalukiAnnotation { schema: &schema::MULTI_REGION_FAILOVER_API_KEY, support_level: SupportLevel::Full, @@ -14,8 +16,7 @@ crate::declare_annotations! { test_json: None, pipeline_affinity: PipelineAffinity::CrossCutting, }; - - /// `multi_region_failover.dd_url` - intake URL for the MRF failover region. + /// `multi_region_failover.dd_url`-Failover intake URL MULTI_REGION_FAILOVER_DD_URL = SalukiAnnotation { schema: &schema::MULTI_REGION_FAILOVER_DD_URL, support_level: SupportLevel::Full, @@ -26,11 +27,10 @@ crate::declare_annotations! { test_json: None, pipeline_affinity: PipelineAffinity::CrossCutting, }; - - /// `multi_region_failover.enabled` - multi-region failover mode. + /// `multi_region_failover.enabled`-Enable multi-region failover mode MULTI_REGION_FAILOVER_ENABLED = SalukiAnnotation { schema: &schema::MULTI_REGION_FAILOVER_ENABLED, - support_level: SupportLevel::Full, + support_level: SupportLevel::Partial, additional_yaml_paths: &[], env_var_override: Some(&["DD_MULTI_REGION_FAILOVER_ENABLED"]), used_by: &[structs::MRF_CONFIGURATION], @@ -38,8 +38,7 @@ crate::declare_annotations! { test_json: None, pipeline_affinity: PipelineAffinity::CrossCutting, }; - - /// `multi_region_failover.failover_metrics` - metrics forwarding to the failover region. + /// `multi_region_failover.failover_metrics`-Enable metrics forwarding to failover region MULTI_REGION_FAILOVER_FAILOVER_METRICS = SalukiAnnotation { schema: &schema::MULTI_REGION_FAILOVER_FAILOVER_METRICS, support_level: SupportLevel::Full, @@ -50,8 +49,7 @@ crate::declare_annotations! { test_json: None, pipeline_affinity: PipelineAffinity::CrossCutting, }; - - /// `multi_region_failover.metric_allowlist` - metric name allowlist for MRF forwarding. + /// `multi_region_failover.metric_allowlist`-Metric name allowlist for MRF forwarding MULTI_REGION_FAILOVER_METRIC_ALLOWLIST = SalukiAnnotation { schema: &schema::MULTI_REGION_FAILOVER_METRIC_ALLOWLIST, support_level: SupportLevel::Full, @@ -62,8 +60,7 @@ crate::declare_annotations! { test_json: None, pipeline_affinity: PipelineAffinity::CrossCutting, }; - - /// `multi_region_failover.site` - Datadog site for the MRF failover region. + /// `multi_region_failover.site`-Datadog site for the failover region MULTI_REGION_FAILOVER_SITE = SalukiAnnotation { schema: &schema::MULTI_REGION_FAILOVER_SITE, support_level: SupportLevel::Full, diff --git a/lib/saluki-components/src/config_registry/datadog/otlp.rs b/lib/datadog-agent/config-testsupport/src/config_registry/otlp.rs similarity index 80% rename from lib/saluki-components/src/config_registry/datadog/otlp.rs rename to lib/datadog-agent/config-testsupport/src/config_registry/otlp.rs index 3693b862642..dfbe75f786a 100644 --- a/lib/saluki-components/src/config_registry/datadog/otlp.rs +++ b/lib/datadog-agent/config-testsupport/src/config_registry/otlp.rs @@ -1,15 +1,15 @@ -//! Annotations for OTLP source, decoder, and relay configuration keys. -use crate::config_registry::{ - generated::schema, structs, Pipeline, PipelineAffinity, SalukiAnnotation, Schema, SchemaEntry, SupportLevel, - ValueType, -}; +// @generated by build.rs from schema_overlay.yaml — DO NOT EDIT +#[allow(unused_imports)] +use super::schema; +#[allow(unused_imports)] +use super::*; -static OTLP_CONFIG_TRACES_ENABLE_TOP_LEVEL_BY_SPAN_KIND_SCHEMA: SchemaEntry = SchemaEntry { +static OTLP_CONFIG_RECEIVER_PROTOCOLS_HTTP_TRANSPORT_SCHEMA: SchemaEntry = SchemaEntry { schema: Schema::Saluki, - yaml_path: "otlp_config.traces.enable_otlp_compute_top_level_by_span_kind", + yaml_path: "otlp_config.receiver.protocols.http.transport", env_vars: &[], - value_type: ValueType::Bool, - default: Some("true"), + value_type: ValueType::String, + default: None, }; static OTLP_CONFIG_TRACES_IGNORE_MISSING_DATADOG_FIELDS_SCHEMA: SchemaEntry = SchemaEntry { @@ -20,19 +20,19 @@ static OTLP_CONFIG_TRACES_IGNORE_MISSING_DATADOG_FIELDS_SCHEMA: SchemaEntry = Sc default: None, }; -static OTLP_CONFIG_TRACES_STRING_INTERNER_SIZE_SCHEMA: SchemaEntry = SchemaEntry { +static OTLP_CONFIG_TRACES_ENABLE_OTLP_COMPUTE_TOP_LEVEL_BY_SPAN_KIND_SCHEMA: SchemaEntry = SchemaEntry { schema: Schema::Saluki, - yaml_path: "otlp_config.traces.string_interner_size", + yaml_path: "otlp_config.traces.enable_otlp_compute_top_level_by_span_kind", env_vars: &[], - value_type: ValueType::Integer, - default: None, + value_type: ValueType::Bool, + default: Some("true"), }; -static OTLP_CONFIG_RECEIVER_PROTOCOLS_HTTP_TRANSPORT_SCHEMA: SchemaEntry = SchemaEntry { +static OTLP_CONFIG_TRACES_STRING_INTERNER_SIZE_SCHEMA: SchemaEntry = SchemaEntry { schema: Schema::Saluki, - yaml_path: "otlp_config.receiver.protocols.http.transport", + yaml_path: "otlp_config.traces.string_interner_size", env_vars: &[], - value_type: ValueType::String, + value_type: ValueType::Integer, default: None, }; @@ -69,9 +69,7 @@ static OTLP_STRING_INTERNER_SIZE_SCHEMA: SchemaEntry = SchemaEntry { }; crate::declare_annotations! { - // ── Receiver ────────────────────────────────────────────────────────────── - - /// `otlp_config.receiver.protocols.grpc.endpoint` + /// `otlp_config.receiver.protocols.grpc.endpoint`-otlp_config.receiver.protocols.grpc.endpoint OTLP_CONFIG_RECEIVER_PROTOCOLS_GRPC_ENDPOINT = SalukiAnnotation { schema: &schema::OTLP_CONFIG_RECEIVER_PROTOCOLS_GRPC_ENDPOINT, support_level: SupportLevel::Full, @@ -82,9 +80,7 @@ crate::declare_annotations! { test_json: None, pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::Otlp]), }; - - /// `otlp_config.receiver.protocols.grpc.max_recv_msg_size_mib` - /// Schema says Float but the Rust field is u64. + /// `otlp_config.receiver.protocols.grpc.max_recv_msg_size_mib`-Max OTLP inbound gRPC message size (MiB) OTLP_CONFIG_RECEIVER_PROTOCOLS_GRPC_MAX_RECV_MSG_SIZE_MIB = SalukiAnnotation { schema: &schema::OTLP_CONFIG_RECEIVER_PROTOCOLS_GRPC_MAX_RECV_MSG_SIZE_MIB, support_level: SupportLevel::Full, @@ -95,8 +91,7 @@ crate::declare_annotations! { test_json: None, pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::Otlp]), }; - - /// `otlp_config.receiver.protocols.grpc.transport` + /// `otlp_config.receiver.protocols.grpc.transport`-otlp_config.receiver.protocols.grpc.transport OTLP_CONFIG_RECEIVER_PROTOCOLS_GRPC_TRANSPORT = SalukiAnnotation { schema: &schema::OTLP_CONFIG_RECEIVER_PROTOCOLS_GRPC_TRANSPORT, support_level: SupportLevel::Full, @@ -107,8 +102,7 @@ crate::declare_annotations! { test_json: None, pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::Otlp]), }; - - /// `otlp_config.receiver.protocols.http.endpoint` + /// `otlp_config.receiver.protocols.http.endpoint`-otlp_config.receiver.protocols.http.endpoint OTLP_CONFIG_RECEIVER_PROTOCOLS_HTTP_ENDPOINT = SalukiAnnotation { schema: &schema::OTLP_CONFIG_RECEIVER_PROTOCOLS_HTTP_ENDPOINT, support_level: SupportLevel::Full, @@ -119,8 +113,7 @@ crate::declare_annotations! { test_json: None, pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::Otlp]), }; - - /// `otlp_config.receiver.protocols.http.transport`—ADP-specific, not in Agent schema. + /// `otlp_config.receiver.protocols.http.transport` OTLP_CONFIG_RECEIVER_PROTOCOLS_HTTP_TRANSPORT = SalukiAnnotation { schema: &OTLP_CONFIG_RECEIVER_PROTOCOLS_HTTP_TRANSPORT_SCHEMA, support_level: SupportLevel::Full, @@ -131,10 +124,7 @@ crate::declare_annotations! { test_json: None, pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::Otlp]), }; - - // ── Traces ──────────────────────────────────────────────────────────────── - - /// `otlp_config.traces.enabled`. + /// `otlp_config.traces.enabled`-otlp_config.traces.enabled OTLP_CONFIG_TRACES_ENABLED = SalukiAnnotation { schema: &schema::OTLP_CONFIG_TRACES_ENABLED, support_level: SupportLevel::Full, @@ -145,8 +135,7 @@ crate::declare_annotations! { test_json: None, pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::Traces]), }; - - /// `otlp_config.traces.ignore_missing_datadog_fields`—ADP-specific, default false. + /// `otlp_config.traces.ignore_missing_datadog_fields` OTLP_CONFIG_TRACES_IGNORE_MISSING_DATADOG_FIELDS = SalukiAnnotation { schema: &OTLP_CONFIG_TRACES_IGNORE_MISSING_DATADOG_FIELDS_SCHEMA, support_level: SupportLevel::Full, @@ -157,10 +146,9 @@ crate::declare_annotations! { test_json: None, pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::Traces]), }; - - /// `otlp_config.traces.enable_otlp_compute_top_level_by_span_kind`. - OTLP_CONFIG_TRACES_ENABLE_TOP_LEVEL_BY_SPAN_KIND = SalukiAnnotation { - schema: &OTLP_CONFIG_TRACES_ENABLE_TOP_LEVEL_BY_SPAN_KIND_SCHEMA, + /// `otlp_config.traces.enable_otlp_compute_top_level_by_span_kind` + OTLP_CONFIG_TRACES_ENABLE_OTLP_COMPUTE_TOP_LEVEL_BY_SPAN_KIND = SalukiAnnotation { + schema: &OTLP_CONFIG_TRACES_ENABLE_OTLP_COMPUTE_TOP_LEVEL_BY_SPAN_KIND_SCHEMA, support_level: SupportLevel::Full, additional_yaml_paths: &[], env_var_override: None, @@ -169,8 +157,7 @@ crate::declare_annotations! { test_json: None, pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::Traces]), }; - - /// `otlp_config.traces.internal_port`—schema says Float but field is u16. + /// `otlp_config.traces.internal_port`-otlp_config.traces.internal_port OTLP_CONFIG_TRACES_INTERNAL_PORT = SalukiAnnotation { schema: &schema::OTLP_CONFIG_TRACES_INTERNAL_PORT, support_level: SupportLevel::Full, @@ -181,8 +168,7 @@ crate::declare_annotations! { test_json: None, pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::Traces]), }; - - /// `otlp_config.traces.probabilistic_sampler.sampling_percentage`—default 100.0. + /// `otlp_config.traces.probabilistic_sampler.sampling_percentage`-OTLP trace sampling percentage OTLP_CONFIG_TRACES_PROBABILISTIC_SAMPLER_SAMPLING_PERCENTAGE = SalukiAnnotation { schema: &schema::OTLP_CONFIG_TRACES_PROBABILISTIC_SAMPLER_SAMPLING_PERCENTAGE, support_level: SupportLevel::Full, @@ -193,8 +179,7 @@ crate::declare_annotations! { test_json: None, pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::Traces]), }; - - /// `otlp_config.traces.string_interner_size`—ADP-specific; default 512 KiB. + /// `otlp_config.traces.string_interner_size` OTLP_CONFIG_TRACES_STRING_INTERNER_SIZE = SalukiAnnotation { schema: &OTLP_CONFIG_TRACES_STRING_INTERNER_SIZE_SCHEMA, support_level: SupportLevel::Full, @@ -205,10 +190,7 @@ crate::declare_annotations! { test_json: None, pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::Traces]), }; - - // ── Logs / Metrics ──────────────────────────────────────────────────────── - - /// `otlp_config.logs.enabled`—schema default is false but saluki defaults to true; `test_json` injects false explicitly. + /// `otlp_config.logs.enabled`-otlp_config.logs.enabled OTLP_CONFIG_LOGS_ENABLED = SalukiAnnotation { schema: &schema::OTLP_CONFIG_LOGS_ENABLED, support_level: SupportLevel::Full, @@ -219,8 +201,7 @@ crate::declare_annotations! { test_json: Some("false"), pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::Otlp]), }; - - /// `otlp_config.metrics.enabled`. + /// `otlp_config.metrics.enabled`-otlp_config.metrics.enabled OTLP_CONFIG_METRICS_ENABLED = SalukiAnnotation { schema: &schema::OTLP_CONFIG_METRICS_ENABLED, support_level: SupportLevel::Full, @@ -231,10 +212,7 @@ crate::declare_annotations! { test_json: None, pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::Otlp]), }; - - // ── OtlpConfiguration source-specific ───────────────────────────────────── - - /// `otlp_allow_context_heap_allocs`. + /// `otlp_allow_context_heap_allocs` OTLP_ALLOW_CONTEXT_HEAP_ALLOCS = SalukiAnnotation { schema: &OTLP_ALLOW_CONTEXT_HEAP_ALLOCS_SCHEMA, support_level: SupportLevel::Full, @@ -245,8 +223,7 @@ crate::declare_annotations! { test_json: None, pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::Otlp]), }; - - /// `otlp_cached_contexts_limit`—ADP-specific, default 500,000. + /// `otlp_cached_contexts_limit` OTLP_CACHED_CONTEXTS_LIMIT = SalukiAnnotation { schema: &OTLP_CACHED_CONTEXTS_LIMIT_SCHEMA, support_level: SupportLevel::Full, @@ -257,8 +234,7 @@ crate::declare_annotations! { test_json: None, pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::Otlp]), }; - - /// `otlp_cached_tagsets_limit`—ADP-specific, default 500,000. + /// `otlp_cached_tagsets_limit` OTLP_CACHED_TAGSETS_LIMIT = SalukiAnnotation { schema: &OTLP_CACHED_TAGSETS_LIMIT_SCHEMA, support_level: SupportLevel::Full, @@ -269,8 +245,7 @@ crate::declare_annotations! { test_json: None, pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::Otlp]), }; - - /// `otlp_string_interner_size`—ADP-specific; default 2 MiB. + /// `otlp_string_interner_size` OTLP_STRING_INTERNER_SIZE = SalukiAnnotation { schema: &OTLP_STRING_INTERNER_SIZE_SCHEMA, support_level: SupportLevel::Full, diff --git a/lib/saluki-components/src/config_registry/datadog/proxy.rs b/lib/datadog-agent/config-testsupport/src/config_registry/proxy.rs similarity index 73% rename from lib/saluki-components/src/config_registry/datadog/proxy.rs rename to lib/datadog-agent/config-testsupport/src/config_registry/proxy.rs index 77abb29a12b..d9aeb7c660c 100644 --- a/lib/saluki-components/src/config_registry/datadog/proxy.rs +++ b/lib/datadog-agent/config-testsupport/src/config_registry/proxy.rs @@ -1,8 +1,11 @@ -//! Annotations for proxy configuration keys. -use crate::config_registry::{generated::schema, structs, PipelineAffinity, SalukiAnnotation, SupportLevel}; +// @generated by build.rs from schema_overlay.yaml — DO NOT EDIT +#[allow(unused_imports)] +use super::schema; +#[allow(unused_imports)] +use super::*; crate::declare_annotations! { - /// `proxy.http` → `ProxyConfiguration::http_server` + /// `proxy.http`-HTTP proxy URL PROXY_HTTP = SalukiAnnotation { schema: &schema::PROXY_HTTP, support_level: SupportLevel::Full, @@ -11,11 +14,9 @@ crate::declare_annotations! { used_by: &[structs::FORWARDER_CONFIGURATION, structs::PROXY_CONFIGURATION], value_type_override: None, test_json: None, - // Proxy configuration can affect all networking. pipeline_affinity: PipelineAffinity::CrossCutting, }; - - /// `proxy.https` → `ProxyConfiguration::https_server` + /// `proxy.https`-HTTPS proxy URL PROXY_HTTPS = SalukiAnnotation { schema: &schema::PROXY_HTTPS, support_level: SupportLevel::Full, @@ -24,11 +25,9 @@ crate::declare_annotations! { used_by: &[structs::FORWARDER_CONFIGURATION, structs::PROXY_CONFIGURATION], value_type_override: None, test_json: None, - // Proxy configuration can affect all networking. pipeline_affinity: PipelineAffinity::CrossCutting, }; - - /// `proxy.no_proxy` → `ProxyConfiguration::no_proxy` + /// `proxy.no_proxy`-Hosts bypassing proxy PROXY_NO_PROXY = SalukiAnnotation { schema: &schema::PROXY_NO_PROXY, support_level: SupportLevel::Full, @@ -37,11 +36,9 @@ crate::declare_annotations! { used_by: &[structs::FORWARDER_CONFIGURATION, structs::PROXY_CONFIGURATION], value_type_override: None, test_json: None, - // Proxy configuration can affect all networking. pipeline_affinity: PipelineAffinity::CrossCutting, }; - - /// `no_proxy_nonexact_match` → `ProxyConfiguration::no_proxy_nonexact_match` + /// `no_proxy_nonexact_match`-Domain/CIDR `no_proxy` matching NO_PROXY_NONEXACT_MATCH = SalukiAnnotation { schema: &schema::NO_PROXY_NONEXACT_MATCH, support_level: SupportLevel::Full, @@ -50,11 +47,9 @@ crate::declare_annotations! { used_by: &[structs::FORWARDER_CONFIGURATION, structs::PROXY_CONFIGURATION], value_type_override: None, test_json: None, - // Proxy configuration can affect all networking. pipeline_affinity: PipelineAffinity::CrossCutting, }; - - /// `use_proxy_for_cloud_metadata` → `ProxyConfiguration::use_proxy_for_cloud_metadata` + /// `use_proxy_for_cloud_metadata`-Proxy cloud metadata endpoints USE_PROXY_FOR_CLOUD_METADATA = SalukiAnnotation { schema: &schema::USE_PROXY_FOR_CLOUD_METADATA, support_level: SupportLevel::Full, @@ -63,7 +58,6 @@ crate::declare_annotations! { used_by: &[structs::FORWARDER_CONFIGURATION, structs::PROXY_CONFIGURATION], value_type_override: None, test_json: None, - // Proxy configuration can affect all networking. pipeline_affinity: PipelineAffinity::CrossCutting, }; } diff --git a/lib/saluki-components/src/config_registry/datadog/tag_filterlist.rs b/lib/datadog-agent/config-testsupport/src/config_registry/tag_filterlist.rs similarity index 68% rename from lib/saluki-components/src/config_registry/datadog/tag_filterlist.rs rename to lib/datadog-agent/config-testsupport/src/config_registry/tag_filterlist.rs index b431bf0c8a6..4c2d078ebbf 100644 --- a/lib/saluki-components/src/config_registry/datadog/tag_filterlist.rs +++ b/lib/datadog-agent/config-testsupport/src/config_registry/tag_filterlist.rs @@ -1,10 +1,11 @@ -//! Annotations for metric tag filterlist transform configuration keys. -use crate::config_registry::{ - generated::schema, structs, Pipeline, PipelineAffinity, SalukiAnnotation, SupportLevel, ValueType, -}; +// @generated by build.rs from schema_overlay.yaml — DO NOT EDIT +#[allow(unused_imports)] +use super::schema; +#[allow(unused_imports)] +use super::*; crate::declare_annotations! { - /// `data_plane.dogstatsd.aggregator_tag_filter_cache_capacity`—maximum entries in the per-context deduplication cache used by ADP. + /// `data_plane.dogstatsd.aggregator_tag_filter_cache_capacity`-Tag-filter deduplication cache size DATA_PLANE_DOGSTATSD_AGGREGATOR_TAG_FILTER_CACHE_CAPACITY = SalukiAnnotation { schema: &schema::DATA_PLANE_DOGSTATSD_AGGREGATOR_TAG_FILTER_CACHE_CAPACITY, support_level: SupportLevel::Full, diff --git a/lib/saluki-components/src/config_registry/datadog/trace_obfuscation.rs b/lib/datadog-agent/config-testsupport/src/config_registry/trace_obfuscation.rs similarity index 70% rename from lib/saluki-components/src/config_registry/datadog/trace_obfuscation.rs rename to lib/datadog-agent/config-testsupport/src/config_registry/trace_obfuscation.rs index 7f98f608933..fcf128ca57c 100644 --- a/lib/saluki-components/src/config_registry/datadog/trace_obfuscation.rs +++ b/lib/datadog-agent/config-testsupport/src/config_registry/trace_obfuscation.rs @@ -1,13 +1,10 @@ -//! Annotations for trace obfuscation transform configuration keys. -use crate::config_registry::{ - generated::schema, structs, Pipeline, PipelineAffinity, SalukiAnnotation, Schema, SchemaEntry, SupportLevel, - ValueType, -}; - -// Custom statics for SQL obfuscation fields: no corresponding entries exist in the -// vendored Agent schema, so these are defined manually with the correct paths. +// @generated by build.rs from schema_overlay.yaml — DO NOT EDIT +#[allow(unused_imports)] +use super::schema; +#[allow(unused_imports)] +use super::*; -static SQL_DBMS: SchemaEntry = SchemaEntry { +static APM_CONFIG_OBFUSCATION_SQL_DBMS_SCHEMA: SchemaEntry = SchemaEntry { schema: Schema::Saluki, yaml_path: "apm_config.obfuscation.sql.dbms", env_vars: &[], @@ -15,7 +12,7 @@ static SQL_DBMS: SchemaEntry = SchemaEntry { default: None, }; -static SQL_DOLLAR_QUOTED: SchemaEntry = SchemaEntry { +static APM_CONFIG_OBFUSCATION_SQL_DOLLAR_QUOTED_FUNC_SCHEMA: SchemaEntry = SchemaEntry { schema: Schema::Saluki, yaml_path: "apm_config.obfuscation.sql.dollar_quoted_func", env_vars: &[], @@ -23,7 +20,7 @@ static SQL_DOLLAR_QUOTED: SchemaEntry = SchemaEntry { default: None, }; -static SQL_KEEP_ALIAS: SchemaEntry = SchemaEntry { +static APM_CONFIG_OBFUSCATION_SQL_KEEP_SQL_ALIAS_SCHEMA: SchemaEntry = SchemaEntry { schema: Schema::Saluki, yaml_path: "apm_config.obfuscation.sql.keep_sql_alias", env_vars: &[], @@ -31,7 +28,7 @@ static SQL_KEEP_ALIAS: SchemaEntry = SchemaEntry { default: None, }; -static SQL_REPLACE_DIGITS: SchemaEntry = SchemaEntry { +static APM_CONFIG_OBFUSCATION_SQL_REPLACE_DIGITS_SCHEMA: SchemaEntry = SchemaEntry { schema: Schema::Saluki, yaml_path: "apm_config.obfuscation.sql.replace_digits", env_vars: &[], @@ -39,7 +36,7 @@ static SQL_REPLACE_DIGITS: SchemaEntry = SchemaEntry { default: None, }; -static SQL_TABLE_NAMES: SchemaEntry = SchemaEntry { +static APM_CONFIG_OBFUSCATION_SQL_TABLE_NAMES_SCHEMA: SchemaEntry = SchemaEntry { schema: Schema::Saluki, yaml_path: "apm_config.obfuscation.sql.table_names", env_vars: &[], @@ -48,8 +45,8 @@ static SQL_TABLE_NAMES: SchemaEntry = SchemaEntry { }; crate::declare_annotations! { - /// `apm_config.obfuscation.credit_cards.enabled` - CONFIG_CREDIT_CARDS_ENABLED = SalukiAnnotation { + /// `apm_config.obfuscation.credit_cards.enabled`-apm_config.obfuscation.credit_cards.enabled + APM_CONFIG_OBFUSCATION_CREDIT_CARDS_ENABLED = SalukiAnnotation { schema: &schema::APM_CONFIG_OBFUSCATION_CREDIT_CARDS_ENABLED, support_level: SupportLevel::Full, additional_yaml_paths: &[], @@ -59,9 +56,8 @@ crate::declare_annotations! { test_json: Some("true"), pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::Traces]), }; - - /// `apm_config.obfuscation.credit_cards.keep_values` - CONFIG_CREDIT_CARDS_KEEP_VALUES = SalukiAnnotation { + /// `apm_config.obfuscation.credit_cards.keep_values`-apm_config.obfuscation.credit_cards.keep_values + APM_CONFIG_OBFUSCATION_CREDIT_CARDS_KEEP_VALUES = SalukiAnnotation { schema: &schema::APM_CONFIG_OBFUSCATION_CREDIT_CARDS_KEEP_VALUES, support_level: SupportLevel::Full, additional_yaml_paths: &[], @@ -71,9 +67,8 @@ crate::declare_annotations! { test_json: None, pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::Traces]), }; - - /// `apm_config.obfuscation.credit_cards.luhn` - CONFIG_CREDIT_CARDS_LUHN = SalukiAnnotation { + /// `apm_config.obfuscation.credit_cards.luhn`-apm_config.obfuscation.credit_cards.luhn + APM_CONFIG_OBFUSCATION_CREDIT_CARDS_LUHN = SalukiAnnotation { schema: &schema::APM_CONFIG_OBFUSCATION_CREDIT_CARDS_LUHN, support_level: SupportLevel::Full, additional_yaml_paths: &[], @@ -83,9 +78,8 @@ crate::declare_annotations! { test_json: None, pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::Traces]), }; - - /// `apm_config.obfuscation.elasticsearch.enabled` - CONFIG_ES_ENABLED = SalukiAnnotation { + /// `apm_config.obfuscation.elasticsearch.enabled`-apm_config.obfuscation.elasticsearch.enabled + APM_CONFIG_OBFUSCATION_ELASTICSEARCH_ENABLED = SalukiAnnotation { schema: &schema::APM_CONFIG_OBFUSCATION_ELASTICSEARCH_ENABLED, support_level: SupportLevel::Full, additional_yaml_paths: &[], @@ -95,9 +89,8 @@ crate::declare_annotations! { test_json: Some("true"), pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::Traces]), }; - - /// `apm_config.obfuscation.elasticsearch.keep_values` - CONFIG_ES_KEEP_VALUES = SalukiAnnotation { + /// `apm_config.obfuscation.elasticsearch.keep_values`-apm_config.obfuscation.elasticsearch.keep_values + APM_CONFIG_OBFUSCATION_ELASTICSEARCH_KEEP_VALUES = SalukiAnnotation { schema: &schema::APM_CONFIG_OBFUSCATION_ELASTICSEARCH_KEEP_VALUES, support_level: SupportLevel::Full, additional_yaml_paths: &[], @@ -107,9 +100,8 @@ crate::declare_annotations! { test_json: None, pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::Traces]), }; - - /// `apm_config.obfuscation.elasticsearch.obfuscate_sql_values` - CONFIG_ES_OBFUSCATE_SQL_VALUES = SalukiAnnotation { + /// `apm_config.obfuscation.elasticsearch.obfuscate_sql_values`-Obfuscate SQL values in ES queries + APM_CONFIG_OBFUSCATION_ELASTICSEARCH_OBFUSCATE_SQL_VALUES = SalukiAnnotation { schema: &schema::APM_CONFIG_OBFUSCATION_ELASTICSEARCH_OBFUSCATE_SQL_VALUES, support_level: SupportLevel::Full, additional_yaml_paths: &[], @@ -119,9 +111,8 @@ crate::declare_annotations! { test_json: None, pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::Traces]), }; - - /// `apm_config.obfuscation.http.remove_paths_with_digits` - CONFIG_HTTP_REMOVE_PATH_DIGITS = SalukiAnnotation { + /// `apm_config.obfuscation.http.remove_paths_with_digits`-Strip numeric segments from HTTP paths + APM_CONFIG_OBFUSCATION_HTTP_REMOVE_PATHS_WITH_DIGITS = SalukiAnnotation { schema: &schema::APM_CONFIG_OBFUSCATION_HTTP_REMOVE_PATHS_WITH_DIGITS, support_level: SupportLevel::Full, additional_yaml_paths: &[], @@ -131,9 +122,8 @@ crate::declare_annotations! { test_json: None, pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::Traces]), }; - - /// `apm_config.obfuscation.http.remove_query_string` - CONFIG_HTTP_REMOVE_QUERY_STRING = SalukiAnnotation { + /// `apm_config.obfuscation.http.remove_query_string`-apm_config.obfuscation.http.remove_query_string + APM_CONFIG_OBFUSCATION_HTTP_REMOVE_QUERY_STRING = SalukiAnnotation { schema: &schema::APM_CONFIG_OBFUSCATION_HTTP_REMOVE_QUERY_STRING, support_level: SupportLevel::Full, additional_yaml_paths: &[], @@ -143,9 +133,8 @@ crate::declare_annotations! { test_json: None, pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::Traces]), }; - - /// `apm_config.obfuscation.memcached.enabled` - CONFIG_MEMCACHED_ENABLED = SalukiAnnotation { + /// `apm_config.obfuscation.memcached.enabled`-apm_config.obfuscation.memcached.enabled + APM_CONFIG_OBFUSCATION_MEMCACHED_ENABLED = SalukiAnnotation { schema: &schema::APM_CONFIG_OBFUSCATION_MEMCACHED_ENABLED, support_level: SupportLevel::Full, additional_yaml_paths: &[], @@ -155,9 +144,8 @@ crate::declare_annotations! { test_json: Some("true"), pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::Traces]), }; - - /// `apm_config.obfuscation.memcached.keep_command` - CONFIG_MEMCACHED_KEEP_COMMAND = SalukiAnnotation { + /// `apm_config.obfuscation.memcached.keep_command`-apm_config.obfuscation.memcached.keep_command + APM_CONFIG_OBFUSCATION_MEMCACHED_KEEP_COMMAND = SalukiAnnotation { schema: &schema::APM_CONFIG_OBFUSCATION_MEMCACHED_KEEP_COMMAND, support_level: SupportLevel::Full, additional_yaml_paths: &[], @@ -167,9 +155,8 @@ crate::declare_annotations! { test_json: None, pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::Traces]), }; - - /// `apm_config.obfuscation.mongodb.enabled` - CONFIG_MONGO_ENABLED = SalukiAnnotation { + /// `apm_config.obfuscation.mongodb.enabled`-apm_config.obfuscation.mongodb.enabled + APM_CONFIG_OBFUSCATION_MONGODB_ENABLED = SalukiAnnotation { schema: &schema::APM_CONFIG_OBFUSCATION_MONGODB_ENABLED, support_level: SupportLevel::Full, additional_yaml_paths: &[], @@ -179,9 +166,8 @@ crate::declare_annotations! { test_json: Some("true"), pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::Traces]), }; - - /// `apm_config.obfuscation.mongodb.keep_values` - CONFIG_MONGO_KEEP_VALUES = SalukiAnnotation { + /// `apm_config.obfuscation.mongodb.keep_values`-apm_config.obfuscation.mongodb.keep_values + APM_CONFIG_OBFUSCATION_MONGODB_KEEP_VALUES = SalukiAnnotation { schema: &schema::APM_CONFIG_OBFUSCATION_MONGODB_KEEP_VALUES, support_level: SupportLevel::Full, additional_yaml_paths: &[], @@ -191,9 +177,8 @@ crate::declare_annotations! { test_json: None, pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::Traces]), }; - - /// `apm_config.obfuscation.mongodb.obfuscate_sql_values` - CONFIG_MONGO_OBFUSCATE_SQL_VALUES = SalukiAnnotation { + /// `apm_config.obfuscation.mongodb.obfuscate_sql_values`-Obfuscate SQL values in MongoDB queries + APM_CONFIG_OBFUSCATION_MONGODB_OBFUSCATE_SQL_VALUES = SalukiAnnotation { schema: &schema::APM_CONFIG_OBFUSCATION_MONGODB_OBFUSCATE_SQL_VALUES, support_level: SupportLevel::Full, additional_yaml_paths: &[], @@ -203,9 +188,8 @@ crate::declare_annotations! { test_json: None, pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::Traces]), }; - - /// `apm_config.obfuscation.opensearch.enabled` - CONFIG_OPEN_SEARCH_ENABLED = SalukiAnnotation { + /// `apm_config.obfuscation.opensearch.enabled`-apm_config.obfuscation.opensearch.enabled + APM_CONFIG_OBFUSCATION_OPENSEARCH_ENABLED = SalukiAnnotation { schema: &schema::APM_CONFIG_OBFUSCATION_OPENSEARCH_ENABLED, support_level: SupportLevel::Full, additional_yaml_paths: &[], @@ -215,9 +199,8 @@ crate::declare_annotations! { test_json: Some("true"), pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::Traces]), }; - - /// `apm_config.obfuscation.opensearch.keep_values` - CONFIG_OPEN_SEARCH_KEEP_VALUES = SalukiAnnotation { + /// `apm_config.obfuscation.opensearch.keep_values`-apm_config.obfuscation.opensearch.keep_values + APM_CONFIG_OBFUSCATION_OPENSEARCH_KEEP_VALUES = SalukiAnnotation { schema: &schema::APM_CONFIG_OBFUSCATION_OPENSEARCH_KEEP_VALUES, support_level: SupportLevel::Full, additional_yaml_paths: &[], @@ -227,9 +210,8 @@ crate::declare_annotations! { test_json: None, pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::Traces]), }; - - /// `apm_config.obfuscation.opensearch.obfuscate_sql_values` - CONFIG_OPEN_SEARCH_OBFUSCATE_SQL_VALUES = SalukiAnnotation { + /// `apm_config.obfuscation.opensearch.obfuscate_sql_values`-Obfuscate SQL values in OpenSearch queries + APM_CONFIG_OBFUSCATION_OPENSEARCH_OBFUSCATE_SQL_VALUES = SalukiAnnotation { schema: &schema::APM_CONFIG_OBFUSCATION_OPENSEARCH_OBFUSCATE_SQL_VALUES, support_level: SupportLevel::Full, additional_yaml_paths: &[], @@ -239,9 +221,8 @@ crate::declare_annotations! { test_json: None, pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::Traces]), }; - - /// `apm_config.obfuscation.redis.enabled` - CONFIG_REDIS_ENABLED = SalukiAnnotation { + /// `apm_config.obfuscation.redis.enabled`-apm_config.obfuscation.redis.enabled + APM_CONFIG_OBFUSCATION_REDIS_ENABLED = SalukiAnnotation { schema: &schema::APM_CONFIG_OBFUSCATION_REDIS_ENABLED, support_level: SupportLevel::Full, additional_yaml_paths: &[], @@ -251,9 +232,8 @@ crate::declare_annotations! { test_json: Some("true"), pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::Traces]), }; - - /// `apm_config.obfuscation.redis.remove_all_args` - CONFIG_REDIS_REMOVE_ALL_ARGS = SalukiAnnotation { + /// `apm_config.obfuscation.redis.remove_all_args`-apm_config.obfuscation.redis.remove_all_args + APM_CONFIG_OBFUSCATION_REDIS_REMOVE_ALL_ARGS = SalukiAnnotation { schema: &schema::APM_CONFIG_OBFUSCATION_REDIS_REMOVE_ALL_ARGS, support_level: SupportLevel::Full, additional_yaml_paths: &[], @@ -263,10 +243,9 @@ crate::declare_annotations! { test_json: None, pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::Traces]), }; - /// `apm_config.obfuscation.sql.dbms` - CONFIG_SQL_DBMS = SalukiAnnotation { - schema: &SQL_DBMS, + APM_CONFIG_OBFUSCATION_SQL_DBMS = SalukiAnnotation { + schema: &APM_CONFIG_OBFUSCATION_SQL_DBMS_SCHEMA, support_level: SupportLevel::Full, additional_yaml_paths: &[], env_var_override: None, @@ -275,10 +254,9 @@ crate::declare_annotations! { test_json: None, pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::Traces]), }; - /// `apm_config.obfuscation.sql.dollar_quoted_func` - CONFIG_SQL_DOLLAR_QUOTED_FUNC = SalukiAnnotation { - schema: &SQL_DOLLAR_QUOTED, + APM_CONFIG_OBFUSCATION_SQL_DOLLAR_QUOTED_FUNC = SalukiAnnotation { + schema: &APM_CONFIG_OBFUSCATION_SQL_DOLLAR_QUOTED_FUNC_SCHEMA, support_level: SupportLevel::Full, additional_yaml_paths: &[], env_var_override: None, @@ -287,10 +265,9 @@ crate::declare_annotations! { test_json: None, pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::Traces]), }; - /// `apm_config.obfuscation.sql.keep_sql_alias` - CONFIG_SQL_KEEP_SQL_ALIAS = SalukiAnnotation { - schema: &SQL_KEEP_ALIAS, + APM_CONFIG_OBFUSCATION_SQL_KEEP_SQL_ALIAS = SalukiAnnotation { + schema: &APM_CONFIG_OBFUSCATION_SQL_KEEP_SQL_ALIAS_SCHEMA, support_level: SupportLevel::Full, additional_yaml_paths: &[], env_var_override: None, @@ -299,10 +276,9 @@ crate::declare_annotations! { test_json: None, pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::Traces]), }; - /// `apm_config.obfuscation.sql.replace_digits` - CONFIG_SQL_REPLACE_DIGITS = SalukiAnnotation { - schema: &SQL_REPLACE_DIGITS, + APM_CONFIG_OBFUSCATION_SQL_REPLACE_DIGITS = SalukiAnnotation { + schema: &APM_CONFIG_OBFUSCATION_SQL_REPLACE_DIGITS_SCHEMA, support_level: SupportLevel::Full, additional_yaml_paths: &[], env_var_override: None, @@ -311,10 +287,9 @@ crate::declare_annotations! { test_json: None, pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::Traces]), }; - /// `apm_config.obfuscation.sql.table_names` - CONFIG_SQL_TABLE_NAMES = SalukiAnnotation { - schema: &SQL_TABLE_NAMES, + APM_CONFIG_OBFUSCATION_SQL_TABLE_NAMES = SalukiAnnotation { + schema: &APM_CONFIG_OBFUSCATION_SQL_TABLE_NAMES_SCHEMA, support_level: SupportLevel::Full, additional_yaml_paths: &[], env_var_override: None, @@ -323,9 +298,8 @@ crate::declare_annotations! { test_json: None, pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::Traces]), }; - - /// `apm_config.obfuscation.valkey.enabled` - CONFIG_VALKEY_ENABLED = SalukiAnnotation { + /// `apm_config.obfuscation.valkey.enabled`-apm_config.obfuscation.valkey.enabled + APM_CONFIG_OBFUSCATION_VALKEY_ENABLED = SalukiAnnotation { schema: &schema::APM_CONFIG_OBFUSCATION_VALKEY_ENABLED, support_level: SupportLevel::Full, additional_yaml_paths: &[], @@ -335,9 +309,8 @@ crate::declare_annotations! { test_json: Some("true"), pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::Traces]), }; - - /// `apm_config.obfuscation.valkey.remove_all_args` - CONFIG_VALKEY_REMOVE_ALL_ARGS = SalukiAnnotation { + /// `apm_config.obfuscation.valkey.remove_all_args`-apm_config.obfuscation.valkey.remove_all_args + APM_CONFIG_OBFUSCATION_VALKEY_REMOVE_ALL_ARGS = SalukiAnnotation { schema: &schema::APM_CONFIG_OBFUSCATION_VALKEY_REMOVE_ALL_ARGS, support_level: SupportLevel::Full, additional_yaml_paths: &[], diff --git a/lib/saluki-components/src/config_registry/datadog/unsupported.rs b/lib/datadog-agent/config-testsupport/src/config_registry/unsupported.rs similarity index 50% rename from lib/saluki-components/src/config_registry/datadog/unsupported.rs rename to lib/datadog-agent/config-testsupport/src/config_registry/unsupported.rs index b4b9a975ee8..6a2015e8473 100644 --- a/lib/saluki-components/src/config_registry/datadog/unsupported.rs +++ b/lib/datadog-agent/config-testsupport/src/config_registry/unsupported.rs @@ -1,11 +1,13 @@ -//! Annotations for configuration keys that Saluki doesn't support. -use crate::config_registry::{generated::schema, Pipeline, PipelineAffinity, SalukiAnnotation, Severity, SupportLevel}; +// @generated by build.rs from schema_overlay.yaml — DO NOT EDIT +#[allow(unused_imports)] +use super::schema; +#[allow(unused_imports)] +use super::*; crate::declare_annotations! { - /// `dogstatsd_disable_verbose_logs` - suppress noisy parse error logs. + /// `dogstatsd_disable_verbose_logs`-Suppress noisy parse error logs DOGSTATSD_DISABLE_VERBOSE_LOGS = SalukiAnnotation { schema: &schema::DOGSTATSD_DISABLE_VERBOSE_LOGS, - // ADP logs parse failures unconditionally, no toggle. #1350 support_level: SupportLevel::Incompatible(Severity::Medium), additional_yaml_paths: &[], env_var_override: None, @@ -14,11 +16,9 @@ crate::declare_annotations! { test_json: None, pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::DogStatsD]), }; - - /// `dogstatsd_pipe_name` - Windows named pipe path. + /// `dogstatsd_pipe_name`-Windows named pipe path DOGSTATSD_PIPE_NAME = SalukiAnnotation { schema: &schema::DOGSTATSD_PIPE_NAME, - // Windows support not implemented. #1466 support_level: SupportLevel::Incompatible(Severity::Medium), additional_yaml_paths: &[], env_var_override: None, @@ -27,11 +27,9 @@ crate::declare_annotations! { test_json: None, pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::DogStatsD]), }; - - /// `dogstatsd_stats_buffer` - internal stats buffer size. + /// `dogstatsd_stats_buffer`-Internal stats buffer size DOGSTATSD_STATS_BUFFER = SalukiAnnotation { schema: &schema::DOGSTATSD_STATS_BUFFER, - // No expvar stats endpoint in ADP. #1352 support_level: SupportLevel::Incompatible(Severity::Medium), additional_yaml_paths: &[], env_var_override: None, @@ -40,11 +38,9 @@ crate::declare_annotations! { test_json: None, pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::DogStatsD]), }; - - /// `dogstatsd_stats_enable` - enable internal stats endpoint. + /// `dogstatsd_stats_enable`-Enable internal stats endpoint DOGSTATSD_STATS_ENABLE = SalukiAnnotation { schema: &schema::DOGSTATSD_STATS_ENABLE, - // No expvar stats endpoint in ADP. #1352 support_level: SupportLevel::Incompatible(Severity::Medium), additional_yaml_paths: &[], env_var_override: None, @@ -53,11 +49,9 @@ crate::declare_annotations! { test_json: None, pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::DogStatsD]), }; - - /// `dogstatsd_stats_port` - internal stats endpoint port. + /// `dogstatsd_stats_port`-Internal stats endpoint port DOGSTATSD_STATS_PORT = SalukiAnnotation { schema: &schema::DOGSTATSD_STATS_PORT, - // No expvar stats endpoint in ADP. #1352 support_level: SupportLevel::Incompatible(Severity::Medium), additional_yaml_paths: &[], env_var_override: None, @@ -66,12 +60,10 @@ crate::declare_annotations! { test_json: None, pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::DogStatsD]), }; - - /// `dogstatsd_telemetry_enabled_listener_id` - per-listener telemetry tagging. + /// `dogstatsd_telemetry_enabled_listener_id`-Per-listener telemetry tagging DOGSTATSD_TELEMETRY_ENABLED_LISTENER_ID = SalukiAnnotation { schema: &schema::DOGSTATSD_TELEMETRY_ENABLED_LISTENER_ID, - // Not feasible to thread listener ID through ADP topology. Not planned. - support_level: SupportLevel::Incompatible(Severity::Medium), + support_level: SupportLevel::Incompatible(Severity::Low), additional_yaml_paths: &[], env_var_override: None, used_by: &[], @@ -79,11 +71,9 @@ crate::declare_annotations! { test_json: None, pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::DogStatsD]), }; - - /// `dogstatsd_windows_pipe_security_descriptor` - Windows named pipe ACL. + /// `dogstatsd_windows_pipe_security_descriptor`-Windows named pipe ACL descriptor DOGSTATSD_WINDOWS_PIPE_SECURITY_DESCRIPTOR = SalukiAnnotation { schema: &schema::DOGSTATSD_WINDOWS_PIPE_SECURITY_DESCRIPTOR, - // Windows support not implemented. #1466 support_level: SupportLevel::Incompatible(Severity::Medium), additional_yaml_paths: &[], env_var_override: None, @@ -92,180 +82,141 @@ crate::declare_annotations! { test_json: None, pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::DogStatsD]), }; - - /// `forwarder_apikey_validation_interval` - API key check interval. + /// `forwarder_apikey_validation_interval`-API key check interval (minutes) FORWARDER_APIKEY_VALIDATION_INTERVAL = SalukiAnnotation { schema: &schema::FORWARDER_APIKEY_VALIDATION_INTERVAL, - // Runtime API key refresh not implemented. #1357 support_level: SupportLevel::Incompatible(Severity::Medium), additional_yaml_paths: &[], env_var_override: None, used_by: &[], value_type_override: None, test_json: None, - // The forwarder is potentially used by any pipeline. pipeline_affinity: PipelineAffinity::CrossCutting, }; - - /// `forwarder_flush_to_disk_mem_ratio` - mem-to-disk flush threshold. + /// `forwarder_flush_to_disk_mem_ratio`-Mem-to-disk flush threshold FORWARDER_FLUSH_TO_DISK_MEM_RATIO = SalukiAnnotation { schema: &schema::FORWARDER_FLUSH_TO_DISK_MEM_RATIO, - // Not implemented. #1364 support_level: SupportLevel::Incompatible(Severity::Medium), additional_yaml_paths: &[], env_var_override: None, used_by: &[], value_type_override: None, test_json: None, - // The forwarder is potentially used by any pipeline. pipeline_affinity: PipelineAffinity::CrossCutting, }; - - /// `forwarder_low_prio_buffer_size` - low-priority request queue size. + /// `forwarder_low_prio_buffer_size`-Low-priority request queue size FORWARDER_LOW_PRIO_BUFFER_SIZE = SalukiAnnotation { schema: &schema::FORWARDER_LOW_PRIO_BUFFER_SIZE, - // ADP has no separate low-priority queue. #1362 support_level: SupportLevel::Incompatible(Severity::Medium), additional_yaml_paths: &[], env_var_override: None, used_by: &[], value_type_override: None, test_json: None, - // The forwarder is potentially used by any pipeline. pipeline_affinity: PipelineAffinity::CrossCutting, }; - - /// `forwarder_max_concurrent_requests` - max concurrent HTTP requests. + /// `forwarder_max_concurrent_requests`-Max concurrent HTTP requests FORWARDER_MAX_CONCURRENT_REQUESTS = SalukiAnnotation { schema: &schema::FORWARDER_MAX_CONCURRENT_REQUESTS, - // ADP concurrency model differs. #1363 support_level: SupportLevel::Incompatible(Severity::Medium), additional_yaml_paths: &[], env_var_override: None, used_by: &[], value_type_override: None, test_json: None, - // The forwarder is potentially used by any pipeline. pipeline_affinity: PipelineAffinity::CrossCutting, }; - - /// `forwarder_retry_queue_capacity_time_interval_sec` - retry queue time-based capacity. + /// `forwarder_retry_queue_capacity_time_interval_sec`-Retry queue time-based capacity FORWARDER_RETRY_QUEUE_CAPACITY_TIME_INTERVAL_SEC = SalukiAnnotation { schema: &schema::FORWARDER_RETRY_QUEUE_CAPACITY_TIME_INTERVAL_SEC, - // Not implemented. #1365 support_level: SupportLevel::Incompatible(Severity::Medium), additional_yaml_paths: &[], env_var_override: None, used_by: &[], value_type_override: None, test_json: None, - // The forwarder is potentially used by any pipeline. pipeline_affinity: PipelineAffinity::CrossCutting, }; - - /// `serializer_experimental_use_v3_api.compression_level` - V3 API compression level. + /// `serializer_experimental_use_v3_api.compression_level`-V3 API zstd compression level SERIALIZER_EXPERIMENTAL_USE_V3_API_COMPRESSION_LEVEL = SalukiAnnotation { schema: &schema::SERIALIZER_EXPERIMENTAL_USE_V3_API_COMPRESSION_LEVEL, - // V3 metrics API not implemented. #1468 support_level: SupportLevel::Incompatible(Severity::Low), additional_yaml_paths: &[], env_var_override: None, used_by: &[], value_type_override: None, test_json: None, - // Metrics encoder (dd_metrics_encode) is used by DogStatsD, Checks, and OTLP native (Traces active); APM traces use a separate encoder. pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::DogStatsD, Pipeline::Checks, Pipeline::Traces]), }; - - /// `serializer_experimental_use_v3_api.series.endpoints` - V3 API series endpoints. + /// `serializer_experimental_use_v3_api.series.endpoints`-Endpoints enabled for V3 series API SERIALIZER_EXPERIMENTAL_USE_V3_API_SERIES_ENDPOINTS = SalukiAnnotation { schema: &schema::SERIALIZER_EXPERIMENTAL_USE_V3_API_SERIES_ENDPOINTS, - // V3 metrics API not implemented. #1468 support_level: SupportLevel::Incompatible(Severity::Low), additional_yaml_paths: &[], env_var_override: None, used_by: &[], value_type_override: None, test_json: None, - // Metrics encoder (dd_metrics_encode) is used by DogStatsD, Checks, and OTLP native (Traces active); APM traces use a separate encoder. pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::DogStatsD, Pipeline::Checks, Pipeline::Traces]), }; - - /// `serializer_experimental_use_v3_api.series.validate` - V3 API series validation. + /// `serializer_experimental_use_v3_api.series.validate`-Dual-send v2+v3 series for validation SERIALIZER_EXPERIMENTAL_USE_V3_API_SERIES_VALIDATE = SalukiAnnotation { schema: &schema::SERIALIZER_EXPERIMENTAL_USE_V3_API_SERIES_VALIDATE, - // V3 metrics API not implemented. #1468 support_level: SupportLevel::Incompatible(Severity::Low), additional_yaml_paths: &[], env_var_override: None, used_by: &[], value_type_override: None, test_json: None, - // Metrics encoder (dd_metrics_encode) is used by DogStatsD, Checks, and OTLP native (Traces active); APM traces use a separate encoder. pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::DogStatsD, Pipeline::Checks, Pipeline::Traces]), }; - - /// `serializer_experimental_use_v3_api.sketches.endpoints` - V3 API sketches endpoints. + /// `serializer_experimental_use_v3_api.sketches.endpoints`-Endpoints enabling v3 sketches API SERIALIZER_EXPERIMENTAL_USE_V3_API_SKETCHES_ENDPOINTS = SalukiAnnotation { schema: &schema::SERIALIZER_EXPERIMENTAL_USE_V3_API_SKETCHES_ENDPOINTS, - // V3 metrics API not implemented. #1468 support_level: SupportLevel::Incompatible(Severity::Low), additional_yaml_paths: &[], env_var_override: None, used_by: &[], value_type_override: None, test_json: None, - // Metrics encoder (dd_metrics_encode) is used by DogStatsD, Checks, and OTLP native (Traces active); APM traces use a separate encoder. pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::DogStatsD, Pipeline::Checks, Pipeline::Traces]), }; - - /// `serializer_experimental_use_v3_api.sketches.validate` - V3 API sketches validation. + /// `serializer_experimental_use_v3_api.sketches.validate`-Dual-send v2+v3 sketches for validation SERIALIZER_EXPERIMENTAL_USE_V3_API_SKETCHES_VALIDATE = SalukiAnnotation { schema: &schema::SERIALIZER_EXPERIMENTAL_USE_V3_API_SKETCHES_VALIDATE, - // V3 metrics API not implemented. #1468 support_level: SupportLevel::Incompatible(Severity::Low), additional_yaml_paths: &[], env_var_override: None, used_by: &[], value_type_override: None, test_json: None, - // Metrics encoder (dd_metrics_encode) is used by DogStatsD, Checks, and OTLP native (Traces active); APM traces use a separate encoder. pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::DogStatsD, Pipeline::Checks, Pipeline::Traces]), }; - - - /// `sslkeylogfile` - TLS key log file path. + /// `sslkeylogfile`-TLS key log file path SSLKEYLOGFILE = SalukiAnnotation { schema: &schema::SSLKEYLOGFILE, - // Not implemented. #1372 support_level: SupportLevel::Incompatible(Severity::Medium), additional_yaml_paths: &[], env_var_override: None, used_by: &[], value_type_override: None, test_json: None, - // TLS is process-wide. pipeline_affinity: PipelineAffinity::CrossCutting, }; - - /// `tls_handshake_timeout` - HTTP TLS handshake timeout. + /// `tls_handshake_timeout`-HTTP TLS handshake timeout TLS_HANDSHAKE_TIMEOUT = SalukiAnnotation { schema: &schema::TLS_HANDSHAKE_TIMEOUT, - // Not implemented. Request timeout covers the gap. #178 support_level: SupportLevel::Incompatible(Severity::Medium), additional_yaml_paths: &[], env_var_override: None, used_by: &[], value_type_override: None, test_json: None, - // TLS is process-wide. pipeline_affinity: PipelineAffinity::CrossCutting, }; - - /// `aggregator_buffer_size` - aggregator input channel depth. + /// `aggregator_buffer_size`-Channel buffer depth for aggregator queues AGGREGATOR_BUFFER_SIZE = SalukiAnnotation { schema: &schema::AGGREGATOR_BUFFER_SIZE, - // Not implemented. #1681 support_level: SupportLevel::Incompatible(Severity::Low), additional_yaml_paths: &[], env_var_override: None, @@ -274,10 +225,9 @@ crate::declare_annotations! { test_json: None, pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::DogStatsD]), }; - /// `aggregator_flush_metrics_and_serialize_in_parallel_buffer_size` - parallel flush buffer size. + /// `aggregator_flush_metrics_and_serialize_in_parallel_buffer_size`-Parallel flush: series/sketch buffer size AGGREGATOR_FLUSH_METRICS_AND_SERIALIZE_IN_PARALLEL_BUFFER_SIZE = SalukiAnnotation { schema: &schema::AGGREGATOR_FLUSH_METRICS_AND_SERIALIZE_IN_PARALLEL_BUFFER_SIZE, - // Not implemented. #1681 support_level: SupportLevel::Incompatible(Severity::Low), additional_yaml_paths: &[], env_var_override: None, @@ -286,10 +236,9 @@ crate::declare_annotations! { test_json: None, pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::DogStatsD]), }; - /// `aggregator_flush_metrics_and_serialize_in_parallel_chan_size` - parallel flush channel size. + /// `aggregator_flush_metrics_and_serialize_in_parallel_chan_size`-Parallel flush: channel size AGGREGATOR_FLUSH_METRICS_AND_SERIALIZE_IN_PARALLEL_CHAN_SIZE = SalukiAnnotation { schema: &schema::AGGREGATOR_FLUSH_METRICS_AND_SERIALIZE_IN_PARALLEL_CHAN_SIZE, - // Not implemented. #1681 support_level: SupportLevel::Incompatible(Severity::Low), additional_yaml_paths: &[], env_var_override: None, @@ -298,10 +247,9 @@ crate::declare_annotations! { test_json: None, pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::DogStatsD]), }; - /// `aggregator_stop_timeout` - aggregator shutdown drain timeout. + /// `aggregator_stop_timeout`-Timeout (s) for aggregator flush on stop AGGREGATOR_STOP_TIMEOUT = SalukiAnnotation { schema: &schema::AGGREGATOR_STOP_TIMEOUT, - // Not implemented. #1681 support_level: SupportLevel::Incompatible(Severity::Low), additional_yaml_paths: &[], env_var_override: None, @@ -310,10 +258,9 @@ crate::declare_annotations! { test_json: None, pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::DogStatsD]), }; - /// `aggregator_use_tags_store` - shared tag deduplication store toggle. + /// `aggregator_use_tags_store`-Enable shared tag deduplication store AGGREGATOR_USE_TAGS_STORE = SalukiAnnotation { schema: &schema::AGGREGATOR_USE_TAGS_STORE, - // Not implemented. #1681 support_level: SupportLevel::Incompatible(Severity::Low), additional_yaml_paths: &[], env_var_override: None, @@ -322,36 +269,31 @@ crate::declare_annotations! { test_json: None, pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::DogStatsD]), }; - /// `autoscaling.failover.enabled` - autoscaling failover metric routing via DCA. + /// `autoscaling.failover.enabled`-Enable autoscaling failover metric routing AUTOSCALING_FAILOVER_ENABLED = SalukiAnnotation { schema: &schema::AUTOSCALING_FAILOVER_ENABLED, - // Not implemented. #1684 support_level: SupportLevel::Incompatible(Severity::Medium), additional_yaml_paths: &[], env_var_override: None, used_by: &[], value_type_override: None, test_json: None, - // Autoscaling failover routes metric series to the Cluster Agent for HPA; applies to DogStatsD and Checks metric producers, not APM. - pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::DogStatsD, Pipeline::Checks]), + pipeline_affinity: PipelineAffinity::CrossCutting, }; - /// `autoscaling.failover.metrics` - metric names forwarded to DCA for failover. + /// `autoscaling.failover.metrics`-Metric names forwarded to DCA for failover AUTOSCALING_FAILOVER_METRICS = SalukiAnnotation { schema: &schema::AUTOSCALING_FAILOVER_METRICS, - // Not implemented. #1684 support_level: SupportLevel::Incompatible(Severity::Medium), additional_yaml_paths: &[], env_var_override: None, used_by: &[], value_type_override: None, test_json: None, - // Autoscaling failover routes metric series to the Cluster Agent for HPA; applies to DogStatsD and Checks metric producers, not APM. - pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::DogStatsD, Pipeline::Checks]), + pipeline_affinity: PipelineAffinity::CrossCutting, }; - /// `dogstatsd_experimental_http.enabled` - experimental HTTP/H2C DSD listener toggle. + /// `dogstatsd_experimental_http.enabled`-Enable experimental HTTP/H2C DSD listener DOGSTATSD_EXPERIMENTAL_HTTP_ENABLED = SalukiAnnotation { schema: &schema::DOGSTATSD_EXPERIMENTAL_HTTP_ENABLED, - // Not implemented. #1682 support_level: SupportLevel::Incompatible(Severity::High), additional_yaml_paths: &[], env_var_override: None, @@ -360,10 +302,9 @@ crate::declare_annotations! { test_json: None, pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::DogStatsD]), }; - /// `dogstatsd_experimental_http.listen_address` - experimental HTTP DSD listener bind address. + /// `dogstatsd_experimental_http.listen_address`-Bind address for experimental HTTP DSD listener DOGSTATSD_EXPERIMENTAL_HTTP_LISTEN_ADDRESS = SalukiAnnotation { schema: &schema::DOGSTATSD_EXPERIMENTAL_HTTP_LISTEN_ADDRESS, - // Not implemented. #1682 support_level: SupportLevel::Incompatible(Severity::High), additional_yaml_paths: &[], env_var_override: None, @@ -372,107 +313,356 @@ crate::declare_annotations! { test_json: None, pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::DogStatsD]), }; - /// `forwarder_requeue_buffer_size` - forwarder in-memory requeue buffer size. + /// `forwarder_requeue_buffer_size`-In-memory re-queue buffer size FORWARDER_REQUEUE_BUFFER_SIZE = SalukiAnnotation { schema: &schema::FORWARDER_REQUEUE_BUFFER_SIZE, - // Not implemented. #1755 support_level: SupportLevel::Incompatible(Severity::Low), additional_yaml_paths: &[], env_var_override: None, used_by: &[], value_type_override: None, test_json: None, - // The forwarder is potentially used by any pipeline. pipeline_affinity: PipelineAffinity::CrossCutting, }; - /// `forwarder_stop_timeout` - forwarder graceful stop drain timeout. + /// `forwarder_stop_timeout`-Timeout (s) for forwarder graceful stop FORWARDER_STOP_TIMEOUT = SalukiAnnotation { schema: &schema::FORWARDER_STOP_TIMEOUT, - // Not implemented. #1754 support_level: SupportLevel::Incompatible(Severity::Low), additional_yaml_paths: &[], env_var_override: None, used_by: &[], value_type_override: None, test_json: None, - // The forwarder is potentially used by any pipeline. pipeline_affinity: PipelineAffinity::CrossCutting, }; - /// `heroku_dyno` - Heroku dyno name override for agent telemetry. + /// `heroku_dyno`-Heroku dyno telemetry mode HEROKU_DYNO = SalukiAnnotation { schema: &schema::HEROKU_DYNO, - // Not planned: this changes core Agent heartbeat telemetry in the Heroku Agent package - // path, where ADP is not launched. #1753 - support_level: SupportLevel::Incompatible(Severity::High), + support_level: SupportLevel::Incompatible(Severity::Low), additional_yaml_paths: &[], env_var_override: None, used_by: &[], value_type_override: None, test_json: None, - // Agent/host metadata applied to all payloads. pipeline_affinity: PipelineAffinity::CrossCutting, }; - /// `telemetry.dogstatsd.aggregator_channel_latency_buckets` - DSD-to-aggregator channel latency histogram buckets. + /// `telemetry.dogstatsd.aggregator_channel_latency_buckets`-Histogram buckets: DSD aggregator channel lag TELEMETRY_DOGSTATSD_AGGREGATOR_CHANNEL_LATENCY_BUCKETS = SalukiAnnotation { schema: &schema::TELEMETRY_DOGSTATSD_AGGREGATOR_CHANNEL_LATENCY_BUCKETS, - // Not implemented. #1679 support_level: SupportLevel::Incompatible(Severity::Low), additional_yaml_paths: &[], env_var_override: None, used_by: &[], value_type_override: None, test_json: None, - pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::DogStatsD]), + pipeline_affinity: PipelineAffinity::CrossCutting, }; - /// `telemetry.dogstatsd.listeners_channel_latency_buckets` - DSD listener channel latency histogram buckets. + /// `telemetry.dogstatsd.listeners_channel_latency_buckets`-Histogram buckets: listener channel latency TELEMETRY_DOGSTATSD_LISTENERS_CHANNEL_LATENCY_BUCKETS = SalukiAnnotation { schema: &schema::TELEMETRY_DOGSTATSD_LISTENERS_CHANNEL_LATENCY_BUCKETS, - // Not implemented. #1679 support_level: SupportLevel::Incompatible(Severity::Low), additional_yaml_paths: &[], env_var_override: None, used_by: &[], value_type_override: None, test_json: None, - pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::DogStatsD]), + pipeline_affinity: PipelineAffinity::CrossCutting, }; - /// `telemetry.dogstatsd.listeners_latency_buckets` - DSD listener processing latency histogram buckets. + /// `telemetry.dogstatsd.listeners_latency_buckets`-Histogram buckets: listener processing TELEMETRY_DOGSTATSD_LISTENERS_LATENCY_BUCKETS = SalukiAnnotation { schema: &schema::TELEMETRY_DOGSTATSD_LISTENERS_LATENCY_BUCKETS, - // Not implemented. #1679 support_level: SupportLevel::Incompatible(Severity::Low), additional_yaml_paths: &[], env_var_override: None, used_by: &[], value_type_override: None, test_json: None, - pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::DogStatsD]), + pipeline_affinity: PipelineAffinity::CrossCutting, }; - /// `telemetry.dogstatsd_origin` - per-origin processed-metric telemetry counters. + /// `telemetry.dogstatsd_origin`-Per-origin processed-metrics telemetry TELEMETRY_DOGSTATSD_ORIGIN = SalukiAnnotation { schema: &schema::TELEMETRY_DOGSTATSD_ORIGIN, - // Not implemented. #1679 support_level: SupportLevel::Incompatible(Severity::Low), additional_yaml_paths: &[], env_var_override: None, used_by: &[], value_type_override: None, test_json: None, - pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::DogStatsD]), + pipeline_affinity: PipelineAffinity::CrossCutting, }; - - /// `cluster_agent.enabled` - enable Cluster Agent connectivity. + /// `cluster_agent.enabled`-Enable Cluster Agent communication CLUSTER_AGENT_ENABLED = SalukiAnnotation { schema: &schema::CLUSTER_AGENT_ENABLED, - // Not implemented. Required for autoscaling failover routing. #1684 support_level: SupportLevel::Incompatible(Severity::Low), additional_yaml_paths: &[], env_var_override: None, used_by: &[], value_type_override: None, test_json: None, - // DCA connectivity is needed in Saluki for autoscaling failover (#1684), which affects DogStatsD and Checks metric pipelines. - pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::DogStatsD, Pipeline::Checks]), + pipeline_affinity: PipelineAffinity::CrossCutting, + }; + /// `config_id`-Fleet Automation config ID tag + CONFIG_ID = SalukiAnnotation { + schema: &schema::CONFIG_ID, + support_level: SupportLevel::Incompatible(Severity::Low), + additional_yaml_paths: &[], + env_var_override: None, + used_by: &[], + value_type_override: None, + test_json: None, + pipeline_affinity: PipelineAffinity::CrossCutting, + }; + /// `dogstatsd_host_socket_path`-Host UDS socket dir for DSD + DOGSTATSD_HOST_SOCKET_PATH = SalukiAnnotation { + schema: &schema::DOGSTATSD_HOST_SOCKET_PATH, + support_level: SupportLevel::Incompatible(Severity::Low), + additional_yaml_paths: &[], + env_var_override: None, + used_by: &[], + value_type_override: None, + test_json: None, + pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::DogStatsD]), + }; + /// `dogstatsd_mem_based_rate_limiter.enabled`-Memory-based rate limiter toggle + DOGSTATSD_MEM_BASED_RATE_LIMITER_ENABLED = SalukiAnnotation { + schema: &schema::DOGSTATSD_MEM_BASED_RATE_LIMITER_ENABLED, + support_level: SupportLevel::Incompatible(Severity::Low), + additional_yaml_paths: &[], + env_var_override: None, + used_by: &[], + value_type_override: None, + test_json: None, + pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::DogStatsD]), + }; + /// `dogstatsd_mem_based_rate_limiter.go_gc`-Memory rate limiter GC percent + DOGSTATSD_MEM_BASED_RATE_LIMITER_GO_GC = SalukiAnnotation { + schema: &schema::DOGSTATSD_MEM_BASED_RATE_LIMITER_GO_GC, + support_level: SupportLevel::Incompatible(Severity::Low), + additional_yaml_paths: &[], + env_var_override: None, + used_by: &[], + value_type_override: None, + test_json: None, + pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::DogStatsD]), + }; + /// `dogstatsd_mem_based_rate_limiter.high_soft_limit`-Memory rate limiter high soft limit + DOGSTATSD_MEM_BASED_RATE_LIMITER_HIGH_SOFT_LIMIT = SalukiAnnotation { + schema: &schema::DOGSTATSD_MEM_BASED_RATE_LIMITER_HIGH_SOFT_LIMIT, + support_level: SupportLevel::Incompatible(Severity::Low), + additional_yaml_paths: &[], + env_var_override: None, + used_by: &[], + value_type_override: None, + test_json: None, + pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::DogStatsD]), + }; + /// `dogstatsd_mem_based_rate_limiter.low_soft_limit`-Memory rate limiter low soft limit + DOGSTATSD_MEM_BASED_RATE_LIMITER_LOW_SOFT_LIMIT = SalukiAnnotation { + schema: &schema::DOGSTATSD_MEM_BASED_RATE_LIMITER_LOW_SOFT_LIMIT, + support_level: SupportLevel::Incompatible(Severity::Low), + additional_yaml_paths: &[], + env_var_override: None, + used_by: &[], + value_type_override: None, + test_json: None, + pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::DogStatsD]), + }; + /// `dogstatsd_mem_based_rate_limiter.memory_ballast`-Memory rate limiter heap ballast size + DOGSTATSD_MEM_BASED_RATE_LIMITER_MEMORY_BALLAST = SalukiAnnotation { + schema: &schema::DOGSTATSD_MEM_BASED_RATE_LIMITER_MEMORY_BALLAST, + support_level: SupportLevel::Incompatible(Severity::Low), + additional_yaml_paths: &[], + env_var_override: None, + used_by: &[], + value_type_override: None, + test_json: None, + pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::DogStatsD]), + }; + /// `dogstatsd_mem_based_rate_limiter.rate_check.factor`-Memory rate limiter check factor + DOGSTATSD_MEM_BASED_RATE_LIMITER_RATE_CHECK_FACTOR = SalukiAnnotation { + schema: &schema::DOGSTATSD_MEM_BASED_RATE_LIMITER_RATE_CHECK_FACTOR, + support_level: SupportLevel::Incompatible(Severity::Low), + additional_yaml_paths: &[], + env_var_override: None, + used_by: &[], + value_type_override: None, + test_json: None, + pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::DogStatsD]), + }; + /// `dogstatsd_mem_based_rate_limiter.rate_check.max`-Memory rate limiter check max interval + DOGSTATSD_MEM_BASED_RATE_LIMITER_RATE_CHECK_MAX = SalukiAnnotation { + schema: &schema::DOGSTATSD_MEM_BASED_RATE_LIMITER_RATE_CHECK_MAX, + support_level: SupportLevel::Incompatible(Severity::Low), + additional_yaml_paths: &[], + env_var_override: None, + used_by: &[], + value_type_override: None, + test_json: None, + pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::DogStatsD]), + }; + /// `dogstatsd_mem_based_rate_limiter.rate_check.min`-Memory rate limiter check min interval + DOGSTATSD_MEM_BASED_RATE_LIMITER_RATE_CHECK_MIN = SalukiAnnotation { + schema: &schema::DOGSTATSD_MEM_BASED_RATE_LIMITER_RATE_CHECK_MIN, + support_level: SupportLevel::Incompatible(Severity::Low), + additional_yaml_paths: &[], + env_var_override: None, + used_by: &[], + value_type_override: None, + test_json: None, + pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::DogStatsD]), + }; + /// `dogstatsd_mem_based_rate_limiter.soft_limit_freeos_check.factor`-Memory rate limiter FreeOS check factor + DOGSTATSD_MEM_BASED_RATE_LIMITER_SOFT_LIMIT_FREEOS_CHECK_FACTOR = SalukiAnnotation { + schema: &schema::DOGSTATSD_MEM_BASED_RATE_LIMITER_SOFT_LIMIT_FREEOS_CHECK_FACTOR, + support_level: SupportLevel::Incompatible(Severity::Low), + additional_yaml_paths: &[], + env_var_override: None, + used_by: &[], + value_type_override: None, + test_json: None, + pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::DogStatsD]), + }; + /// `dogstatsd_mem_based_rate_limiter.soft_limit_freeos_check.max`-Memory rate limiter FreeOS check max + DOGSTATSD_MEM_BASED_RATE_LIMITER_SOFT_LIMIT_FREEOS_CHECK_MAX = SalukiAnnotation { + schema: &schema::DOGSTATSD_MEM_BASED_RATE_LIMITER_SOFT_LIMIT_FREEOS_CHECK_MAX, + support_level: SupportLevel::Incompatible(Severity::Low), + additional_yaml_paths: &[], + env_var_override: None, + used_by: &[], + value_type_override: None, + test_json: None, + pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::DogStatsD]), + }; + /// `dogstatsd_mem_based_rate_limiter.soft_limit_freeos_check.min`-Memory rate limiter FreeOS check min + DOGSTATSD_MEM_BASED_RATE_LIMITER_SOFT_LIMIT_FREEOS_CHECK_MIN = SalukiAnnotation { + schema: &schema::DOGSTATSD_MEM_BASED_RATE_LIMITER_SOFT_LIMIT_FREEOS_CHECK_MIN, + support_level: SupportLevel::Incompatible(Severity::Low), + additional_yaml_paths: &[], + env_var_override: None, + used_by: &[], + value_type_override: None, + test_json: None, + pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::DogStatsD]), + }; + /// `dogstatsd_no_aggregation_pipeline_batch_size`-No-aggregation pipeline batch size + DOGSTATSD_NO_AGGREGATION_PIPELINE_BATCH_SIZE = SalukiAnnotation { + schema: &schema::DOGSTATSD_NO_AGGREGATION_PIPELINE_BATCH_SIZE, + support_level: SupportLevel::Incompatible(Severity::Low), + additional_yaml_paths: &[], + env_var_override: None, + used_by: &[], + value_type_override: None, + test_json: None, + pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::DogStatsD]), + }; + /// `dogstatsd_packet_buffer_flush_timeout`-Packet buffer flush timeout + DOGSTATSD_PACKET_BUFFER_FLUSH_TIMEOUT = SalukiAnnotation { + schema: &schema::DOGSTATSD_PACKET_BUFFER_FLUSH_TIMEOUT, + support_level: SupportLevel::Incompatible(Severity::Low), + additional_yaml_paths: &[], + env_var_override: None, + used_by: &[], + value_type_override: None, + test_json: None, + pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::DogStatsD]), + }; + /// `dogstatsd_packet_buffer_size`-Datagrams per packet buffer + DOGSTATSD_PACKET_BUFFER_SIZE = SalukiAnnotation { + schema: &schema::DOGSTATSD_PACKET_BUFFER_SIZE, + support_level: SupportLevel::Incompatible(Severity::Low), + additional_yaml_paths: &[], + env_var_override: None, + used_by: &[], + value_type_override: None, + test_json: None, + pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::DogStatsD]), + }; + /// `dogstatsd_pipeline_autoadjust`-Auto-adjust pipeline workers + DOGSTATSD_PIPELINE_AUTOADJUST = SalukiAnnotation { + schema: &schema::DOGSTATSD_PIPELINE_AUTOADJUST, + support_level: SupportLevel::Incompatible(Severity::Low), + additional_yaml_paths: &[], + env_var_override: None, + used_by: &[], + value_type_override: None, + test_json: None, + pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::DogStatsD]), + }; + /// `dogstatsd_pipeline_count`-Parallel processing pipelines + DOGSTATSD_PIPELINE_COUNT = SalukiAnnotation { + schema: &schema::DOGSTATSD_PIPELINE_COUNT, + support_level: SupportLevel::Incompatible(Severity::Low), + additional_yaml_paths: &[], + env_var_override: None, + used_by: &[], + value_type_override: None, + test_json: None, + pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::DogStatsD]), + }; + /// `dogstatsd_queue_size`-Packet channel buffer size + DOGSTATSD_QUEUE_SIZE = SalukiAnnotation { + schema: &schema::DOGSTATSD_QUEUE_SIZE, + support_level: SupportLevel::Incompatible(Severity::Low), + additional_yaml_paths: &[], + env_var_override: None, + used_by: &[], + value_type_override: None, + test_json: None, + pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::DogStatsD]), + }; + /// `dogstatsd_workers_count`-Number of DSD processing workers + DOGSTATSD_WORKERS_COUNT = SalukiAnnotation { + schema: &schema::DOGSTATSD_WORKERS_COUNT, + support_level: SupportLevel::Incompatible(Severity::Low), + additional_yaml_paths: &[], + env_var_override: None, + used_by: &[], + value_type_override: None, + test_json: None, + pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::DogStatsD]), + }; + /// `enable_json_stream_shared_compressor_buffers`-Pre-allocate shared compressor buffers + ENABLE_JSON_STREAM_SHARED_COMPRESSOR_BUFFERS = SalukiAnnotation { + schema: &schema::ENABLE_JSON_STREAM_SHARED_COMPRESSOR_BUFFERS, + support_level: SupportLevel::Incompatible(Severity::Low), + additional_yaml_paths: &[], + env_var_override: None, + used_by: &[], + value_type_override: None, + test_json: None, + pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::DogStatsD, Pipeline::Checks, Pipeline::Traces]), + }; + /// `entity_id`-Agent pod entity ID + ENTITY_ID = SalukiAnnotation { + schema: &schema::ENTITY_ID, + support_level: SupportLevel::Incompatible(Severity::Low), + additional_yaml_paths: &[], + env_var_override: None, + used_by: &[], + value_type_override: None, + test_json: None, + pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::DogStatsD]), + }; + /// `logging_frequency`-Transaction success log interval + LOGGING_FREQUENCY = SalukiAnnotation { + schema: &schema::LOGGING_FREQUENCY, + support_level: SupportLevel::Incompatible(Severity::Low), + additional_yaml_paths: &[], + env_var_override: None, + used_by: &[], + value_type_override: None, + test_json: None, + pipeline_affinity: PipelineAffinity::CrossCutting, + }; + /// `use_dogstatsd`-Master DogStatsD enable toggle + USE_DOGSTATSD = SalukiAnnotation { + schema: &schema::USE_DOGSTATSD, + support_level: SupportLevel::Incompatible(Severity::Low), + additional_yaml_paths: &[], + env_var_override: None, + used_by: &[], + value_type_override: None, + test_json: None, + pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::DogStatsD]), }; - } diff --git a/lib/datadog-agent/config-testsupport/src/lib.rs b/lib/datadog-agent/config-testsupport/src/lib.rs new file mode 100644 index 00000000000..7df9dbe992a --- /dev/null +++ b/lib/datadog-agent/config-testsupport/src/lib.rs @@ -0,0 +1,7 @@ +// This crate's build.rs generates both the test-support config registry annotations AND the +// configuration documentation markdown. Doc generation lives here (not in the config crate) +// because it is a dev/CI concern, not a prod build artifact. +pub mod config_registry; + +mod smoke_test; +pub use smoke_test::run_config_smoke_tests; diff --git a/lib/saluki-components/src/config_registry/test_support.rs b/lib/datadog-agent/config-testsupport/src/smoke_test.rs similarity index 70% rename from lib/saluki-components/src/config_registry/test_support.rs rename to lib/datadog-agent/config-testsupport/src/smoke_test.rs index fe73815e222..ac696387e3c 100644 --- a/lib/saluki-components/src/config_registry/test_support.rs +++ b/lib/datadog-agent/config-testsupport/src/smoke_test.rs @@ -1,9 +1,9 @@ +use figment::Provider; use saluki_config::{ConfigurationLoader, GenericConfiguration}; use serde::Serialize; use serde_json::json; -use super::{SalukiAnnotation, ValueType, SUPPORTED_ANNOTATIONS}; -use crate::config::{DatadogRemapper, KEY_ALIASES}; +use crate::config_registry::{SalukiAnnotation, ValueType, SUPPORTED_ANNOTATIONS}; /// Test value injected for `String` keys. pub const TEST_STRING_VALUE: &str = "http://smoke-proxy.example.com:3128"; @@ -22,8 +22,6 @@ fn test_json_value(value_type: ValueType) -> serde_json::Value { } } -/// Returns the effective test value for an annotation, auto-flipping when the -/// generic value would match the schema default (which would leave the struct unchanged). fn effective_test_value(annotation: &SalukiAnnotation) -> serde_json::Value { let v = test_json_value(annotation.value_type()); if let Some(default_raw) = annotation.schema.default { @@ -31,8 +29,6 @@ fn effective_test_value(annotation: &SalukiAnnotation) -> serde_json::Value { if v == default_val { return match annotation.value_type() { ValueType::Bool => json!(!default_val.as_bool().unwrap_or(false)), - // For other types the generic values (URL, [list], 42, 1.5) are - // extremely unlikely to match any real default, so no flip needed. _ => v, }; } @@ -41,7 +37,6 @@ fn effective_test_value(annotation: &SalukiAnnotation) -> serde_json::Value { v } -/// Converts an injected JSON value back to the string format used by env var loading. fn json_value_to_env_string(value: &serde_json::Value, value_type: ValueType) -> String { match value_type { ValueType::Bool => value @@ -107,27 +102,38 @@ fn dd_env_var_to_test_key(env_var: &str) -> &str { env_var.strip_prefix("DD_").unwrap_or(env_var) } -async fn make_config_from_file(file_values: serde_json::Value) -> GenericConfiguration { +async fn make_config_from_file( + file_values: serde_json::Value, key_aliases: &'static [(&'static str, &'static str)], provider_factory: F, +) -> GenericConfiguration +where + P: Provider + Send + Sync + 'static, + F: FnOnce() -> P, +{ let (cfg, _) = ConfigurationLoader::for_tests_with_provider_factory( Some(file_values), None, false, - KEY_ALIASES, - DatadogRemapper::new, + key_aliases, + provider_factory, ) .await; cfg } -async fn make_config_from_env( +async fn make_config_from_env( base_file_values: &serde_json::Value, env_vars: &[(String, String)], -) -> GenericConfiguration { + key_aliases: &'static [(&'static str, &'static str)], provider_factory: F, +) -> GenericConfiguration +where + P: Provider + Send + Sync + 'static, + F: FnOnce() -> P, +{ let (cfg, _) = ConfigurationLoader::for_tests_with_provider_factory( Some(base_file_values.clone()), Some(env_vars), false, - KEY_ALIASES, - DatadogRemapper::new, + key_aliases, + provider_factory, ) .await; cfg @@ -135,36 +141,28 @@ async fn make_config_from_env( /// Runs smoke tests for all annotations registered to `struct_name` against a deserialized config struct `T`. /// -/// Annotations are discovered automatically from [`SUPPORTED_ANNOTATIONS`] by filtering on `used_by`— -/// there is no need to pass a list of keys explicitly. Register an annotation for a struct by -/// adding its name (from [`crate::config_registry::structs`]) to the annotation's `used_by` field. -/// /// Verifies three properties: /// -/// **Supported keys** (those registered to `struct_name`): loading the struct with the test value -/// set via the annotation's `yaml_path` and via each of its effective env vars must all produce -/// identical structs, and each must differ from the default (empty-config) struct. +/// **Supported keys**: loading the struct with the test value set via the annotation's `yaml_path` +/// and via each of its effective env vars must all produce identical structs, and each must differ +/// from the default (empty-config) struct. /// -/// **Unsupported keys** (all other annotations in `ALL_ANNOTATIONS`): loading the struct with -/// that key set must produce a struct identical to the default struct—that's, the struct is -/// unaffected. +/// **Unsupported keys**: loading the struct with that key set must produce a struct identical to the +/// default struct. /// /// **Full field coverage**: loading the struct with all supported keys set simultaneously must -/// produce a struct where every serialized leaf field differs from the default. This catches fields -/// that exist in the struct but have no registered annotation exercising them. Fields that are -/// intentionally not configuration-driven (for example, populated from runtime state) can be excluded by -/// passing their serialized paths in `non_config_fields` (for example, `&["workload_provider"]`). -/// -/// `base_config` is merged into every config load before test values are applied. Use this to -/// supply fields that are required for the struct to deserialize at all (for example, `api_key`). Pass -/// `json!({})` when no required fields are needed. +/// produce a struct where every serialized leaf field differs from the default. /// -/// `config_factory` converts a raw `GenericConfiguration` into the typed struct under test. -pub async fn run_config_smoke_tests( +/// `key_aliases` and `provider_factory` configure the test config loader. Pass the same aliases and +/// remapper factory used in production config loading. +pub async fn run_config_smoke_tests( struct_name: &'static str, non_config_fields: &[&str], base_config: serde_json::Value, config_factory: Factory, + key_aliases: &'static [(&'static str, &'static str)], provider_factory: PF, ) where T: PartialEq + Serialize, Factory: Fn(GenericConfiguration) -> T, + P: Provider + Send + Sync + 'static, + PF: Fn() -> P, { let keys: Vec<&'static SalukiAnnotation> = SUPPORTED_ANNOTATIONS .iter() @@ -172,11 +170,10 @@ pub async fn run_config_smoke_tests( .filter(|a| a.used_by.contains(&struct_name)) .collect(); - let default_struct = config_factory(make_config_from_file(base_config.clone()).await); + let default_struct = + config_factory(make_config_from_file(base_config.clone(), key_aliases, &provider_factory).await); let mut failures: Vec = Vec::new(); - // Supported keys: the canonical yaml_path and every additional yaml_path and env var is - // loaded independently; all must produce the same struct, and each must differ from the default. for annotation in &keys { let canonical_path = annotation.yaml_path(); let injected_value = match annotation.test_json { @@ -184,10 +181,11 @@ pub async fn run_config_smoke_tests( None => effective_test_value(annotation), }; let reference = config_factory( - make_config_from_file(merge_over_base( - &base_config, - yaml_path_to_json(canonical_path, injected_value.clone()), - )) + make_config_from_file( + merge_over_base(&base_config, yaml_path_to_json(canonical_path, injected_value.clone())), + key_aliases, + &provider_factory, + ) .await, ); @@ -197,16 +195,16 @@ pub async fn run_config_smoke_tests( is the test value the same as the default, or is the key not wired up?", canonical_path, )); - // Reference is invalid; skip comparisons for this key to avoid cascading noise. continue; } for yaml_path in annotation.additional_yaml_paths { let from_path = config_factory( - make_config_from_file(merge_over_base( - &base_config, - yaml_path_to_json(yaml_path, injected_value.clone()), - )) + make_config_from_file( + merge_over_base(&base_config, yaml_path_to_json(yaml_path, injected_value.clone())), + key_aliases, + &provider_factory, + ) .await, ); if from_path != reference { @@ -222,7 +220,8 @@ pub async fn run_config_smoke_tests( dd_env_var_to_test_key(env_var).to_string(), json_value_to_env_string(&injected_value, annotation.value_type()), )]; - let from_env = config_factory(make_config_from_env(&base_config, &env_pairs).await); + let from_env = + config_factory(make_config_from_env(&base_config, &env_pairs, key_aliases, &provider_factory).await); if from_env != reference { failures.push(format!( "env var '{}' produced a different struct than yaml_path '{}'", @@ -232,17 +231,20 @@ pub async fn run_config_smoke_tests( } } - // Unsupported keys: setting any of their yaml_paths must not change the struct. for annotation in SUPPORTED_ANNOTATIONS .iter() .filter(|a| !a.used_by.contains(&struct_name)) { for yaml_path in annotation.all_yaml_paths() { let with_foreign = config_factory( - make_config_from_file(merge_over_base( - &base_config, - yaml_path_to_json(yaml_path, test_json_value(annotation.value_type())), - )) + make_config_from_file( + merge_over_base( + &base_config, + yaml_path_to_json(yaml_path, test_json_value(annotation.value_type())), + ), + key_aliases, + &provider_factory, + ) .await, ); if with_foreign != default_struct { @@ -254,9 +256,6 @@ pub async fn run_config_smoke_tests( } } - // Full coverage: load all supported keys at once and verify every serialized leaf field - // differs from the default. Catches struct fields that exist and are populated from config - // but have no registered annotation exercising them. let mut all_vals = base_config.clone(); for annotation in keys { let val = match annotation.test_json { @@ -265,7 +264,7 @@ pub async fn run_config_smoke_tests( }; saluki_config::upsert(&mut all_vals, annotation.yaml_path(), val); } - let all_keys_struct = config_factory(make_config_from_file(all_vals).await); + let all_keys_struct = config_factory(make_config_from_file(all_vals, key_aliases, &provider_factory).await); let full_map = serde_json::to_value(&all_keys_struct).expect("failed to serialize struct with all keys set"); let default_map = serde_json::to_value(&default_struct).expect("failed to serialize default struct"); let mut unchanged = Vec::new(); diff --git a/lib/datadog-agent/config/Cargo.toml b/lib/datadog-agent/config/Cargo.toml new file mode 100644 index 00000000000..d394ca802e4 --- /dev/null +++ b/lib/datadog-agent/config/Cargo.toml @@ -0,0 +1,16 @@ +[package] +name = "datadog-agent-config" +version = "0.1.0" +edition = { workspace = true } +license = { workspace = true } +repository = { workspace = true } + +[dependencies] +serde_json = { workspace = true } + +[build-dependencies] +datadog-agent-config-overlay-model = { workspace = true } +indexmap = { workspace = true } + +[lints] +workspace = true diff --git a/lib/datadog-agent/config/build.rs b/lib/datadog-agent/config/build.rs new file mode 100644 index 00000000000..3d0c925ee45 --- /dev/null +++ b/lib/datadog-agent/config/build.rs @@ -0,0 +1,22 @@ +use std::path::PathBuf; + +use datadog_agent_config_overlay_model::{schema_gen, Files, SchemaOverlay}; + +#[path = "build/classifier_gen.rs"] +mod classifier_gen; + +fn main() { + let manifest_dir = PathBuf::from(env!("CARGO_MANIFEST_DIR")); + let files = Files::default(); + + println!("cargo:rerun-if-changed={}", files.schema.display()); + println!("cargo:rerun-if-changed={}", files.overlay.display()); + println!("cargo:rerun-if-changed=build.rs"); + println!("cargo:rerun-if-changed=build/classifier_gen.rs"); + + let schema_path = files.schema.clone(); + let overlay = SchemaOverlay::load(files).unwrap_or_else(|e| panic!("{e}")); + let schema_map = schema_gen::load_schema(&schema_path); + + classifier_gen::generate(&overlay, &schema_map, &manifest_dir); +} diff --git a/lib/datadog-agent/config/build/classifier_gen.rs b/lib/datadog-agent/config/build/classifier_gen.rs new file mode 100644 index 00000000000..1c7ac01b3ee --- /dev/null +++ b/lib/datadog-agent/config/build/classifier_gen.rs @@ -0,0 +1,121 @@ +use std::fmt::Write as _; +use std::path::Path; + +use datadog_agent_config_overlay_model::schema_gen::FieldInfo; +use datadog_agent_config_overlay_model::{PipelineAffinity, SchemaOverlay, Severity, SupportLevel}; +use indexmap::IndexMap; + +pub fn generate(overlay: &SchemaOverlay, schema_map: &IndexMap, manifest_dir: &Path) { + let mut out = String::new(); + writeln!( + out, + "// @generated by build.rs from core_schema.yaml + schema_overlay.yaml — DO NOT EDIT" + ) + .unwrap(); + writeln!(out, "// Regenerate by running `cargo build -p datadog-agent-config`.").unwrap(); + writeln!(out).unwrap(); + writeln!(out, "use super::*;").unwrap(); + writeln!(out).unwrap(); + writeln!(out, "pub(crate) static CLASSIFIER_ENTRIES: &[ClassifierEntry] = &[").unwrap(); + + // Only Partial entries from `supported` are actionable (they emit a warning at the call site). + // Full entries are silently skipped regardless, so they add no value to the classifier. + for (yaml_path, entry) in &overlay.supported { + if entry.support_level != SupportLevel::Partial { + continue; + } + let alias_lit = alias_literal(&entry.additional_yaml_paths); + let pipeline_affinity = overlay_pipeline_affinity_expr(&entry.pipelines); + let default_lit = schema_default_literal(yaml_path, schema_map); + + writeln!(out, " ClassifierEntry {{").unwrap(); + writeln!(out, " yaml_path: \"{}\",", yaml_path).unwrap(); + writeln!(out, " aliases: {},", alias_lit).unwrap(); + writeln!(out, " support_level: SupportLevel::Partial,").unwrap(); + writeln!(out, " pipeline_affinity: {},", pipeline_affinity).unwrap(); + writeln!(out, " default: {},", default_lit).unwrap(); + writeln!(out, " }},").unwrap(); + } + + for (yaml_path, entry) in &overlay.unsupported { + let severity = match entry.severity { + Severity::Low => "Severity::Low", + Severity::Medium => "Severity::Medium", + Severity::High => "Severity::High", + }; + let pipeline_affinity = overlay_pipeline_affinity_expr(&entry.pipelines); + let default_lit = schema_default_literal(yaml_path, schema_map); + + writeln!(out, " ClassifierEntry {{").unwrap(); + writeln!(out, " yaml_path: \"{}\",", yaml_path).unwrap(); + writeln!(out, " aliases: &[],").unwrap(); + writeln!(out, " support_level: SupportLevel::Incompatible({}),", severity).unwrap(); + writeln!(out, " pipeline_affinity: {},", pipeline_affinity).unwrap(); + writeln!(out, " default: {},", default_lit).unwrap(); + writeln!(out, " }},").unwrap(); + } + + for (yaml_path, entry) in &overlay.investigate { + let severity = match entry.severity { + Some(Severity::Low) => "Severity::Low", + Some(Severity::Medium) => "Severity::Medium", + Some(Severity::High) => "Severity::High", + None => continue, + }; + let default_lit = schema_default_literal(yaml_path, schema_map); + + writeln!(out, " ClassifierEntry {{").unwrap(); + writeln!(out, " yaml_path: \"{}\",", yaml_path).unwrap(); + writeln!(out, " aliases: &[],").unwrap(); + writeln!(out, " support_level: SupportLevel::Incompatible({}),", severity).unwrap(); + writeln!(out, " pipeline_affinity: PipelineAffinity::CrossCutting,").unwrap(); + writeln!(out, " default: {},", default_lit).unwrap(); + writeln!(out, " }},").unwrap(); + } + + writeln!(out, "];").unwrap(); + + let path = manifest_dir.join("src/classifier/classifier_data.rs"); + std::fs::write(&path, out).unwrap_or_else(|e| panic!("cannot write {}: {}", path.display(), e)); +} + +fn alias_literal(paths: &[String]) -> String { + if paths.is_empty() { + "&[]".to_string() + } else { + let items: Vec = paths.iter().map(|p| format!("\"{}\"", p)).collect(); + format!("&[{}]", items.join(", ")) + } +} + +fn schema_default_literal(yaml_path: &str, schema_map: &IndexMap) -> String { + if let Some(info) = schema_map.get(yaml_path) { + match &info.default { + Some(d) => format!( + "Some(\"{}\")", + datadog_agent_config_overlay_model::schema_gen::escape_str(d) + ), + None => "None".to_string(), + } + } else { + "None".to_string() + } +} + +fn overlay_pipeline_affinity_expr(pa: &PipelineAffinity) -> String { + match pa { + PipelineAffinity::CrossCutting => "PipelineAffinity::CrossCutting".to_string(), + PipelineAffinity::Pipelines(ps) => { + let parts: Vec<&str> = ps + .iter() + .map(|p| match p { + datadog_agent_config_overlay_model::Pipeline::DogStatsD => "Pipeline::DogStatsD", + datadog_agent_config_overlay_model::Pipeline::Checks => "Pipeline::Checks", + datadog_agent_config_overlay_model::Pipeline::Otlp => "Pipeline::Otlp", + datadog_agent_config_overlay_model::Pipeline::Traces => "Pipeline::Traces", + }) + .collect(); + format!("PipelineAffinity::Pipelines(&[{}])", parts.join(", ")) + } + } +} diff --git a/lib/saluki-components/vendor/core_schema.yaml b/lib/datadog-agent/config/schema/core_schema.yaml similarity index 100% rename from lib/saluki-components/vendor/core_schema.yaml rename to lib/datadog-agent/config/schema/core_schema.yaml diff --git a/lib/datadog-agent/config/schema/schema_overlay.yaml b/lib/datadog-agent/config/schema/schema_overlay.yaml new file mode 100644 index 00000000000..fd866e3095a --- /dev/null +++ b/lib/datadog-agent/config/schema/schema_overlay.yaml @@ -0,0 +1,3470 @@ +# Schema Overlay: the single source of truth file for managing Saluki's Datadog config inventory. +# +# This file lives side-by-side with the vendored Datadog Agent configuration schema. Every +# config key that exists in the schema must be represented here in the overlay. Validation happens +# during and after deserialization during build and tooling processes. +# +# There are four sections that must appear in the correct order: +# - supported: fully and partially supported keys +# - unsupported: keys that are either permanently or temporarily unsupported +# - investigate: keys that require investigation before we can say whether they should be supported +# - ignored: keys that ADP/Saluki intentionally and silently ignores +# +# Rust code and Markdown documentation are generated from the contents of this file. Your edits here +# have consequences downstream as follows (see the generator code to be certain): +# +# supported + support_level: full -> runtime classifier: Full; docs: "Transparent Settings" table +# +# supported + support_level: partial -> runtime classifier: Partial; docs: "Behavioral Differences" +# table; multi-line documentation renders as a detail block +# below the table +# +# unsupported + planned: true -> runtime classifier: Incompatible(severity); docs: "Being +# Worked On" table; issue required +# +# unsupported + planned: false -> runtime classifier: Incompatible(severity); docs: "Not +# Planned" table; single-line documentation fills the "Reason" +# column; multi-line renders as a detail block below the table +# +# investigate + severity set -> runtime classifier: Incompatible(severity, cross_cutting); +# docs: "Compatibility Unknown" table +# +# investigate + no severity -> no classifier entry (docs-only); "Compatibility Unknown" +# table +# +# ignored -> no classifier entry; no docs table entry +# +# Validation rules are somewhat complex. For complete rules, see the code in `config-overlay-model`, +# but here are some of the basics: +# +# - unsupported + planned: true requires issue; the build rejects entries that omit it +# - pipelines: [cross_cutting] must appear alone; cross_cutting mixed with other tokens is rejected +# - investigate entries without severity produce no runtime classifier entry and are docs-only +supported: + additional_endpoints: + support_level: full + used_by: [ ForwarderConfiguration ] + pipelines: [ cross_cutting ] + description: "Dual-ship to extra endpoints" + test_json: '{"smoke-host-1.example.com": ["smoke-api-key"]}' + additional_attributes: + config_registry_filename: forwarder.rs + + allow_arbitrary_tags: + support_level: full + used_by: [ ForwarderConfiguration ] + pipelines: [ cross_cutting ] + description: "Relax backend tag validation via HTTP header" + env_var_override: [ DD_ALLOW_ARBITRARY_TAGS ] + additional_attributes: + config_registry_filename: forwarder.rs + + api_key: + support_level: full + used_by: [ ForwarderConfiguration ] + pipelines: [ cross_cutting ] + description: "API key for endpoint auth" + additional_attributes: + config_registry_filename: forwarder.rs + + apm_config.obfuscation.credit_cards.enabled: + support_level: full + used_by: [ TraceObfuscationConfiguration ] + pipelines: [ traces ] + description: "apm_config.obfuscation.credit_cards.enabled" + test_json: 'true' + additional_attributes: + config_registry_filename: trace_obfuscation.rs + + apm_config.obfuscation.credit_cards.keep_values: + support_level: full + used_by: [ TraceObfuscationConfiguration ] + pipelines: [ traces ] + description: "apm_config.obfuscation.credit_cards.keep_values" + additional_attributes: + config_registry_filename: trace_obfuscation.rs + + apm_config.obfuscation.credit_cards.luhn: + support_level: full + used_by: [ TraceObfuscationConfiguration ] + pipelines: [ traces ] + description: "apm_config.obfuscation.credit_cards.luhn" + additional_attributes: + config_registry_filename: trace_obfuscation.rs + + apm_config.obfuscation.elasticsearch.enabled: + support_level: full + used_by: [ TraceObfuscationConfiguration ] + pipelines: [ traces ] + description: "apm_config.obfuscation.elasticsearch.enabled" + test_json: 'true' + additional_attributes: + config_registry_filename: trace_obfuscation.rs + + apm_config.obfuscation.elasticsearch.keep_values: + support_level: full + used_by: [ TraceObfuscationConfiguration ] + pipelines: [ traces ] + description: "apm_config.obfuscation.elasticsearch.keep_values" + additional_attributes: + config_registry_filename: trace_obfuscation.rs + + apm_config.obfuscation.elasticsearch.obfuscate_sql_values: + support_level: full + used_by: [ TraceObfuscationConfiguration ] + pipelines: [ traces ] + description: "Obfuscate SQL values in ES queries" + additional_attributes: + config_registry_filename: trace_obfuscation.rs + + apm_config.obfuscation.http.remove_paths_with_digits: + support_level: full + used_by: [ TraceObfuscationConfiguration ] + pipelines: [ traces ] + description: "Strip numeric segments from HTTP paths" + additional_attributes: + config_registry_filename: trace_obfuscation.rs + + apm_config.obfuscation.http.remove_query_string: + support_level: full + used_by: [ TraceObfuscationConfiguration ] + pipelines: [ traces ] + description: "apm_config.obfuscation.http.remove_query_string" + additional_attributes: + config_registry_filename: trace_obfuscation.rs + + apm_config.obfuscation.memcached.enabled: + support_level: full + used_by: [ TraceObfuscationConfiguration ] + pipelines: [ traces ] + description: "apm_config.obfuscation.memcached.enabled" + test_json: 'true' + additional_attributes: + config_registry_filename: trace_obfuscation.rs + + apm_config.obfuscation.memcached.keep_command: + support_level: full + used_by: [ TraceObfuscationConfiguration ] + pipelines: [ traces ] + description: "apm_config.obfuscation.memcached.keep_command" + additional_attributes: + config_registry_filename: trace_obfuscation.rs + + apm_config.obfuscation.mongodb.enabled: + support_level: full + used_by: [ TraceObfuscationConfiguration ] + pipelines: [ traces ] + description: "apm_config.obfuscation.mongodb.enabled" + test_json: 'true' + additional_attributes: + config_registry_filename: trace_obfuscation.rs + + apm_config.obfuscation.mongodb.keep_values: + support_level: full + used_by: [ TraceObfuscationConfiguration ] + pipelines: [ traces ] + description: "apm_config.obfuscation.mongodb.keep_values" + additional_attributes: + config_registry_filename: trace_obfuscation.rs + + apm_config.obfuscation.mongodb.obfuscate_sql_values: + support_level: full + used_by: [ TraceObfuscationConfiguration ] + pipelines: [ traces ] + description: "Obfuscate SQL values in MongoDB queries" + additional_attributes: + config_registry_filename: trace_obfuscation.rs + + apm_config.obfuscation.opensearch.enabled: + support_level: full + used_by: [ TraceObfuscationConfiguration ] + pipelines: [ traces ] + description: "apm_config.obfuscation.opensearch.enabled" + test_json: 'true' + additional_attributes: + config_registry_filename: trace_obfuscation.rs + + apm_config.obfuscation.opensearch.keep_values: + support_level: full + used_by: [ TraceObfuscationConfiguration ] + pipelines: [ traces ] + description: "apm_config.obfuscation.opensearch.keep_values" + additional_attributes: + config_registry_filename: trace_obfuscation.rs + + apm_config.obfuscation.opensearch.obfuscate_sql_values: + support_level: full + used_by: [ TraceObfuscationConfiguration ] + pipelines: [ traces ] + description: "Obfuscate SQL values in OpenSearch queries" + additional_attributes: + config_registry_filename: trace_obfuscation.rs + + apm_config.obfuscation.redis.enabled: + support_level: full + used_by: [ TraceObfuscationConfiguration ] + pipelines: [ traces ] + description: "apm_config.obfuscation.redis.enabled" + test_json: 'true' + additional_attributes: + config_registry_filename: trace_obfuscation.rs + + apm_config.obfuscation.redis.remove_all_args: + support_level: full + used_by: [ TraceObfuscationConfiguration ] + pipelines: [ traces ] + description: "apm_config.obfuscation.redis.remove_all_args" + additional_attributes: + config_registry_filename: trace_obfuscation.rs + + apm_config.obfuscation.valkey.enabled: + support_level: full + used_by: [ TraceObfuscationConfiguration ] + pipelines: [ traces ] + description: "apm_config.obfuscation.valkey.enabled" + test_json: 'true' + additional_attributes: + config_registry_filename: trace_obfuscation.rs + + apm_config.obfuscation.valkey.remove_all_args: + support_level: full + used_by: [ TraceObfuscationConfiguration ] + pipelines: [ traces ] + description: "apm_config.obfuscation.valkey.remove_all_args" + additional_attributes: + config_registry_filename: trace_obfuscation.rs + + bind_host: + support_level: full + used_by: [ DogStatsDConfiguration ] + pipelines: [ dogstatsd ] + description: "Global listen host fallback" + additional_attributes: + config_registry_filename: dogstatsd.rs + + cmd_port: + support_level: full + used_by: [ RemoteAgentClientConfiguration ] + pipelines: [ cross_cutting ] + description: "Datadog Agent IPC/CMD API port" + test_json: '5101' + additional_attributes: + config_registry_filename: get_typed.rs + + cri_connection_timeout: + support_level: full + used_by: [ ContainerdConfiguration ] + pipelines: [ cross_cutting ] + description: "CRI container runtime connection timeout (s)" + additional_attributes: + config_registry_filename: containerd.rs + + cri_query_timeout: + support_level: full + used_by: [ ContainerdConfiguration ] + pipelines: [ cross_cutting ] + description: "CRI container runtime query timeout (s)" + additional_attributes: + config_registry_filename: containerd.rs + + data_plane.dogstatsd.aggregator_tag_filter_cache_capacity: + support_level: full + used_by: [ TagFilterlistConfiguration ] + pipelines: [ dogstatsd ] + description: "Tag-filter deduplication cache size" + value_type_override: integer + additional_attributes: + config_registry_filename: tag_filterlist.rs + + dd_url: + support_level: full + used_by: [ ForwarderConfiguration ] + pipelines: [ cross_cutting ] + description: "Override intake endpoint URL" + additional_attributes: + config_registry_filename: forwarder.rs + + dogstatsd_buffer_size: + support_level: full + used_by: [ DogStatsDConfiguration ] + pipelines: [ dogstatsd ] + description: "Receive buffer size (bytes)" + value_type_override: integer + additional_attributes: + config_registry_filename: dogstatsd.rs + + dogstatsd_capture_depth: + support_level: full + used_by: [ DogStatsDConfiguration ] + pipelines: [ dogstatsd ] + description: "Traffic capture channel depth" + issue: "#1381" + value_type_override: integer + additional_attributes: + config_registry_filename: dogstatsd.rs + + dogstatsd_capture_path: + support_level: full + used_by: [ DogStatsDConfiguration ] + pipelines: [ dogstatsd ] + description: "Traffic capture file location" + issue: "#1381" + additional_attributes: + config_registry_filename: dogstatsd.rs + + dogstatsd_context_expiry_seconds: + support_level: full + used_by: [ DogStatsDConfiguration ] + pipelines: [ dogstatsd ] + description: "Context cache TTL (seconds)" + value_type_override: integer + additional_attributes: + config_registry_filename: dogstatsd.rs + + dogstatsd_entity_id_precedence: + support_level: full + used_by: [ DogStatsDConfiguration ] + pipelines: [ dogstatsd ] + description: "Entity ID over auto-detection" + env_var_override: [ DD_DOGSTATSD_ENTITY_ID_PRECEDENCE ] + additional_attributes: + config_registry_filename: dogstatsd.rs + + dogstatsd_eol_required: + support_level: full + used_by: [ DogStatsDConfiguration ] + pipelines: [ dogstatsd ] + description: "Require newline-terminated messages" + test_json: '["udp"]' + additional_attributes: + config_registry_filename: dogstatsd.rs + + dogstatsd_flush_incomplete_buckets: + support_level: full + used_by: [ AggregateConfiguration ] + pipelines: [ dogstatsd, checks ] + description: "Flush open buckets on shutdown" + additional_yaml_paths: [ aggregate_flush_open_windows ] + additional_attributes: + config_registry_filename: aggregate.rs + + dogstatsd_log_file: + support_level: full + used_by: [ DogStatsDDebugLogConfiguration ] + pipelines: [ dogstatsd ] + description: "DSD dedicated log file path" + additional_attributes: + config_registry_filename: dogstatsd.rs + + dogstatsd_log_file_max_rolls: + support_level: full + used_by: [ DogStatsDDebugLogConfiguration ] + pipelines: [ dogstatsd ] + description: "DSD log file max roll count" + value_type_override: integer + additional_attributes: + config_registry_filename: dogstatsd.rs + + dogstatsd_log_file_max_size: + support_level: full + used_by: [ DogStatsDDebugLogConfiguration ] + pipelines: [ dogstatsd ] + description: "DSD log file max size" + test_json: '"42MB"' + additional_attributes: + config_registry_filename: dogstatsd.rs + + dogstatsd_logging_enabled: + support_level: full + used_by: [ DogStatsDDebugLogConfiguration ] + pipelines: [ dogstatsd ] + description: "Enables DSD metric logging" + documentation: |- + ADP supports the core agent's DogStatsD metric debug log. To write this file, set + `dogstatsd_metrics_stats_enable: true`. `dogstatsd_logging_enabled` also must be `true`; + it defaults to `true`, so most configurations only need to enable + `dogstatsd_metrics_stats_enable`. + + When `dogstatsd_logging_enabled` is `true`, ADP connects an extra DogStatsD destination + to the decoded metric stream. The destination writes one line per metric sample with the + metric name, tags, count, and last-seen time while `dogstatsd_metrics_stats_enable` is + `true`. When `dogstatsd_metrics_stats_enable` is `false`, the destination drains decoded + metrics and drops them. This lets runtime configuration changes start and stop the debug + log without rebuilding the topology. + + The default `dogstatsd_log_file` path is + `/var/log/datadog/dogstatsd_info/dogstatsd-stats.log` on Linux and other Unix platforms, + `/opt/datadog-agent/logs/dogstatsd_info/dogstatsd-stats.log` on macOS, and + `%ProgramData%\datadog\logs\dogstatsd_info\dogstatsd-stats.log` on Windows. + + This debug log differs from the `dogstatsd_capture_*` settings. The debug log records + decoded metric summaries after DogStatsD parsing. The capture settings record raw + DogStatsD traffic for packet-level investigation. + additional_attributes: + config_registry_filename: dogstatsd.rs + + dogstatsd_mapper_cache_size: + support_level: partial + used_by: [ DogStatsDMapperConfiguration ] + pipelines: [ dogstatsd ] + description: "Mapper result LRU cache size" + documentation: |- + ADP and the core agent both cache mapper results to skip regex evaluation on repeat + metric names. With the default value of `1000`, and with any positive integer, behavior + matches the core agent: results are cached in an LRU keyed by the original metric name, + including a negative-cache entry for names that match no profile. + + The two implementations diverge when this setting is `0`. In the core agent, `0` is + rejected by the underlying LRU library, which causes the entire mapper to be silently + disabled: mapping profiles configured by `dogstatsd_mapper_profiles` are not applied. In + ADP, `0` disables the result cache only; mapping profiles still run, so each metric pays + the regex evaluation cost without amortization. + + If you previously set `dogstatsd_mapper_cache_size: 0` in the core agent to turn off the + mapper, clear `dogstatsd_mapper_profiles` instead when running ADP. + issue: "#1687" + value_type_override: integer + additional_attributes: + config_registry_filename: dogstatsd_mapper.rs + + dogstatsd_mapper_profiles: + support_level: full + used_by: [ DogStatsDMapperConfiguration ] + pipelines: [ dogstatsd ] + description: "Metric mapping profile definitions" + test_json: '[{"name":"test","prefix":"test.","mappings":[]}]' + additional_attributes: + config_registry_filename: dogstatsd_mapper.rs + + dogstatsd_metrics_stats_enable: + support_level: partial + used_by: [ DogStatsDDebugLogConfiguration ] + pipelines: [ dogstatsd ] + description: "Enable per-metric debug stats" + documentation: "See `dogstatsd_stats_enable`" + issue: "#1352" + additional_attributes: + config_registry_filename: dogstatsd.rs + + dogstatsd_no_aggregation_pipeline: + support_level: full + used_by: [ AggregateConfiguration, DogStatsDConfiguration ] + pipelines: [ dogstatsd, checks ] + description: "Enable no-agg timestamped path" + additional_attributes: + config_registry_filename: aggregate.rs + + dogstatsd_non_local_traffic: + support_level: full + used_by: [ DogStatsDConfiguration ] + pipelines: [ dogstatsd ] + description: "Accept non-localhost UDP/TCP" + additional_attributes: + config_registry_filename: dogstatsd.rs + + dogstatsd_origin_detection: + support_level: full + used_by: [ DogStatsDConfiguration ] + pipelines: [ dogstatsd ] + description: "Enable UDS origin detection" + env_var_override: [ DD_DOGSTATSD_ORIGIN_DETECTION ] + additional_attributes: + config_registry_filename: dogstatsd.rs + + dogstatsd_origin_detection_client: + support_level: full + used_by: [ DogStatsDConfiguration ] + pipelines: [ dogstatsd ] + description: "Honor client origin proto fields" + env_var_override: [ DD_DOGSTATSD_ORIGIN_DETECTION_CLIENT ] + additional_attributes: + config_registry_filename: dogstatsd.rs + + dogstatsd_origin_optout_enabled: + support_level: full + used_by: [ DogStatsDConfiguration ] + pipelines: [ dogstatsd ] + description: "Allow clients to opt out origin" + env_var_override: [ DD_DOGSTATSD_ORIGIN_OPTOUT_ENABLED ] + additional_attributes: + config_registry_filename: dogstatsd.rs + + dogstatsd_port: + support_level: full + used_by: [ DogStatsDConfiguration ] + pipelines: [ dogstatsd ] + description: "UDP listen port" + value_type_override: integer + additional_attributes: + config_registry_filename: dogstatsd.rs + + dogstatsd_so_rcvbuf: + support_level: full + used_by: [ DogStatsDConfiguration ] + pipelines: [ dogstatsd ] + description: "Socket receive buffer size" + value_type_override: integer + additional_attributes: + config_registry_filename: dogstatsd.rs + + dogstatsd_socket: + support_level: full + used_by: [ DogStatsDConfiguration ] + pipelines: [ dogstatsd ] + description: "UDS datagram socket path" + additional_attributes: + config_registry_filename: dogstatsd.rs + + + + dogstatsd_stream_log_too_big: + support_level: full + used_by: [ DogStatsDConfiguration ] + pipelines: [ dogstatsd ] + description: "Log oversized UDS stream frames" + additional_attributes: + config_registry_filename: dogstatsd.rs + + dogstatsd_stream_socket: + support_level: full + used_by: [ DogStatsDConfiguration ] + pipelines: [ dogstatsd ] + description: "UDS stream socket path" + additional_attributes: + config_registry_filename: dogstatsd.rs + + dogstatsd_string_interner_size: + support_level: full + used_by: [ DogStatsDConfiguration ] + pipelines: [ dogstatsd ] + description: "String interner capacity" + value_type_override: integer + additional_attributes: + config_registry_filename: dogstatsd.rs + + dogstatsd_tag_cardinality: + support_level: full + used_by: [ DogStatsDConfiguration ] + pipelines: [ dogstatsd ] + description: "Default tag cardinality level" + env_var_override: [ DD_DOGSTATSD_TAG_CARDINALITY ] + test_json: '"high"' + additional_attributes: + config_registry_filename: dogstatsd.rs + + dogstatsd_tags: + support_level: full + used_by: [ DogStatsDConfiguration ] + pipelines: [ dogstatsd ] + description: "Extra tags added to all DSD data" + additional_attributes: + config_registry_filename: dogstatsd.rs + + enable_payloads.events: + support_level: full + used_by: [ DogStatsDConfiguration ] + pipelines: [ dogstatsd ] + description: "Allow sending event payloads" + additional_attributes: + config_registry_filename: dogstatsd.rs + + enable_payloads.series: + support_level: full + used_by: [ DogStatsDConfiguration ] + pipelines: [ dogstatsd ] + description: "Allow sending series payloads" + additional_attributes: + config_registry_filename: dogstatsd.rs + + enable_payloads.service_checks: + support_level: full + used_by: [ DogStatsDConfiguration ] + pipelines: [ dogstatsd ] + description: "Allow sending service check payloads" + additional_attributes: + config_registry_filename: dogstatsd.rs + + enable_payloads.sketches: + support_level: full + used_by: [ DogStatsDConfiguration ] + pipelines: [ dogstatsd ] + description: "Allow sending sketch payloads" + additional_attributes: + config_registry_filename: dogstatsd.rs + + env: + support_level: full + used_by: [ DatadogApmStatsEncoderConfiguration, DatadogTraceConfiguration ] + pipelines: [ traces ] + description: "Agent environment name" + documentation: >- + ADP reads env but defaults to 'none' instead of the core agent's ''. Scope + is narrower in ADP (only traces/stats encoders). Neither implementation uses + env directly on the DogStatsD metrics path. + additional_attributes: + config_registry_filename: encoders.rs + + forwarder_backoff_base: + support_level: full + used_by: [ ForwarderConfiguration ] + pipelines: [ cross_cutting ] + description: "Retry backoff base (secs)" + additional_attributes: + config_registry_filename: forwarder.rs + + forwarder_backoff_factor: + support_level: full + used_by: [ ForwarderConfiguration ] + pipelines: [ cross_cutting ] + description: "Retry backoff jitter factor" + additional_attributes: + config_registry_filename: forwarder.rs + + forwarder_backoff_max: + support_level: full + used_by: [ ForwarderConfiguration ] + pipelines: [ cross_cutting ] + description: "Retry backoff ceiling (secs)" + additional_attributes: + config_registry_filename: forwarder.rs + + forwarder_connection_reset_interval: + support_level: full + used_by: [ ForwarderConfiguration ] + pipelines: [ cross_cutting ] + description: "HTTP conn reset interval (secs)" + value_type_override: integer + additional_attributes: + config_registry_filename: forwarder.rs + + forwarder_high_prio_buffer_size: + support_level: full + used_by: [ ForwarderConfiguration ] + pipelines: [ cross_cutting ] + description: "High-priority request queue size" + issue: "#1362" + value_type_override: integer + additional_attributes: + config_registry_filename: forwarder.rs + + forwarder_http_protocol: + support_level: full + used_by: [ ForwarderConfiguration ] + pipelines: [ cross_cutting ] + description: "HTTP version selection (auto/http1/http2)" + issue: "#1361" + test_json: '"http1"' + additional_attributes: + config_registry_filename: forwarder.rs + + forwarder_num_workers: + support_level: full + used_by: [ ForwarderConfiguration ] + pipelines: [ cross_cutting ] + description: "Concurrent forwarder workers" + value_type_override: integer + additional_attributes: + config_registry_filename: forwarder.rs + + forwarder_outdated_file_in_days: + support_level: full + used_by: [ ForwarderConfiguration ] + pipelines: [ cross_cutting ] + description: "Days before retry files are deleted" + issue: "#1360" + value_type_override: integer + additional_attributes: + config_registry_filename: forwarder.rs + + forwarder_recovery_interval: + support_level: full + used_by: [ ForwarderConfiguration ] + pipelines: [ cross_cutting ] + description: "Backoff recovery decrease factor" + value_type_override: integer + additional_attributes: + config_registry_filename: forwarder.rs + + forwarder_recovery_reset: + support_level: full + used_by: [ ForwarderConfiguration ] + pipelines: [ cross_cutting ] + description: "Reset errors on success" + additional_attributes: + config_registry_filename: forwarder.rs + + forwarder_retry_queue_max_size: + support_level: full + used_by: [ ForwarderConfiguration ] + pipelines: [ cross_cutting ] + description: "Retry queue max size (deprecated)" + value_type_override: integer + additional_attributes: + config_registry_filename: forwarder.rs + + forwarder_retry_queue_payloads_max_size: + support_level: full + used_by: [ ForwarderConfiguration ] + pipelines: [ cross_cutting ] + description: "Retry queue max size (bytes)" + value_type_override: integer + additional_attributes: + config_registry_filename: forwarder.rs + + forwarder_storage_max_disk_ratio: + support_level: full + used_by: [ ForwarderConfiguration ] + pipelines: [ cross_cutting ] + description: "Max disk usage ratio for retry" + additional_attributes: + config_registry_filename: forwarder.rs + + forwarder_storage_max_size_in_bytes: + support_level: full + used_by: [ ForwarderConfiguration ] + pipelines: [ cross_cutting ] + description: "Max on-disk retry storage size" + value_type_override: integer + additional_attributes: + config_registry_filename: forwarder.rs + + forwarder_storage_path: + support_level: full + used_by: [ ForwarderConfiguration ] + pipelines: [ cross_cutting ] + description: "On-disk retry storage directory" + additional_attributes: + config_registry_filename: forwarder.rs + + forwarder_timeout: + support_level: full + used_by: [ ForwarderConfiguration ] + pipelines: [ cross_cutting ] + description: "Forwarder HTTP request timeout" + value_type_override: integer + additional_attributes: + config_registry_filename: forwarder.rs + + histogram_aggregates: + support_level: full + used_by: [ AggregateConfiguration ] + pipelines: [ dogstatsd, checks ] + description: "Histogram aggregate statistics" + test_json: '["count"]' + additional_attributes: + config_registry_filename: aggregate.rs + + histogram_copy_to_distribution: + support_level: full + used_by: [ AggregateConfiguration ] + pipelines: [ dogstatsd, checks ] + description: "Copy histograms to distributions" + additional_attributes: + config_registry_filename: aggregate.rs + + histogram_copy_to_distribution_prefix: + support_level: full + used_by: [ AggregateConfiguration ] + pipelines: [ dogstatsd, checks ] + description: "Prefix for hist-to-dist copies" + additional_attributes: + config_registry_filename: aggregate.rs + + log_format_rfc3339: + support_level: full + used_by: [ get_typed ] + pipelines: [ cross_cutting ] + description: "Use RFC 3339 timestamps in log output" + additional_attributes: + config_registry_filename: get_typed.rs + + log_level: + support_level: partial + used_by: [ get_typed ] + pipelines: [ cross_cutting ] + description: "Log verbosity directives" + documentation: |- + ADP accepts `log_level` as the startup logging control. A plain level applies to + ADP-owned and Saluki-owned targets only, including `agent_data_plane`, `saluki_*`, and + runtime crates under `lib/`. + + ```yaml + log_level: debug + ``` + + This keeps third-party dependencies such as `hyper`, `tokio`, and `tonic` at their + default filtering unless you opt them in. + + To control dependency logs or set a global fallback, use advanced `EnvFilter` directives + in `log_level`. ADP applies those directive strings as configured: + + ```yaml + log_level: warn,agent_data_plane=debug,hyper=warn + ``` + additional_attributes: + config_registry_filename: get_typed.rs + + log_payloads: + support_level: full + used_by: [ DatadogEventsConfiguration, DatadogMetricsConfiguration, DatadogServiceChecksConfiguration ] + pipelines: [ checks, dogstatsd, traces ] + description: "Debug-log decoded payload contents before encoding" + documentation: |- + Set `log_payloads: true` and run with debug-level logging to see decoded payload objects + (scalar series metrics, sketches/distributions, events, and service checks) before they + enter Datadog encoders. These logs can contain high-volume customer data including metric + names, tags, host and container metadata, event text, and service check messages. Use this + setting only while diagnosing payload content. + + ADP does not dump the exact encoded JSON or protobuf HTTP request body, and it does not + log compressed wire payload bytes. + additional_attributes: + config_registry_filename: encoders.rs + + metric_filterlist: + support_level: full + used_by: [ DogStatsDPrefixFilterConfiguration ] + pipelines: [ dogstatsd ] + description: "Metric name blocklist" + additional_attributes: + config_registry_filename: dogstatsd_prefix_filter.rs + + metric_filterlist_match_prefix: + support_level: full + used_by: [ DogStatsDPrefixFilterConfiguration ] + pipelines: [ dogstatsd ] + description: "Blocklist uses prefix matching" + additional_attributes: + config_registry_filename: dogstatsd_prefix_filter.rs + + min_tls_version: + support_level: partial + used_by: [ ForwarderConfiguration ] + pipelines: [ cross_cutting ] + description: "Minimum TLS version for HTTPS connections" + documentation: |- + ADP supports `min_tls_version` for Datadog intake forwarding through the shared Datadog + forwarder. The default is `tlsv1.2`, which allows TLS 1.2 and TLS 1.3. To require TLS + 1.3 only, set `min_tls_version: tlsv1.3` or `DD_MIN_TLS_VERSION=tlsv1.3`. + + The core agent also accepts `tlsv1.0` and `tlsv1.1`. ADP accepts those values for + configuration compatibility, but clamps them to TLS 1.2 because ADP uses `rustls`, which + does not support TLS 1.0 or TLS 1.1. + + This setting does not affect ADP IPC, local privileged APIs, ADP control-plane clients, + OTLP proxying to the core agent, or unrelated HTTP clients. + env_var_override: [ DD_MIN_TLS_VERSION ] + additional_attributes: + config_registry_filename: forwarder.rs + + multi_region_failover.api_key: + support_level: full + used_by: [ MrfConfiguration ] + pipelines: [ cross_cutting ] + description: "API key for the failover-region endpoint" + env_var_override: [ DD_MULTI_REGION_FAILOVER_API_KEY ] + value_type_override: string + additional_attributes: + config_registry_filename: mrf.rs + + multi_region_failover.dd_url: + support_level: full + used_by: [ MrfConfiguration ] + pipelines: [ cross_cutting ] + description: "Failover intake URL" + env_var_override: [ DD_MULTI_REGION_FAILOVER_DD_URL ] + value_type_override: string + additional_attributes: + config_registry_filename: mrf.rs + + multi_region_failover.enabled: + support_level: partial + used_by: [ MrfConfiguration ] + pipelines: [ cross_cutting ] + description: "Enable multi-region failover mode" + documentation: |- + ADP supports multi-region failover for metrics. When `multi_region_failover.enabled` and + `multi_region_failover.failover_metrics` are both `true`, ADP forwards metrics to the + primary Datadog endpoint and to a second MRF endpoint. + + To enable the MRF metrics branch at startup, configure `multi_region_failover.api_key` + and one of `multi_region_failover.site` or `multi_region_failover.dd_url`. If the MRF + endpoint configuration is incomplete, ADP skips the MRF branch and continues forwarding + to the primary endpoint. + + ADP does not fall back to the primary `api_key`, `site`, or `dd_url` for MRF traffic. + `multi_region_failover.enabled` and endpoint selection are resolved at startup. + `multi_region_failover.failover_metrics`, `multi_region_failover.metric_allowlist`, and + `multi_region_failover.api_key` can refresh from live configuration after the MRF branch + is enabled. + + | Config Key | Behavior | Default | + | ---------------------------------------- | -------------------------------------------------------------------------- | ------- | + | `multi_region_failover.enabled` | Enables multi-region failover mode. | `false` | + | `multi_region_failover.failover_metrics` | Enables metrics forwarding to the failover region when MRF is enabled. | `false` | + | `multi_region_failover.metric_allowlist` | Exact metric names to forward to MRF. Empty or unset forwards all metrics. | `[]` | + | `multi_region_failover.api_key` | API key for the failover-region endpoint. | unset | + | `multi_region_failover.site` | Datadog site for the failover region, used as `https://app.mrf.`. | unset | + | `multi_region_failover.dd_url` | Explicit failover intake URL. Takes precedence over `site` when set. | unset | + env_var_override: [ DD_MULTI_REGION_FAILOVER_ENABLED ] + additional_attributes: + config_registry_filename: mrf.rs + + multi_region_failover.failover_metrics: + support_level: full + used_by: [ MrfConfiguration ] + pipelines: [ cross_cutting ] + description: "Enable metrics forwarding to failover region" + env_var_override: [ DD_MULTI_REGION_FAILOVER_FAILOVER_METRICS ] + additional_attributes: + config_registry_filename: mrf.rs + + multi_region_failover.metric_allowlist: + support_level: full + used_by: [ MrfConfiguration ] + pipelines: [ cross_cutting ] + description: "Metric name allowlist for MRF forwarding" + env_var_override: [ DD_MULTI_REGION_FAILOVER_METRIC_ALLOWLIST ] + value_type_override: string_list + additional_attributes: + config_registry_filename: mrf.rs + + multi_region_failover.site: + support_level: full + used_by: [ MrfConfiguration ] + pipelines: [ cross_cutting ] + description: "Datadog site for the failover region" + env_var_override: [ DD_MULTI_REGION_FAILOVER_SITE ] + value_type_override: string + additional_attributes: + config_registry_filename: mrf.rs + + no_proxy_nonexact_match: + support_level: full + used_by: [ ForwarderConfiguration, ProxyConfiguration ] + pipelines: [ cross_cutting ] + description: "Domain/CIDR `no_proxy` matching" + env_var_override: [ DD_NO_PROXY_NONEXACT_MATCH ] + additional_attributes: + config_registry_filename: proxy.rs + + observability_pipelines_worker.metrics.enabled: + support_level: full + used_by: [ ForwarderConfiguration ] + pipelines: [ cross_cutting ] + description: "Route metrics to OPW instance" + env_var_override: [ DD_OBSERVABILITY_PIPELINES_WORKER_METRICS_ENABLED ] + additional_attributes: + config_registry_filename: forwarder.rs + + observability_pipelines_worker.metrics.url: + support_level: full + used_by: [ ForwarderConfiguration ] + pipelines: [ cross_cutting ] + description: "OPW metrics intake URL" + env_var_override: [ DD_OBSERVABILITY_PIPELINES_WORKER_METRICS_URL ] + additional_attributes: + config_registry_filename: forwarder.rs + + origin_detection_unified: + support_level: full + used_by: [ DogStatsDConfiguration ] + pipelines: [ dogstatsd ] + description: "Unified origin detection mode" + env_var_override: [ DD_ORIGIN_DETECTION_UNIFIED ] + additional_attributes: + config_registry_filename: dogstatsd.rs + + otlp_config.logs.enabled: + support_level: full + used_by: [ OtlpConfiguration ] + pipelines: [ otlp ] + description: "otlp_config.logs.enabled" + test_json: 'false' + additional_attributes: + config_registry_filename: otlp.rs + + otlp_config.metrics.enabled: + support_level: full + used_by: [ OtlpConfiguration ] + pipelines: [ otlp ] + description: "otlp_config.metrics.enabled" + additional_attributes: + config_registry_filename: otlp.rs + + otlp_config.receiver.protocols.grpc.endpoint: + support_level: full + used_by: [ OtlpRelayConfiguration, OtlpConfiguration ] + pipelines: [ otlp ] + description: "otlp_config.receiver.protocols.grpc.endpoint" + additional_attributes: + config_registry_filename: otlp.rs + + otlp_config.receiver.protocols.grpc.max_recv_msg_size_mib: + support_level: full + used_by: [ OtlpRelayConfiguration, OtlpConfiguration ] + pipelines: [ otlp ] + description: "Max OTLP inbound gRPC message size (MiB)" + value_type_override: integer + additional_attributes: + config_registry_filename: otlp.rs + + otlp_config.receiver.protocols.grpc.transport: + support_level: full + used_by: [ OtlpRelayConfiguration, OtlpConfiguration ] + pipelines: [ otlp ] + description: "otlp_config.receiver.protocols.grpc.transport" + additional_attributes: + config_registry_filename: otlp.rs + + otlp_config.receiver.protocols.http.endpoint: + support_level: full + used_by: [ OtlpRelayConfiguration, OtlpConfiguration ] + pipelines: [ otlp ] + description: "otlp_config.receiver.protocols.http.endpoint" + additional_attributes: + config_registry_filename: otlp.rs + + otlp_config.traces.enabled: + support_level: full + used_by: [ OtlpDecoderConfiguration, OtlpConfiguration ] + pipelines: [ traces ] + description: "otlp_config.traces.enabled" + additional_attributes: + config_registry_filename: otlp.rs + + otlp_config.traces.internal_port: + support_level: full + used_by: [ OtlpDecoderConfiguration, OtlpConfiguration ] + pipelines: [ traces ] + description: "otlp_config.traces.internal_port" + value_type_override: integer + additional_attributes: + config_registry_filename: otlp.rs + + otlp_config.traces.probabilistic_sampler.sampling_percentage: + support_level: full + used_by: [ OtlpDecoderConfiguration, OtlpConfiguration ] + pipelines: [ traces ] + description: "OTLP trace sampling percentage" + additional_attributes: + config_registry_filename: otlp.rs + + provider_kind: + support_level: full + used_by: [ DogStatsDConfiguration ] + pipelines: [ dogstatsd ] + description: "Provider kind static tag" + env_var_override: [ DD_PROVIDER_KIND ] + additional_attributes: + config_registry_filename: dogstatsd.rs + + proxy.http: + support_level: full + used_by: [ ForwarderConfiguration, ProxyConfiguration ] + pipelines: [ cross_cutting ] + description: "HTTP proxy URL" + env_var_override: [ DD_PROXY_HTTP, HTTP_PROXY ] + additional_attributes: + config_registry_filename: proxy.rs + + proxy.https: + support_level: full + used_by: [ ForwarderConfiguration, ProxyConfiguration ] + pipelines: [ cross_cutting ] + description: "HTTPS proxy URL" + env_var_override: [ DD_PROXY_HTTPS, HTTPS_PROXY ] + additional_attributes: + config_registry_filename: proxy.rs + + proxy.no_proxy: + support_level: full + used_by: [ ForwarderConfiguration, ProxyConfiguration ] + pipelines: [ cross_cutting ] + description: "Hosts bypassing proxy" + env_var_override: [ DD_PROXY_NO_PROXY ] + additional_attributes: + config_registry_filename: proxy.rs + + serializer_compressor_kind: + support_level: full + used_by: [ DatadogEventsConfiguration, DatadogLogsConfiguration, DatadogMetricsConfiguration, DatadogServiceChecksConfiguration, DatadogTraceConfiguration ] + pipelines: [ cross_cutting ] + description: "Payload compression algorithm" + additional_attributes: + config_registry_filename: encoders.rs + + serializer_max_payload_size: + support_level: full + used_by: [ DatadogEventsConfiguration, DatadogMetricsConfiguration, DatadogServiceChecksConfiguration ] + pipelines: [ checks, dogstatsd ] + description: "Max compressed payload size (generic)" + value_type_override: integer + additional_attributes: + config_registry_filename: encoders.rs + + serializer_max_series_payload_size: + support_level: full + used_by: [ DatadogMetricsConfiguration ] + pipelines: [ checks, dogstatsd ] + description: "Max compressed V2 series payload size" + value_type_override: integer + additional_attributes: + config_registry_filename: encoders.rs + + serializer_max_series_points_per_payload: + support_level: full + used_by: [ DatadogMetricsConfiguration ] + pipelines: [ checks, dogstatsd ] + description: "Max data points per series payload" + value_type_override: integer + additional_attributes: + config_registry_filename: encoders.rs + + serializer_max_series_uncompressed_payload_size: + support_level: full + used_by: [ DatadogMetricsConfiguration ] + pipelines: [ checks, dogstatsd ] + description: "Max uncompressed V2 series payload size" + value_type_override: integer + additional_attributes: + config_registry_filename: encoders.rs + + serializer_max_uncompressed_payload_size: + support_level: full + used_by: [ DatadogEventsConfiguration, DatadogMetricsConfiguration, DatadogServiceChecksConfiguration ] + pipelines: [ checks, dogstatsd ] + description: "Max uncompressed payload size (generic)" + value_type_override: integer + additional_attributes: + config_registry_filename: encoders.rs + + serializer_zstd_compressor_level: + support_level: partial + used_by: [ DatadogEventsConfiguration, DatadogLogsConfiguration, DatadogMetricsConfiguration, DatadogServiceChecksConfiguration, DatadogTraceConfiguration ] + pipelines: [ cross_cutting ] + description: "Zstd compression level" + documentation: >- + ADP defaults to level 3 vs Agent level 1. ADP intentionally compresses + better. Key is recognized by both; default divergence is intentional. + value_type_override: integer + additional_attributes: + config_registry_filename: encoders.rs + + site: + support_level: full + used_by: [ ForwarderConfiguration ] + pipelines: [ cross_cutting ] + description: "Datadog site domain" + additional_attributes: + config_registry_filename: forwarder.rs + + skip_ssl_validation: + support_level: partial + used_by: [ ForwarderConfiguration ] + pipelines: [ cross_cutting ] + description: "Skip TLS cert validation" + documentation: |- + ADP supports `skip_ssl_validation` for Datadog intake forwarding through the shared + Datadog forwarder. The default is `false`, which preserves normal server certificate + validation. When enabled, this setting affects the Datadog intake clients used by metrics, + logs, traces, events, and service checks that flow through the shared forwarder. + + This setting does not affect ADP IPC, local privileged APIs, ADP control-plane clients, + OTLP proxying to the core agent, or unrelated HTTP clients. In FIPS builds, ADP rejects + `skip_ssl_validation: true` because disabling TLS certificate validation is not + FIPS-compliant. + env_var_override: [ DD_SKIP_SSL_VALIDATION ] + additional_attributes: + config_registry_filename: forwarder.rs + + statsd_forward_host: + support_level: partial + used_by: [ DogStatsDConfiguration ] + pipelines: [ dogstatsd ] + description: "UDP packet forwarding destination host" + documentation: |- + ADP supports DogStatsD forwarding when both `statsd_forward_host` and + `statsd_forward_port` are set. ADP forwards each framed DogStatsD message over UDP to the + configured destination before parsing, filtering, mapping, or aggregation. Forwarding + does not preserve the core Agent's packet-buffer grouping, so forwarded UDP datagrams may + be split differently while carrying the same DogStatsD messages. ADP logs setup failures + and tracks send failures through telemetry. + test_json: '"127.0.0.1"' + additional_attributes: + config_registry_filename: dogstatsd.rs + + statsd_forward_port: + support_level: full + used_by: [ DogStatsDConfiguration ] + pipelines: [ dogstatsd ] + description: "UDP packet forwarding destination port" + value_type_override: integer + test_json: '9125' + additional_attributes: + config_registry_filename: dogstatsd.rs + + statsd_metric_blocklist: + support_level: full + used_by: [ DogStatsDPrefixFilterConfiguration ] + pipelines: [ dogstatsd ] + description: "List of metric names to block/drop" + additional_attributes: + config_registry_filename: dogstatsd_prefix_filter.rs + + statsd_metric_blocklist_match_prefix: + support_level: full + used_by: [ DogStatsDPrefixFilterConfiguration ] + pipelines: [ dogstatsd ] + description: "Treat blocklist entries as prefixes" + additional_attributes: + config_registry_filename: dogstatsd_prefix_filter.rs + + statsd_metric_namespace: + support_level: full + used_by: [ DogStatsDPrefixFilterConfiguration ] + pipelines: [ dogstatsd ] + description: "Prefix prepended to all metric names" + additional_attributes: + config_registry_filename: dogstatsd_prefix_filter.rs + + statsd_metric_namespace_blacklist: + support_level: full + used_by: [ DogStatsDPrefixFilterConfiguration ] + pipelines: [ dogstatsd ] + description: "Prefixes exempt from namespace" + additional_yaml_paths: [ statsd_metric_namespace_blocklist ] + additional_attributes: + config_registry_filename: dogstatsd_prefix_filter.rs + + syslog_rfc: + support_level: full + used_by: [ get_typed ] + pipelines: [ cross_cutting ] + description: "Use RFC-style syslog header" + additional_attributes: + config_registry_filename: get_typed.rs + + syslog_uri: + support_level: full + used_by: [ get_typed ] + pipelines: [ cross_cutting ] + description: "Syslog destination URI" + additional_attributes: + config_registry_filename: get_typed.rs + + use_proxy_for_cloud_metadata: + support_level: full + used_by: [ ForwarderConfiguration, ProxyConfiguration ] + pipelines: [ cross_cutting ] + description: "Proxy cloud metadata endpoints" + env_var_override: [ DD_USE_PROXY_FOR_CLOUD_METADATA ] + additional_attributes: + config_registry_filename: proxy.rs + + use_v2_api.series: + support_level: full + used_by: [ DatadogMetricsConfiguration ] + pipelines: [ checks, dogstatsd ] + description: "Send series via V2 protobuf endpoint" + additional_attributes: + config_registry_filename: encoders.rs + + vector.metrics.enabled: + support_level: full + used_by: [ ForwarderConfiguration ] + pipelines: [ cross_cutting ] + description: "Route metrics to OPW (legacy alias)" + env_var_override: [ DD_VECTOR_METRICS_ENABLED ] + additional_attributes: + config_registry_filename: forwarder.rs + + vector.metrics.url: + support_level: full + used_by: [ ForwarderConfiguration ] + pipelines: [ cross_cutting ] + description: "OPW metrics intake URL (legacy alias)" + env_var_override: [ DD_VECTOR_METRICS_URL ] + additional_attributes: + config_registry_filename: forwarder.rs + + vsock_addr: + support_level: full + used_by: [ RemoteAgentClientConfiguration ] + pipelines: [ cross_cutting ] + description: "vsock address for Agent IPC endpoint" + test_json: '"host"' + additional_attributes: + config_registry_filename: get_typed.rs + +#################################################################################################### +# UNSUPPORTED +#################################################################################################### +unsupported: + aggregator_buffer_size: + severity: low + planned: false + pipelines: [ dogstatsd ] + description: "Channel buffer depth for aggregator queues" + documentation: >- + Saluki topology uses fixed interconnect sizes and construction-time wiring; + no per-component config knobs. + issue: "#1681" + + aggregator_flush_metrics_and_serialize_in_parallel_buffer_size: + severity: low + planned: false + pipelines: [ dogstatsd ] + description: "Parallel flush: series/sketch buffer size" + documentation: >- + Saluki topology uses fixed interconnect sizes; no per-component config knobs. + issue: "#1681" + + aggregator_flush_metrics_and_serialize_in_parallel_chan_size: + severity: low + planned: false + pipelines: [ dogstatsd ] + description: "Parallel flush: channel size" + documentation: >- + Saluki topology uses fixed interconnect sizes; no per-component config knobs. + issue: "#1681" + + aggregator_stop_timeout: + severity: low + planned: false + pipelines: [ dogstatsd ] + description: "Timeout (s) for aggregator flush on stop" + documentation: >- + Saluki topology uses fixed interconnect sizes and construction-time wiring; + no per-component config knobs. + issue: "#1681" + + aggregator_use_tags_store: + severity: low + planned: false + pipelines: [ dogstatsd ] + description: "Enable shared tag deduplication store" + documentation: >- + Core agent concept with no ADP analog. + issue: "#1681" + + config_id: + severity: low + planned: false + pipelines: [ cross_cutting ] + description: "Fleet Automation config ID tag" + documentation: >- + Core Agent uses this only on Agent HA telemetry metrics. + + dogstatsd_disable_verbose_logs: + severity: medium + planned: false + pipelines: [ dogstatsd ] + description: "Suppress noisy parse error logs" + documentation: >- + ADP does not emit the verbose parse-error logs that this key filters in + the core Agent, so there is nothing to suppress. + issue: "#1350" + + dogstatsd_experimental_http.enabled: + severity: high + planned: true + pipelines: [ dogstatsd ] + description: "Enable experimental HTTP/H2C DSD listener" + documentation: >- + Experimental HTTP/H2C DogStatsD ingestion endpoint; not needed for ADP. + issue: "#1682" + + dogstatsd_experimental_http.listen_address: + severity: high + planned: true + pipelines: [ dogstatsd ] + description: "Bind address for experimental HTTP DSD listener" + documentation: >- + Experimental HTTP/H2C DogStatsD ingestion endpoint; not needed for ADP. + issue: "#1682" + + dogstatsd_host_socket_path: + severity: low + planned: false + pipelines: [ dogstatsd ] + description: "Host UDS socket dir for DSD" + documentation: >- + Not read by DSD server; admission controller only. + + dogstatsd_mem_based_rate_limiter.enabled: + severity: low + planned: false + pipelines: [ dogstatsd ] + description: "Memory-based rate limiter toggle" + documentation: |- + The Core Agent exposes 11 keys under this prefix to apply backpressure when the Go + process approaches its memory limit. They work by manipulating Go's garbage collector + (`debug.SetGCPercent`, `debug.FreeOSMemory`), allocating a large heap ballast to adjust + GC heuristics, and blocking goroutines to slow packet ingestion. None of these mechanisms + have an equivalent in Rust, and ADP does not use a Go runtime. + + ADP takes a different approach to the same problem using explicit static memory accounting + and a process-level RSS limit. All 11 `dogstatsd_mem_based_rate_limiter.*` keys are not + planned. See [Memory Management](../memory.md) for details. + + dogstatsd_mem_based_rate_limiter.go_gc: + severity: low + planned: false + pipelines: [ dogstatsd ] + description: "Memory rate limiter GC percent" + documentation: >- + Go GC-specific; ADP uses `memory_limit` instead. + + dogstatsd_mem_based_rate_limiter.high_soft_limit: + severity: low + planned: false + pipelines: [ dogstatsd ] + description: "Memory rate limiter high soft limit" + documentation: >- + Go GC-specific; ADP uses `memory_limit` instead. + + dogstatsd_mem_based_rate_limiter.low_soft_limit: + severity: low + planned: false + pipelines: [ dogstatsd ] + description: "Memory rate limiter low soft limit" + documentation: >- + Go GC-specific; ADP uses `memory_limit` instead. + + dogstatsd_mem_based_rate_limiter.memory_ballast: + severity: low + planned: false + pipelines: [ dogstatsd ] + description: "Memory rate limiter heap ballast size" + documentation: >- + Go GC-specific; ADP uses `memory_limit` instead. + + dogstatsd_mem_based_rate_limiter.rate_check.factor: + severity: low + planned: false + pipelines: [ dogstatsd ] + description: "Memory rate limiter check factor" + documentation: >- + Go GC-specific; ADP uses `memory_limit` instead. + + dogstatsd_mem_based_rate_limiter.rate_check.max: + severity: low + planned: false + pipelines: [ dogstatsd ] + description: "Memory rate limiter check max interval" + documentation: >- + Go GC-specific; ADP uses `memory_limit` instead. + + dogstatsd_mem_based_rate_limiter.rate_check.min: + severity: low + planned: false + pipelines: [ dogstatsd ] + description: "Memory rate limiter check min interval" + documentation: >- + Go GC-specific; ADP uses `memory_limit` instead. + + dogstatsd_mem_based_rate_limiter.soft_limit_freeos_check.factor: + severity: low + planned: false + pipelines: [ dogstatsd ] + description: "Memory rate limiter FreeOS check factor" + documentation: >- + Go GC-specific; ADP uses `memory_limit` instead. + + dogstatsd_mem_based_rate_limiter.soft_limit_freeos_check.max: + severity: low + planned: false + pipelines: [ dogstatsd ] + description: "Memory rate limiter FreeOS check max" + documentation: >- + Go GC-specific; ADP uses `memory_limit` instead. + + dogstatsd_mem_based_rate_limiter.soft_limit_freeos_check.min: + severity: low + planned: false + pipelines: [ dogstatsd ] + description: "Memory rate limiter FreeOS check min" + documentation: >- + Go GC-specific; ADP uses `memory_limit` instead. + + dogstatsd_no_aggregation_pipeline_batch_size: + severity: low + planned: false + pipelines: [ dogstatsd ] + description: "No-aggregation pipeline batch size" + documentation: >- + Fixed in ADP topology. + + dogstatsd_packet_buffer_flush_timeout: + severity: low + planned: false + pipelines: [ dogstatsd ] + description: "Packet buffer flush timeout" + documentation: >- + ADP decodes inline. + + dogstatsd_packet_buffer_size: + severity: low + planned: false + pipelines: [ dogstatsd ] + description: "Datagrams per packet buffer" + documentation: >- + ADP decodes inline. + + dogstatsd_pipe_name: + severity: medium + planned: true + pipelines: [ dogstatsd ] + description: "Windows named pipe path" + documentation: >- + ADP targets Linux for initial GA; Windows support will follow. + issue: "#1466" + + dogstatsd_pipeline_autoadjust: + severity: low + planned: false + pipelines: [ dogstatsd ] + description: "Auto-adjust pipeline workers" + documentation: >- + ADP uses async tasks. + + dogstatsd_pipeline_count: + severity: low + planned: false + pipelines: [ dogstatsd ] + description: "Parallel processing pipelines" + documentation: >- + ADP uses async tasks. + + dogstatsd_queue_size: + severity: low + planned: false + pipelines: [ dogstatsd ] + description: "Packet channel buffer size" + documentation: >- + ADP uses async tasks. + + dogstatsd_stats_buffer: + severity: medium + planned: false + pipelines: [ dogstatsd ] + description: "Internal stats buffer size" + documentation: >- + ADP does not expose the core agent's packet-per-second expvar endpoint, + so there is no persistent stats endpoint buffer to configure. + issue: "#1352" + + dogstatsd_stats_enable: + severity: medium + planned: false + pipelines: [ dogstatsd ] + description: "Enable internal stats endpoint" + documentation: |- + ### DogStatsD statistics (`dogstatsd_stats_enable` / `dogstatsd_metrics_stats_enable`) + + The core agent has two DogStatsD statistics mechanisms with different scopes. + `dogstatsd_stats_enable` enables packet-level throughput statistics from a ring buffer, exposed as + Go expvar data on `dogstatsd_stats_port` (default `5000`). Operators must configure an OpenMetrics + check to scrape that endpoint before the data is submitted. `dogstatsd_metrics_stats_enable` + enables runtime-toggleable metric-level debug statistics that track count and last-seen time per + unique metric and tag combination. That data powers the core agent's `dogstatsd-stats` CLI command + and HTTP endpoint. + + ADP does not mirror the packet-level statistics config path. Instead, ADP provides an on-demand + metric-level view through a DogStatsD statistics destination that is always wired into the + topology, but only collects data during a time-bounded request. To collect statistics, run + `agent-data-plane dogstatsd stats --duration-secs N` or call the privileged + `/dogstatsd/stats?collection_duration_secs=N` API. The handler waits for the requested collection + window, then returns count and last-seen time per metric context inline as JSON. The CLI uses the + same API and renders the result as either summary or cardinality analysis. + + ADP also exposes aggregate DogStatsD counters through its internal telemetry scrape endpoint. This + endpoint is separate from `/dogstatsd/stats`: it does not return the per-metric count and last-seen + map, and it is not controlled by the core agent's `dogstatsd_stats_*` keys. See + [Scraping internal telemetry](../telemetry.md) for endpoint details and scrape examples. + + ADP does not expose the core agent's packet-per-second expvar endpoint or a persistent per-metric + DogStatsD statistics endpoint to scrape. You do not need to set up scraper configuration for this + per-metric data. The config keys `dogstatsd_stats_enable`, `dogstatsd_stats_buffer`, and + `dogstatsd_stats_port` have no effect in ADP. See [#1352]. + issue: "#1352" + + dogstatsd_stats_port: + severity: medium + planned: false + pipelines: [ dogstatsd ] + description: "Internal stats endpoint port" + documentation: >- + ADP does not expose the core agent's packet-per-second expvar endpoint, + so `dogstatsd_stats_port` has no effect. + issue: "#1352" + + dogstatsd_telemetry_enabled_listener_id: + severity: low + planned: false + pipelines: [ dogstatsd ] + description: "Per-listener telemetry tagging" + documentation: >- + Not feasible to thread listener identity through ADP's async decode pipeline. + + dogstatsd_windows_pipe_security_descriptor: + severity: medium + planned: true + pipelines: [ dogstatsd ] + description: "Windows named pipe ACL descriptor" + documentation: >- + Windows support is deferred but planned. + issue: "#1466" + + dogstatsd_workers_count: + severity: low + planned: false + pipelines: [ dogstatsd ] + description: "Number of DSD processing workers" + documentation: >- + ADP uses async tasks. + + enable_json_stream_shared_compressor_buffers: + severity: low + planned: false + pipelines: [ dogstatsd, checks, traces ] + description: "Pre-allocate shared compressor buffers" + documentation: >- + ADP does not use a shared compressor buffer pool; Rust request builders own fixed-capacity + scratch and compression buffers. + issue: "#1749" + + entity_id: + severity: low + planned: false + pipelines: [ dogstatsd ] + description: "Agent pod entity ID" + documentation: >- + ADP internal DogStatsD telemetry uses OpenMetrics. + + forwarder_apikey_validation_interval: + severity: medium + planned: true + pipelines: [ cross_cutting ] + description: "API key check interval (minutes)" + documentation: >- + Core agent supports runtime API key refresh without restart. ADP has partial + infrastructure (config-side listeners) but the forwarder does not act on updates. + issue: "#1357" + + heroku_dyno: + severity: low + planned: false + pipelines: [ cross_cutting ] + description: "Heroku dyno telemetry mode" + documentation: |- + The `heroku_dyno` setting affects the core Agent's self-telemetry heartbeat. It changes the Agent + flavor used by the core Agent aggregator so the running heartbeat is emitted as + `datadog.heroku_agent.running`. + + ADP does not run in the supported Heroku Agent package path: the Heroku Agent package excludes the + `agent-data-plane` dependency, and the Heroku Datadog launch script starts the core Agent, trace Agent, and + optionally process Agent without launching an `agent-data-plane` process. ADP also does not emit the + core Agent's `datadog..running` series. + + Because the affected heartbeat is core-Agent-owned and ADP is not part of the supported Heroku + deployment path, ADP does not implement `heroku_dyno`. See [#1753]. + issue: "#1753" + + logging_frequency: + severity: low + planned: false + pipelines: [ cross_cutting ] + description: "Transaction success log interval" + documentation: >- + The core agent uses `logging_frequency` to throttle repetitive successful transaction + logs. ADP logs successful forwarder operations below the default `info` level, so there + is no matching info-level success-log stream to throttle. This key is intentionally + unused. + + serializer_experimental_use_v3_api.compression_level: + severity: low + planned: true + pipelines: [ dogstatsd, checks, traces ] + description: "V3 API zstd compression level" + documentation: >- + V2 to V3 migration PR in progress. Feature is missing but actively being addressed. + issue: "#1468" + + serializer_experimental_use_v3_api.series.endpoints: + severity: low + planned: true + pipelines: [ dogstatsd, checks, traces ] + description: "Endpoints enabled for V3 series API" + documentation: >- + V2 to V3 migration PR in progress. Feature is missing but actively being addressed. + issue: "#1468" + + serializer_experimental_use_v3_api.series.validate: + severity: low + planned: true + pipelines: [ dogstatsd, checks, traces ] + description: "Dual-send v2+v3 series for validation" + documentation: >- + V2 to V3 migration PR in progress. Feature is missing but actively being addressed. + issue: "#1468" + + serializer_experimental_use_v3_api.sketches.endpoints: + severity: low + planned: true + pipelines: [ dogstatsd, checks, traces ] + description: "Endpoints enabling v3 sketches API" + documentation: >- + V2 to V3 migration PR in progress. Feature is missing but actively being addressed. + issue: "#1468" + + serializer_experimental_use_v3_api.sketches.validate: + severity: low + planned: true + pipelines: [ dogstatsd, checks, traces ] + description: "Dual-send v2+v3 sketches for validation" + documentation: >- + V2 to V3 migration PR in progress. Feature is missing but actively being addressed. + issue: "#1468" + + sslkeylogfile: + severity: medium + planned: true + pipelines: [ cross_cutting ] + description: "TLS key log file path" + documentation: >- + TLS key log file not implemented in ADP. + issue: "#1372" + + tls_handshake_timeout: + severity: medium + planned: true + pipelines: [ cross_cutting ] + description: "HTTP TLS handshake timeout" + documentation: >- + Existing request timeout covers the gap. + issue: "#178" + + + use_dogstatsd: + severity: low + planned: false + pipelines: [ dogstatsd ] + description: "Master DogStatsD enable toggle" + documentation: >- + Core Agent evaluates and sets `data_plane.dogstatsd.enabled`. + +#################################################################################################### +# INVESTIGATE +#################################################################################################### +investigate: + autoscaling.failover.enabled: + severity: medium + description: "Enable autoscaling failover metric routing" + documentation: >- + Marked for investigation; previously dismissed as not-applicable. + issue: "#1684" + + autoscaling.failover.metrics: + severity: medium + description: "Metric names forwarded to DCA for failover" + documentation: >- + Marked for investigation; previously dismissed as not-applicable. + issue: "#1684" + + cluster_agent.enabled: + severity: low + pipelines: [ dogstatsd, checks ] + description: "Enable Cluster Agent communication" + issue: "#1684" + + forwarder_flush_to_disk_mem_ratio: + severity: medium + description: "Mem-to-disk flush threshold" + issue: "#1364" + + forwarder_low_prio_buffer_size: + severity: medium + description: "Low-priority request queue size" + issue: "#1362" + + forwarder_max_concurrent_requests: + severity: medium + description: "Max concurrent HTTP requests" + issue: "#1363" + + forwarder_requeue_buffer_size: + severity: low + description: "In-memory re-queue buffer size" + issue: "#1755" + + forwarder_retry_queue_capacity_time_interval_sec: + severity: medium + description: "Retry queue time-based capacity" + issue: "#1365" + + forwarder_stop_timeout: + severity: low + description: "Timeout (s) for forwarder graceful stop" + issue: "#1754" + + telemetry.dogstatsd.aggregator_channel_latency_buckets: + severity: low + description: "Histogram buckets: DSD aggregator channel lag" + issue: "#1679" + + telemetry.dogstatsd.listeners_channel_latency_buckets: + severity: low + description: "Histogram buckets: listener channel latency" + issue: "#1679" + + telemetry.dogstatsd.listeners_latency_buckets: + severity: low + description: "Histogram buckets: listener processing" + issue: "#1679" + + telemetry.dogstatsd_origin: + severity: low + description: "Per-origin processed-metrics telemetry" + issue: "#1679" + +#################################################################################################### +# IGNORED +#################################################################################################### +ignored: + GUI_host: "ignored in initial audit 2026-04-23" + GUI_port: "ignored in initial audit 2026-04-23" + GUI_session_expiration: "ignored in initial audit 2026-04-23" + ac_exclude: "ignored in initial audit 2026-04-23" + ac_include: "ignored in initial audit 2026-04-23" + ad_allowed_env_vars: "ignored in initial audit 2026-04-23" + ad_config_poll_interval: "ignored in initial audit 2026-04-23" + ad_disable_env_var_resolution: "ignored in initial audit 2026-04-23" + ad_tag_completeness_max_wait: "ignored in initial audit 2026-04-23" + additional_checksd: "ignored in initial audit 2026-04-23" + admission_controller.add_aks_selectors: "ignored in initial audit 2026-04-23" + admission_controller.agent_sidecar.cluster_agent.enabled: "ignored in initial audit 2026-04-23" + admission_controller.agent_sidecar.cluster_agent.tls_verification.copy_ca_configmap: "ignored in initial audit 2026-04-23" + admission_controller.agent_sidecar.cluster_agent.tls_verification.enabled: "ignored in initial audit 2026-04-23" + admission_controller.agent_sidecar.container_registry: "ignored in initial audit 2026-04-23" + admission_controller.agent_sidecar.enabled: "ignored in initial audit 2026-04-23" + admission_controller.agent_sidecar.endpoint: "ignored in initial audit 2026-04-23" + admission_controller.agent_sidecar.image_name: "ignored in initial audit 2026-04-23" + admission_controller.agent_sidecar.image_tag: "ignored in initial audit 2026-04-23" + admission_controller.agent_sidecar.kubelet_api_logging.enabled: "ignored in initial audit 2026-04-23" + admission_controller.agent_sidecar.profiles: "ignored in initial audit 2026-04-23" + admission_controller.agent_sidecar.provider: "ignored in initial audit 2026-04-23" + admission_controller.agent_sidecar.selectors: "ignored in initial audit 2026-04-23" + admission_controller.appsec.sidecar.body_parsing_size_limit: "ignored in initial audit 2026-04-23" + admission_controller.appsec.sidecar.health_port: "ignored in initial audit 2026-04-23" + admission_controller.appsec.sidecar.image: "ignored in initial audit 2026-04-23" + admission_controller.appsec.sidecar.image_tag: "ignored in initial audit 2026-04-23" + admission_controller.appsec.sidecar.port: "ignored in initial audit 2026-04-23" + admission_controller.appsec.sidecar.resources.limits.cpu: "ignored in initial audit 2026-04-23" + admission_controller.appsec.sidecar.resources.limits.memory: "ignored in initial audit 2026-04-23" + admission_controller.appsec.sidecar.resources.requests.cpu: "ignored in initial audit 2026-04-23" + admission_controller.appsec.sidecar.resources.requests.memory: "ignored in initial audit 2026-04-23" + admission_controller.auto_instrumentation.asm.enabled: "ignored in initial audit 2026-04-23" + admission_controller.auto_instrumentation.asm_sca.enabled: "ignored in initial audit 2026-04-23" + admission_controller.auto_instrumentation.container_registry: "ignored in initial audit 2026-04-23" + admission_controller.auto_instrumentation.default_dd_registries: "ignored in initial audit 2026-04-23" + admission_controller.auto_instrumentation.enabled: "ignored in initial audit 2026-04-23" + admission_controller.auto_instrumentation.endpoint: "ignored in initial audit 2026-04-23" + admission_controller.auto_instrumentation.gradual_rollout.cache_ttl: "ignored in initial audit 2026-04-23" + admission_controller.auto_instrumentation.gradual_rollout.enabled: "ignored in initial audit 2026-04-23" + admission_controller.auto_instrumentation.iast.enabled: "ignored in initial audit 2026-04-23" + admission_controller.auto_instrumentation.init_resources.cpu: "ignored in initial audit 2026-04-23" + admission_controller.auto_instrumentation.init_resources.memory: "ignored in initial audit 2026-04-23" + admission_controller.auto_instrumentation.init_security_context: "ignored in initial audit 2026-04-23" + admission_controller.auto_instrumentation.inject_auto_detected_libraries: "ignored in initial audit 2026-04-23" + admission_controller.auto_instrumentation.patcher.enabled: "ignored in initial audit 2026-04-23" + admission_controller.auto_instrumentation.patcher.fallback_to_file_provider: "ignored in initial audit 2026-04-23" + admission_controller.auto_instrumentation.patcher.file_provider_path: "ignored in initial audit 2026-04-23" + admission_controller.auto_instrumentation.profiling.enabled: "ignored in initial audit 2026-04-23" + admission_controller.certificate.expiration_threshold: "ignored in initial audit 2026-04-23" + admission_controller.certificate.secret_name: "ignored in initial audit 2026-04-23" + admission_controller.certificate.validity_bound: "ignored in initial audit 2026-04-23" + admission_controller.container_registry: "ignored in initial audit 2026-04-23" + admission_controller.cws_instrumentation.command_endpoint: "ignored in initial audit 2026-04-23" + admission_controller.cws_instrumentation.container_registry: "ignored in initial audit 2026-04-23" + admission_controller.cws_instrumentation.enabled: "ignored in initial audit 2026-04-23" + admission_controller.cws_instrumentation.exclude: "ignored in initial audit 2026-04-23" + admission_controller.cws_instrumentation.image_name: "ignored in initial audit 2026-04-23" + admission_controller.cws_instrumentation.image_tag: "ignored in initial audit 2026-04-23" + admission_controller.cws_instrumentation.include: "ignored in initial audit 2026-04-23" + admission_controller.cws_instrumentation.init_resources.cpu: "ignored in initial audit 2026-04-23" + admission_controller.cws_instrumentation.init_resources.memory: "ignored in initial audit 2026-04-23" + admission_controller.cws_instrumentation.mode: "ignored in initial audit 2026-04-23" + admission_controller.cws_instrumentation.mutate_unlabelled: "ignored in initial audit 2026-04-23" + admission_controller.cws_instrumentation.pod_endpoint: "ignored in initial audit 2026-04-23" + admission_controller.cws_instrumentation.remote_copy.directory: "ignored in initial audit 2026-04-23" + admission_controller.cws_instrumentation.remote_copy.mount_volume: "ignored in initial audit 2026-04-23" + admission_controller.cws_instrumentation.timeout: "ignored in initial audit 2026-04-23" + admission_controller.enabled: "ignored in initial audit 2026-04-23" + admission_controller.failure_policy: "ignored in initial audit 2026-04-23" + admission_controller.inject_config.enabled: "ignored in initial audit 2026-04-23" + admission_controller.inject_config.endpoint: "ignored in initial audit 2026-04-23" + admission_controller.inject_config.local_service_name: "ignored in initial audit 2026-04-23" + admission_controller.inject_config.mode: "ignored in initial audit 2026-04-23" + admission_controller.inject_config.socket_path: "ignored in initial audit 2026-04-23" + admission_controller.inject_config.type_socket_volumes: "ignored in initial audit 2026-04-23" + admission_controller.inject_tags.enabled: "ignored in initial audit 2026-04-23" + admission_controller.inject_tags.endpoint: "ignored in initial audit 2026-04-23" + admission_controller.inject_tags.pod_owners_cache_validity: "ignored in initial audit 2026-04-23" + admission_controller.kubernetes_admission_events.enabled: "ignored in initial audit 2026-04-23" + admission_controller.mutate_unlabelled: "ignored in initial audit 2026-04-23" + admission_controller.mutation.enabled: "ignored in initial audit 2026-04-23" + admission_controller.namespace_selector_fallback: "ignored in initial audit 2026-04-23" + admission_controller.pod_owners_cache_validity: "ignored in initial audit 2026-04-23" + admission_controller.port: "ignored in initial audit 2026-04-23" + admission_controller.probe.enabled: "ignored in initial audit 2026-04-23" + admission_controller.probe.grace_period: "ignored in initial audit 2026-04-23" + admission_controller.probe.interval: "ignored in initial audit 2026-04-23" + admission_controller.reinvocation_policy: "ignored in initial audit 2026-04-23" + admission_controller.service_name: "ignored in initial audit 2026-04-23" + admission_controller.timeout_seconds: "ignored in initial audit 2026-04-23" + admission_controller.validation.enabled: "ignored in initial audit 2026-04-23" + admission_controller.webhook_name: "ignored in initial audit 2026-04-23" + agent_ipc.config_refresh_interval: "ignored in initial audit 2026-04-23" + agent_ipc.host: "ignored in initial audit 2026-04-23" + agent_ipc.port: "ignored in initial audit 2026-04-23" + agent_ipc.socket_path: "ignored in initial audit 2026-04-23" + agent_ipc.use_socket: "ignored in initial audit 2026-04-23" + agent_telemetry.additional_endpoints: "ignored in initial audit 2026-04-23" + agent_telemetry.batch_max_concurrent_send: "ignored in initial audit 2026-04-23" + agent_telemetry.batch_max_content_size: "ignored in initial audit 2026-04-23" + agent_telemetry.batch_max_size: "ignored in initial audit 2026-04-23" + agent_telemetry.batch_wait: "ignored in initial audit 2026-04-23" + agent_telemetry.compression_kind: "ignored in initial audit 2026-04-23" + agent_telemetry.compression_level: "ignored in initial audit 2026-04-23" + agent_telemetry.connection_reset_interval: "ignored in initial audit 2026-04-23" + agent_telemetry.dd_url: "ignored in initial audit 2026-04-23" + agent_telemetry.dev_mode_no_ssl: "ignored in initial audit 2026-04-23" + agent_telemetry.enabled: "ignored in initial audit 2026-04-23" + agent_telemetry.input_chan_size: "ignored in initial audit 2026-04-23" + agent_telemetry.logs_dd_url: "ignored in initial audit 2026-04-23" + agent_telemetry.logs_no_ssl: "ignored in initial audit 2026-04-23" + agent_telemetry.sender_backoff_base: "ignored in initial audit 2026-04-23" + agent_telemetry.sender_backoff_factor: "ignored in initial audit 2026-04-23" + agent_telemetry.sender_backoff_max: "ignored in initial audit 2026-04-23" + agent_telemetry.sender_recovery_interval: "ignored in initial audit 2026-04-23" + agent_telemetry.sender_recovery_reset: "ignored in initial audit 2026-04-23" + agent_telemetry.startup_trace_sampling: "ignored in initial audit 2026-04-23" + agent_telemetry.use_compression: "ignored in initial audit 2026-04-23" + agent_telemetry.use_v2_api: "ignored in initial audit 2026-04-23" + agent_telemetry.zstd_compression_level: "ignored in initial audit 2026-04-23" + aggregator_tag_filter_cache_capacity: "ADP uses data_plane.dogstatsd.aggregator_tag_filter_cache_capacity instead; this core-agent key is expected to be set alongside the ADP key and should not trigger any warning" + allow_python_path_heuristics_failure: "ignored in initial audit 2026-04-23" + allowed_additional_checks: "ignored in initial audit 2026-04-23" + apm_config.additional_endpoints: "ignored in initial audit 2026-04-23" + apm_config.additional_profile_tags: "ignored in initial audit 2026-04-23" + apm_config.analyzed_rate_by_service: "ignored in initial audit 2026-04-23" + apm_config.analyzed_spans: "ignored in initial audit 2026-04-23" + apm_config.apm_dd_url: "ignored in initial audit 2026-04-23" + apm_config.apm_non_local_traffic: "ignored in initial audit 2026-04-23" + apm_config.bucket_size_seconds: "ignored in initial audit 2026-04-23" + apm_config.client_stats_flush_interval: "ignored in initial audit 2026-04-23" + apm_config.compute_stats_by_span_kind: "ignored in initial audit 2026-04-23" + apm_config.connection_limit: "ignored in initial audit 2026-04-23" + apm_config.connection_reset_interval: "ignored in initial audit 2026-04-23" + apm_config.dd_agent_bin: "ignored in initial audit 2026-04-23" + apm_config.debug.port: "ignored in initial audit 2026-04-23" + apm_config.debug_v1_payloads: "ignored in initial audit 2026-04-23" + apm_config.debugger_additional_endpoints: "ignored in initial audit 2026-04-23" + apm_config.debugger_api_key: "ignored in initial audit 2026-04-23" + apm_config.debugger_dd_url: "ignored in initial audit 2026-04-23" + apm_config.debugger_diagnostics_additional_endpoints: "ignored in initial audit 2026-04-23" + apm_config.debugger_diagnostics_api_key: "ignored in initial audit 2026-04-23" + apm_config.debugger_diagnostics_dd_url: "ignored in initial audit 2026-04-23" + apm_config.decoder_timeout: "ignored in initial audit 2026-04-23" + apm_config.decoders: "ignored in initial audit 2026-04-23" + apm_config.disable_rare_sampler: "ignored in initial audit 2026-04-23" + apm_config.enable_container_tags_buffer: "ignored in initial audit 2026-04-23" + apm_config.enable_rare_sampler: "ignored in initial audit 2026-04-23" + apm_config.enabled: "ignored in initial audit 2026-04-23" + apm_config.env: "ignored in initial audit 2026-04-23" + apm_config.error_tracking_standalone.enabled: "ignored in initial audit 2026-04-23" + apm_config.errors_per_second: "ignored in initial audit 2026-04-23" + apm_config.extra_sample_rate: "ignored in initial audit 2026-04-23" + apm_config.features: "ignored in initial audit 2026-04-23" + apm_config.filter_tags.reject: "ignored in initial audit 2026-04-23" + apm_config.filter_tags.require: "ignored in initial audit 2026-04-23" + apm_config.filter_tags_regex.reject: "ignored in initial audit 2026-04-23" + apm_config.filter_tags_regex.require: "ignored in initial audit 2026-04-23" + apm_config.ignore_resources: "ignored in initial audit 2026-04-23" + apm_config.install_id: "ignored in initial audit 2026-04-23" + apm_config.install_time: "ignored in initial audit 2026-04-23" + apm_config.install_type: "ignored in initial audit 2026-04-23" + apm_config.instrumentation.disabled_namespaces: "ignored in initial audit 2026-04-23" + apm_config.instrumentation.enabled: "ignored in initial audit 2026-04-23" + apm_config.instrumentation.enabled_namespaces: "ignored in initial audit 2026-04-23" + apm_config.instrumentation.injection_mode: "ignored in initial audit 2026-04-23" + apm_config.instrumentation.injector_image_tag: "ignored in initial audit 2026-04-23" + apm_config.instrumentation.lib_versions: "ignored in initial audit 2026-04-23" + apm_config.instrumentation.targets: "ignored in initial audit 2026-04-23" + apm_config.internal_profiling.enabled: "ignored in initial audit 2026-04-23" + apm_config.log_file: "ignored in initial audit 2026-04-23" + apm_config.max_catalog_entries: "ignored in initial audit 2026-04-23" + apm_config.max_catalog_services: "ignored in initial audit 2026-04-23" + apm_config.max_connections: "ignored in initial audit 2026-04-23" + apm_config.max_cpu_percent: "ignored in initial audit 2026-04-23" + apm_config.max_events_per_second: "ignored in initial audit 2026-04-23" + apm_config.max_memory: "ignored in initial audit 2026-04-23" + apm_config.max_payload_size: "ignored in initial audit 2026-04-23" + apm_config.max_remote_traces_per_second: "ignored in initial audit 2026-04-23" + apm_config.max_sender_retries: "ignored in initial audit 2026-04-23" + apm_config.max_traces_per_second: "ignored in initial audit 2026-04-23" + apm_config.mode: "ignored in initial audit 2026-04-23" + apm_config.obfuscation.cache.enabled: "ignored in initial audit 2026-04-23" + apm_config.obfuscation.cache.max_size: "ignored in initial audit 2026-04-23" + apm_config.obfuscation.remove_stack_traces: "ignored in initial audit 2026-04-23" + apm_config.obfuscation.sql_exec_plan.enabled: "ignored in initial audit 2026-04-23" + apm_config.obfuscation.sql_exec_plan.keep_values: "ignored in initial audit 2026-04-23" + apm_config.obfuscation.sql_exec_plan.obfuscate_sql_values: "ignored in initial audit 2026-04-23" + apm_config.obfuscation.sql_exec_plan_normalize.enabled: "ignored in initial audit 2026-04-23" + apm_config.obfuscation.sql_exec_plan_normalize.keep_values: "ignored in initial audit 2026-04-23" + apm_config.obfuscation.sql_exec_plan_normalize.obfuscate_sql_values: "ignored in initial audit 2026-04-23" + apm_config.peer_service_aggregation: "ignored in initial audit 2026-04-23" + apm_config.peer_tags: "ignored in initial audit 2026-04-23" + apm_config.peer_tags_aggregation: "ignored in initial audit 2026-04-23" + apm_config.probabilistic_sampler.enabled: "ignored in initial audit 2026-04-23" + apm_config.probabilistic_sampler.hash_seed: "ignored in initial audit 2026-04-23" + apm_config.probabilistic_sampler.sampling_percentage: "ignored in initial audit 2026-04-23" + apm_config.profiling_additional_endpoints: "ignored in initial audit 2026-04-23" + apm_config.profiling_dd_url: "ignored in initial audit 2026-04-23" + apm_config.profiling_receiver_timeout: "ignored in initial audit 2026-04-23" + apm_config.receiver_enabled: "ignored in initial audit 2026-04-23" + apm_config.receiver_port: "ignored in initial audit 2026-04-23" + apm_config.receiver_socket: "ignored in initial audit 2026-04-23" + apm_config.receiver_timeout: "ignored in initial audit 2026-04-23" + apm_config.replace_tags: "ignored in initial audit 2026-04-23" + apm_config.send_all_internal_stats: "ignored in initial audit 2026-04-23" + apm_config.socket_activation.enabled: "ignored in initial audit 2026-04-23" + apm_config.socket_activation.handle_tcp_probe: "ignored in initial audit 2026-04-23" + apm_config.span_derived_primary_tags: "ignored in initial audit 2026-04-23" + apm_config.sql_obfuscation_mode: "ignored in initial audit 2026-04-23" + apm_config.stats_writer.connection_limit: "ignored in initial audit 2026-04-23" + apm_config.stats_writer.queue_size: "ignored in initial audit 2026-04-23" + apm_config.symdb_additional_endpoints: "ignored in initial audit 2026-04-23" + apm_config.symdb_api_key: "ignored in initial audit 2026-04-23" + apm_config.symdb_dd_url: "ignored in initial audit 2026-04-23" + apm_config.sync_flushing: "ignored in initial audit 2026-04-23" + apm_config.target_traces_per_second: "ignored in initial audit 2026-04-23" + apm_config.telemetry.additional_endpoints: "ignored in initial audit 2026-04-23" + apm_config.telemetry.dd_url: "ignored in initial audit 2026-04-23" + apm_config.telemetry.enabled: "ignored in initial audit 2026-04-23" + apm_config.trace_buffer: "ignored in initial audit 2026-04-23" + apm_config.trace_writer.connection_limit: "ignored in initial audit 2026-04-23" + apm_config.trace_writer.queue_size: "ignored in initial audit 2026-04-23" + apm_config.watchdog_check_delay: "ignored in initial audit 2026-04-23" + apm_config.windows_pipe_buffer_size: "ignored in initial audit 2026-04-23" + apm_config.windows_pipe_name: "ignored in initial audit 2026-04-23" + apm_config.windows_pipe_security_descriptor: "ignored in initial audit 2026-04-23" + apm_config.workload_selection: "ignored in initial audit 2026-04-23" + app_key: "ignored in initial audit 2026-04-23" + appsec.proxy.auto_detect: "ignored in initial audit 2026-04-23" + appsec.proxy.enabled: "ignored in initial audit 2026-04-23" + appsec.proxy.processor.address: "ignored in initial audit 2026-04-23" + appsec.proxy.processor.port: "ignored in initial audit 2026-04-23" + appsec.proxy.proxies: "ignored in initial audit 2026-04-23" + auth_init_timeout: "ignored in initial audit 2026-04-23" + auth_token_file_path: "ignored in second bulk edit 2026-05-06" + auto_exit.noprocess.enabled: "ignored in initial audit 2026-04-23" + auto_exit.noprocess.excluded_processes: "ignored in initial audit 2026-04-23" + auto_exit.validation_period: "ignored in initial audit 2026-04-23" + auto_team_tag_collection: "ignored in initial audit 2026-04-23" + autoconf_config_files_poll: "ignored in initial audit 2026-04-23" + autoconf_config_files_poll_interval: "ignored in initial audit 2026-04-23" + autoconf_template_dir: "ignored in initial audit 2026-04-23" + autoconfig_exclude_features: "ignored in initial audit 2026-04-23" + autoconfig_from_environment: "ignored in initial audit 2026-04-23" + autoconfig_include_features: "ignored in initial audit 2026-04-23" + autoscaling.cluster.enabled: "ignored in initial audit 2026-04-23" + autoscaling.workload.enabled: "ignored in initial audit 2026-04-23" + autoscaling.workload.external_recommender.tls.ca_file: "ignored in initial audit 2026-04-23" + autoscaling.workload.external_recommender.tls.cert_file: "ignored in initial audit 2026-04-23" + autoscaling.workload.external_recommender.tls.key_file: "ignored in initial audit 2026-04-23" + autoscaling.workload.in_place_vertical_scaling.enabled: "ignored in initial audit 2026-04-23" + autoscaling.workload.limit: "ignored in initial audit 2026-04-23" + autoscaling.workload.num_workers: "ignored in initial audit 2026-04-23" + azure_hostname_style: "ignored in initial audit 2026-04-23" + azure_metadata_api_version: "ignored in initial audit 2026-04-23" + azure_metadata_timeout: "ignored in initial audit 2026-04-23" + basic_telemetry_add_container_tags: "ignored in initial audit 2026-04-23" + bosh_id: "ignored in initial audit 2026-04-23" + c_core_dump: "ignored in initial audit 2026-04-23" + c_stacktrace_collection: "ignored in initial audit 2026-04-23" + cel_workload_exclude: "ignored in initial audit 2026-04-23" + cf_os_hostname_aliasing: "ignored in initial audit 2026-04-23" + check_cancel_timeout: "ignored in initial audit 2026-04-23" + check_runner_utilization_monitor_interval: "ignored in initial audit 2026-04-23" + check_runner_utilization_threshold: "ignored in initial audit 2026-04-23" + check_runner_utilization_warning_cooldown: "ignored in initial audit 2026-04-23" + check_runners: "ignored in initial audit 2026-04-23" + check_sampler_allow_sketch_bucket_reset: "ignored in initial audit 2026-04-23" + check_sampler_bucket_commits_count_expiry: "ignored in initial audit 2026-04-23" + check_sampler_context_metrics: "ignored in initial audit 2026-04-23" + check_sampler_expire_metrics: "ignored in initial audit 2026-04-23" + check_sampler_stateful_metric_expiration_time: "ignored in initial audit 2026-04-23" + check_system_probe_startup_time: "ignored in initial audit 2026-04-23" + check_system_probe_timeout: "ignored in initial audit 2026-04-23" + check_watchdog_warning_timeout: "ignored in initial audit 2026-04-23" + checks_tag_cardinality: "ignored in initial audit 2026-04-23" + clc_runner_enabled: "ignored in initial audit 2026-04-23" + clc_runner_host: "ignored in initial audit 2026-04-23" + clc_runner_id: "ignored in initial audit 2026-04-23" + clc_runner_port: "ignored in initial audit 2026-04-23" + clc_runner_remote_tagger_enabled: "ignored in initial audit 2026-04-23" + clc_runner_server_readheader_timeout: "ignored in initial audit 2026-04-23" + clc_runner_server_write_timeout: "ignored in initial audit 2026-04-23" + cloud_foundry: "ignored in initial audit 2026-04-23" + cloud_foundry_bbs.ca_file: "ignored in initial audit 2026-04-23" + cloud_foundry_bbs.cert_file: "ignored in initial audit 2026-04-23" + cloud_foundry_bbs.env_exclude: "ignored in initial audit 2026-04-23" + cloud_foundry_bbs.env_include: "ignored in initial audit 2026-04-23" + cloud_foundry_bbs.key_file: "ignored in initial audit 2026-04-23" + cloud_foundry_bbs.poll_interval: "ignored in initial audit 2026-04-23" + cloud_foundry_bbs.url: "ignored in initial audit 2026-04-23" + cloud_foundry_buildpack: "ignored in initial audit 2026-04-23" + cloud_foundry_cc.apps_batch_size: "ignored in initial audit 2026-04-23" + cloud_foundry_cc.client_id: "ignored in initial audit 2026-04-23" + cloud_foundry_cc.client_secret: "ignored in initial audit 2026-04-23" + cloud_foundry_cc.poll_interval: "ignored in initial audit 2026-04-23" + cloud_foundry_cc.skip_ssl_validation: "ignored in initial audit 2026-04-23" + cloud_foundry_cc.url: "ignored in initial audit 2026-04-23" + cloud_foundry_container_tagger.retry_count: "ignored in initial audit 2026-04-23" + cloud_foundry_container_tagger.retry_interval: "ignored in initial audit 2026-04-23" + cloud_foundry_container_tagger.shell_path: "ignored in initial audit 2026-04-23" + cloud_foundry_garden.listen_address: "ignored in initial audit 2026-04-23" + cloud_foundry_garden.listen_network: "ignored in initial audit 2026-04-23" + cloud_provider_metadata: "ignored in initial audit 2026-04-23" + cluster_agent.allow_legacy_tls: "ignored in initial audit 2026-04-23" + cluster_agent.appsec.injector.annotations: "ignored in initial audit 2026-04-23" + cluster_agent.appsec.injector.base_backoff: "ignored in initial audit 2026-04-23" + cluster_agent.appsec.injector.enabled: "ignored in initial audit 2026-04-23" + cluster_agent.appsec.injector.istio.namespace: "ignored in initial audit 2026-04-23" + cluster_agent.appsec.injector.labels: "ignored in initial audit 2026-04-23" + cluster_agent.appsec.injector.max_backoff: "ignored in initial audit 2026-04-23" + cluster_agent.appsec.injector.mode: "ignored in initial audit 2026-04-23" + cluster_agent.appsec.injector.processor.service.name: "ignored in initial audit 2026-04-23" + cluster_agent.appsec.injector.processor.service.namespace: "ignored in initial audit 2026-04-23" + cluster_agent.auth_token: "ignored in initial audit 2026-04-23" + cluster_agent.client_reconnect_period_seconds: "ignored in initial audit 2026-04-23" + cluster_agent.cluster_tagger.grpc_max_message_size: "ignored in initial audit 2026-04-23" + cluster_agent.cmd_port: "ignored in initial audit 2026-04-23" + cluster_agent.collect_kubernetes_tags: "ignored in initial audit 2026-04-23" + cluster_agent.isolation_segments_tags: "ignored in initial audit 2026-04-23" + cluster_agent.kube_metadata_collection.enabled: "ignored in initial audit 2026-04-23" + cluster_agent.kube_metadata_collection.resource_annotations_exclude: "ignored in initial audit 2026-04-23" + cluster_agent.kube_metadata_collection.resources: "ignored in initial audit 2026-04-23" + cluster_agent.kubernetes_resources_collection.deployment_annotations_exclude: "ignored in initial audit 2026-04-23" + cluster_agent.kubernetes_resources_collection.pod_annotations_exclude: "ignored in initial audit 2026-04-23" + cluster_agent.kubernetes_service_name: "ignored in initial audit 2026-04-23" + cluster_agent.language_detection.cleanup.language_ttl: "ignored in initial audit 2026-04-23" + cluster_agent.language_detection.cleanup.period: "ignored in initial audit 2026-04-23" + cluster_agent.language_detection.patcher.base_backoff: "ignored in initial audit 2026-04-23" + cluster_agent.language_detection.patcher.enabled: "ignored in initial audit 2026-04-23" + cluster_agent.language_detection.patcher.max_backoff: "ignored in initial audit 2026-04-23" + cluster_agent.max_leader_connections: "ignored in initial audit 2026-04-23" + cluster_agent.mcp.enabled: "ignored in initial audit 2026-04-23" + cluster_agent.mcp.endpoint: "ignored in initial audit 2026-04-23" + cluster_agent.refresh_on_cache_miss: "ignored in initial audit 2026-04-23" + cluster_agent.serve_nozzle_data: "ignored in initial audit 2026-04-23" + cluster_agent.server.idle_timeout_seconds: "ignored in initial audit 2026-04-23" + cluster_agent.server.read_timeout_seconds: "ignored in initial audit 2026-04-23" + cluster_agent.server.write_timeout_seconds: "ignored in initial audit 2026-04-23" + cluster_agent.service_account_name: "ignored in initial audit 2026-04-23" + cluster_agent.sidecars_tags: "ignored in initial audit 2026-04-23" + cluster_agent.tagging_fallback: "ignored in initial audit 2026-04-23" + cluster_agent.token_name: "ignored in initial audit 2026-04-23" + cluster_agent.tracing.enabled: "ignored in initial audit 2026-04-23" + cluster_agent.tracing.env: "ignored in initial audit 2026-04-23" + cluster_agent.tracing.sample_rate: "ignored in initial audit 2026-04-23" + cluster_agent.url: "ignored in initial audit 2026-04-23" + cluster_checks.advanced_dispatching_enabled: "ignored in initial audit 2026-04-23" + cluster_checks.clc_runners_port: "ignored in initial audit 2026-04-23" + cluster_checks.cluster_tag_name: "ignored in initial audit 2026-04-23" + cluster_checks.crd_collection: "ignored in initial audit 2026-04-23" + cluster_checks.enabled: "ignored in initial audit 2026-04-23" + cluster_checks.exclude_checks: "ignored in initial audit 2026-04-23" + cluster_checks.exclude_checks_from_dispatching: "ignored in initial audit 2026-04-23" + cluster_checks.extra_tags: "ignored in initial audit 2026-04-23" + cluster_checks.ksm_sharding_enabled: "ignored in initial audit 2026-04-23" + cluster_checks.node_expiration_timeout: "ignored in initial audit 2026-04-23" + cluster_checks.rebalance_min_percentage_improvement: "ignored in initial audit 2026-04-23" + cluster_checks.rebalance_period: "ignored in initial audit 2026-04-23" + cluster_checks.rebalance_with_utilization: "ignored in initial audit 2026-04-23" + cluster_checks.support_hybrid_ignore_ad_tags: "ignored in initial audit 2026-04-23" + cluster_checks.unscheduled_check_threshold: "ignored in initial audit 2026-04-23" + cluster_checks.warmup_duration: "ignored in initial audit 2026-04-23" + cluster_name: "ignored in initial audit 2026-04-23" + cluster_trust_chain.ca_cert_file_path: "ignored in initial audit 2026-04-23" + cluster_trust_chain.ca_key_file_path: "ignored in initial audit 2026-04-23" + cluster_trust_chain.enable_tls_verification: "ignored in initial audit 2026-04-23" + cmd.check.fullsketches: "ignored in initial audit 2026-04-23" + cmd_host: "ignored in initial audit 2026-04-23" + collect_ccrid: "ignored in initial audit 2026-04-23" + collect_ec2_instance_info: "ignored in initial audit 2026-04-23" + collect_ec2_tags: "ignored in initial audit 2026-04-23" + collect_ec2_tags_use_imds: "ignored in initial audit 2026-04-23" + collect_gce_tags: "ignored in initial audit 2026-04-23" + collect_gpu_tags: "ignored in initial audit 2026-04-23" + collect_kubernetes_events: "ignored in initial audit 2026-04-23" + common_root: "ignored in initial audit 2026-04-23" + compliance_config.check_interval: "ignored in initial audit 2026-04-23" + compliance_config.check_max_events_per_run: "ignored in initial audit 2026-04-23" + compliance_config.container_exclude: "ignored in initial audit 2026-04-23" + compliance_config.container_include: "ignored in initial audit 2026-04-23" + compliance_config.database_benchmarks.enabled: "ignored in initial audit 2026-04-23" + compliance_config.dir: "ignored in initial audit 2026-04-23" + compliance_config.enabled: "ignored in initial audit 2026-04-23" + compliance_config.endpoints.additional_endpoints: "ignored in initial audit 2026-04-23" + compliance_config.endpoints.batch_max_concurrent_send: "ignored in initial audit 2026-04-23" + compliance_config.endpoints.batch_max_content_size: "ignored in initial audit 2026-04-23" + compliance_config.endpoints.batch_max_size: "ignored in initial audit 2026-04-23" + compliance_config.endpoints.batch_wait: "ignored in initial audit 2026-04-23" + compliance_config.endpoints.compression_kind: "ignored in initial audit 2026-04-23" + compliance_config.endpoints.compression_level: "ignored in initial audit 2026-04-23" + compliance_config.endpoints.connection_reset_interval: "ignored in initial audit 2026-04-23" + compliance_config.endpoints.dd_url: "ignored in initial audit 2026-04-23" + compliance_config.endpoints.dev_mode_no_ssl: "ignored in initial audit 2026-04-23" + compliance_config.endpoints.input_chan_size: "ignored in initial audit 2026-04-23" + compliance_config.endpoints.logs_dd_url: "ignored in initial audit 2026-04-23" + compliance_config.endpoints.logs_no_ssl: "ignored in initial audit 2026-04-23" + compliance_config.endpoints.sender_backoff_base: "ignored in initial audit 2026-04-23" + compliance_config.endpoints.sender_backoff_factor: "ignored in initial audit 2026-04-23" + compliance_config.endpoints.sender_backoff_max: "ignored in initial audit 2026-04-23" + compliance_config.endpoints.sender_recovery_interval: "ignored in initial audit 2026-04-23" + compliance_config.endpoints.sender_recovery_reset: "ignored in initial audit 2026-04-23" + compliance_config.endpoints.use_compression: "ignored in initial audit 2026-04-23" + compliance_config.endpoints.use_v2_api: "ignored in initial audit 2026-04-23" + compliance_config.endpoints.zstd_compression_level: "ignored in initial audit 2026-04-23" + compliance_config.exclude_pause_container: "ignored in initial audit 2026-04-23" + compliance_config.host_benchmarks.enabled: "ignored in initial audit 2026-04-23" + compliance_config.metrics.enabled: "ignored in initial audit 2026-04-23" + compliance_config.opa.metrics.enabled: "ignored in initial audit 2026-04-23" + compliance_config.run_commands_as: "ignored in initial audit 2026-04-23" + compliance_config.run_in_system_probe: "ignored in initial audit 2026-04-23" + compliance_config.xccdf.enabled: "ignored in initial audit 2026-04-23" + conf_path: "ignored in initial audit 2026-04-23" + confd_path: "ignored in initial audit 2026-04-23" + config_providers: "ignored in initial audit 2026-04-23" + container_cgroup_root: "ignored in second bulk edit 2026-05-06" + container_env_as_tags: "ignored in initial audit 2026-04-23" + container_exclude: "ignored in initial audit 2026-04-23" + container_exclude_logs: "ignored in initial audit 2026-04-23" + container_exclude_metrics: "ignored in initial audit 2026-04-23" + container_exclude_stopped_age: "ignored in initial audit 2026-04-23" + container_image.additional_endpoints: "ignored in initial audit 2026-04-23" + container_image.batch_max_concurrent_send: "ignored in initial audit 2026-04-23" + container_image.batch_max_content_size: "ignored in initial audit 2026-04-23" + container_image.batch_max_size: "ignored in initial audit 2026-04-23" + container_image.batch_wait: "ignored in initial audit 2026-04-23" + container_image.compression_kind: "ignored in initial audit 2026-04-23" + container_image.compression_level: "ignored in initial audit 2026-04-23" + container_image.connection_reset_interval: "ignored in initial audit 2026-04-23" + container_image.dd_url: "ignored in initial audit 2026-04-23" + container_image.dev_mode_no_ssl: "ignored in initial audit 2026-04-23" + container_image.enabled: "ignored in initial audit 2026-04-23" + container_image.input_chan_size: "ignored in initial audit 2026-04-23" + container_image.logs_dd_url: "ignored in initial audit 2026-04-23" + container_image.logs_no_ssl: "ignored in initial audit 2026-04-23" + container_image.sender_backoff_base: "ignored in initial audit 2026-04-23" + container_image.sender_backoff_factor: "ignored in initial audit 2026-04-23" + container_image.sender_backoff_max: "ignored in initial audit 2026-04-23" + container_image.sender_recovery_interval: "ignored in initial audit 2026-04-23" + container_image.sender_recovery_reset: "ignored in initial audit 2026-04-23" + container_image.use_compression: "ignored in initial audit 2026-04-23" + container_image.use_v2_api: "ignored in initial audit 2026-04-23" + container_image.zstd_compression_level: "ignored in initial audit 2026-04-23" + container_include: "ignored in initial audit 2026-04-23" + container_include_logs: "ignored in initial audit 2026-04-23" + container_include_metrics: "ignored in initial audit 2026-04-23" + container_labels_as_tags: "ignored in initial audit 2026-04-23" + container_lifecycle.additional_endpoints: "ignored in initial audit 2026-04-23" + container_lifecycle.batch_max_concurrent_send: "ignored in initial audit 2026-04-23" + container_lifecycle.batch_max_content_size: "ignored in initial audit 2026-04-23" + container_lifecycle.batch_max_size: "ignored in initial audit 2026-04-23" + container_lifecycle.batch_wait: "ignored in initial audit 2026-04-23" + container_lifecycle.compression_kind: "ignored in initial audit 2026-04-23" + container_lifecycle.compression_level: "ignored in initial audit 2026-04-23" + container_lifecycle.connection_reset_interval: "ignored in initial audit 2026-04-23" + container_lifecycle.dd_url: "ignored in initial audit 2026-04-23" + container_lifecycle.dev_mode_no_ssl: "ignored in initial audit 2026-04-23" + container_lifecycle.enabled: "ignored in initial audit 2026-04-23" + container_lifecycle.input_chan_size: "ignored in initial audit 2026-04-23" + container_lifecycle.logs_dd_url: "ignored in initial audit 2026-04-23" + container_lifecycle.logs_no_ssl: "ignored in initial audit 2026-04-23" + container_lifecycle.sender_backoff_base: "ignored in initial audit 2026-04-23" + container_lifecycle.sender_backoff_factor: "ignored in initial audit 2026-04-23" + container_lifecycle.sender_backoff_max: "ignored in initial audit 2026-04-23" + container_lifecycle.sender_recovery_interval: "ignored in initial audit 2026-04-23" + container_lifecycle.sender_recovery_reset: "ignored in initial audit 2026-04-23" + container_lifecycle.use_compression: "ignored in initial audit 2026-04-23" + container_lifecycle.use_v2_api: "ignored in initial audit 2026-04-23" + container_lifecycle.zstd_compression_level: "ignored in initial audit 2026-04-23" + container_pid_mapper: "ignored in initial audit 2026-04-23" + container_proc_root: "ignored in second bulk edit 2026-05-06" + containerd_exclude_namespaces: "ignored in initial audit 2026-04-23" + containerd_namespace: "ignored in initial audit 2026-04-23" + containerd_namespaces: "ignored in initial audit 2026-04-23" + convert_dd_site_fqdn.enabled: "ignored in initial audit 2026-04-23" + core_agent.enabled: "ignored in initial audit 2026-04-23" + cri_socket_path: "ignored in second bulk edit 2026-05-06" + csi.driver: "ignored in initial audit 2026-04-23" + csi.enabled: "ignored in initial audit 2026-04-23" + data_observability.forwarder.additional_endpoints: "ignored in initial audit 2026-04-23" + data_observability.forwarder.batch_max_concurrent_send: "ignored in initial audit 2026-04-23" + data_observability.forwarder.batch_max_content_size: "ignored in initial audit 2026-04-23" + data_observability.forwarder.batch_max_size: "ignored in initial audit 2026-04-23" + data_observability.forwarder.batch_wait: "ignored in initial audit 2026-04-23" + data_observability.forwarder.compression_kind: "ignored in initial audit 2026-04-23" + data_observability.forwarder.compression_level: "ignored in initial audit 2026-04-23" + data_observability.forwarder.connection_reset_interval: "ignored in initial audit 2026-04-23" + data_observability.forwarder.dd_url: "ignored in initial audit 2026-04-23" + data_observability.forwarder.dev_mode_no_ssl: "ignored in initial audit 2026-04-23" + data_observability.forwarder.input_chan_size: "ignored in initial audit 2026-04-23" + data_observability.forwarder.logs_dd_url: "ignored in initial audit 2026-04-23" + data_observability.forwarder.logs_no_ssl: "ignored in initial audit 2026-04-23" + data_observability.forwarder.sender_backoff_base: "ignored in initial audit 2026-04-23" + data_observability.forwarder.sender_backoff_factor: "ignored in initial audit 2026-04-23" + data_observability.forwarder.sender_backoff_max: "ignored in initial audit 2026-04-23" + data_observability.forwarder.sender_recovery_interval: "ignored in initial audit 2026-04-23" + data_observability.forwarder.sender_recovery_reset: "ignored in initial audit 2026-04-23" + data_observability.forwarder.use_compression: "ignored in initial audit 2026-04-23" + data_observability.forwarder.use_v2_api: "ignored in initial audit 2026-04-23" + data_observability.forwarder.zstd_compression_level: "ignored in initial audit 2026-04-23" + data_observability.query_actions.enabled: "ignored in initial audit 2026-04-23" + data_plane.dogstatsd.enabled: "ignored in second bulk edit 2026-05-06" + data_plane.enabled: "ignored in second bulk edit 2026-05-06" + data_plane.otlp.enabled: "ignored in initial audit 2026-04-23" + data_plane.otlp.proxy.enabled: "ignored in initial audit 2026-04-23" + data_plane.otlp.proxy.receiver.protocols.grpc.endpoint: "ignored in initial audit 2026-04-23" + data_streams.forwarder.additional_endpoints: "ignored in initial audit 2026-04-23" + data_streams.forwarder.batch_max_concurrent_send: "ignored in initial audit 2026-04-23" + data_streams.forwarder.batch_max_content_size: "ignored in initial audit 2026-04-23" + data_streams.forwarder.batch_max_size: "ignored in initial audit 2026-04-23" + data_streams.forwarder.batch_wait: "ignored in initial audit 2026-04-23" + data_streams.forwarder.compression_kind: "ignored in initial audit 2026-04-23" + data_streams.forwarder.compression_level: "ignored in initial audit 2026-04-23" + data_streams.forwarder.connection_reset_interval: "ignored in initial audit 2026-04-23" + data_streams.forwarder.dd_url: "ignored in initial audit 2026-04-23" + data_streams.forwarder.dev_mode_no_ssl: "ignored in initial audit 2026-04-23" + data_streams.forwarder.input_chan_size: "ignored in initial audit 2026-04-23" + data_streams.forwarder.logs_dd_url: "ignored in initial audit 2026-04-23" + data_streams.forwarder.logs_no_ssl: "ignored in initial audit 2026-04-23" + data_streams.forwarder.sender_backoff_base: "ignored in initial audit 2026-04-23" + data_streams.forwarder.sender_backoff_factor: "ignored in initial audit 2026-04-23" + data_streams.forwarder.sender_backoff_max: "ignored in initial audit 2026-04-23" + data_streams.forwarder.sender_recovery_interval: "ignored in initial audit 2026-04-23" + data_streams.forwarder.sender_recovery_reset: "ignored in initial audit 2026-04-23" + data_streams.forwarder.use_compression: "ignored in initial audit 2026-04-23" + data_streams.forwarder.use_v2_api: "ignored in initial audit 2026-04-23" + data_streams.forwarder.zstd_compression_level: "ignored in initial audit 2026-04-23" + database_monitoring.activity.additional_endpoints: "ignored in initial audit 2026-04-23" + database_monitoring.activity.batch_max_concurrent_send: "ignored in initial audit 2026-04-23" + database_monitoring.activity.batch_max_content_size: "ignored in initial audit 2026-04-23" + database_monitoring.activity.batch_max_size: "ignored in initial audit 2026-04-23" + database_monitoring.activity.batch_wait: "ignored in initial audit 2026-04-23" + database_monitoring.activity.compression_kind: "ignored in initial audit 2026-04-23" + database_monitoring.activity.compression_level: "ignored in initial audit 2026-04-23" + database_monitoring.activity.connection_reset_interval: "ignored in initial audit 2026-04-23" + database_monitoring.activity.dd_url: "ignored in initial audit 2026-04-23" + database_monitoring.activity.dev_mode_no_ssl: "ignored in initial audit 2026-04-23" + database_monitoring.activity.input_chan_size: "ignored in initial audit 2026-04-23" + database_monitoring.activity.logs_dd_url: "ignored in initial audit 2026-04-23" + database_monitoring.activity.logs_no_ssl: "ignored in initial audit 2026-04-23" + database_monitoring.activity.sender_backoff_base: "ignored in initial audit 2026-04-23" + database_monitoring.activity.sender_backoff_factor: "ignored in initial audit 2026-04-23" + database_monitoring.activity.sender_backoff_max: "ignored in initial audit 2026-04-23" + database_monitoring.activity.sender_recovery_interval: "ignored in initial audit 2026-04-23" + database_monitoring.activity.sender_recovery_reset: "ignored in initial audit 2026-04-23" + database_monitoring.activity.use_compression: "ignored in initial audit 2026-04-23" + database_monitoring.activity.use_v2_api: "ignored in initial audit 2026-04-23" + database_monitoring.activity.zstd_compression_level: "ignored in initial audit 2026-04-23" + database_monitoring.autodiscovery.aurora.dbm_tag: "ignored in initial audit 2026-04-23" + database_monitoring.autodiscovery.aurora.discovery_interval: "ignored in initial audit 2026-04-23" + database_monitoring.autodiscovery.aurora.enabled: "ignored in initial audit 2026-04-23" + database_monitoring.autodiscovery.aurora.global_view_db_tag: "ignored in initial audit 2026-04-23" + database_monitoring.autodiscovery.aurora.query_timeout: "ignored in initial audit 2026-04-23" + database_monitoring.autodiscovery.aurora.region: "ignored in initial audit 2026-04-23" + database_monitoring.autodiscovery.aurora.tags: "ignored in initial audit 2026-04-23" + database_monitoring.autodiscovery.rds.dbm_tag: "ignored in initial audit 2026-04-23" + database_monitoring.autodiscovery.rds.discovery_interval: "ignored in initial audit 2026-04-23" + database_monitoring.autodiscovery.rds.enabled: "ignored in initial audit 2026-04-23" + database_monitoring.autodiscovery.rds.global_view_db_tag: "ignored in initial audit 2026-04-23" + database_monitoring.autodiscovery.rds.query_timeout: "ignored in initial audit 2026-04-23" + database_monitoring.autodiscovery.rds.region: "ignored in initial audit 2026-04-23" + database_monitoring.autodiscovery.rds.tags: "ignored in initial audit 2026-04-23" + database_monitoring.metrics.additional_endpoints: "ignored in initial audit 2026-04-23" + database_monitoring.metrics.batch_max_concurrent_send: "ignored in initial audit 2026-04-23" + database_monitoring.metrics.batch_max_content_size: "ignored in initial audit 2026-04-23" + database_monitoring.metrics.batch_max_size: "ignored in initial audit 2026-04-23" + database_monitoring.metrics.batch_wait: "ignored in initial audit 2026-04-23" + database_monitoring.metrics.compression_kind: "ignored in initial audit 2026-04-23" + database_monitoring.metrics.compression_level: "ignored in initial audit 2026-04-23" + database_monitoring.metrics.connection_reset_interval: "ignored in initial audit 2026-04-23" + database_monitoring.metrics.dd_url: "ignored in initial audit 2026-04-23" + database_monitoring.metrics.dev_mode_no_ssl: "ignored in initial audit 2026-04-23" + database_monitoring.metrics.input_chan_size: "ignored in initial audit 2026-04-23" + database_monitoring.metrics.logs_dd_url: "ignored in initial audit 2026-04-23" + database_monitoring.metrics.logs_no_ssl: "ignored in initial audit 2026-04-23" + database_monitoring.metrics.sender_backoff_base: "ignored in initial audit 2026-04-23" + database_monitoring.metrics.sender_backoff_factor: "ignored in initial audit 2026-04-23" + database_monitoring.metrics.sender_backoff_max: "ignored in initial audit 2026-04-23" + database_monitoring.metrics.sender_recovery_interval: "ignored in initial audit 2026-04-23" + database_monitoring.metrics.sender_recovery_reset: "ignored in initial audit 2026-04-23" + database_monitoring.metrics.use_compression: "ignored in initial audit 2026-04-23" + database_monitoring.metrics.use_v2_api: "ignored in initial audit 2026-04-23" + database_monitoring.metrics.zstd_compression_level: "ignored in initial audit 2026-04-23" + database_monitoring.samples.additional_endpoints: "ignored in initial audit 2026-04-23" + database_monitoring.samples.batch_max_concurrent_send: "ignored in initial audit 2026-04-23" + database_monitoring.samples.batch_max_content_size: "ignored in initial audit 2026-04-23" + database_monitoring.samples.batch_max_size: "ignored in initial audit 2026-04-23" + database_monitoring.samples.batch_wait: "ignored in initial audit 2026-04-23" + database_monitoring.samples.compression_kind: "ignored in initial audit 2026-04-23" + database_monitoring.samples.compression_level: "ignored in initial audit 2026-04-23" + database_monitoring.samples.connection_reset_interval: "ignored in initial audit 2026-04-23" + database_monitoring.samples.dd_url: "ignored in initial audit 2026-04-23" + database_monitoring.samples.dev_mode_no_ssl: "ignored in initial audit 2026-04-23" + database_monitoring.samples.input_chan_size: "ignored in initial audit 2026-04-23" + database_monitoring.samples.logs_dd_url: "ignored in initial audit 2026-04-23" + database_monitoring.samples.logs_no_ssl: "ignored in initial audit 2026-04-23" + database_monitoring.samples.sender_backoff_base: "ignored in initial audit 2026-04-23" + database_monitoring.samples.sender_backoff_factor: "ignored in initial audit 2026-04-23" + database_monitoring.samples.sender_backoff_max: "ignored in initial audit 2026-04-23" + database_monitoring.samples.sender_recovery_interval: "ignored in initial audit 2026-04-23" + database_monitoring.samples.sender_recovery_reset: "ignored in initial audit 2026-04-23" + database_monitoring.samples.use_compression: "ignored in initial audit 2026-04-23" + database_monitoring.samples.use_v2_api: "ignored in initial audit 2026-04-23" + database_monitoring.samples.zstd_compression_level: "ignored in initial audit 2026-04-23" + default_integration_http_timeout: "ignored in initial audit 2026-04-23" + delegated_auth.aws.region: "ignored in initial audit 2026-04-23" + delegated_auth.org_uuid: "ignored in initial audit 2026-04-23" + delegated_auth.provider: "ignored in initial audit 2026-04-23" + delegated_auth.refresh_interval_mins: "ignored in initial audit 2026-04-23" + disable_cluster_name_tag_key: "ignored in initial audit 2026-04-23" + disable_file_logging: "ignored in initial audit 2026-04-23" + disable_py3_validation: "ignored in initial audit 2026-04-23" + disable_unsafe_yaml: "ignored in initial audit 2026-04-23" + disk_check.use_core_loader: "ignored in initial audit 2026-04-23" + djm_config.enabled: "ignored in initial audit 2026-04-23" + docker_env_as_tags: "ignored in initial audit 2026-04-23" + docker_labels_as_tags: "ignored in initial audit 2026-04-23" + docker_query_timeout: "ignored in initial audit 2026-04-23" + dogstatsd_expiry_seconds: "ignored in second bulk edit 2026-05-06" + ec2_imdsv2_transition_payload_enabled: "ignored in initial audit 2026-04-23" + ec2_metadata_timeout: "ignored in initial audit 2026-04-23" + ec2_metadata_token_lifetime: "ignored in initial audit 2026-04-23" + ec2_prefer_imdsv2: "ignored in initial audit 2026-04-23" + ec2_prioritize_instance_id_as_hostname: "ignored in initial audit 2026-04-23" + ec2_use_dmi: "ignored in initial audit 2026-04-23" + ec2_use_windows_prefix_detection: "ignored in initial audit 2026-04-23" + ecs_agent_container_name: "ignored in initial audit 2026-04-23" + ecs_agent_url: "ignored in initial audit 2026-04-23" + ecs_collect_resource_tags_ec2: "ignored in initial audit 2026-04-23" + ecs_deployment_mode: "ignored in initial audit 2026-04-23" + ecs_metadata_retry_initial_interval: "ignored in initial audit 2026-04-23" + ecs_metadata_retry_max_elapsed_time: "ignored in initial audit 2026-04-23" + ecs_metadata_retry_timeout_factor: "ignored in initial audit 2026-04-23" + ecs_metadata_timeout: "ignored in initial audit 2026-04-23" + ecs_resource_tags_replace_colon: "ignored in initial audit 2026-04-23" + ecs_task_cache_ttl: "ignored in initial audit 2026-04-23" + ecs_task_collection_burst: "ignored in initial audit 2026-04-23" + ecs_task_collection_enabled: "ignored in initial audit 2026-04-23" + ecs_task_collection_rate: "ignored in initial audit 2026-04-23" + eks_fargate: "ignored in initial audit 2026-04-23" + enable_cluster_agent_metadata_collection: "ignored in initial audit 2026-04-23" + enable_gohai: "ignored in initial audit 2026-04-23" + enable_metadata_collection: "ignored in initial audit 2026-04-23" + enable_payloads.json_to_v1_intake: "Legacy v1/intake endpoint; not implemented in ADP" + enable_signing_metadata_collection: "ignored in initial audit 2026-04-23" + enabled_rfc1123_compliant_cluster_name_tag: "ignored in initial audit 2026-04-23" + enhanced_metrics: "ignored in initial audit 2026-04-23" + event_management.forwarder.additional_endpoints: "ignored in initial audit 2026-04-23" + event_management.forwarder.batch_max_concurrent_send: "ignored in initial audit 2026-04-23" + event_management.forwarder.batch_max_content_size: "ignored in initial audit 2026-04-23" + event_management.forwarder.batch_max_size: "ignored in initial audit 2026-04-23" + event_management.forwarder.batch_wait: "ignored in initial audit 2026-04-23" + event_management.forwarder.compression_kind: "ignored in initial audit 2026-04-23" + event_management.forwarder.compression_level: "ignored in initial audit 2026-04-23" + event_management.forwarder.connection_reset_interval: "ignored in initial audit 2026-04-23" + event_management.forwarder.dd_url: "ignored in initial audit 2026-04-23" + event_management.forwarder.dev_mode_no_ssl: "ignored in initial audit 2026-04-23" + event_management.forwarder.input_chan_size: "ignored in initial audit 2026-04-23" + event_management.forwarder.logs_dd_url: "ignored in initial audit 2026-04-23" + event_management.forwarder.logs_no_ssl: "ignored in initial audit 2026-04-23" + event_management.forwarder.sender_backoff_base: "ignored in initial audit 2026-04-23" + event_management.forwarder.sender_backoff_factor: "ignored in initial audit 2026-04-23" + event_management.forwarder.sender_backoff_max: "ignored in initial audit 2026-04-23" + event_management.forwarder.sender_recovery_interval: "ignored in initial audit 2026-04-23" + event_management.forwarder.sender_recovery_reset: "ignored in initial audit 2026-04-23" + event_management.forwarder.use_compression: "ignored in initial audit 2026-04-23" + event_management.forwarder.use_v2_api: "ignored in initial audit 2026-04-23" + event_management.forwarder.zstd_compression_level: "ignored in initial audit 2026-04-23" + evp_proxy_config.additional_endpoints: "ignored in initial audit 2026-04-23" + evp_proxy_config.api_key: "ignored in initial audit 2026-04-23" + evp_proxy_config.dd_url: "ignored in initial audit 2026-04-23" + evp_proxy_config.delegated_auth.aws.region: "ignored in initial audit 2026-04-23" + evp_proxy_config.delegated_auth.org_uuid: "ignored in initial audit 2026-04-23" + evp_proxy_config.delegated_auth.provider: "ignored in initial audit 2026-04-23" + evp_proxy_config.delegated_auth.refresh_interval_mins: "ignored in initial audit 2026-04-23" + evp_proxy_config.enabled: "ignored in initial audit 2026-04-23" + evp_proxy_config.max_payload_size: "ignored in initial audit 2026-04-23" + evp_proxy_config.receiver_timeout: "ignored in initial audit 2026-04-23" + exclude_ec2_tags: "ignored in initial audit 2026-04-23" + exclude_gce_tags: "ignored in initial audit 2026-04-23" + exclude_pause_container: "ignored in initial audit 2026-04-23" + expected_tags_duration: "ignored in second bulk edit 2026-05-06" + expvar_port: "ignored in initial audit 2026-04-23" + external_metrics.aggregator: "ignored in initial audit 2026-04-23" + external_metrics_provider.api_key: "ignored in initial audit 2026-04-23" + external_metrics_provider.app_key: "ignored in initial audit 2026-04-23" + external_metrics_provider.batch_window: "ignored in initial audit 2026-04-23" + external_metrics_provider.bucket_size: "ignored in initial audit 2026-04-23" + external_metrics_provider.chunk_size: "ignored in initial audit 2026-04-23" + external_metrics_provider.config: "ignored in initial audit 2026-04-23" + external_metrics_provider.enable_datadogmetric_autogen: "ignored in initial audit 2026-04-23" + external_metrics_provider.enabled: "ignored in initial audit 2026-04-23" + external_metrics_provider.endpoint: "ignored in initial audit 2026-04-23" + external_metrics_provider.endpoints: "ignored in initial audit 2026-04-23" + external_metrics_provider.local_copy_refresh_rate: "ignored in initial audit 2026-04-23" + external_metrics_provider.max_age: "ignored in initial audit 2026-04-23" + external_metrics_provider.max_parallel_queries: "ignored in initial audit 2026-04-23" + external_metrics_provider.max_time_window: "ignored in initial audit 2026-04-23" + external_metrics_provider.num_workers: "ignored in initial audit 2026-04-23" + external_metrics_provider.port: "ignored in initial audit 2026-04-23" + external_metrics_provider.query_validity_period: "ignored in initial audit 2026-04-23" + external_metrics_provider.refresh_period: "ignored in initial audit 2026-04-23" + external_metrics_provider.rollup: "ignored in initial audit 2026-04-23" + external_metrics_provider.split_batches_with_backoff: "ignored in initial audit 2026-04-23" + external_metrics_provider.use_datadogmetric_crd: "ignored in initial audit 2026-04-23" + external_metrics_provider.wpa_controller: "ignored in initial audit 2026-04-23" + extra_config_providers: "ignored in initial audit 2026-04-23" + extra_listeners: "ignored in initial audit 2026-04-23" + extra_tags: "ignored in second bulk edit 2026-05-06" + fips.enabled: "ignored in initial audit 2026-04-23" + fips.https: "ignored in initial audit 2026-04-23" + fips.local_address: "ignored in initial audit 2026-04-23" + fips.port_range_start: "ignored in initial audit 2026-04-23" + fips.tls_verify: "ignored in initial audit 2026-04-23" + flare.profile_overhead_runtime: "ignored in initial audit 2026-04-23" + flare.rc_profiling.blocking_rate: "ignored in initial audit 2026-04-23" + flare.rc_profiling.mutex_fraction: "ignored in initial audit 2026-04-23" + flare.rc_profiling.profile_duration: "ignored in initial audit 2026-04-23" + flare.rc_streamlogs.duration: "ignored in initial audit 2026-04-23" + flare_provider_timeout: "ignored in initial audit 2026-04-23" + flare_stripped_keys: "ignored in initial audit 2026-04-23" + fleet_layers: "ignored in initial audit 2026-04-23" + fleet_policies_dir: "ignored in initial audit 2026-04-23" + gce_metadata_timeout: "ignored in initial audit 2026-04-23" + gce_send_project_id_tag: "ignored in initial audit 2026-04-23" + go_core_dump: "ignored in initial audit 2026-04-23" + gpu.disabled_collectors: "ignored in initial audit 2026-04-23" + gpu.enabled: "ignored in initial audit 2026-04-23" + gpu.integrate_with_workloadmeta_processes: "ignored in initial audit 2026-04-23" + gpu.nvml_lib_path: "ignored in initial audit 2026-04-23" + gpu.sp_process_metrics_request_timeout: "ignored in initial audit 2026-04-23" + gpu.use_sp_process_metrics: "ignored in initial audit 2026-04-23" + gpu.workload_tag_cache_size: "ignored in initial audit 2026-04-23" + ha_agent.enabled: "ignored in initial audit 2026-04-23" + ha_agent.group: "ignored in initial audit 2026-04-23" + health_platform.enabled: "ignored in initial audit 2026-04-23" + health_platform.forwarder.interval: "ignored in initial audit 2026-04-23" + health_platform.persist_on_kubernetes: "ignored in initial audit 2026-04-23" + health_port: "ignored in initial audit 2026-04-23" + histogram_percentiles: "ignored in second bulk edit 2026-05-06" + host_aliases: "ignored in initial audit 2026-04-23" + hostname: "ignored in second bulk edit 2026-05-06" + hostname_drift_initial_delay: "ignored in initial audit 2026-04-23" + hostname_drift_recurring_interval: "ignored in initial audit 2026-04-23" + hostname_file: "ignored in initial audit 2026-04-23" + hostname_force_config_as_canonical: "ignored in initial audit 2026-04-23" + hostname_fqdn: "ignored in initial audit 2026-04-23" + hostname_trust_uts_namespace: "ignored in initial audit 2026-04-23" + hostprofiler.additional_http_headers: "ignored in initial audit 2026-04-23" + hostprofiler.ddprofiling.enabled: "ignored in initial audit 2026-04-23" + hostprofiler.ddprofiling.period: "ignored in initial audit 2026-04-23" + hostprofiler.debug.verbosity: "ignored in initial audit 2026-04-23" + hpa_configmap_name: "ignored in initial audit 2026-04-23" + hpa_watcher_gc_period: "ignored in initial audit 2026-04-23" + hpa_watcher_polling_freq: "ignored in initial audit 2026-04-23" + http_dial_fallback_delay: "ignored in initial audit 2026-04-23" + ibm_metadata_timeout: "ignored in initial audit 2026-04-23" + ignore_autoconf: "ignored in initial audit 2026-04-23" + ignore_host_etc: "ignored in initial audit 2026-04-23" + include_ephemeral_containers: "ignored in initial audit 2026-04-23" + infrastructure_mode: "ignored in initial audit 2026-04-23" + installer.gc_interval: "ignored in initial audit 2026-04-23" + installer.mirror: "ignored in initial audit 2026-04-23" + installer.refresh_interval: "ignored in initial audit 2026-04-23" + installer.registry.auth: "ignored in initial audit 2026-04-23" + installer.registry.password: "ignored in initial audit 2026-04-23" + installer.registry.url: "ignored in initial audit 2026-04-23" + installer.registry.username: "ignored in initial audit 2026-04-23" + integration.additional: "ignored in initial audit 2026-04-23" + integration.basic.allowed: "ignored in initial audit 2026-04-23" + integration.enabled: "ignored in initial audit 2026-04-23" + integration.end_user_device.allowed: "ignored in initial audit 2026-04-23" + integration.excluded: "ignored in initial audit 2026-04-23" + integration.full.allowed: "ignored in initial audit 2026-04-23" + integration_check_status_enabled: "ignored in initial audit 2026-04-23" + integration_file_paths_allowlist: "ignored in initial audit 2026-04-23" + integration_ignore_untrusted_file_params: "ignored in initial audit 2026-04-23" + integration_profiling: "ignored in initial audit 2026-04-23" + integration_security_excluded_checks: "ignored in initial audit 2026-04-23" + integration_tracing: "ignored in initial audit 2026-04-23" + integration_tracing_exhaustive: "ignored in initial audit 2026-04-23" + integration_trusted_providers: "ignored in initial audit 2026-04-23" + internal_profiling.block_profile_rate: "ignored in initial audit 2026-04-23" + internal_profiling.capture_all_allocations: "ignored in initial audit 2026-04-23" + internal_profiling.cpu_duration: "ignored in initial audit 2026-04-23" + internal_profiling.custom_attributes: "ignored in initial audit 2026-04-23" + internal_profiling.delta_profiles: "ignored in initial audit 2026-04-23" + internal_profiling.enable_block_profiling: "ignored in initial audit 2026-04-23" + internal_profiling.enable_goroutine_stacktraces: "ignored in initial audit 2026-04-23" + internal_profiling.enable_mutex_profiling: "ignored in initial audit 2026-04-23" + internal_profiling.enabled: "ignored in initial audit 2026-04-23" + internal_profiling.extra_tags: "ignored in initial audit 2026-04-23" + internal_profiling.mutex_profile_fraction: "ignored in initial audit 2026-04-23" + internal_profiling.period: "ignored in initial audit 2026-04-23" + internal_profiling.profile_dd_url: "ignored in initial audit 2026-04-23" + internal_profiling.unix_socket: "ignored in initial audit 2026-04-23" + inventories_checks_configuration_enabled: "ignored in initial audit 2026-04-23" + inventories_collect_cloud_provider_account_id: "ignored in initial audit 2026-04-23" + inventories_configuration_enabled: "ignored in initial audit 2026-04-23" + inventories_diagnostics_enabled: "ignored in initial audit 2026-04-23" + inventories_enabled: "ignored in initial audit 2026-04-23" + inventories_first_run_delay: "ignored in initial audit 2026-04-23" + inventories_max_interval: "ignored in initial audit 2026-04-23" + inventories_min_interval: "ignored in initial audit 2026-04-23" + iot_host: "ignored in initial audit 2026-04-23" + ipc_address: "ignored in initial audit 2026-04-23" + ipc_cert_file_path: "ignored in second bulk edit 2026-05-06" + jmx_check_period: "ignored in initial audit 2026-04-23" + jmx_collection_timeout: "ignored in initial audit 2026-04-23" + jmx_custom_jars: "ignored in initial audit 2026-04-23" + jmx_java_tool_options: "ignored in initial audit 2026-04-23" + jmx_log_file: "ignored in initial audit 2026-04-23" + jmx_max_ram_percentage: "ignored in initial audit 2026-04-23" + jmx_max_restarts: "ignored in initial audit 2026-04-23" + jmx_reconnection_thread_pool_size: "ignored in initial audit 2026-04-23" + jmx_reconnection_timeout: "ignored in initial audit 2026-04-23" + jmx_restart_interval: "ignored in initial audit 2026-04-23" + jmx_statsd_client_buffer_size: "ignored in initial audit 2026-04-23" + jmx_statsd_client_queue_size: "ignored in initial audit 2026-04-23" + jmx_statsd_client_socket_timeout: "ignored in initial audit 2026-04-23" + jmx_statsd_client_use_non_blocking: "ignored in initial audit 2026-04-23" + jmx_statsd_telemetry_enabled: "ignored in initial audit 2026-04-23" + jmx_telemetry_enabled: "ignored in initial audit 2026-04-23" + jmx_thread_pool_size: "ignored in initial audit 2026-04-23" + jmx_use_cgroup_memory_limit: "ignored in initial audit 2026-04-23" + jmx_use_container_support: "ignored in initial audit 2026-04-23" + kube_cache_sync_timeout_seconds: "ignored in initial audit 2026-04-23" + kube_resources_namespace: "ignored in initial audit 2026-04-23" + kubeactions.enabled: "ignored in initial audit 2026-04-23" + kubelet_auth_token_path: "ignored in initial audit 2026-04-23" + kubelet_cache_pods_duration: "ignored in initial audit 2026-04-23" + kubelet_client_ca: "ignored in initial audit 2026-04-23" + kubelet_client_crt: "ignored in initial audit 2026-04-23" + kubelet_client_key: "ignored in initial audit 2026-04-23" + kubelet_collector_pull_interval: "ignored in initial audit 2026-04-23" + kubelet_core_check_enabled: "ignored in initial audit 2026-04-23" + kubelet_tls_verify: "ignored in initial audit 2026-04-23" + kubelet_use_api_server: "ignored in initial audit 2026-04-23" + kubernetes_ad_tags_disabled: "ignored in initial audit 2026-04-23" + kubernetes_apiserver_ca_path: "ignored in initial audit 2026-04-23" + kubernetes_apiserver_client_timeout: "ignored in initial audit 2026-04-23" + kubernetes_apiserver_informer_client_timeout: "ignored in initial audit 2026-04-23" + kubernetes_apiserver_tls_verify: "ignored in initial audit 2026-04-23" + kubernetes_apiserver_use_protobuf: "ignored in initial audit 2026-04-23" + kubernetes_collect_metadata_tags: "ignored in initial audit 2026-04-23" + kubernetes_event_collection_timeout: "ignored in initial audit 2026-04-23" + kubernetes_events_source_detection.enabled: "ignored in initial audit 2026-04-23" + kubernetes_http_kubelet_port: "ignored in initial audit 2026-04-23" + kubernetes_https_kubelet_port: "ignored in initial audit 2026-04-23" + kubernetes_informers_resync_period: "ignored in initial audit 2026-04-23" + kubernetes_kube_service_ignore_readiness: "ignored in initial audit 2026-04-23" + kubernetes_kubeconfig_path: "ignored in initial audit 2026-04-23" + kubernetes_kubelet_deviceplugins_cache_duration: "ignored in initial audit 2026-04-23" + kubernetes_kubelet_deviceplugins_socketdir: "ignored in initial audit 2026-04-23" + kubernetes_kubelet_host: "ignored in initial audit 2026-04-23" + kubernetes_kubelet_nodename: "ignored in initial audit 2026-04-23" + kubernetes_kubelet_podresources_socket: "ignored in initial audit 2026-04-23" + kubernetes_map_services_on_ip: "ignored in initial audit 2026-04-23" + kubernetes_metadata_streaming: "ignored in initial audit 2026-04-23" + kubernetes_metadata_tag_update_freq: "ignored in initial audit 2026-04-23" + kubernetes_namespace_annotations_as_tags: "ignored in initial audit 2026-04-23" + kubernetes_namespace_labels_as_tags: "ignored in initial audit 2026-04-23" + kubernetes_node_annotations_as_host_aliases: "ignored in initial audit 2026-04-23" + kubernetes_node_annotations_as_tags: "ignored in initial audit 2026-04-23" + kubernetes_node_label_as_cluster_name: "ignored in initial audit 2026-04-23" + kubernetes_node_labels_as_tags: "ignored in initial audit 2026-04-23" + kubernetes_persistent_volume_claims_as_tags: "ignored in initial audit 2026-04-23" + kubernetes_pod_annotations_as_tags: "ignored in initial audit 2026-04-23" + kubernetes_pod_expiration_duration: "ignored in initial audit 2026-04-23" + kubernetes_pod_labels_as_tags: "ignored in initial audit 2026-04-23" + kubernetes_resources_annotations_as_tags: "ignored in initial audit 2026-04-23" + kubernetes_resources_labels_as_tags: "ignored in initial audit 2026-04-23" + kubernetes_use_endpoint_slices: "ignored in initial audit 2026-04-23" + language_detection.enabled: "ignored in initial audit 2026-04-23" + language_detection.reporting.buffer_period: "ignored in initial audit 2026-04-23" + language_detection.reporting.enabled: "ignored in initial audit 2026-04-23" + language_detection.reporting.refresh_period: "ignored in initial audit 2026-04-23" + leader_election: "ignored in initial audit 2026-04-23" + leader_election_default_resource: "ignored in initial audit 2026-04-23" + leader_election_release_on_shutdown: "ignored in initial audit 2026-04-23" + leader_lease_duration: "ignored in initial audit 2026-04-23" + leader_lease_name: "ignored in initial audit 2026-04-23" + listeners: "ignored in initial audit 2026-04-23" + log_all_goroutines_when_unhealthy: "ignored in initial audit 2026-04-23" + log_enabled: "ignored in initial audit 2026-04-23" + log_file: "ignored in second bulk edit 2026-05-06" + log_file_max_rolls: "ignored in second bulk edit 2026-05-06" + log_file_max_size: "ignored in second bulk edit 2026-05-06" + log_format_json: "ignored in second bulk edit 2026-05-06" + log_to_console: "ignored in second bulk edit 2026-05-06" + log_to_syslog: "ignored in second bulk edit 2026-05-06" + logon_duration.enabled: "ignored in initial audit 2026-04-23" + logs_config.add_logsource_tag: "ignored in initial audit 2026-04-23" + logs_config.additional_endpoints: "ignored in initial audit 2026-04-23" + logs_config.aggregation_timeout: "ignored in initial audit 2026-04-23" + logs_config.api_key: "ignored in initial audit 2026-04-23" + logs_config.atomic_registry_write: "ignored in initial audit 2026-04-23" + logs_config.auditor_ttl: "ignored in initial audit 2026-04-23" + logs_config.auto_multi_line.enable_datetime_detection: "ignored in initial audit 2026-04-23" + logs_config.auto_multi_line.enable_json_aggregation: "ignored in initial audit 2026-04-23" + logs_config.auto_multi_line.enable_json_detection: "ignored in initial audit 2026-04-23" + logs_config.auto_multi_line.pattern_table_match_threshold: "ignored in initial audit 2026-04-23" + logs_config.auto_multi_line.pattern_table_max_size: "ignored in initial audit 2026-04-23" + logs_config.auto_multi_line.tag_aggregated_json: "ignored in initial audit 2026-04-23" + logs_config.auto_multi_line.timestamp_detector_match_threshold: "ignored in initial audit 2026-04-23" + logs_config.auto_multi_line.tokenizer_max_input_bytes: "ignored in initial audit 2026-04-23" + logs_config.auto_multi_line_default_match_threshold: "ignored in initial audit 2026-04-23" + logs_config.auto_multi_line_default_match_timeout: "ignored in initial audit 2026-04-23" + logs_config.auto_multi_line_default_sample_size: "ignored in initial audit 2026-04-23" + logs_config.auto_multi_line_detection: "ignored in initial audit 2026-04-23" + logs_config.auto_multi_line_detection_custom_samples: "ignored in initial audit 2026-04-23" + logs_config.auto_multi_line_detection_tagging: "ignored in initial audit 2026-04-23" + logs_config.auto_multi_line_extra_patterns: "ignored in initial audit 2026-04-23" + logs_config.batch_max_concurrent_send: "ignored in initial audit 2026-04-23" + logs_config.batch_max_content_size: "ignored in initial audit 2026-04-23" + logs_config.batch_max_size: "ignored in initial audit 2026-04-23" + logs_config.batch_wait: "ignored in initial audit 2026-04-23" + logs_config.close_timeout: "ignored in initial audit 2026-04-23" + logs_config.compression_kind: "ignored in initial audit 2026-04-23" + logs_config.compression_level: "ignored in initial audit 2026-04-23" + logs_config.connection_reset_interval: "ignored in initial audit 2026-04-23" + logs_config.container_collect_all: "ignored in initial audit 2026-04-23" + logs_config.container_runtime_waiting_timeout: "ignored in initial audit 2026-04-23" + logs_config.dd_port: "ignored in initial audit 2026-04-23" + logs_config.dd_url: "ignored in initial audit 2026-04-23" + logs_config.dd_url_443: "ignored in initial audit 2026-04-23" + logs_config.delegated_auth.aws.region: "ignored in initial audit 2026-04-23" + logs_config.delegated_auth.org_uuid: "ignored in initial audit 2026-04-23" + logs_config.delegated_auth.provider: "ignored in initial audit 2026-04-23" + logs_config.delegated_auth.refresh_interval_mins: "ignored in initial audit 2026-04-23" + logs_config.dev_mode_no_ssl: "ignored in initial audit 2026-04-23" + logs_config.dev_mode_use_proto: "ignored in initial audit 2026-04-23" + logs_config.disable_distributed_senders: "ignored in initial audit 2026-04-23" + logs_config.docker_client_read_timeout: "ignored in initial audit 2026-04-23" + logs_config.docker_container_force_use_file: "ignored in initial audit 2026-04-23" + logs_config.docker_container_use_file: "ignored in initial audit 2026-04-23" + logs_config.docker_path_override: "ignored in initial audit 2026-04-23" + logs_config.enable_recursive_glob: "ignored in initial audit 2026-04-23" + logs_config.expected_tags_duration: "ignored in initial audit 2026-04-23" + logs_config.experimental_adaptive_sampling.burst_size: "ignored in initial audit 2026-04-23" + logs_config.experimental_adaptive_sampling.enabled: "ignored in initial audit 2026-04-23" + logs_config.experimental_adaptive_sampling.match_threshold: "ignored in initial audit 2026-04-23" + logs_config.experimental_adaptive_sampling.max_patterns: "ignored in initial audit 2026-04-23" + logs_config.experimental_adaptive_sampling.rate_limit: "ignored in initial audit 2026-04-23" + logs_config.experimental_adaptive_sampling.tokenizer_max_input_bytes: "ignored in initial audit 2026-04-23" + logs_config.file_scan_period: "ignored in initial audit 2026-04-23" + logs_config.file_wildcard_selection_mode: "ignored in initial audit 2026-04-23" + logs_config.fingerprint_config.count: "ignored in initial audit 2026-04-23" + logs_config.fingerprint_config.count_to_skip: "ignored in initial audit 2026-04-23" + logs_config.fingerprint_config.fingerprint_strategy: "ignored in initial audit 2026-04-23" + logs_config.fingerprint_config.max_bytes: "ignored in initial audit 2026-04-23" + logs_config.force_auto_multi_line_detection_v1: "ignored in initial audit 2026-04-23" + logs_config.force_use_http: "ignored in initial audit 2026-04-23" + logs_config.force_use_tcp: "ignored in initial audit 2026-04-23" + logs_config.frame_size: "ignored in initial audit 2026-04-23" + logs_config.http_connectivity_retry_interval_max: "ignored in initial audit 2026-04-23" + logs_config.http_protocol: "ignored in initial audit 2026-04-23" + logs_config.http_timeout: "ignored in initial audit 2026-04-23" + logs_config.input_chan_size: "ignored in initial audit 2026-04-23" + logs_config.integrations_logs_disk_ratio: "ignored in initial audit 2026-04-23" + logs_config.integrations_logs_files_max_size: "ignored in initial audit 2026-04-23" + logs_config.integrations_logs_total_usage: "ignored in initial audit 2026-04-23" + logs_config.k8s_container_use_file: "ignored in initial audit 2026-04-23" + logs_config.k8s_container_use_kubelet_api: "ignored in initial audit 2026-04-23" + logs_config.kubelet_api_client_read_timeout: "ignored in initial audit 2026-04-23" + logs_config.logs_dd_url: "ignored in initial audit 2026-04-23" + logs_config.logs_no_ssl: "ignored in initial audit 2026-04-23" + logs_config.max_message_size_bytes: "ignored in initial audit 2026-04-23" + logs_config.message_channel_size: "ignored in initial audit 2026-04-23" + logs_config.open_files_limit: "ignored in initial audit 2026-04-23" + logs_config.payload_channel_size: "ignored in initial audit 2026-04-23" + logs_config.pipeline_failover.enabled: "ignored in initial audit 2026-04-23" + logs_config.pipeline_failover.router_channel_size: "ignored in initial audit 2026-04-23" + logs_config.pipelines: "ignored in initial audit 2026-04-23" + logs_config.process_exclude_agent: "ignored in initial audit 2026-04-23" + logs_config.processing_rules: "ignored in initial audit 2026-04-23" + logs_config.run_path: "ignored in initial audit 2026-04-23" + logs_config.sender_backoff_base: "ignored in initial audit 2026-04-23" + logs_config.sender_backoff_factor: "ignored in initial audit 2026-04-23" + logs_config.sender_backoff_max: "ignored in initial audit 2026-04-23" + logs_config.sender_recovery_interval: "ignored in initial audit 2026-04-23" + logs_config.sender_recovery_reset: "ignored in initial audit 2026-04-23" + logs_config.socks5_proxy_address: "ignored in initial audit 2026-04-23" + logs_config.stop_grace_period: "ignored in initial audit 2026-04-23" + logs_config.streaming.streamlogs_log_file: "ignored in initial audit 2026-04-23" + logs_config.tag_multi_line_logs: "ignored in initial audit 2026-04-23" + logs_config.tag_truncated_logs: "ignored in initial audit 2026-04-23" + logs_config.tagger_warmup_duration: "ignored in initial audit 2026-04-23" + logs_config.use_compression: "ignored in initial audit 2026-04-23" + logs_config.use_http: "ignored in initial audit 2026-04-23" + logs_config.use_podman_logs: "ignored in initial audit 2026-04-23" + logs_config.use_port_443: "ignored in initial audit 2026-04-23" + logs_config.use_sourcehost_tag: "ignored in initial audit 2026-04-23" + logs_config.use_tcp: "ignored in initial audit 2026-04-23" + logs_config.use_v2_api: "ignored in initial audit 2026-04-23" + logs_config.validate_pod_container_id: "ignored in initial audit 2026-04-23" + logs_config.windows_open_file_timeout: "ignored in initial audit 2026-04-23" + logs_config.zstd_compression_level: "ignored in initial audit 2026-04-23" + logs_enabled: "ignored in initial audit 2026-04-23" + memtrack_enabled: "ignored in initial audit 2026-04-23" + metadata_endpoints_max_hostname_size: "ignored in initial audit 2026-04-23" + metadata_ip_resolution_from_hostname: "ignored in initial audit 2026-04-23" + metadata_provider_stop_timeout: "ignored in initial audit 2026-04-23" + metadata_providers: "ignored in initial audit 2026-04-23" + metric_tag_filterlist: "ignored in second bulk edit 2026-05-06" + metrics_port: "ignored in initial audit 2026-04-23" + multi_region_failover.failover_apm: "ignored in initial audit 2026-04-23" + multi_region_failover.failover_logs: "ignored in initial audit 2026-04-23" + multi_region_failover.logs_service_allowlist: "ignored in initial audit 2026-04-23" + multi_region_failover.remote_configuration.clients.cache_bypass_limit: "ignored in initial audit 2026-04-23" + multi_region_failover.remote_configuration.clients.ttl_seconds: "ignored in initial audit 2026-04-23" + multi_region_failover.remote_configuration.config_root: "ignored in initial audit 2026-04-23" + multi_region_failover.remote_configuration.director_root: "ignored in initial audit 2026-04-23" + multi_region_failover.remote_configuration.key: "ignored in initial audit 2026-04-23" + multi_region_failover.remote_configuration.max_backoff_interval: "ignored in initial audit 2026-04-23" + multi_region_failover.remote_configuration.max_backoff_time: "ignored in initial audit 2026-04-23" + multi_region_failover.remote_configuration.org_status_refresh_interval: "ignored in initial audit 2026-04-23" + multi_region_failover.remote_configuration.refresh_interval: "ignored in initial audit 2026-04-23" + network.id: "ignored in initial audit 2026-04-23" + network_check.use_core_loader: "ignored in initial audit 2026-04-23" + network_config_management.forwarder.additional_endpoints: "ignored in initial audit 2026-04-23" + network_config_management.forwarder.batch_max_concurrent_send: "ignored in initial audit 2026-04-23" + network_config_management.forwarder.batch_max_content_size: "ignored in initial audit 2026-04-23" + network_config_management.forwarder.batch_max_size: "ignored in initial audit 2026-04-23" + network_config_management.forwarder.batch_wait: "ignored in initial audit 2026-04-23" + network_config_management.forwarder.compression_kind: "ignored in initial audit 2026-04-23" + network_config_management.forwarder.compression_level: "ignored in initial audit 2026-04-23" + network_config_management.forwarder.connection_reset_interval: "ignored in initial audit 2026-04-23" + network_config_management.forwarder.dd_url: "ignored in initial audit 2026-04-23" + network_config_management.forwarder.dev_mode_no_ssl: "ignored in initial audit 2026-04-23" + network_config_management.forwarder.input_chan_size: "ignored in initial audit 2026-04-23" + network_config_management.forwarder.logs_dd_url: "ignored in initial audit 2026-04-23" + network_config_management.forwarder.logs_no_ssl: "ignored in initial audit 2026-04-23" + network_config_management.forwarder.sender_backoff_base: "ignored in initial audit 2026-04-23" + network_config_management.forwarder.sender_backoff_factor: "ignored in initial audit 2026-04-23" + network_config_management.forwarder.sender_backoff_max: "ignored in initial audit 2026-04-23" + network_config_management.forwarder.sender_recovery_interval: "ignored in initial audit 2026-04-23" + network_config_management.forwarder.sender_recovery_reset: "ignored in initial audit 2026-04-23" + network_config_management.forwarder.use_compression: "ignored in initial audit 2026-04-23" + network_config_management.forwarder.use_v2_api: "ignored in initial audit 2026-04-23" + network_config_management.forwarder.zstd_compression_level: "ignored in initial audit 2026-04-23" + network_devices.autodiscovery.allowed_failures: "ignored in initial audit 2026-04-23" + network_devices.autodiscovery.collect_device_metadata: "ignored in initial audit 2026-04-23" + network_devices.autodiscovery.collect_topology: "ignored in initial audit 2026-04-23" + network_devices.autodiscovery.collect_vpn: "ignored in initial audit 2026-04-23" + network_devices.autodiscovery.configs: "ignored in initial audit 2026-04-23" + network_devices.autodiscovery.discovery_allowed_failures: "ignored in initial audit 2026-04-23" + network_devices.autodiscovery.discovery_interval: "ignored in initial audit 2026-04-23" + network_devices.autodiscovery.loader: "ignored in initial audit 2026-04-23" + network_devices.autodiscovery.min_collection_interval: "ignored in initial audit 2026-04-23" + network_devices.autodiscovery.namespace: "ignored in initial audit 2026-04-23" + network_devices.autodiscovery.oid_batch_size: "ignored in initial audit 2026-04-23" + network_devices.autodiscovery.ping.count: "ignored in initial audit 2026-04-23" + network_devices.autodiscovery.ping.enabled: "ignored in initial audit 2026-04-23" + network_devices.autodiscovery.ping.interval: "ignored in initial audit 2026-04-23" + network_devices.autodiscovery.ping.linux.use_raw_socket: "ignored in initial audit 2026-04-23" + network_devices.autodiscovery.ping.timeout: "ignored in initial audit 2026-04-23" + network_devices.autodiscovery.retries: "ignored in initial audit 2026-04-23" + network_devices.autodiscovery.timeout: "ignored in initial audit 2026-04-23" + network_devices.autodiscovery.use_deduplication: "ignored in initial audit 2026-04-23" + network_devices.autodiscovery.use_device_id_as_hostname: "ignored in initial audit 2026-04-23" + network_devices.autodiscovery.workers: "ignored in initial audit 2026-04-23" + network_devices.default_scan.enabled: "ignored in initial audit 2026-04-23" + network_devices.default_scan.excluded_ips: "ignored in initial audit 2026-04-23" + network_devices.metadata.additional_endpoints: "ignored in initial audit 2026-04-23" + network_devices.metadata.batch_max_concurrent_send: "ignored in initial audit 2026-04-23" + network_devices.metadata.batch_max_content_size: "ignored in initial audit 2026-04-23" + network_devices.metadata.batch_max_size: "ignored in initial audit 2026-04-23" + network_devices.metadata.batch_wait: "ignored in initial audit 2026-04-23" + network_devices.metadata.compression_kind: "ignored in initial audit 2026-04-23" + network_devices.metadata.compression_level: "ignored in initial audit 2026-04-23" + network_devices.metadata.connection_reset_interval: "ignored in initial audit 2026-04-23" + network_devices.metadata.dd_url: "ignored in initial audit 2026-04-23" + network_devices.metadata.dev_mode_no_ssl: "ignored in initial audit 2026-04-23" + network_devices.metadata.input_chan_size: "ignored in initial audit 2026-04-23" + network_devices.metadata.logs_dd_url: "ignored in initial audit 2026-04-23" + network_devices.metadata.logs_no_ssl: "ignored in initial audit 2026-04-23" + network_devices.metadata.sender_backoff_base: "ignored in initial audit 2026-04-23" + network_devices.metadata.sender_backoff_factor: "ignored in initial audit 2026-04-23" + network_devices.metadata.sender_backoff_max: "ignored in initial audit 2026-04-23" + network_devices.metadata.sender_recovery_interval: "ignored in initial audit 2026-04-23" + network_devices.metadata.sender_recovery_reset: "ignored in initial audit 2026-04-23" + network_devices.metadata.use_compression: "ignored in initial audit 2026-04-23" + network_devices.metadata.use_v2_api: "ignored in initial audit 2026-04-23" + network_devices.metadata.zstd_compression_level: "ignored in initial audit 2026-04-23" + network_devices.namespace: "ignored in initial audit 2026-04-23" + network_devices.netflow.aggregator_buffer_size: "ignored in initial audit 2026-04-23" + network_devices.netflow.aggregator_flow_context_ttl: "ignored in initial audit 2026-04-23" + network_devices.netflow.aggregator_flush_interval: "ignored in initial audit 2026-04-23" + network_devices.netflow.aggregator_port_rollup_threshold: "ignored in initial audit 2026-04-23" + network_devices.netflow.aggregator_rollup_tracker_refresh_interval: "ignored in initial audit 2026-04-23" + network_devices.netflow.enabled: "ignored in initial audit 2026-04-23" + network_devices.netflow.forwarder.additional_endpoints: "ignored in initial audit 2026-04-23" + network_devices.netflow.forwarder.batch_max_concurrent_send: "ignored in initial audit 2026-04-23" + network_devices.netflow.forwarder.batch_max_content_size: "ignored in initial audit 2026-04-23" + network_devices.netflow.forwarder.batch_max_size: "ignored in initial audit 2026-04-23" + network_devices.netflow.forwarder.batch_wait: "ignored in initial audit 2026-04-23" + network_devices.netflow.forwarder.compression_kind: "ignored in initial audit 2026-04-23" + network_devices.netflow.forwarder.compression_level: "ignored in initial audit 2026-04-23" + network_devices.netflow.forwarder.connection_reset_interval: "ignored in initial audit 2026-04-23" + network_devices.netflow.forwarder.dd_url: "ignored in initial audit 2026-04-23" + network_devices.netflow.forwarder.dev_mode_no_ssl: "ignored in initial audit 2026-04-23" + network_devices.netflow.forwarder.input_chan_size: "ignored in initial audit 2026-04-23" + network_devices.netflow.forwarder.logs_dd_url: "ignored in initial audit 2026-04-23" + network_devices.netflow.forwarder.logs_no_ssl: "ignored in initial audit 2026-04-23" + network_devices.netflow.forwarder.sender_backoff_base: "ignored in initial audit 2026-04-23" + network_devices.netflow.forwarder.sender_backoff_factor: "ignored in initial audit 2026-04-23" + network_devices.netflow.forwarder.sender_backoff_max: "ignored in initial audit 2026-04-23" + network_devices.netflow.forwarder.sender_recovery_interval: "ignored in initial audit 2026-04-23" + network_devices.netflow.forwarder.sender_recovery_reset: "ignored in initial audit 2026-04-23" + network_devices.netflow.forwarder.use_compression: "ignored in initial audit 2026-04-23" + network_devices.netflow.forwarder.use_v2_api: "ignored in initial audit 2026-04-23" + network_devices.netflow.forwarder.zstd_compression_level: "ignored in initial audit 2026-04-23" + network_devices.netflow.listeners: "ignored in initial audit 2026-04-23" + network_devices.netflow.reverse_dns_enrichment_enabled: "ignored in initial audit 2026-04-23" + network_devices.netflow.stop_timeout: "ignored in initial audit 2026-04-23" + network_devices.snmp_traps.bind_host: "ignored in initial audit 2026-04-23" + network_devices.snmp_traps.community_strings: "ignored in initial audit 2026-04-23" + network_devices.snmp_traps.enabled: "ignored in initial audit 2026-04-23" + network_devices.snmp_traps.forwarder.additional_endpoints: "ignored in initial audit 2026-04-23" + network_devices.snmp_traps.forwarder.batch_max_concurrent_send: "ignored in initial audit 2026-04-23" + network_devices.snmp_traps.forwarder.batch_max_content_size: "ignored in initial audit 2026-04-23" + network_devices.snmp_traps.forwarder.batch_max_size: "ignored in initial audit 2026-04-23" + network_devices.snmp_traps.forwarder.batch_wait: "ignored in initial audit 2026-04-23" + network_devices.snmp_traps.forwarder.compression_kind: "ignored in initial audit 2026-04-23" + network_devices.snmp_traps.forwarder.compression_level: "ignored in initial audit 2026-04-23" + network_devices.snmp_traps.forwarder.connection_reset_interval: "ignored in initial audit 2026-04-23" + network_devices.snmp_traps.forwarder.dd_url: "ignored in initial audit 2026-04-23" + network_devices.snmp_traps.forwarder.dev_mode_no_ssl: "ignored in initial audit 2026-04-23" + network_devices.snmp_traps.forwarder.input_chan_size: "ignored in initial audit 2026-04-23" + network_devices.snmp_traps.forwarder.logs_dd_url: "ignored in initial audit 2026-04-23" + network_devices.snmp_traps.forwarder.logs_no_ssl: "ignored in initial audit 2026-04-23" + network_devices.snmp_traps.forwarder.sender_backoff_base: "ignored in initial audit 2026-04-23" + network_devices.snmp_traps.forwarder.sender_backoff_factor: "ignored in initial audit 2026-04-23" + network_devices.snmp_traps.forwarder.sender_backoff_max: "ignored in initial audit 2026-04-23" + network_devices.snmp_traps.forwarder.sender_recovery_interval: "ignored in initial audit 2026-04-23" + network_devices.snmp_traps.forwarder.sender_recovery_reset: "ignored in initial audit 2026-04-23" + network_devices.snmp_traps.forwarder.use_compression: "ignored in initial audit 2026-04-23" + network_devices.snmp_traps.forwarder.use_v2_api: "ignored in initial audit 2026-04-23" + network_devices.snmp_traps.forwarder.zstd_compression_level: "ignored in initial audit 2026-04-23" + network_devices.snmp_traps.port: "ignored in initial audit 2026-04-23" + network_devices.snmp_traps.stop_timeout: "ignored in initial audit 2026-04-23" + network_devices.snmp_traps.users: "ignored in initial audit 2026-04-23" + network_path.collector.dest_excludes: "ignored in initial audit 2026-04-23" + network_path.collector.disable_intra_vpc_collection: "ignored in initial audit 2026-04-23" + network_path.collector.disable_windows_driver: "ignored in initial audit 2026-04-23" + network_path.collector.e2e_queries: "ignored in initial audit 2026-04-23" + network_path.collector.filters: "ignored in initial audit 2026-04-23" + network_path.collector.flush_interval: "ignored in initial audit 2026-04-23" + network_path.collector.icmp_mode: "ignored in initial audit 2026-04-23" + network_path.collector.input_chan_size: "ignored in initial audit 2026-04-23" + network_path.collector.max_ttl: "ignored in initial audit 2026-04-23" + network_path.collector.monitor_ip_without_domain: "ignored in initial audit 2026-04-23" + network_path.collector.pathtest_contexts_limit: "ignored in initial audit 2026-04-23" + network_path.collector.pathtest_interval: "ignored in initial audit 2026-04-23" + network_path.collector.pathtest_max_burst_duration: "ignored in initial audit 2026-04-23" + network_path.collector.pathtest_max_per_minute: "ignored in initial audit 2026-04-23" + network_path.collector.pathtest_ttl: "ignored in initial audit 2026-04-23" + network_path.collector.processing_chan_size: "ignored in initial audit 2026-04-23" + network_path.collector.reverse_dns_enrichment.enabled: "ignored in initial audit 2026-04-23" + network_path.collector.reverse_dns_enrichment.timeout: "ignored in initial audit 2026-04-23" + network_path.collector.source_excludes: "ignored in initial audit 2026-04-23" + network_path.collector.tcp_method: "ignored in initial audit 2026-04-23" + network_path.collector.tcp_syn_paris_traceroute_mode: "ignored in initial audit 2026-04-23" + network_path.collector.timeout: "ignored in initial audit 2026-04-23" + network_path.collector.traceroute_queries: "ignored in initial audit 2026-04-23" + network_path.collector.workers: "ignored in initial audit 2026-04-23" + network_path.connections_monitoring.enabled: "ignored in initial audit 2026-04-23" + network_path.forwarder.additional_endpoints: "ignored in initial audit 2026-04-23" + network_path.forwarder.batch_max_concurrent_send: "ignored in initial audit 2026-04-23" + network_path.forwarder.batch_max_content_size: "ignored in initial audit 2026-04-23" + network_path.forwarder.batch_max_size: "ignored in initial audit 2026-04-23" + network_path.forwarder.batch_wait: "ignored in initial audit 2026-04-23" + network_path.forwarder.compression_kind: "ignored in initial audit 2026-04-23" + network_path.forwarder.compression_level: "ignored in initial audit 2026-04-23" + network_path.forwarder.connection_reset_interval: "ignored in initial audit 2026-04-23" + network_path.forwarder.dd_url: "ignored in initial audit 2026-04-23" + network_path.forwarder.dev_mode_no_ssl: "ignored in initial audit 2026-04-23" + network_path.forwarder.input_chan_size: "ignored in initial audit 2026-04-23" + network_path.forwarder.logs_dd_url: "ignored in initial audit 2026-04-23" + network_path.forwarder.logs_no_ssl: "ignored in initial audit 2026-04-23" + network_path.forwarder.sender_backoff_base: "ignored in initial audit 2026-04-23" + network_path.forwarder.sender_backoff_factor: "ignored in initial audit 2026-04-23" + network_path.forwarder.sender_backoff_max: "ignored in initial audit 2026-04-23" + network_path.forwarder.sender_recovery_interval: "ignored in initial audit 2026-04-23" + network_path.forwarder.sender_recovery_reset: "ignored in initial audit 2026-04-23" + network_path.forwarder.use_compression: "ignored in initial audit 2026-04-23" + network_path.forwarder.use_v2_api: "ignored in initial audit 2026-04-23" + network_path.forwarder.zstd_compression_level: "ignored in initial audit 2026-04-23" + notable_events.enabled: "ignored in initial audit 2026-04-23" + observability_pipelines_worker.logs.enabled: "OPW logs routing out of scope for ADP" + observability_pipelines_worker.logs.url: "OPW logs routing out of scope for ADP" + observability_pipelines_worker.traces.enabled: "OPW traces routing out of scope for ADP" + observability_pipelines_worker.traces.url: "OPW traces routing out of scope for ADP" + ol_proxy_config.additional_endpoints: "ignored in initial audit 2026-04-23" + ol_proxy_config.api_key: "ignored in initial audit 2026-04-23" + ol_proxy_config.api_version: "ignored in initial audit 2026-04-23" + ol_proxy_config.dd_url: "ignored in initial audit 2026-04-23" + ol_proxy_config.delegated_auth.aws.region: "ignored in initial audit 2026-04-23" + ol_proxy_config.delegated_auth.org_uuid: "ignored in initial audit 2026-04-23" + ol_proxy_config.delegated_auth.provider: "ignored in initial audit 2026-04-23" + ol_proxy_config.delegated_auth.refresh_interval_mins: "ignored in initial audit 2026-04-23" + ol_proxy_config.enabled: "ignored in initial audit 2026-04-23" + orchestrator_explorer.collector_discovery.enabled: "ignored in initial audit 2026-04-23" + orchestrator_explorer.container_scrubbing.enabled: "ignored in initial audit 2026-04-23" + orchestrator_explorer.custom_resources.max_count: "ignored in initial audit 2026-04-23" + orchestrator_explorer.custom_resources.ootb.enabled: "ignored in initial audit 2026-04-23" + orchestrator_explorer.custom_resources.ootb.gateway_api: "ignored in initial audit 2026-04-23" + orchestrator_explorer.custom_resources.ootb.ingress_controllers: "ignored in initial audit 2026-04-23" + orchestrator_explorer.custom_resources.ootb.service_mesh: "ignored in initial audit 2026-04-23" + orchestrator_explorer.custom_sensitive_annotations_labels: "ignored in initial audit 2026-04-23" + orchestrator_explorer.custom_sensitive_words: "ignored in initial audit 2026-04-23" + orchestrator_explorer.enabled: "ignored in initial audit 2026-04-23" + orchestrator_explorer.extra_tags: "ignored in initial audit 2026-04-23" + orchestrator_explorer.kubelet_config_check.enabled: "ignored in initial audit 2026-04-23" + orchestrator_explorer.manifest_collection.buffer_flush_interval: "ignored in initial audit 2026-04-23" + orchestrator_explorer.manifest_collection.buffer_manifest: "ignored in initial audit 2026-04-23" + orchestrator_explorer.manifest_collection.enabled: "ignored in initial audit 2026-04-23" + orchestrator_explorer.max_message_bytes: "ignored in initial audit 2026-04-23" + orchestrator_explorer.max_per_message: "ignored in initial audit 2026-04-23" + orchestrator_explorer.orchestrator_additional_endpoints: "ignored in initial audit 2026-04-23" + orchestrator_explorer.orchestrator_dd_url: "ignored in initial audit 2026-04-23" + orchestrator_explorer.terminated_pods.enabled: "ignored in initial audit 2026-04-23" + orchestrator_explorer.terminated_pods_improved.enabled: "ignored in initial audit 2026-04-23" + orchestrator_explorer.terminated_resources.enabled: "ignored in initial audit 2026-04-23" + orchestrator_explorer.use_legacy_endpoint: "ignored in initial audit 2026-04-23" + otel_standalone: "ignored in initial audit 2026-04-23" + otelcollector.converter.enabled: "ignored in initial audit 2026-04-23" + otelcollector.converter.features: "ignored in initial audit 2026-04-23" + otelcollector.enabled: "ignored in initial audit 2026-04-23" + otelcollector.extension_timeout: "ignored in initial audit 2026-04-23" + otelcollector.extension_url: "ignored in initial audit 2026-04-23" + otelcollector.flare.timeout: "ignored in initial audit 2026-04-23" + otelcollector.gateway.mode: "ignored in initial audit 2026-04-23" + otelcollector.installation_method: "ignored in initial audit 2026-04-23" + otelcollector.submit_dummy_metadata: "ignored in initial audit 2026-04-23" + otlp_config.debug.verbosity: "ignored in initial audit 2026-04-23" + otlp_config.grpc_port: "ignored in initial audit 2026-04-23" + otlp_config.http_port: "ignored in initial audit 2026-04-23" + otlp_config.logs.batch.flush_timeout: "ignored in initial audit 2026-04-23" + otlp_config.logs.batch.max_size: "ignored in initial audit 2026-04-23" + otlp_config.logs.batch.min_size: "ignored in initial audit 2026-04-23" + otlp_config.metrics.batch.flush_timeout: "ignored in initial audit 2026-04-23" + otlp_config.metrics.batch.max_size: "ignored in initial audit 2026-04-23" + otlp_config.metrics.batch.min_size: "ignored in initial audit 2026-04-23" + otlp_config.metrics.delta_ttl: "ignored in initial audit 2026-04-23" + otlp_config.metrics.histograms.mode: "ignored in initial audit 2026-04-23" + otlp_config.metrics.histograms.send_aggregation_metrics: "ignored in initial audit 2026-04-23" + otlp_config.metrics.histograms.send_count_sum_metrics: "ignored in initial audit 2026-04-23" + otlp_config.metrics.instrumentation_scope_metadata_as_tags: "ignored in initial audit 2026-04-23" + otlp_config.metrics.resource_attributes_as_tags: "ignored in initial audit 2026-04-23" + otlp_config.metrics.summaries.mode: "ignored in initial audit 2026-04-23" + otlp_config.metrics.sums.cumulative_monotonic_mode: "ignored in initial audit 2026-04-23" + otlp_config.metrics.sums.initial_cumulative_monotonic_value: "ignored in initial audit 2026-04-23" + otlp_config.metrics.tag_cardinality: "ignored in initial audit 2026-04-23" + otlp_config.metrics.tags: "ignored in initial audit 2026-04-23" + otlp_config.receiver.protocols.grpc.include_metadata: "ignored in initial audit 2026-04-23" + otlp_config.receiver.protocols.grpc.keepalive.enforcement_policy.min_time: "ignored in initial audit 2026-04-23" + otlp_config.receiver.protocols.grpc.max_concurrent_streams: "ignored in initial audit 2026-04-23" + otlp_config.receiver.protocols.grpc.read_buffer_size: "ignored in initial audit 2026-04-23" + otlp_config.receiver.protocols.grpc.write_buffer_size: "ignored in initial audit 2026-04-23" + otlp_config.receiver.protocols.http.cors.allowed_headers: "ignored in initial audit 2026-04-23" + otlp_config.receiver.protocols.http.cors.allowed_origins: "ignored in initial audit 2026-04-23" + otlp_config.receiver.protocols.http.include_metadata: "ignored in initial audit 2026-04-23" + otlp_config.receiver.protocols.http.max_request_body_size: "ignored in initial audit 2026-04-23" + otlp_config.traces.infra_attributes.enabled: "ignored in initial audit 2026-04-23" + otlp_config.traces.span_name_as_resource_name: "ignored in initial audit 2026-04-23" + otlp_config.traces.span_name_remappings: "ignored in initial audit 2026-04-23" + podman_db_path: "ignored in initial audit 2026-04-23" + prioritize_go_check_loader: "ignored in initial audit 2026-04-23" + private_action_runner.actions_allowlist: "ignored in initial audit 2026-04-23" + private_action_runner.enabled: "ignored in initial audit 2026-04-23" + private_action_runner.http_allow_imds_endpoint: "ignored in initial audit 2026-04-23" + private_action_runner.http_allowlist: "ignored in initial audit 2026-04-23" + private_action_runner.http_timeout_seconds: "ignored in initial audit 2026-04-23" + private_action_runner.identity_file_path: "ignored in second bulk edit 2026-05-06" + private_action_runner.identity_secret_name: "ignored in second bulk edit 2026-05-06" + private_action_runner.identity_use_k8s_secret: "ignored in second bulk edit 2026-05-06" + private_action_runner.log_file: "ignored in second bulk edit 2026-05-06" + private_action_runner.private_key: "ignored in second bulk edit 2026-05-06" + private_action_runner.restricted_shell_allowed_paths: "ignored in second bulk edit 2026-05-06" + private_action_runner.self_enroll: "ignored in initial audit 2026-04-23" + private_action_runner.task_concurrency: "ignored in initial audit 2026-04-23" + private_action_runner.task_timeout_seconds: "ignored in initial audit 2026-04-23" + private_action_runner.urn: "ignored in second bulk edit 2026-05-06" + proc_root: "ignored in initial audit 2026-04-23" + process_config.additional_endpoints: "ignored in initial audit 2026-04-23" + process_config.blacklist_patterns: "ignored in initial audit 2026-04-23" + process_config.cache_lookupid: "ignored in initial audit 2026-04-23" + process_config.cmd_port: "ignored in initial audit 2026-04-23" + process_config.container_collection.enabled: "ignored in initial audit 2026-04-23" + process_config.custom_sensitive_words: "ignored in initial audit 2026-04-23" + process_config.dd_agent_bin: "ignored in initial audit 2026-04-23" + process_config.dd_agent_env: "ignored in initial audit 2026-04-23" + process_config.disable_realtime_checks: "ignored in initial audit 2026-04-23" + process_config.drop_check_payloads: "ignored in initial audit 2026-04-23" + process_config.enabled: "ignored in initial audit 2026-04-23" + process_config.expvar_port: "ignored in initial audit 2026-04-23" + process_config.grpc_connection_timeout_secs: "ignored in initial audit 2026-04-23" + process_config.ignore_zombie_processes: "ignored in initial audit 2026-04-23" + process_config.internal_profiling.enabled: "ignored in initial audit 2026-04-23" + process_config.intervals.connections: "ignored in initial audit 2026-04-23" + process_config.intervals.container: "ignored in initial audit 2026-04-23" + process_config.intervals.container_realtime: "ignored in initial audit 2026-04-23" + process_config.intervals.process: "ignored in initial audit 2026-04-23" + process_config.intervals.process_realtime: "ignored in initial audit 2026-04-23" + process_config.language_detection.grpc_port: "ignored in initial audit 2026-04-23" + process_config.log_file: "ignored in initial audit 2026-04-23" + process_config.max_message_bytes: "ignored in initial audit 2026-04-23" + process_config.max_per_message: "ignored in initial audit 2026-04-23" + process_config.orchestrator_additional_endpoints: "ignored in initial audit 2026-04-23" + process_config.orchestrator_dd_url: "ignored in initial audit 2026-04-23" + process_config.process_collection.enabled: "ignored in initial audit 2026-04-23" + process_config.process_dd_url: "ignored in initial audit 2026-04-23" + process_config.process_discovery.enabled: "ignored in initial audit 2026-04-23" + process_config.process_discovery.hint_frequency: "ignored in initial audit 2026-04-23" + process_config.process_discovery.interval: "ignored in initial audit 2026-04-23" + process_config.process_queue_bytes: "ignored in initial audit 2026-04-23" + process_config.queue_size: "ignored in initial audit 2026-04-23" + process_config.rt_queue_size: "ignored in initial audit 2026-04-23" + process_config.scrub_args: "ignored in initial audit 2026-04-23" + process_config.strip_proc_arguments: "ignored in initial audit 2026-04-23" + process_config.windows.use_perf_counters: "ignored in initial audit 2026-04-23" + procfs_path: "ignored in initial audit 2026-04-23" + prometheus_scrape.checks: "ignored in initial audit 2026-04-23" + prometheus_scrape.enabled: "ignored in initial audit 2026-04-23" + prometheus_scrape.service_endpoints: "ignored in initial audit 2026-04-23" + prometheus_scrape.version: "ignored in initial audit 2026-04-23" + python3_linter_timeout: "ignored in initial audit 2026-04-23" + python_lazy_loading: "ignored in initial audit 2026-04-23" + remote_agent.configstream.enabled: "ignored in initial audit 2026-04-23" + remote_agent.configstream.sleep_interval: "ignored in initial audit 2026-04-23" + remote_agent.registry.enabled: "ignored in initial audit 2026-04-23" + remote_agent.registry.idle_timeout: "ignored in initial audit 2026-04-23" + remote_agent.registry.query_timeout: "ignored in initial audit 2026-04-23" + remote_agent.registry.recommended_refresh_interval: "ignored in initial audit 2026-04-23" + remote_configuration.agent_integrations.allow_list: "ignored in initial audit 2026-04-23" + remote_configuration.agent_integrations.allow_log_config_scheduling: "ignored in initial audit 2026-04-23" + remote_configuration.agent_integrations.block_list: "ignored in initial audit 2026-04-23" + remote_configuration.agent_integrations.enabled: "ignored in initial audit 2026-04-23" + remote_configuration.api_key: "ignored in initial audit 2026-04-23" + remote_configuration.apm_sampling.enabled: "ignored in initial audit 2026-04-23" + remote_configuration.clients.cache_bypass_limit: "ignored in initial audit 2026-04-23" + remote_configuration.clients.ttl_seconds: "ignored in initial audit 2026-04-23" + remote_configuration.config_root: "ignored in initial audit 2026-04-23" + remote_configuration.delegated_auth.aws.region: "ignored in initial audit 2026-04-23" + remote_configuration.delegated_auth.org_uuid: "ignored in initial audit 2026-04-23" + remote_configuration.delegated_auth.provider: "ignored in initial audit 2026-04-23" + remote_configuration.delegated_auth.refresh_interval_mins: "ignored in initial audit 2026-04-23" + remote_configuration.director_root: "ignored in initial audit 2026-04-23" + remote_configuration.enabled: "ignored in initial audit 2026-04-23" + remote_configuration.key: "ignored in initial audit 2026-04-23" + remote_configuration.max_backoff_interval: "ignored in initial audit 2026-04-23" + remote_configuration.no_tls: "ignored in initial audit 2026-04-23" + remote_configuration.no_tls_validation: "ignored in initial audit 2026-04-23" + remote_configuration.no_websocket_echo: "ignored in initial audit 2026-04-23" + remote_configuration.org_status_refresh_interval: "ignored in initial audit 2026-04-23" + remote_configuration.rc_dd_url: "ignored in initial audit 2026-04-23" + remote_configuration.refresh_interval: "ignored in initial audit 2026-04-23" + remote_policies: "ignored in initial audit 2026-04-23" + remote_tagger.max_concurrent_sync: "ignored in initial audit 2026-04-23" + remote_updates: "ignored in initial audit 2026-04-23" + reverse_dns_enrichment.cache.clean_interval: "ignored in initial audit 2026-04-23" + reverse_dns_enrichment.cache.enabled: "ignored in initial audit 2026-04-23" + reverse_dns_enrichment.cache.entry_ttl: "ignored in initial audit 2026-04-23" + reverse_dns_enrichment.cache.max_retries: "ignored in initial audit 2026-04-23" + reverse_dns_enrichment.cache.max_size: "ignored in initial audit 2026-04-23" + reverse_dns_enrichment.cache.persist_interval: "ignored in initial audit 2026-04-23" + reverse_dns_enrichment.chan_size: "ignored in initial audit 2026-04-23" + reverse_dns_enrichment.rate_limiter.enabled: "ignored in initial audit 2026-04-23" + reverse_dns_enrichment.rate_limiter.limit_per_sec: "ignored in initial audit 2026-04-23" + reverse_dns_enrichment.rate_limiter.limit_throttled_per_sec: "ignored in initial audit 2026-04-23" + reverse_dns_enrichment.rate_limiter.recovery_interval: "ignored in initial audit 2026-04-23" + reverse_dns_enrichment.rate_limiter.recovery_intervals: "ignored in initial audit 2026-04-23" + reverse_dns_enrichment.rate_limiter.throttle_error_threshold: "ignored in initial audit 2026-04-23" + reverse_dns_enrichment.workers: "ignored in initial audit 2026-04-23" + run_path: "ignored in second bulk edit 2026-05-06" + runtime_security_config.activity_dump.remote_storage.endpoints.additional_endpoints: "ignored in initial audit 2026-04-23" + runtime_security_config.activity_dump.remote_storage.endpoints.batch_max_concurrent_send: "ignored in initial audit 2026-04-23" + runtime_security_config.activity_dump.remote_storage.endpoints.batch_max_content_size: "ignored in initial audit 2026-04-23" + runtime_security_config.activity_dump.remote_storage.endpoints.batch_max_size: "ignored in initial audit 2026-04-23" + runtime_security_config.activity_dump.remote_storage.endpoints.batch_wait: "ignored in initial audit 2026-04-23" + runtime_security_config.activity_dump.remote_storage.endpoints.compression_kind: "ignored in initial audit 2026-04-23" + runtime_security_config.activity_dump.remote_storage.endpoints.compression_level: "ignored in initial audit 2026-04-23" + runtime_security_config.activity_dump.remote_storage.endpoints.connection_reset_interval: "ignored in initial audit 2026-04-23" + runtime_security_config.activity_dump.remote_storage.endpoints.dd_url: "ignored in initial audit 2026-04-23" + runtime_security_config.activity_dump.remote_storage.endpoints.dev_mode_no_ssl: "ignored in initial audit 2026-04-23" + runtime_security_config.activity_dump.remote_storage.endpoints.input_chan_size: "ignored in initial audit 2026-04-23" + runtime_security_config.activity_dump.remote_storage.endpoints.logs_dd_url: "ignored in initial audit 2026-04-23" + runtime_security_config.activity_dump.remote_storage.endpoints.logs_no_ssl: "ignored in initial audit 2026-04-23" + runtime_security_config.activity_dump.remote_storage.endpoints.sender_backoff_base: "ignored in initial audit 2026-04-23" + runtime_security_config.activity_dump.remote_storage.endpoints.sender_backoff_factor: "ignored in initial audit 2026-04-23" + runtime_security_config.activity_dump.remote_storage.endpoints.sender_backoff_max: "ignored in initial audit 2026-04-23" + runtime_security_config.activity_dump.remote_storage.endpoints.sender_recovery_interval: "ignored in initial audit 2026-04-23" + runtime_security_config.activity_dump.remote_storage.endpoints.sender_recovery_reset: "ignored in initial audit 2026-04-23" + runtime_security_config.activity_dump.remote_storage.endpoints.use_compression: "ignored in initial audit 2026-04-23" + runtime_security_config.activity_dump.remote_storage.endpoints.use_v2_api: "ignored in initial audit 2026-04-23" + runtime_security_config.activity_dump.remote_storage.endpoints.zstd_compression_level: "ignored in initial audit 2026-04-23" + runtime_security_config.cmd_socket: "ignored in initial audit 2026-04-23" + runtime_security_config.direct_send_from_system_probe: "ignored in initial audit 2026-04-23" + runtime_security_config.enabled: "ignored in initial audit 2026-04-23" + runtime_security_config.endpoints.additional_endpoints: "ignored in initial audit 2026-04-23" + runtime_security_config.endpoints.batch_max_concurrent_send: "ignored in initial audit 2026-04-23" + runtime_security_config.endpoints.batch_max_content_size: "ignored in initial audit 2026-04-23" + runtime_security_config.endpoints.batch_max_size: "ignored in initial audit 2026-04-23" + runtime_security_config.endpoints.batch_wait: "ignored in initial audit 2026-04-23" + runtime_security_config.endpoints.compression_kind: "ignored in initial audit 2026-04-23" + runtime_security_config.endpoints.compression_level: "ignored in initial audit 2026-04-23" + runtime_security_config.endpoints.connection_reset_interval: "ignored in initial audit 2026-04-23" + runtime_security_config.endpoints.dd_url: "ignored in initial audit 2026-04-23" + runtime_security_config.endpoints.dev_mode_no_ssl: "ignored in initial audit 2026-04-23" + runtime_security_config.endpoints.input_chan_size: "ignored in initial audit 2026-04-23" + runtime_security_config.endpoints.logs_dd_url: "ignored in initial audit 2026-04-23" + runtime_security_config.endpoints.logs_no_ssl: "ignored in initial audit 2026-04-23" + runtime_security_config.endpoints.sender_backoff_base: "ignored in initial audit 2026-04-23" + runtime_security_config.endpoints.sender_backoff_factor: "ignored in initial audit 2026-04-23" + runtime_security_config.endpoints.sender_backoff_max: "ignored in initial audit 2026-04-23" + runtime_security_config.endpoints.sender_recovery_interval: "ignored in initial audit 2026-04-23" + runtime_security_config.endpoints.sender_recovery_reset: "ignored in initial audit 2026-04-23" + runtime_security_config.endpoints.use_compression: "ignored in initial audit 2026-04-23" + runtime_security_config.endpoints.use_v2_api: "ignored in initial audit 2026-04-23" + runtime_security_config.endpoints.zstd_compression_level: "ignored in initial audit 2026-04-23" + runtime_security_config.event_grpc_server: "ignored in initial audit 2026-04-23" + runtime_security_config.socket: "ignored in initial audit 2026-04-23" + runtime_security_config.use_secruntime_track: "ignored in initial audit 2026-04-23" + sbom.additional_endpoints: "ignored in initial audit 2026-04-23" + sbom.batch_max_concurrent_send: "ignored in initial audit 2026-04-23" + sbom.batch_max_content_size: "ignored in initial audit 2026-04-23" + sbom.batch_max_size: "ignored in initial audit 2026-04-23" + sbom.batch_wait: "ignored in initial audit 2026-04-23" + sbom.cache.clean_interval: "ignored in initial audit 2026-04-23" + sbom.cache.max_disk_size: "ignored in initial audit 2026-04-23" + sbom.cache_directory: "ignored in initial audit 2026-04-23" + sbom.clear_cache_on_exit: "ignored in initial audit 2026-04-23" + sbom.compression_kind: "ignored in initial audit 2026-04-23" + sbom.compression_level: "ignored in initial audit 2026-04-23" + sbom.compute_dependencies: "ignored in initial audit 2026-04-23" + sbom.connection_reset_interval: "ignored in initial audit 2026-04-23" + sbom.container.enabled: "ignored in initial audit 2026-04-23" + sbom.container_image.additional_directories: "ignored in initial audit 2026-04-23" + sbom.container_image.allow_missing_repodigest: "ignored in initial audit 2026-04-23" + sbom.container_image.analyzers: "ignored in initial audit 2026-04-23" + sbom.container_image.check_disk_usage: "ignored in initial audit 2026-04-23" + sbom.container_image.container_exclude: "ignored in initial audit 2026-04-23" + sbom.container_image.container_include: "ignored in initial audit 2026-04-23" + sbom.container_image.enabled: "ignored in initial audit 2026-04-23" + sbom.container_image.exclude_pause_container: "ignored in initial audit 2026-04-23" + sbom.container_image.min_available_disk: "ignored in initial audit 2026-04-23" + sbom.container_image.overlayfs_direct_scan: "ignored in initial audit 2026-04-23" + sbom.container_image.overlayfs_disable_cache: "ignored in initial audit 2026-04-23" + sbom.container_image.scan_interval: "ignored in initial audit 2026-04-23" + sbom.container_image.scan_timeout: "ignored in initial audit 2026-04-23" + sbom.container_image.use_mount: "ignored in initial audit 2026-04-23" + sbom.container_image.use_spread_refresher: "ignored in initial audit 2026-04-23" + sbom.dd_url: "ignored in initial audit 2026-04-23" + sbom.dev_mode_no_ssl: "ignored in initial audit 2026-04-23" + sbom.enabled: "ignored in initial audit 2026-04-23" + sbom.host.additional_directories: "ignored in initial audit 2026-04-23" + sbom.host.analyzers: "ignored in initial audit 2026-04-23" + sbom.host.enabled: "ignored in initial audit 2026-04-23" + sbom.input_chan_size: "ignored in initial audit 2026-04-23" + sbom.logs_dd_url: "ignored in initial audit 2026-04-23" + sbom.logs_no_ssl: "ignored in initial audit 2026-04-23" + sbom.scan_queue.base_backoff: "ignored in initial audit 2026-04-23" + sbom.scan_queue.max_backoff: "ignored in initial audit 2026-04-23" + sbom.sender_backoff_base: "ignored in initial audit 2026-04-23" + sbom.sender_backoff_factor: "ignored in initial audit 2026-04-23" + sbom.sender_backoff_max: "ignored in initial audit 2026-04-23" + sbom.sender_recovery_interval: "ignored in initial audit 2026-04-23" + sbom.sender_recovery_reset: "ignored in initial audit 2026-04-23" + sbom.simplify_bom_refs: "ignored in initial audit 2026-04-23" + sbom.use_compression: "ignored in initial audit 2026-04-23" + sbom.use_v2_api: "ignored in initial audit 2026-04-23" + sbom.zstd_compression_level: "ignored in initial audit 2026-04-23" + scrubber.additional_keys: "ignored in initial audit 2026-04-23" + secret_allowed_k8s_namespace: "ignored in initial audit 2026-04-23" + secret_audit_file_max_size: "ignored in initial audit 2026-04-23" + secret_backend_arguments: "ignored in initial audit 2026-04-23" + secret_backend_command: "ignored in second bulk edit 2026-05-06" + secret_backend_command_allow_group_exec_perm: "ignored in initial audit 2026-04-23" + secret_backend_config: "ignored in initial audit 2026-04-23" + secret_backend_output_max_size: "ignored in initial audit 2026-04-23" + secret_backend_remove_trailing_line_break: "ignored in initial audit 2026-04-23" + secret_backend_skip_checks: "ignored in initial audit 2026-04-23" + secret_backend_timeout: "ignored in second bulk edit 2026-05-06" + secret_backend_type: "ignored in initial audit 2026-04-23" + secret_image_to_handle: "ignored in initial audit 2026-04-23" + secret_refresh_interval: "ignored in initial audit 2026-04-23" + secret_refresh_on_api_key_failure_interval: "ignored in initial audit 2026-04-23" + secret_refresh_scatter: "ignored in initial audit 2026-04-23" + secret_scope_integration_to_their_k8s_namespace: "ignored in initial audit 2026-04-23" + security_agent.cmd_port: "ignored in initial audit 2026-04-23" + security_agent.disable_thp: "ignored in initial audit 2026-04-23" + security_agent.expvar_port: "ignored in initial audit 2026-04-23" + security_agent.internal_profiling.api_key: "ignored in initial audit 2026-04-23" + security_agent.internal_profiling.block_profile_rate: "ignored in initial audit 2026-04-23" + security_agent.internal_profiling.cpu_duration: "ignored in initial audit 2026-04-23" + security_agent.internal_profiling.delta_profiles: "ignored in initial audit 2026-04-23" + security_agent.internal_profiling.enable_block_profiling: "ignored in initial audit 2026-04-23" + security_agent.internal_profiling.enable_goroutine_stacktraces: "ignored in initial audit 2026-04-23" + security_agent.internal_profiling.enable_mutex_profiling: "ignored in initial audit 2026-04-23" + security_agent.internal_profiling.enabled: "ignored in initial audit 2026-04-23" + security_agent.internal_profiling.env: "ignored in initial audit 2026-04-23" + security_agent.internal_profiling.extra_tags: "ignored in initial audit 2026-04-23" + security_agent.internal_profiling.mutex_profile_fraction: "ignored in initial audit 2026-04-23" + security_agent.internal_profiling.period: "ignored in initial audit 2026-04-23" + security_agent.internal_profiling.profile_dd_url: "ignored in initial audit 2026-04-23" + security_agent.internal_profiling.site: "ignored in initial audit 2026-04-23" + security_agent.internal_profiling.unix_socket: "ignored in initial audit 2026-04-23" + security_agent.log_file: "ignored in initial audit 2026-04-23" + serializer_experimental_use_v3_api.series.beta_route: "ignored in second bulk edit 2026-05-06" + serializer_experimental_use_v3_api.series.use_beta: "ignored in second bulk edit 2026-05-06" + server_timeout: "ignored in initial audit 2026-04-23" + serverless.enabled: "ignored in initial audit 2026-04-23" + serverless.logs_enabled: "ignored in initial audit 2026-04-23" + serverless.service_mapping: "ignored in initial audit 2026-04-23" + serverless.trace_enabled: "ignored in initial audit 2026-04-23" + serverless.trace_managed_services: "ignored in initial audit 2026-04-23" + service_discovery.forwarder.additional_endpoints: "ignored in initial audit 2026-04-23" + service_discovery.forwarder.batch_max_concurrent_send: "ignored in initial audit 2026-04-23" + service_discovery.forwarder.batch_max_content_size: "ignored in initial audit 2026-04-23" + service_discovery.forwarder.batch_max_size: "ignored in initial audit 2026-04-23" + service_discovery.forwarder.batch_wait: "ignored in initial audit 2026-04-23" + service_discovery.forwarder.compression_kind: "ignored in initial audit 2026-04-23" + service_discovery.forwarder.compression_level: "ignored in initial audit 2026-04-23" + service_discovery.forwarder.connection_reset_interval: "ignored in initial audit 2026-04-23" + service_discovery.forwarder.dd_url: "ignored in initial audit 2026-04-23" + service_discovery.forwarder.dev_mode_no_ssl: "ignored in initial audit 2026-04-23" + service_discovery.forwarder.input_chan_size: "ignored in initial audit 2026-04-23" + service_discovery.forwarder.logs_dd_url: "ignored in initial audit 2026-04-23" + service_discovery.forwarder.logs_no_ssl: "ignored in initial audit 2026-04-23" + service_discovery.forwarder.sender_backoff_base: "ignored in initial audit 2026-04-23" + service_discovery.forwarder.sender_backoff_factor: "ignored in initial audit 2026-04-23" + service_discovery.forwarder.sender_backoff_max: "ignored in initial audit 2026-04-23" + service_discovery.forwarder.sender_recovery_interval: "ignored in initial audit 2026-04-23" + service_discovery.forwarder.sender_recovery_reset: "ignored in initial audit 2026-04-23" + service_discovery.forwarder.use_compression: "ignored in initial audit 2026-04-23" + service_discovery.forwarder.use_v2_api: "ignored in initial audit 2026-04-23" + service_discovery.forwarder.zstd_compression_level: "ignored in initial audit 2026-04-23" + shared_library_check.enabled: "ignored in initial audit 2026-04-23" + shared_library_check.library_folder_path: "ignored in initial audit 2026-04-23" + snmp_listener.allowed_failures: "ignored in initial audit 2026-04-23" + snmp_listener.collect_device_metadata: "ignored in initial audit 2026-04-23" + snmp_listener.collect_topology: "ignored in initial audit 2026-04-23" + snmp_listener.configs: "ignored in initial audit 2026-04-23" + snmp_listener.discovery_allowed_failures: "ignored in initial audit 2026-04-23" + snmp_listener.discovery_interval: "ignored in initial audit 2026-04-23" + snmp_listener.loader: "ignored in initial audit 2026-04-23" + snmp_listener.min_collection_interval: "ignored in initial audit 2026-04-23" + snmp_listener.namespace: "ignored in initial audit 2026-04-23" + snmp_listener.oid_batch_size: "ignored in initial audit 2026-04-23" + snmp_listener.ping.count: "ignored in initial audit 2026-04-23" + snmp_listener.ping.enabled: "ignored in initial audit 2026-04-23" + snmp_listener.ping.interval: "ignored in initial audit 2026-04-23" + snmp_listener.ping.linux.use_raw_socket: "ignored in initial audit 2026-04-23" + snmp_listener.ping.timeout: "ignored in initial audit 2026-04-23" + snmp_listener.retries: "ignored in initial audit 2026-04-23" + snmp_listener.timeout: "ignored in initial audit 2026-04-23" + snmp_listener.use_device_id_as_hostname: "ignored in initial audit 2026-04-23" + snmp_listener.workers: "ignored in initial audit 2026-04-23" + software_inventory.enabled: "ignored in initial audit 2026-04-23" + software_inventory.forwarder.additional_endpoints: "ignored in initial audit 2026-04-23" + software_inventory.forwarder.batch_max_concurrent_send: "ignored in initial audit 2026-04-23" + software_inventory.forwarder.batch_max_content_size: "ignored in initial audit 2026-04-23" + software_inventory.forwarder.batch_max_size: "ignored in initial audit 2026-04-23" + software_inventory.forwarder.batch_wait: "ignored in initial audit 2026-04-23" + software_inventory.forwarder.compression_kind: "ignored in initial audit 2026-04-23" + software_inventory.forwarder.compression_level: "ignored in initial audit 2026-04-23" + software_inventory.forwarder.connection_reset_interval: "ignored in initial audit 2026-04-23" + software_inventory.forwarder.dd_url: "ignored in initial audit 2026-04-23" + software_inventory.forwarder.dev_mode_no_ssl: "ignored in initial audit 2026-04-23" + software_inventory.forwarder.input_chan_size: "ignored in initial audit 2026-04-23" + software_inventory.forwarder.logs_dd_url: "ignored in initial audit 2026-04-23" + software_inventory.forwarder.logs_no_ssl: "ignored in initial audit 2026-04-23" + software_inventory.forwarder.sender_backoff_base: "ignored in initial audit 2026-04-23" + software_inventory.forwarder.sender_backoff_factor: "ignored in initial audit 2026-04-23" + software_inventory.forwarder.sender_backoff_max: "ignored in initial audit 2026-04-23" + software_inventory.forwarder.sender_recovery_interval: "ignored in initial audit 2026-04-23" + software_inventory.forwarder.sender_recovery_reset: "ignored in initial audit 2026-04-23" + software_inventory.forwarder.use_compression: "ignored in initial audit 2026-04-23" + software_inventory.forwarder.use_v2_api: "ignored in initial audit 2026-04-23" + software_inventory.forwarder.zstd_compression_level: "ignored in initial audit 2026-04-23" + software_inventory.interval: "ignored in initial audit 2026-04-23" + software_inventory.jitter: "ignored in initial audit 2026-04-23" + synthetics.collector.enabled: "ignored in initial audit 2026-04-23" + synthetics.collector.flush_interval: "ignored in initial audit 2026-04-23" + synthetics.collector.workers: "ignored in initial audit 2026-04-23" + synthetics.forwarder.additional_endpoints: "ignored in initial audit 2026-04-23" + synthetics.forwarder.batch_max_concurrent_send: "ignored in initial audit 2026-04-23" + synthetics.forwarder.batch_max_content_size: "ignored in initial audit 2026-04-23" + synthetics.forwarder.batch_max_size: "ignored in initial audit 2026-04-23" + synthetics.forwarder.batch_wait: "ignored in initial audit 2026-04-23" + synthetics.forwarder.compression_kind: "ignored in initial audit 2026-04-23" + synthetics.forwarder.compression_level: "ignored in initial audit 2026-04-23" + synthetics.forwarder.connection_reset_interval: "ignored in initial audit 2026-04-23" + synthetics.forwarder.dd_url: "ignored in initial audit 2026-04-23" + synthetics.forwarder.dev_mode_no_ssl: "ignored in initial audit 2026-04-23" + synthetics.forwarder.input_chan_size: "ignored in initial audit 2026-04-23" + synthetics.forwarder.logs_dd_url: "ignored in initial audit 2026-04-23" + synthetics.forwarder.logs_no_ssl: "ignored in initial audit 2026-04-23" + synthetics.forwarder.sender_backoff_base: "ignored in initial audit 2026-04-23" + synthetics.forwarder.sender_backoff_factor: "ignored in initial audit 2026-04-23" + synthetics.forwarder.sender_backoff_max: "ignored in initial audit 2026-04-23" + synthetics.forwarder.sender_recovery_interval: "ignored in initial audit 2026-04-23" + synthetics.forwarder.sender_recovery_reset: "ignored in initial audit 2026-04-23" + synthetics.forwarder.use_compression: "ignored in initial audit 2026-04-23" + synthetics.forwarder.use_v2_api: "ignored in initial audit 2026-04-23" + synthetics.forwarder.zstd_compression_level: "ignored in initial audit 2026-04-23" + system_tray.log_file: "ignored in initial audit 2026-04-23" + tag_value_split_separator: "ignored in initial audit 2026-04-23" + tags: "ignored in second bulk edit 2026-05-06" + telemetry.checks: "ignored in initial audit 2026-04-23" + telemetry.enabled: "ignored in second bulk edit 2026-05-06" + telemetry.python_memory: "ignored in initial audit 2026-04-23" + trace_agent_host_socket_path: "ignored in initial audit 2026-04-23" + tracemalloc_blacklist: "ignored in initial audit 2026-04-23" + tracemalloc_debug: "ignored in initial audit 2026-04-23" + tracemalloc_exclude: "ignored in initial audit 2026-04-23" + tracemalloc_include: "ignored in initial audit 2026-04-23" + tracemalloc_whitelist: "ignored in initial audit 2026-04-23" + use_diskv2_check: "ignored in initial audit 2026-04-23" + use_improved_cgroup_parser: "ignored in initial audit 2026-04-23" + use_networkv2_check: "ignored in initial audit 2026-04-23" + vector.logs.enabled: "OPW logs routing out of scope for ADP" + vector.logs.url: "OPW logs routing out of scope for ADP" + vector.traces.enabled: "OPW traces routing out of scope for ADP" + vector.traces.url: "OPW traces routing out of scope for ADP" + win_skip_com_init: "ignored in initial audit 2026-04-23" + windows_counter_init_failure_limit: "ignored in initial audit 2026-04-23" + windows_counter_refresh_interval: "ignored in initial audit 2026-04-23" + windows_use_pythonpath: "ignored in initial audit 2026-04-23" + workloadmeta.local_process_collector.collection_interval: "ignored in initial audit 2026-04-23" + workloadmeta.remote.recv_without_timeout: "ignored in initial audit 2026-04-23" diff --git a/lib/datadog-agent/config/src/classifier/classifier.rs b/lib/datadog-agent/config/src/classifier/classifier.rs new file mode 100644 index 00000000000..3871698b1db --- /dev/null +++ b/lib/datadog-agent/config/src/classifier/classifier.rs @@ -0,0 +1,151 @@ +use std::collections::HashMap; + +use serde_json::Value; + +use super::{ClassifierEntry, PipelineAffinity, SupportLevel, CLASSIFIER_ENTRIES}; + +/// Result of classifying a single config key/value pair against the registry. +pub struct Classification { + /// The level at which this config key is supported by Saluki. + pub support_level: SupportLevel, + /// Whether the value matches the schema default. + pub is_default: bool, + /// Which pipelines this key's incompatibility warning applies to. + pub pipeline_affinity: PipelineAffinity, +} + +/// Classifies the support level of config keys and determines if a value is default. +/// +/// Only knows about annotated keys (supported + unsupported). Keys not in the registry - whether +/// ignored, unrecognized, or anything else - return `None` from +/// [`classify`](Self::classify). +pub struct ConfigClassifier { + lookup: HashMap<&'static str, &'static ClassifierEntry>, +} + +impl ConfigClassifier { + /// Builds a classifier from all annotated config keys. + pub fn new() -> Self { + let mut lookup = HashMap::new(); + + for entry in CLASSIFIER_ENTRIES { + lookup.insert(entry.yaml_path, entry); + for alias in entry.aliases { + lookup.insert(alias, entry); + } + } + + Self { lookup } + } + + /// Classifies a single config key/value pair against the registry. + /// + /// Returns `None` for keys not in the registry (ignored, unrecognized, etc.). + pub fn classify(&self, key: &str, value: &Value) -> Option { + let entry = self.lookup.get(key)?; + Some(Classification { + support_level: entry.support_level, + is_default: is_default_value(entry.default, value), + pipeline_affinity: entry.pipeline_affinity, + }) + } +} + +fn is_default_value(default: Option<&str>, value: &Value) -> bool { + match default { + Some(default_str) => match serde_json::from_str::(default_str) { + Ok(default_value) => *value == default_value, + Err(_) => false, + }, + None => match value { + Value::Null => true, + Value::String(s) => s.is_empty(), + _ => false, + }, + } +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::classifier::Severity; + + fn classifier() -> ConfigClassifier { + ConfigClassifier::new() + } + + #[test] + fn full_support_keys_not_in_classifier() { + // Full-support keys are not actionable at the call site; the classifier omits them. + // The call site treats None identically to Full (silently continues). + let c = classifier(); + assert!(c.classify("dogstatsd_port", &Value::Number(9999.into())).is_none()); + assert!(c.classify("log_payloads", &Value::Bool(true)).is_none()); + } + + #[test] + fn partial_non_default() { + let c = classifier(); + let result = c + .classify("min_tls_version", &Value::String("non_default_value".into())) + .unwrap(); + assert_eq!(result.support_level, SupportLevel::Partial); + } + + #[test] + fn incompatible_non_default() { + let c = classifier(); + let result = c.classify("tls_handshake_timeout", &Value::Number(999.into())).unwrap(); + assert!(matches!(result.support_level, SupportLevel::Incompatible(_))); + assert!(!result.is_default); + } + + #[test] + fn incompatible_default() { + let c = classifier(); + let result = c.classify("tls_handshake_timeout", &Value::String("".into())).unwrap(); + assert!(matches!(result.support_level, SupportLevel::Incompatible(_))); + assert!(result.is_default); + } + + #[test] + fn not_in_registry_returns_none() { + let c = classifier(); + assert!(c.classify("totally_made_up_key", &Value::Bool(true)).is_none()); + assert!(c.classify("GUI_host", &Value::String("localhost".into())).is_none()); + } + + #[test] + fn none_default_null_is_default() { + let c = classifier(); + // tls_handshake_timeout is unsupported with no schema default + let result = c.classify("tls_handshake_timeout", &Value::Null).unwrap(); + assert!(result.is_default); + } + + #[test] + fn none_default_empty_string_is_default() { + let c = classifier(); + let result = c.classify("tls_handshake_timeout", &Value::String("".into())).unwrap(); + assert!(result.is_default); + } + + #[test] + fn none_default_non_empty_is_not_default() { + let c = classifier(); + let result = c + .classify("tls_handshake_timeout", &Value::String("something".into())) + .unwrap(); + assert!(!result.is_default); + } + + #[test] + fn incompatible_severity_levels() { + let c = classifier(); + let result = c.classify("tls_handshake_timeout", &Value::Number(30.into())).unwrap(); + assert!(matches!( + result.support_level, + SupportLevel::Incompatible(Severity::Medium) + )); + } +} diff --git a/lib/datadog-agent/config/src/classifier/classifier_data.rs b/lib/datadog-agent/config/src/classifier/classifier_data.rs new file mode 100644 index 00000000000..515f59deaba --- /dev/null +++ b/lib/datadog-agent/config/src/classifier/classifier_data.rs @@ -0,0 +1,483 @@ +// @generated by build.rs from core_schema.yaml + schema_overlay.yaml — DO NOT EDIT +// Regenerate by running `cargo build -p datadog-agent-config`. + +use super::*; + +pub(crate) static CLASSIFIER_ENTRIES: &[ClassifierEntry] = &[ + ClassifierEntry { + yaml_path: "dogstatsd_mapper_cache_size", + aliases: &[], + support_level: SupportLevel::Partial, + pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::DogStatsD]), + default: Some("1000"), + }, + ClassifierEntry { + yaml_path: "dogstatsd_metrics_stats_enable", + aliases: &[], + support_level: SupportLevel::Partial, + pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::DogStatsD]), + default: Some("false"), + }, + ClassifierEntry { + yaml_path: "log_level", + aliases: &[], + support_level: SupportLevel::Partial, + pipeline_affinity: PipelineAffinity::CrossCutting, + default: Some("\"info\""), + }, + ClassifierEntry { + yaml_path: "min_tls_version", + aliases: &[], + support_level: SupportLevel::Partial, + pipeline_affinity: PipelineAffinity::CrossCutting, + default: Some("\"tlsv1.2\""), + }, + ClassifierEntry { + yaml_path: "multi_region_failover.enabled", + aliases: &[], + support_level: SupportLevel::Partial, + pipeline_affinity: PipelineAffinity::CrossCutting, + default: Some("false"), + }, + ClassifierEntry { + yaml_path: "serializer_zstd_compressor_level", + aliases: &[], + support_level: SupportLevel::Partial, + pipeline_affinity: PipelineAffinity::CrossCutting, + default: Some("1"), + }, + ClassifierEntry { + yaml_path: "skip_ssl_validation", + aliases: &[], + support_level: SupportLevel::Partial, + pipeline_affinity: PipelineAffinity::CrossCutting, + default: Some("false"), + }, + ClassifierEntry { + yaml_path: "statsd_forward_host", + aliases: &[], + support_level: SupportLevel::Partial, + pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::DogStatsD]), + default: Some("\"\""), + }, + ClassifierEntry { + yaml_path: "aggregator_buffer_size", + aliases: &[], + support_level: SupportLevel::Incompatible(Severity::Low), + pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::DogStatsD]), + default: Some("100"), + }, + ClassifierEntry { + yaml_path: "aggregator_flush_metrics_and_serialize_in_parallel_buffer_size", + aliases: &[], + support_level: SupportLevel::Incompatible(Severity::Low), + pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::DogStatsD]), + default: Some("4000"), + }, + ClassifierEntry { + yaml_path: "aggregator_flush_metrics_and_serialize_in_parallel_chan_size", + aliases: &[], + support_level: SupportLevel::Incompatible(Severity::Low), + pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::DogStatsD]), + default: Some("200"), + }, + ClassifierEntry { + yaml_path: "aggregator_stop_timeout", + aliases: &[], + support_level: SupportLevel::Incompatible(Severity::Low), + pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::DogStatsD]), + default: Some("2"), + }, + ClassifierEntry { + yaml_path: "aggregator_use_tags_store", + aliases: &[], + support_level: SupportLevel::Incompatible(Severity::Low), + pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::DogStatsD]), + default: Some("true"), + }, + ClassifierEntry { + yaml_path: "config_id", + aliases: &[], + support_level: SupportLevel::Incompatible(Severity::Low), + pipeline_affinity: PipelineAffinity::CrossCutting, + default: Some("\"\""), + }, + ClassifierEntry { + yaml_path: "dogstatsd_disable_verbose_logs", + aliases: &[], + support_level: SupportLevel::Incompatible(Severity::Medium), + pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::DogStatsD]), + default: Some("false"), + }, + ClassifierEntry { + yaml_path: "dogstatsd_experimental_http.enabled", + aliases: &[], + support_level: SupportLevel::Incompatible(Severity::High), + pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::DogStatsD]), + default: Some("false"), + }, + ClassifierEntry { + yaml_path: "dogstatsd_experimental_http.listen_address", + aliases: &[], + support_level: SupportLevel::Incompatible(Severity::High), + pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::DogStatsD]), + default: Some("\"127.0.0.1:8125\""), + }, + ClassifierEntry { + yaml_path: "dogstatsd_host_socket_path", + aliases: &[], + support_level: SupportLevel::Incompatible(Severity::Low), + pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::DogStatsD]), + default: Some("\"/var/run/datadog\""), + }, + ClassifierEntry { + yaml_path: "dogstatsd_mem_based_rate_limiter.enabled", + aliases: &[], + support_level: SupportLevel::Incompatible(Severity::Low), + pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::DogStatsD]), + default: Some("false"), + }, + ClassifierEntry { + yaml_path: "dogstatsd_mem_based_rate_limiter.go_gc", + aliases: &[], + support_level: SupportLevel::Incompatible(Severity::Low), + pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::DogStatsD]), + default: Some("1"), + }, + ClassifierEntry { + yaml_path: "dogstatsd_mem_based_rate_limiter.high_soft_limit", + aliases: &[], + support_level: SupportLevel::Incompatible(Severity::Low), + pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::DogStatsD]), + default: Some("0.8"), + }, + ClassifierEntry { + yaml_path: "dogstatsd_mem_based_rate_limiter.low_soft_limit", + aliases: &[], + support_level: SupportLevel::Incompatible(Severity::Low), + pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::DogStatsD]), + default: Some("0.7"), + }, + ClassifierEntry { + yaml_path: "dogstatsd_mem_based_rate_limiter.memory_ballast", + aliases: &[], + support_level: SupportLevel::Incompatible(Severity::Low), + pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::DogStatsD]), + default: Some("8589934592"), + }, + ClassifierEntry { + yaml_path: "dogstatsd_mem_based_rate_limiter.rate_check.factor", + aliases: &[], + support_level: SupportLevel::Incompatible(Severity::Low), + pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::DogStatsD]), + default: Some("2"), + }, + ClassifierEntry { + yaml_path: "dogstatsd_mem_based_rate_limiter.rate_check.max", + aliases: &[], + support_level: SupportLevel::Incompatible(Severity::Low), + pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::DogStatsD]), + default: Some("1"), + }, + ClassifierEntry { + yaml_path: "dogstatsd_mem_based_rate_limiter.rate_check.min", + aliases: &[], + support_level: SupportLevel::Incompatible(Severity::Low), + pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::DogStatsD]), + default: Some("0.01"), + }, + ClassifierEntry { + yaml_path: "dogstatsd_mem_based_rate_limiter.soft_limit_freeos_check.factor", + aliases: &[], + support_level: SupportLevel::Incompatible(Severity::Low), + pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::DogStatsD]), + default: Some("1.5"), + }, + ClassifierEntry { + yaml_path: "dogstatsd_mem_based_rate_limiter.soft_limit_freeos_check.max", + aliases: &[], + support_level: SupportLevel::Incompatible(Severity::Low), + pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::DogStatsD]), + default: Some("0.1"), + }, + ClassifierEntry { + yaml_path: "dogstatsd_mem_based_rate_limiter.soft_limit_freeos_check.min", + aliases: &[], + support_level: SupportLevel::Incompatible(Severity::Low), + pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::DogStatsD]), + default: Some("0.01"), + }, + ClassifierEntry { + yaml_path: "dogstatsd_no_aggregation_pipeline_batch_size", + aliases: &[], + support_level: SupportLevel::Incompatible(Severity::Low), + pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::DogStatsD]), + default: Some("2048"), + }, + ClassifierEntry { + yaml_path: "dogstatsd_packet_buffer_flush_timeout", + aliases: &[], + support_level: SupportLevel::Incompatible(Severity::Low), + pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::DogStatsD]), + default: Some("\"100ms\""), + }, + ClassifierEntry { + yaml_path: "dogstatsd_packet_buffer_size", + aliases: &[], + support_level: SupportLevel::Incompatible(Severity::Low), + pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::DogStatsD]), + default: Some("32"), + }, + ClassifierEntry { + yaml_path: "dogstatsd_pipe_name", + aliases: &[], + support_level: SupportLevel::Incompatible(Severity::Medium), + pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::DogStatsD]), + default: Some("\"\""), + }, + ClassifierEntry { + yaml_path: "dogstatsd_pipeline_autoadjust", + aliases: &[], + support_level: SupportLevel::Incompatible(Severity::Low), + pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::DogStatsD]), + default: Some("false"), + }, + ClassifierEntry { + yaml_path: "dogstatsd_pipeline_count", + aliases: &[], + support_level: SupportLevel::Incompatible(Severity::Low), + pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::DogStatsD]), + default: Some("1"), + }, + ClassifierEntry { + yaml_path: "dogstatsd_queue_size", + aliases: &[], + support_level: SupportLevel::Incompatible(Severity::Low), + pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::DogStatsD]), + default: Some("1024"), + }, + ClassifierEntry { + yaml_path: "dogstatsd_stats_buffer", + aliases: &[], + support_level: SupportLevel::Incompatible(Severity::Medium), + pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::DogStatsD]), + default: Some("10"), + }, + ClassifierEntry { + yaml_path: "dogstatsd_stats_enable", + aliases: &[], + support_level: SupportLevel::Incompatible(Severity::Medium), + pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::DogStatsD]), + default: Some("false"), + }, + ClassifierEntry { + yaml_path: "dogstatsd_stats_port", + aliases: &[], + support_level: SupportLevel::Incompatible(Severity::Medium), + pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::DogStatsD]), + default: Some("5000"), + }, + ClassifierEntry { + yaml_path: "dogstatsd_telemetry_enabled_listener_id", + aliases: &[], + support_level: SupportLevel::Incompatible(Severity::Low), + pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::DogStatsD]), + default: Some("false"), + }, + ClassifierEntry { + yaml_path: "dogstatsd_windows_pipe_security_descriptor", + aliases: &[], + support_level: SupportLevel::Incompatible(Severity::Medium), + pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::DogStatsD]), + default: Some("\"D:AI(A;;GA;;;WD)\""), + }, + ClassifierEntry { + yaml_path: "dogstatsd_workers_count", + aliases: &[], + support_level: SupportLevel::Incompatible(Severity::Low), + pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::DogStatsD]), + default: Some("0"), + }, + ClassifierEntry { + yaml_path: "enable_json_stream_shared_compressor_buffers", + aliases: &[], + support_level: SupportLevel::Incompatible(Severity::Low), + pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::DogStatsD, Pipeline::Checks, Pipeline::Traces]), + default: Some("true"), + }, + ClassifierEntry { + yaml_path: "entity_id", + aliases: &[], + support_level: SupportLevel::Incompatible(Severity::Low), + pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::DogStatsD]), + default: Some("\"\""), + }, + ClassifierEntry { + yaml_path: "forwarder_apikey_validation_interval", + aliases: &[], + support_level: SupportLevel::Incompatible(Severity::Medium), + pipeline_affinity: PipelineAffinity::CrossCutting, + default: Some("60"), + }, + ClassifierEntry { + yaml_path: "heroku_dyno", + aliases: &[], + support_level: SupportLevel::Incompatible(Severity::Low), + pipeline_affinity: PipelineAffinity::CrossCutting, + default: Some("false"), + }, + ClassifierEntry { + yaml_path: "logging_frequency", + aliases: &[], + support_level: SupportLevel::Incompatible(Severity::Low), + pipeline_affinity: PipelineAffinity::CrossCutting, + default: Some("500"), + }, + ClassifierEntry { + yaml_path: "serializer_experimental_use_v3_api.compression_level", + aliases: &[], + support_level: SupportLevel::Incompatible(Severity::Low), + pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::DogStatsD, Pipeline::Checks, Pipeline::Traces]), + default: Some("0"), + }, + ClassifierEntry { + yaml_path: "serializer_experimental_use_v3_api.series.endpoints", + aliases: &[], + support_level: SupportLevel::Incompatible(Severity::Low), + pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::DogStatsD, Pipeline::Checks, Pipeline::Traces]), + default: Some("[]"), + }, + ClassifierEntry { + yaml_path: "serializer_experimental_use_v3_api.series.validate", + aliases: &[], + support_level: SupportLevel::Incompatible(Severity::Low), + pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::DogStatsD, Pipeline::Checks, Pipeline::Traces]), + default: Some("false"), + }, + ClassifierEntry { + yaml_path: "serializer_experimental_use_v3_api.sketches.endpoints", + aliases: &[], + support_level: SupportLevel::Incompatible(Severity::Low), + pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::DogStatsD, Pipeline::Checks, Pipeline::Traces]), + default: Some("[]"), + }, + ClassifierEntry { + yaml_path: "serializer_experimental_use_v3_api.sketches.validate", + aliases: &[], + support_level: SupportLevel::Incompatible(Severity::Low), + pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::DogStatsD, Pipeline::Checks, Pipeline::Traces]), + default: Some("false"), + }, + ClassifierEntry { + yaml_path: "sslkeylogfile", + aliases: &[], + support_level: SupportLevel::Incompatible(Severity::Medium), + pipeline_affinity: PipelineAffinity::CrossCutting, + default: Some("\"\""), + }, + ClassifierEntry { + yaml_path: "tls_handshake_timeout", + aliases: &[], + support_level: SupportLevel::Incompatible(Severity::Medium), + pipeline_affinity: PipelineAffinity::CrossCutting, + default: None, + }, + ClassifierEntry { + yaml_path: "use_dogstatsd", + aliases: &[], + support_level: SupportLevel::Incompatible(Severity::Low), + pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::DogStatsD]), + default: Some("true"), + }, + ClassifierEntry { + yaml_path: "autoscaling.failover.enabled", + aliases: &[], + support_level: SupportLevel::Incompatible(Severity::Medium), + pipeline_affinity: PipelineAffinity::CrossCutting, + default: Some("false"), + }, + ClassifierEntry { + yaml_path: "autoscaling.failover.metrics", + aliases: &[], + support_level: SupportLevel::Incompatible(Severity::Medium), + pipeline_affinity: PipelineAffinity::CrossCutting, + default: Some("[\"container.memory.usage\",\"container.cpu.usage\"]"), + }, + ClassifierEntry { + yaml_path: "cluster_agent.enabled", + aliases: &[], + support_level: SupportLevel::Incompatible(Severity::Low), + pipeline_affinity: PipelineAffinity::CrossCutting, + default: Some("false"), + }, + ClassifierEntry { + yaml_path: "forwarder_flush_to_disk_mem_ratio", + aliases: &[], + support_level: SupportLevel::Incompatible(Severity::Medium), + pipeline_affinity: PipelineAffinity::CrossCutting, + default: Some("0.5"), + }, + ClassifierEntry { + yaml_path: "forwarder_low_prio_buffer_size", + aliases: &[], + support_level: SupportLevel::Incompatible(Severity::Medium), + pipeline_affinity: PipelineAffinity::CrossCutting, + default: Some("100"), + }, + ClassifierEntry { + yaml_path: "forwarder_max_concurrent_requests", + aliases: &[], + support_level: SupportLevel::Incompatible(Severity::Medium), + pipeline_affinity: PipelineAffinity::CrossCutting, + default: Some("10"), + }, + ClassifierEntry { + yaml_path: "forwarder_requeue_buffer_size", + aliases: &[], + support_level: SupportLevel::Incompatible(Severity::Low), + pipeline_affinity: PipelineAffinity::CrossCutting, + default: Some("100"), + }, + ClassifierEntry { + yaml_path: "forwarder_retry_queue_capacity_time_interval_sec", + aliases: &[], + support_level: SupportLevel::Incompatible(Severity::Medium), + pipeline_affinity: PipelineAffinity::CrossCutting, + default: Some("900"), + }, + ClassifierEntry { + yaml_path: "forwarder_stop_timeout", + aliases: &[], + support_level: SupportLevel::Incompatible(Severity::Low), + pipeline_affinity: PipelineAffinity::CrossCutting, + default: Some("2"), + }, + ClassifierEntry { + yaml_path: "telemetry.dogstatsd.aggregator_channel_latency_buckets", + aliases: &[], + support_level: SupportLevel::Incompatible(Severity::Low), + pipeline_affinity: PipelineAffinity::CrossCutting, + default: Some("[]"), + }, + ClassifierEntry { + yaml_path: "telemetry.dogstatsd.listeners_channel_latency_buckets", + aliases: &[], + support_level: SupportLevel::Incompatible(Severity::Low), + pipeline_affinity: PipelineAffinity::CrossCutting, + default: Some("[]"), + }, + ClassifierEntry { + yaml_path: "telemetry.dogstatsd.listeners_latency_buckets", + aliases: &[], + support_level: SupportLevel::Incompatible(Severity::Low), + pipeline_affinity: PipelineAffinity::CrossCutting, + default: Some("[]"), + }, + ClassifierEntry { + yaml_path: "telemetry.dogstatsd_origin", + aliases: &[], + support_level: SupportLevel::Incompatible(Severity::Low), + pipeline_affinity: PipelineAffinity::CrossCutting, + default: Some("false"), + }, +]; diff --git a/lib/datadog-agent/config/src/classifier/mod.rs b/lib/datadog-agent/config/src/classifier/mod.rs new file mode 100644 index 00000000000..3f46caa3d70 --- /dev/null +++ b/lib/datadog-agent/config/src/classifier/mod.rs @@ -0,0 +1,160 @@ +//! Configuration key classifier. +//! +//! A programmatic registry of all recognized configuration keys. Each entry describes the key +//! purely from the configuration system's perspective: its canonical YAML path, the environment +//! variables that map to it, the shape of its value, and which internal config structs consume it. +//! +//! This registry is intentionally free of Rust field names and struct internals—it models the +//! configuration surface as an operator would see it, and can be used at runtime to detect +//! unknown or unsupported keys in a loaded configuration file. +//! +//! ## User Guide +//! +//! The registry is generated at build time from `schema_overlay.yaml`, which partitions every +//! key in `core_schema.yaml` into exactly one of: supported, unsupported, or ignored. Data +//! integrity (uniqueness, full coverage, sorted sections) is enforced by `SchemaOverlay::load()` +//! during the build. +//! +//! ### Adding a Configuration Key +//! +//! Add a `supported` entry in `lib/datadog-agent/config/schema/schema_overlay.yaml` with +//! `support_level`, `pipelines`, `used_by`, `description`, and `config_registry_filename`. +//! The build generates the annotation constants automatically. +//! +//! ### Updating the Vendored Schema +//! +//! After updating `core_schema.yaml`, the build will fail if any new keys are not covered +//! by the overlay. For each new key, add it to the appropriate section of +//! `schema_overlay.yaml`. + +#[allow(clippy::module_inception)] +mod classifier; + +pub use classifier::{Classification, ConfigClassifier}; + +/// Identifiers for known configuration structs. +/// +/// Used as values in annotation `used_by` fields to declare which structs consume a given key. +/// Adding a new struct here is the first step when registering its configuration keys. +pub mod structs { + /// Identifier for `ProxyConfiguration`. + pub const PROXY_CONFIGURATION: &str = "ProxyConfiguration"; + /// Identifier for `ForwarderConfiguration`. + pub const FORWARDER_CONFIGURATION: &str = "ForwarderConfiguration"; + /// Identifier for `DogStatsDConfiguration`. + pub const DOGSTATSD_CONFIGURATION: &str = "DogStatsDConfiguration"; + /// Identifier for `ContainerdConfiguration`. + pub const CONTAINERD_CONFIGURATION: &str = "ContainerdConfiguration"; + /// Identifier for `OtlpConfiguration`. + pub const OTLP_CONFIGURATION: &str = "OtlpConfiguration"; + /// Identifier for `AggregateConfiguration`. + pub const AGGREGATE_CONFIGURATION: &str = "AggregateConfiguration"; + /// Identifier for `DogStatsDMapperConfiguration`. + pub const DOGSTATSD_MAPPER_CONFIGURATION: &str = "DogStatsDMapperConfiguration"; + /// Identifier for `DogStatsDDebugLogConfiguration`. + pub const DOGSTATSD_DEBUG_LOG_CONFIGURATION: &str = "DogStatsDDebugLogConfiguration"; + /// Identifier for `DogStatsDPrefixFilterConfiguration`. + pub const DOGSTATSD_PREFIX_FILTER_CONFIGURATION: &str = "DogStatsDPrefixFilterConfiguration"; + /// Identifier for `DatadogMetricsConfiguration`. + pub const DATADOG_METRICS_CONFIGURATION: &str = "DatadogMetricsConfiguration"; + /// Identifier for `DatadogTraceConfiguration`. + pub const DATADOG_TRACE_CONFIGURATION: &str = "DatadogTraceConfiguration"; + /// Identifier for `DatadogLogsConfiguration`. + pub const DATADOG_LOGS_CONFIGURATION: &str = "DatadogLogsConfiguration"; + /// Identifier for `DatadogEventsConfiguration`. + pub const DATADOG_EVENTS_CONFIGURATION: &str = "DatadogEventsConfiguration"; + /// Identifier for `DatadogServiceChecksConfiguration`. + pub const DATADOG_SERVICE_CHECKS_CONFIGURATION: &str = "DatadogServiceChecksConfiguration"; + /// Identifier for `DatadogApmStatsEncoderConfiguration`. + pub const DATADOG_APM_STATS_ENCODER_CONFIGURATION: &str = "DatadogApmStatsEncoderConfiguration"; + /// Identifier for `MrfConfiguration`. + pub const MRF_CONFIGURATION: &str = "MrfConfiguration"; + /// Identifier for `OtlpDecoderConfiguration`. + pub const OTLP_DECODER_CONFIGURATION: &str = "OtlpDecoderConfiguration"; + /// Identifier for `OtlpRelayConfiguration`. + pub const OTLP_RELAY_CONFIGURATION: &str = "OtlpRelayConfiguration"; + /// Identifier for `TraceObfuscationConfiguration`. + pub const TRACE_OBFUSCATION_CONFIGURATION: &str = "TraceObfuscationConfiguration"; + /// Identifier for `RemoteAgentClientConfiguration`. + pub const REMOTE_AGENT_CLIENT_CONFIGURATION: &str = "RemoteAgentClientConfiguration"; + /// Identifier for `TagFilterlistConfiguration`. + pub const TAG_FILTERLIST_CONFIGURATION: &str = "TagFilterlistConfiguration"; + /// Keys read via `get_typed` / `try_get_typed` rather than struct deserialization. + pub const GET_TYPED: &str = "get_typed"; +} + +/// The ADP pipeline a config key affects. +#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)] +pub enum Pipeline { + /// DogStatsD metrics pipeline. + DogStatsD, + /// Agent checks pipeline. + Checks, + /// OTLP ingestion frontend. + Otlp, + /// Internal trace processing. Active when OTLP is enabled and proxy/relay mode (which uses the + /// core Agent for transport) is off. + Traces, +} + +/// Which pipelines a config key affects. +#[derive(Clone, Copy, Debug, PartialEq, Eq)] +pub enum PipelineAffinity { + /// The list of pipelines affected by the key. + /// + /// This list must be non-empty, enforced by test. + Pipelines(&'static [Pipeline]), + /// The key affects all pipelines or ADP behavior as a whole. + CrossCutting, +} + +/// The `Severity` level of a config key that Saluki doesn't support. +#[derive(Clone, Copy, Debug, PartialEq, Eq)] +pub enum Severity { + /// Saluki's incompatibility with the key is considered minor. + Low, + + /// Saluki's incompatibility with the key is considered potentially impactful. + Medium, + + /// Saluki's incompatibility with the key is considered problematic. + High, +} + +/// The support level for a given configuration key. +/// +/// Full support is omitted from the enum and those keys are not classified since there is nothing +/// to be done about them downstream. +#[derive(Clone, Copy, Debug, PartialEq, Eq)] +pub enum SupportLevel { + /// Partially supported. + Partial, + /// Explicitly incompatible. + Incompatible(Severity), + /// Intentionally ignored. + #[allow(unused)] + Ignored, + /// Unrecognized. + #[allow(unused)] + Unrecognized, +} + +/// Slim per-key data generated at build time for the classifier. +/// +/// Carries only what the classifier needs: enough to look up a key, determine its support level, +/// check whether a value is the default, and report which pipelines are affected. +pub struct ClassifierEntry { + /// Canonical dot-separated YAML path. + pub yaml_path: &'static str, + /// Additional YAML paths (aliases) that resolve to this key. + pub aliases: &'static [&'static str], + /// How well saluki supports this key. + pub support_level: SupportLevel, + /// Which pipelines this key affects. + pub pipeline_affinity: PipelineAffinity, + /// JSON-encoded default value from the Agent schema, if present. + pub default: Option<&'static str>, +} + +mod classifier_data; +use classifier_data::CLASSIFIER_ENTRIES; diff --git a/lib/datadog-agent/config/src/lib.rs b/lib/datadog-agent/config/src/lib.rs new file mode 100644 index 00000000000..d5db940e413 --- /dev/null +++ b/lib/datadog-agent/config/src/lib.rs @@ -0,0 +1 @@ +pub mod classifier; diff --git a/lib/saluki-components/Cargo.toml b/lib/saluki-components/Cargo.toml index 7110808bb54..ec57c025c09 100644 --- a/lib/saluki-components/Cargo.toml +++ b/lib/saluki-components/Cargo.toml @@ -10,7 +10,6 @@ workspace = true [features] default = [] -config-test-support = [] fips = ["saluki-io/fips"] antithesis = ["dep:antithesis_sdk", "antithesis_sdk/full"] @@ -89,6 +88,7 @@ url = { workspace = true } zstd = { workspace = true } [dev-dependencies] +datadog-agent-config-testsupport = { workspace = true } derive-where = { workspace = true } proptest = { workspace = true } rcgen = { workspace = true, features = ["crypto", "aws_lc_rs", "pem"] } @@ -99,6 +99,3 @@ tempfile = { workspace = true } test-strategy = { workspace = true } tokio = { workspace = true, features = ["time"] } tokio-rustls = { workspace = true } - -[build-dependencies] -serde_yaml = { workspace = true } diff --git a/lib/saluki-components/build.rs b/lib/saluki-components/build.rs deleted file mode 100644 index fb41a67d9cc..00000000000 --- a/lib/saluki-components/build.rs +++ /dev/null @@ -1,288 +0,0 @@ -use std::fmt::Write as _; -use std::fs::read_to_string; -use std::path::{Path, PathBuf}; - -use serde_yaml::Value; - -fn main() { - let manifest_dir = PathBuf::from(env!("CARGO_MANIFEST_DIR")); - let schema_path = manifest_dir.join("vendor/core_schema.yaml"); - let ignored_keys_path = manifest_dir.join("etc/ignored_keys.yaml"); - let out_dir = PathBuf::from(std::env::var("OUT_DIR").unwrap()); - let out_path = out_dir.join("schema.rs"); - - // Only re-run when the schema source or this build script changes. - println!("cargo:rerun-if-changed=vendor/core_schema.yaml"); - println!("cargo:rerun-if-changed=etc/ignored_keys.yaml"); - println!("cargo:rerun-if-changed=build.rs"); - - let src = std::fs::read_to_string(&schema_path) - .unwrap_or_else(|e| panic!("failed to read {}: {}", schema_path.display(), e)); - - let doc: Value = serde_yaml::from_str(&src).unwrap_or_else(|e| panic!("failed to parse schema YAML: {}", e)); - - let properties = doc - .get("properties") - .and_then(|v| v.as_mapping()) - .expect("schema root must have a 'properties' mapping"); - - let mut entries: Vec = Vec::new(); - collect_entries(properties, &[], &mut entries); - entries.sort_by(|a, b| a.yaml_path.cmp(&b.yaml_path)); - - let mut output = render(&entries); - render_array(&entries, &mut output); - render_ignored_keys(&ignored_keys_path, &mut output); - std::fs::write(&out_path, output).unwrap_or_else(|e| panic!("failed to write {}: {}", out_path.display(), e)); -} - -// ── Schema entry (one per setting leaf) ───────────────────────────────────── - -struct SchemaEntry { - yaml_path: String, - const_name: String, - env_vars: Vec, - value_type: SchemaValueType, - default: Option, -} - -#[derive(Clone, Copy, PartialEq, Eq)] -enum SchemaValueType { - String, - Bool, - Integer, - Float, - StringList, - Unknown, -} - -impl SchemaValueType { - fn as_rust(self) -> &'static str { - match self { - SchemaValueType::String => "ValueType::String", - SchemaValueType::Bool => "ValueType::Bool", - SchemaValueType::Integer => "ValueType::Integer", - SchemaValueType::Float => "ValueType::Float", - SchemaValueType::StringList => "ValueType::StringList", - SchemaValueType::Unknown => "ValueType::String", // safe fallback; annotate to correct - } - } - - fn is_unknown(self) -> bool { - matches!(self, SchemaValueType::Unknown) - } -} - -// ── YAML traversal ─────────────────────────────────────────────────────────── - -fn collect_entries(mapping: &serde_yaml::Mapping, path_parts: &[&str], out: &mut Vec) { - for (key, value) in mapping { - let key_str = match key.as_str() { - Some(s) => s, - None => continue, - }; - - let mut parts = path_parts.to_vec(); - parts.push(key_str); - - let node_type = value.get("node_type").and_then(|v| v.as_str()).unwrap_or(""); - - match node_type { - "setting" => out.push(parse_setting(&parts, value)), - "section" => { - if let Some(props) = value.get("properties").and_then(|v| v.as_mapping()) { - collect_entries(props, &parts, out); - } - } - _ => { - // Unknown node_type — try to recurse if there are properties, otherwise skip. - if let Some(props) = value.get("properties").and_then(|v| v.as_mapping()) { - collect_entries(props, &parts, out); - } - } - } - } -} - -fn parse_setting(path_parts: &[&str], value: &Value) -> SchemaEntry { - let yaml_path = path_parts.join("."); - let const_name = yaml_path_to_const(&yaml_path); - - // Env vars: use explicit list if present. If the key has `no-env` tag OR no env_vars - // field, the list is empty. Annotations can override. - let has_no_env_tag = value - .get("tags") - .and_then(|v| v.as_sequence()) - .map(|tags| tags.iter().any(|t| t.as_str() == Some("no-env"))) - .unwrap_or(false); - - let env_vars: Vec = if has_no_env_tag { - Vec::new() - } else { - value - .get("env_vars") - .and_then(|v| v.as_sequence()) - .map(|seq| seq.iter().filter_map(|v| v.as_str()).map(|s| s.to_string()).collect()) - .unwrap_or_default() - }; - - let value_type = parse_value_type(value); - let default = value.get("default").and_then(yaml_value_to_json_str); - - SchemaEntry { - yaml_path, - const_name, - env_vars, - value_type, - default, - } -} - -fn parse_value_type(value: &Value) -> SchemaValueType { - match value.get("type").and_then(|v| v.as_str()) { - Some("string") => SchemaValueType::String, - Some("boolean") => SchemaValueType::Bool, - Some("integer") => SchemaValueType::Integer, - Some("number") => SchemaValueType::Float, - Some("array") => { - // Only map to StringList if items are strings. Anything else is Unknown. - let item_type = value.get("items").and_then(|v| v.get("type")).and_then(|v| v.as_str()); - if item_type == Some("string") { - SchemaValueType::StringList - } else { - SchemaValueType::Unknown - } - } - _ => SchemaValueType::Unknown, - } -} - -/// Convert a YAML scalar default to a JSON string for embedding as a Rust `&'static str`. -fn yaml_value_to_json_str(value: &serde_yaml::Value) -> Option { - match value { - serde_yaml::Value::Null => None, - serde_yaml::Value::Bool(b) => Some(b.to_string()), - serde_yaml::Value::Number(n) => Some(n.to_string()), - serde_yaml::Value::String(s) => { - let escaped = s.replace('\\', "\\\\").replace('"', "\\\""); - Some(format!("\"{}\"", escaped)) - } - serde_yaml::Value::Sequence(seq) => { - let items: Option> = seq.iter().map(yaml_value_to_json_str).collect(); - items.map(|elems| format!("[{}]", elems.join(","))) - } - serde_yaml::Value::Mapping(map) if map.is_empty() => Some("{}".to_string()), - _ => None, - } -} - -// ── Identifier helpers ─────────────────────────────────────────────────────── - -fn yaml_path_to_const(yaml_path: &str) -> String { - yaml_path.replace('.', "_").to_uppercase() -} - -// ── Code rendering ─────────────────────────────────────────────────────────── - -fn render(entries: &[SchemaEntry]) -> String { - let mut out = String::new(); - - writeln!( - out, - "// @generated by build.rs from vendor/core_schema.yaml — DO NOT EDIT" - ) - .unwrap(); - writeln!(out).unwrap(); - writeln!(out, "use crate::config_registry::{{Schema, SchemaEntry, ValueType}};").unwrap(); - writeln!(out).unwrap(); - - for entry in entries { - if entry.value_type.is_unknown() { - writeln!( - out, - "// TODO: value_type unknown for '{}' — set an override in the annotation", - entry.yaml_path - ) - .unwrap(); - } - - let env_vars_literal = if entry.env_vars.is_empty() { - "&[]".to_string() - } else { - let items: Vec = entry.env_vars.iter().map(|e| format!("\"{}\"", e)).collect(); - format!("&[{}]", items.join(", ")) - }; - - let default_literal = match &entry.default { - Some(d) => format!("Some(\"{}\")", d.replace('\\', "\\\\").replace('"', "\\\"")), - None => "None".to_string(), - }; - - writeln!(out, "pub const {}: SchemaEntry = SchemaEntry {{", entry.const_name).unwrap(); - writeln!(out, " schema: Schema::Datadog,").unwrap(); - writeln!(out, " yaml_path: \"{}\",", entry.yaml_path).unwrap(); - writeln!(out, " env_vars: {},", env_vars_literal).unwrap(); - writeln!(out, " value_type: {},", entry.value_type.as_rust()).unwrap(); - writeln!(out, " default: {},", default_literal).unwrap(); - writeln!(out, "}};").unwrap(); - writeln!(out).unwrap(); - } - - out -} - -fn render_array(entries: &[SchemaEntry], output: &mut String) { - writeln!(output).unwrap(); - writeln!(output).unwrap(); - writeln!( - output, - "/// The complete list of entries found in the Datadog config schema." - ) - .unwrap(); - writeln!( - output, - "pub(crate) static ALL_SCHEMA_ENTRIES: [&SchemaEntry; {}] = [", - entries.len() - ) - .unwrap(); - for entry in entries { - writeln!(output, " &{},", entry.const_name).unwrap(); - } - writeln!(output, "];").unwrap(); -} - -fn render_ignored_keys(ignored_keys_path: &Path, output: &mut String) { - // Deserialize the data file. - let contents = - read_to_string(ignored_keys_path).unwrap_or_else(|_| panic!("Unable to read {}", ignored_keys_path.display())); - let yaml_value: serde_yaml::Value = serde_yaml::from_str(&contents) - .unwrap_or_else(|_| panic!("Unable to deserialize {}", ignored_keys_path.display())); - let names: Vec<&str> = yaml_value - .as_sequence() - .expect("Expected a yaml sequence but found something else") - .iter() - .map(|value| { - value - .as_mapping() - .expect("Expected an object") - .get("name") - .expect("Name field not found.") - .as_str() - .expect("Expected a string.") - }) - .collect(); - - // Begin rendering. - writeln!(output).unwrap(); - writeln!(output).unwrap(); - writeln!( - output, - "/// The list of entries found in the Datadog config schema which we are intentionally ignoring." - ) - .unwrap(); - writeln!(output, "pub(crate) static IGNORED_ENTRIES: [&str; {}] = [", names.len()).unwrap(); - for name in names { - writeln!(output, " \"{name}\",").unwrap(); - } - writeln!(output, "];").unwrap(); -} diff --git a/lib/saluki-components/etc/ignored_keys.yaml b/lib/saluki-components/etc/ignored_keys.yaml deleted file mode 100644 index 0893c938252..00000000000 --- a/lib/saluki-components/etc/ignored_keys.yaml +++ /dev/null @@ -1,3332 +0,0 @@ -# This is a list of configuration keys appearing in core_schema.yaml that ADP has consciously -# decided to ignore. This file is NOT generated by a deterministic build script. Each key must be -# considered with a human-in the loop before being added here. -# -# BE CAREFUL: adding a key here means that ADP will not issue a warning or error when the key exists -# in configuration, even if it is unsupported by ADP. Only those keys which are expected to have no -# effect on ADP behavior (by design) should be listed here. -# -# Reason "initial bulk" refers to the initial population of this file using the results of a -# human-guided AI analysis which resulted in PR #1437. Since then, a few keys deemed ignorable by -# that audit have bubbled up and been proven significant, whether because they are new or because -# they were missed. Overall though, the results of that audit have proven fairly durable. -- name: GUI_host - reason: initial bulk -- name: GUI_port - reason: initial bulk -- name: GUI_session_expiration - reason: initial bulk -- name: ac_exclude - reason: initial bulk -- name: ac_include - reason: initial bulk -- name: ad_allowed_env_vars - reason: initial bulk -- name: ad_config_poll_interval - reason: initial bulk -- name: ad_disable_env_var_resolution - reason: initial bulk -- name: ad_tag_completeness_max_wait - reason: initial bulk -- name: additional_checksd - reason: initial bulk -- name: admission_controller.add_aks_selectors - reason: initial bulk -- name: admission_controller.agent_sidecar.cluster_agent.enabled - reason: initial bulk -- name: admission_controller.agent_sidecar.cluster_agent.tls_verification.copy_ca_configmap - reason: initial bulk -- name: admission_controller.agent_sidecar.cluster_agent.tls_verification.enabled - reason: initial bulk -- name: admission_controller.agent_sidecar.container_registry - reason: initial bulk -- name: admission_controller.agent_sidecar.enabled - reason: initial bulk -- name: admission_controller.agent_sidecar.endpoint - reason: initial bulk -- name: admission_controller.agent_sidecar.image_name - reason: initial bulk -- name: admission_controller.agent_sidecar.image_tag - reason: initial bulk -- name: admission_controller.agent_sidecar.kubelet_api_logging.enabled - reason: initial bulk -- name: admission_controller.agent_sidecar.profiles - reason: initial bulk -- name: admission_controller.agent_sidecar.provider - reason: initial bulk -- name: admission_controller.agent_sidecar.selectors - reason: initial bulk -- name: admission_controller.appsec.sidecar.body_parsing_size_limit - reason: initial bulk -- name: admission_controller.appsec.sidecar.health_port - reason: initial bulk -- name: admission_controller.appsec.sidecar.image - reason: initial bulk -- name: admission_controller.appsec.sidecar.image_tag - reason: initial bulk -- name: admission_controller.appsec.sidecar.port - reason: initial bulk -- name: admission_controller.appsec.sidecar.resources.limits.cpu - reason: initial bulk -- name: admission_controller.appsec.sidecar.resources.limits.memory - reason: initial bulk -- name: admission_controller.appsec.sidecar.resources.requests.cpu - reason: initial bulk -- name: admission_controller.appsec.sidecar.resources.requests.memory - reason: initial bulk -- name: admission_controller.auto_instrumentation.asm.enabled - reason: initial bulk -- name: admission_controller.auto_instrumentation.asm_sca.enabled - reason: initial bulk -- name: admission_controller.auto_instrumentation.container_registry - reason: initial bulk -- name: admission_controller.auto_instrumentation.default_dd_registries - reason: initial bulk -- name: admission_controller.auto_instrumentation.enabled - reason: initial bulk -- name: admission_controller.auto_instrumentation.endpoint - reason: initial bulk -- name: admission_controller.auto_instrumentation.gradual_rollout.cache_ttl - reason: initial bulk -- name: admission_controller.auto_instrumentation.gradual_rollout.enabled - reason: initial bulk -- name: admission_controller.auto_instrumentation.iast.enabled - reason: initial bulk -- name: admission_controller.auto_instrumentation.init_resources.cpu - reason: initial bulk -- name: admission_controller.auto_instrumentation.init_resources.memory - reason: initial bulk -- name: admission_controller.auto_instrumentation.init_security_context - reason: initial bulk -- name: admission_controller.auto_instrumentation.inject_auto_detected_libraries - reason: initial bulk -- name: admission_controller.auto_instrumentation.patcher.enabled - reason: initial bulk -- name: admission_controller.auto_instrumentation.patcher.fallback_to_file_provider - reason: initial bulk -- name: admission_controller.auto_instrumentation.patcher.file_provider_path - reason: initial bulk -- name: admission_controller.auto_instrumentation.profiling.enabled - reason: initial bulk -- name: admission_controller.certificate.expiration_threshold - reason: initial bulk -- name: admission_controller.certificate.secret_name - reason: initial bulk -- name: admission_controller.certificate.validity_bound - reason: initial bulk -- name: admission_controller.container_registry - reason: initial bulk -- name: admission_controller.cws_instrumentation.command_endpoint - reason: initial bulk -- name: admission_controller.cws_instrumentation.container_registry - reason: initial bulk -- name: admission_controller.cws_instrumentation.enabled - reason: initial bulk -- name: admission_controller.cws_instrumentation.exclude - reason: initial bulk -- name: admission_controller.cws_instrumentation.image_name - reason: initial bulk -- name: admission_controller.cws_instrumentation.image_tag - reason: initial bulk -- name: admission_controller.cws_instrumentation.include - reason: initial bulk -- name: admission_controller.cws_instrumentation.init_resources.cpu - reason: initial bulk -- name: admission_controller.cws_instrumentation.init_resources.memory - reason: initial bulk -- name: admission_controller.cws_instrumentation.mode - reason: initial bulk -- name: admission_controller.cws_instrumentation.mutate_unlabelled - reason: initial bulk -- name: admission_controller.cws_instrumentation.pod_endpoint - reason: initial bulk -- name: admission_controller.cws_instrumentation.remote_copy.directory - reason: initial bulk -- name: admission_controller.cws_instrumentation.remote_copy.mount_volume - reason: initial bulk -- name: admission_controller.cws_instrumentation.timeout - reason: initial bulk -- name: admission_controller.enabled - reason: initial bulk -- name: admission_controller.failure_policy - reason: initial bulk -- name: admission_controller.inject_config.enabled - reason: initial bulk -- name: admission_controller.inject_config.endpoint - reason: initial bulk -- name: admission_controller.inject_config.local_service_name - reason: initial bulk -- name: admission_controller.inject_config.mode - reason: initial bulk -- name: admission_controller.inject_config.socket_path - reason: initial bulk -- name: admission_controller.inject_config.type_socket_volumes - reason: initial bulk -- name: admission_controller.inject_tags.enabled - reason: initial bulk -- name: admission_controller.inject_tags.endpoint - reason: initial bulk -- name: admission_controller.inject_tags.pod_owners_cache_validity - reason: initial bulk -- name: admission_controller.kubernetes_admission_events.enabled - reason: initial bulk -- name: admission_controller.mutate_unlabelled - reason: initial bulk -- name: admission_controller.mutation.enabled - reason: initial bulk -- name: admission_controller.namespace_selector_fallback - reason: initial bulk -- name: admission_controller.pod_owners_cache_validity - reason: initial bulk -- name: admission_controller.port - reason: initial bulk -- name: admission_controller.probe.enabled - reason: initial bulk -- name: admission_controller.probe.grace_period - reason: initial bulk -- name: admission_controller.probe.interval - reason: initial bulk -- name: admission_controller.reinvocation_policy - reason: initial bulk -- name: admission_controller.service_name - reason: initial bulk -- name: admission_controller.timeout_seconds - reason: initial bulk -- name: admission_controller.validation.enabled - reason: initial bulk -- name: admission_controller.webhook_name - reason: initial bulk -- name: agent_ipc.config_refresh_interval - reason: initial bulk -- name: agent_ipc.host - reason: initial bulk -- name: agent_ipc.port - reason: initial bulk -- name: agent_ipc.socket_path - reason: initial bulk -- name: agent_ipc.use_socket - reason: initial bulk -- name: agent_telemetry.additional_endpoints - reason: initial bulk -- name: agent_telemetry.batch_max_concurrent_send - reason: initial bulk -- name: agent_telemetry.batch_max_content_size - reason: initial bulk -- name: agent_telemetry.batch_max_size - reason: initial bulk -- name: agent_telemetry.batch_wait - reason: initial bulk -- name: agent_telemetry.compression_kind - reason: initial bulk -- name: agent_telemetry.compression_level - reason: initial bulk -- name: agent_telemetry.connection_reset_interval - reason: initial bulk -- name: agent_telemetry.dd_url - reason: initial bulk -- name: agent_telemetry.dev_mode_no_ssl - reason: initial bulk -- name: agent_telemetry.enabled - reason: initial bulk -- name: agent_telemetry.input_chan_size - reason: initial bulk -- name: agent_telemetry.logs_dd_url - reason: initial bulk -- name: agent_telemetry.logs_no_ssl - reason: initial bulk -- name: agent_telemetry.sender_backoff_base - reason: initial bulk -- name: agent_telemetry.sender_backoff_factor - reason: initial bulk -- name: agent_telemetry.sender_backoff_max - reason: initial bulk -- name: agent_telemetry.sender_recovery_interval - reason: initial bulk -- name: agent_telemetry.sender_recovery_reset - reason: initial bulk -- name: agent_telemetry.startup_trace_sampling - reason: initial bulk -- name: agent_telemetry.use_compression - reason: initial bulk -- name: agent_telemetry.use_v2_api - reason: initial bulk -- name: agent_telemetry.zstd_compression_level - reason: initial bulk -- name: allow_python_path_heuristics_failure - reason: initial bulk -- name: allowed_additional_checks - reason: initial bulk -- name: aggregator_tag_filter_cache_capacity - reason: ADP uses data_plane.dogstatsd.aggregator_tag_filter_cache_capacity instead; this core-agent key is expected to be set alongside the ADP key and should not trigger any warning -- name: apm_config.additional_endpoints - reason: initial bulk -- name: apm_config.additional_profile_tags - reason: initial bulk -- name: apm_config.analyzed_rate_by_service - reason: initial bulk -- name: apm_config.analyzed_spans - reason: initial bulk -- name: apm_config.apm_dd_url - reason: initial bulk -- name: apm_config.apm_non_local_traffic - reason: initial bulk -- name: apm_config.bucket_size_seconds - reason: initial bulk -- name: apm_config.client_stats_flush_interval - reason: initial bulk -- name: apm_config.compute_stats_by_span_kind - reason: initial bulk -- name: apm_config.connection_limit - reason: initial bulk -- name: apm_config.connection_reset_interval - reason: initial bulk -- name: apm_config.dd_agent_bin - reason: initial bulk -- name: apm_config.debug.port - reason: initial bulk -- name: apm_config.debug_v1_payloads - reason: initial bulk -- name: apm_config.debugger_additional_endpoints - reason: initial bulk -- name: apm_config.debugger_api_key - reason: initial bulk -- name: apm_config.debugger_dd_url - reason: initial bulk -- name: apm_config.debugger_diagnostics_additional_endpoints - reason: initial bulk -- name: apm_config.debugger_diagnostics_api_key - reason: initial bulk -- name: apm_config.debugger_diagnostics_dd_url - reason: initial bulk -- name: apm_config.decoder_timeout - reason: initial bulk -- name: apm_config.decoders - reason: initial bulk -- name: apm_config.disable_rare_sampler - reason: initial bulk -- name: apm_config.enable_container_tags_buffer - reason: initial bulk -- name: apm_config.enable_rare_sampler - reason: initial bulk -- name: apm_config.enabled - reason: initial bulk -- name: apm_config.env - reason: initial bulk -- name: apm_config.error_tracking_standalone.enabled - reason: initial bulk -- name: apm_config.errors_per_second - reason: initial bulk -- name: apm_config.extra_sample_rate - reason: initial bulk -- name: apm_config.features - reason: initial bulk -- name: apm_config.filter_tags.reject - reason: initial bulk -- name: apm_config.filter_tags.require - reason: initial bulk -- name: apm_config.filter_tags_regex.reject - reason: initial bulk -- name: apm_config.filter_tags_regex.require - reason: initial bulk -- name: apm_config.ignore_resources - reason: initial bulk -- name: apm_config.install_id - reason: initial bulk -- name: apm_config.install_time - reason: initial bulk -- name: apm_config.install_type - reason: initial bulk -- name: apm_config.instrumentation.disabled_namespaces - reason: initial bulk -- name: apm_config.instrumentation.enabled - reason: initial bulk -- name: apm_config.instrumentation.enabled_namespaces - reason: initial bulk -- name: apm_config.instrumentation.injection_mode - reason: initial bulk -- name: apm_config.instrumentation.injector_image_tag - reason: initial bulk -- name: apm_config.instrumentation.lib_versions - reason: initial bulk -- name: apm_config.instrumentation.targets - reason: initial bulk -- name: apm_config.internal_profiling.enabled - reason: initial bulk -- name: apm_config.log_file - reason: initial bulk -- name: apm_config.max_catalog_entries - reason: initial bulk -- name: apm_config.max_catalog_services - reason: initial bulk -- name: apm_config.max_connections - reason: initial bulk -- name: apm_config.max_cpu_percent - reason: initial bulk -- name: apm_config.max_events_per_second - reason: initial bulk -- name: apm_config.max_memory - reason: initial bulk -- name: apm_config.max_payload_size - reason: initial bulk -- name: apm_config.max_remote_traces_per_second - reason: initial bulk -- name: apm_config.max_sender_retries - reason: initial bulk -- name: apm_config.max_traces_per_second - reason: initial bulk -- name: apm_config.mode - reason: initial bulk -- name: apm_config.obfuscation.cache.enabled - reason: initial bulk -- name: apm_config.obfuscation.cache.max_size - reason: initial bulk -- name: apm_config.obfuscation.remove_stack_traces - reason: initial bulk -- name: apm_config.obfuscation.sql_exec_plan.enabled - reason: initial bulk -- name: apm_config.obfuscation.sql_exec_plan.keep_values - reason: initial bulk -- name: apm_config.obfuscation.sql_exec_plan.obfuscate_sql_values - reason: initial bulk -- name: apm_config.obfuscation.sql_exec_plan_normalize.enabled - reason: initial bulk -- name: apm_config.obfuscation.sql_exec_plan_normalize.keep_values - reason: initial bulk -- name: apm_config.obfuscation.sql_exec_plan_normalize.obfuscate_sql_values - reason: initial bulk -- name: apm_config.peer_service_aggregation - reason: initial bulk -- name: apm_config.peer_tags - reason: initial bulk -- name: apm_config.peer_tags_aggregation - reason: initial bulk -- name: apm_config.probabilistic_sampler.enabled - reason: initial bulk -- name: apm_config.probabilistic_sampler.hash_seed - reason: initial bulk -- name: apm_config.probabilistic_sampler.sampling_percentage - reason: initial bulk -- name: apm_config.profiling_additional_endpoints - reason: initial bulk -- name: apm_config.profiling_dd_url - reason: initial bulk -- name: apm_config.profiling_receiver_timeout - reason: initial bulk -- name: apm_config.receiver_enabled - reason: initial bulk -- name: apm_config.receiver_port - reason: initial bulk -- name: apm_config.receiver_socket - reason: initial bulk -- name: apm_config.receiver_timeout - reason: initial bulk -- name: apm_config.replace_tags - reason: initial bulk -- name: apm_config.send_all_internal_stats - reason: initial bulk -- name: apm_config.socket_activation.enabled - reason: initial bulk -- name: apm_config.socket_activation.handle_tcp_probe - reason: initial bulk -- name: apm_config.span_derived_primary_tags - reason: initial bulk -- name: apm_config.sql_obfuscation_mode - reason: initial bulk -- name: apm_config.stats_writer.connection_limit - reason: initial bulk -- name: apm_config.stats_writer.queue_size - reason: initial bulk -- name: apm_config.symdb_additional_endpoints - reason: initial bulk -- name: apm_config.symdb_api_key - reason: initial bulk -- name: apm_config.symdb_dd_url - reason: initial bulk -- name: apm_config.sync_flushing - reason: initial bulk -- name: apm_config.target_traces_per_second - reason: initial bulk -- name: apm_config.telemetry.additional_endpoints - reason: initial bulk -- name: apm_config.telemetry.dd_url - reason: initial bulk -- name: apm_config.telemetry.enabled - reason: initial bulk -- name: apm_config.trace_buffer - reason: initial bulk -- name: apm_config.trace_writer.connection_limit - reason: initial bulk -- name: apm_config.trace_writer.queue_size - reason: initial bulk -- name: apm_config.watchdog_check_delay - reason: initial bulk -- name: apm_config.windows_pipe_buffer_size - reason: initial bulk -- name: apm_config.windows_pipe_name - reason: initial bulk -- name: apm_config.windows_pipe_security_descriptor - reason: initial bulk -- name: apm_config.workload_selection - reason: initial bulk -- name: app_key - reason: initial bulk -- name: appsec.proxy.auto_detect - reason: initial bulk -- name: appsec.proxy.enabled - reason: initial bulk -- name: appsec.proxy.processor.address - reason: initial bulk -- name: appsec.proxy.processor.port - reason: initial bulk -- name: appsec.proxy.proxies - reason: initial bulk -- name: auth_init_timeout - reason: initial bulk -- name: auth_token_file_path - reason: initial bulk -- name: auto_exit.noprocess.enabled - reason: initial bulk -- name: auto_exit.noprocess.excluded_processes - reason: initial bulk -- name: auto_exit.validation_period - reason: initial bulk -- name: auto_team_tag_collection - reason: initial bulk -- name: autoconf_config_files_poll - reason: initial bulk -- name: autoconf_config_files_poll_interval - reason: initial bulk -- name: autoconf_template_dir - reason: initial bulk -- name: autoconfig_exclude_features - reason: initial bulk -- name: autoconfig_from_environment - reason: initial bulk -- name: autoconfig_include_features - reason: initial bulk -- name: autoscaling.cluster.enabled - reason: initial bulk -- name: autoscaling.workload.enabled - reason: initial bulk -- name: autoscaling.workload.external_recommender.tls.ca_file - reason: initial bulk -- name: autoscaling.workload.external_recommender.tls.cert_file - reason: initial bulk -- name: autoscaling.workload.external_recommender.tls.key_file - reason: initial bulk -- name: autoscaling.workload.in_place_vertical_scaling.enabled - reason: initial bulk -- name: autoscaling.workload.limit - reason: initial bulk -- name: autoscaling.workload.num_workers - reason: initial bulk -- name: azure_hostname_style - reason: initial bulk -- name: azure_metadata_api_version - reason: initial bulk -- name: azure_metadata_timeout - reason: initial bulk -- name: basic_telemetry_add_container_tags - reason: initial bulk -- name: bosh_id - reason: initial bulk -- name: c_core_dump - reason: initial bulk -- name: c_stacktrace_collection - reason: initial bulk -- name: cel_workload_exclude - reason: initial bulk -- name: cf_os_hostname_aliasing - reason: initial bulk -- name: check_cancel_timeout - reason: initial bulk -- name: check_runner_utilization_monitor_interval - reason: initial bulk -- name: check_runner_utilization_threshold - reason: initial bulk -- name: check_runner_utilization_warning_cooldown - reason: initial bulk -- name: check_runners - reason: initial bulk -- name: check_sampler_allow_sketch_bucket_reset - reason: initial bulk -- name: check_sampler_bucket_commits_count_expiry - reason: initial bulk -- name: check_sampler_context_metrics - reason: initial bulk -- name: check_sampler_expire_metrics - reason: initial bulk -- name: check_sampler_stateful_metric_expiration_time - reason: initial bulk -- name: check_system_probe_startup_time - reason: initial bulk -- name: check_system_probe_timeout - reason: initial bulk -- name: check_watchdog_warning_timeout - reason: initial bulk -- name: checks_tag_cardinality - reason: initial bulk -- name: clc_runner_enabled - reason: initial bulk -- name: clc_runner_host - reason: initial bulk -- name: clc_runner_id - reason: initial bulk -- name: clc_runner_port - reason: initial bulk -- name: clc_runner_remote_tagger_enabled - reason: initial bulk -- name: clc_runner_server_readheader_timeout - reason: initial bulk -- name: clc_runner_server_write_timeout - reason: initial bulk -- name: cloud_foundry - reason: initial bulk -- name: cloud_foundry_bbs.ca_file - reason: initial bulk -- name: cloud_foundry_bbs.cert_file - reason: initial bulk -- name: cloud_foundry_bbs.env_exclude - reason: initial bulk -- name: cloud_foundry_bbs.env_include - reason: initial bulk -- name: cloud_foundry_bbs.key_file - reason: initial bulk -- name: cloud_foundry_bbs.poll_interval - reason: initial bulk -- name: cloud_foundry_bbs.url - reason: initial bulk -- name: cloud_foundry_buildpack - reason: initial bulk -- name: cloud_foundry_cc.apps_batch_size - reason: initial bulk -- name: cloud_foundry_cc.client_id - reason: initial bulk -- name: cloud_foundry_cc.client_secret - reason: initial bulk -- name: cloud_foundry_cc.poll_interval - reason: initial bulk -- name: cloud_foundry_cc.skip_ssl_validation - reason: initial bulk -- name: cloud_foundry_cc.url - reason: initial bulk -- name: cloud_foundry_container_tagger.retry_count - reason: initial bulk -- name: cloud_foundry_container_tagger.retry_interval - reason: initial bulk -- name: cloud_foundry_container_tagger.shell_path - reason: initial bulk -- name: cloud_foundry_garden.listen_address - reason: initial bulk -- name: cloud_foundry_garden.listen_network - reason: initial bulk -- name: cloud_provider_metadata - reason: initial bulk -- name: cluster_agent.allow_legacy_tls - reason: initial bulk -- name: cluster_agent.appsec.injector.annotations - reason: initial bulk -- name: cluster_agent.appsec.injector.base_backoff - reason: initial bulk -- name: cluster_agent.appsec.injector.enabled - reason: initial bulk -- name: cluster_agent.appsec.injector.istio.namespace - reason: initial bulk -- name: cluster_agent.appsec.injector.labels - reason: initial bulk -- name: cluster_agent.appsec.injector.max_backoff - reason: initial bulk -- name: cluster_agent.appsec.injector.mode - reason: initial bulk -- name: cluster_agent.appsec.injector.processor.service.name - reason: initial bulk -- name: cluster_agent.appsec.injector.processor.service.namespace - reason: initial bulk -- name: cluster_agent.auth_token - reason: initial bulk -- name: cluster_agent.client_reconnect_period_seconds - reason: initial bulk -- name: cluster_agent.cluster_tagger.grpc_max_message_size - reason: initial bulk -- name: cluster_agent.cmd_port - reason: initial bulk -- name: cluster_agent.collect_kubernetes_tags - reason: initial bulk -- name: cluster_agent.isolation_segments_tags - reason: initial bulk -- name: cluster_agent.kube_metadata_collection.enabled - reason: initial bulk -- name: cluster_agent.kube_metadata_collection.resource_annotations_exclude - reason: initial bulk -- name: cluster_agent.kube_metadata_collection.resources - reason: initial bulk -- name: cluster_agent.kubernetes_resources_collection.deployment_annotations_exclude - reason: initial bulk -- name: cluster_agent.kubernetes_resources_collection.pod_annotations_exclude - reason: initial bulk -- name: cluster_agent.kubernetes_service_name - reason: initial bulk -- name: cluster_agent.language_detection.cleanup.language_ttl - reason: initial bulk -- name: cluster_agent.language_detection.cleanup.period - reason: initial bulk -- name: cluster_agent.language_detection.patcher.base_backoff - reason: initial bulk -- name: cluster_agent.language_detection.patcher.enabled - reason: initial bulk -- name: cluster_agent.language_detection.patcher.max_backoff - reason: initial bulk -- name: cluster_agent.max_leader_connections - reason: initial bulk -- name: cluster_agent.mcp.enabled - reason: initial bulk -- name: cluster_agent.mcp.endpoint - reason: initial bulk -- name: cluster_agent.refresh_on_cache_miss - reason: initial bulk -- name: cluster_agent.serve_nozzle_data - reason: initial bulk -- name: cluster_agent.server.idle_timeout_seconds - reason: initial bulk -- name: cluster_agent.server.read_timeout_seconds - reason: initial bulk -- name: cluster_agent.server.write_timeout_seconds - reason: initial bulk -- name: cluster_agent.service_account_name - reason: initial bulk -- name: cluster_agent.sidecars_tags - reason: initial bulk -- name: cluster_agent.tagging_fallback - reason: initial bulk -- name: cluster_agent.token_name - reason: initial bulk -- name: cluster_agent.tracing.enabled - reason: initial bulk -- name: cluster_agent.tracing.env - reason: initial bulk -- name: cluster_agent.tracing.sample_rate - reason: initial bulk -- name: cluster_agent.url - reason: initial bulk -- name: cluster_checks.advanced_dispatching_enabled - reason: initial bulk -- name: cluster_checks.clc_runners_port - reason: initial bulk -- name: cluster_checks.cluster_tag_name - reason: initial bulk -- name: cluster_checks.crd_collection - reason: initial bulk -- name: cluster_checks.enabled - reason: initial bulk -- name: cluster_checks.exclude_checks - reason: initial bulk -- name: cluster_checks.exclude_checks_from_dispatching - reason: initial bulk -- name: cluster_checks.extra_tags - reason: initial bulk -- name: cluster_checks.ksm_sharding_enabled - reason: initial bulk -- name: cluster_checks.node_expiration_timeout - reason: initial bulk -- name: cluster_checks.rebalance_min_percentage_improvement - reason: initial bulk -- name: cluster_checks.rebalance_period - reason: initial bulk -- name: cluster_checks.rebalance_with_utilization - reason: initial bulk -- name: cluster_checks.support_hybrid_ignore_ad_tags - reason: initial bulk -- name: cluster_checks.unscheduled_check_threshold - reason: initial bulk -- name: cluster_checks.warmup_duration - reason: initial bulk -- name: cluster_name - reason: initial bulk -- name: cluster_trust_chain.ca_cert_file_path - reason: initial bulk -- name: cluster_trust_chain.ca_key_file_path - reason: initial bulk -- name: cluster_trust_chain.enable_tls_verification - reason: initial bulk -- name: cmd.check.fullsketches - reason: initial bulk -- name: cmd_host - reason: initial bulk -- name: collect_ccrid - reason: initial bulk -- name: collect_ec2_instance_info - reason: initial bulk -- name: collect_ec2_tags - reason: initial bulk -- name: collect_ec2_tags_use_imds - reason: initial bulk -- name: collect_gce_tags - reason: initial bulk -- name: collect_gpu_tags - reason: initial bulk -- name: collect_kubernetes_events - reason: initial bulk -- name: common_root - reason: initial bulk -- name: compliance_config.check_interval - reason: initial bulk -- name: compliance_config.check_max_events_per_run - reason: initial bulk -- name: compliance_config.container_exclude - reason: initial bulk -- name: compliance_config.container_include - reason: initial bulk -- name: compliance_config.database_benchmarks.enabled - reason: initial bulk -- name: compliance_config.dir - reason: initial bulk -- name: compliance_config.enabled - reason: initial bulk -- name: compliance_config.endpoints.additional_endpoints - reason: initial bulk -- name: compliance_config.endpoints.batch_max_concurrent_send - reason: initial bulk -- name: compliance_config.endpoints.batch_max_content_size - reason: initial bulk -- name: compliance_config.endpoints.batch_max_size - reason: initial bulk -- name: compliance_config.endpoints.batch_wait - reason: initial bulk -- name: compliance_config.endpoints.compression_kind - reason: initial bulk -- name: compliance_config.endpoints.compression_level - reason: initial bulk -- name: compliance_config.endpoints.connection_reset_interval - reason: initial bulk -- name: compliance_config.endpoints.dd_url - reason: initial bulk -- name: compliance_config.endpoints.dev_mode_no_ssl - reason: initial bulk -- name: compliance_config.endpoints.input_chan_size - reason: initial bulk -- name: compliance_config.endpoints.logs_dd_url - reason: initial bulk -- name: compliance_config.endpoints.logs_no_ssl - reason: initial bulk -- name: compliance_config.endpoints.sender_backoff_base - reason: initial bulk -- name: compliance_config.endpoints.sender_backoff_factor - reason: initial bulk -- name: compliance_config.endpoints.sender_backoff_max - reason: initial bulk -- name: compliance_config.endpoints.sender_recovery_interval - reason: initial bulk -- name: compliance_config.endpoints.sender_recovery_reset - reason: initial bulk -- name: compliance_config.endpoints.use_compression - reason: initial bulk -- name: compliance_config.endpoints.use_v2_api - reason: initial bulk -- name: compliance_config.endpoints.zstd_compression_level - reason: initial bulk -- name: compliance_config.exclude_pause_container - reason: initial bulk -- name: compliance_config.host_benchmarks.enabled - reason: initial bulk -- name: compliance_config.metrics.enabled - reason: initial bulk -- name: compliance_config.opa.metrics.enabled - reason: initial bulk -- name: compliance_config.run_commands_as - reason: initial bulk -- name: compliance_config.run_in_system_probe - reason: initial bulk -- name: compliance_config.xccdf.enabled - reason: initial bulk -- name: conf_path - reason: initial bulk -- name: confd_path - reason: initial bulk -- name: config_id - reason: Core Agent only uses this on Agent HA telemetry metrics; ADP does not need it for metric payloads. -- name: config_providers - reason: initial bulk -- name: container_cgroup_root - reason: initial bulk -- name: container_env_as_tags - reason: initial bulk -- name: container_exclude - reason: initial bulk -- name: container_exclude_logs - reason: initial bulk -- name: container_exclude_metrics - reason: initial bulk -- name: container_exclude_stopped_age - reason: initial bulk -- name: container_image.additional_endpoints - reason: initial bulk -- name: container_image.batch_max_concurrent_send - reason: initial bulk -- name: container_image.batch_max_content_size - reason: initial bulk -- name: container_image.batch_max_size - reason: initial bulk -- name: container_image.batch_wait - reason: initial bulk -- name: container_image.compression_kind - reason: initial bulk -- name: container_image.compression_level - reason: initial bulk -- name: container_image.connection_reset_interval - reason: initial bulk -- name: container_image.dd_url - reason: initial bulk -- name: container_image.dev_mode_no_ssl - reason: initial bulk -- name: container_image.enabled - reason: initial bulk -- name: container_image.input_chan_size - reason: initial bulk -- name: container_image.logs_dd_url - reason: initial bulk -- name: container_image.logs_no_ssl - reason: initial bulk -- name: container_image.sender_backoff_base - reason: initial bulk -- name: container_image.sender_backoff_factor - reason: initial bulk -- name: container_image.sender_backoff_max - reason: initial bulk -- name: container_image.sender_recovery_interval - reason: initial bulk -- name: container_image.sender_recovery_reset - reason: initial bulk -- name: container_image.use_compression - reason: initial bulk -- name: container_image.use_v2_api - reason: initial bulk -- name: container_image.zstd_compression_level - reason: initial bulk -- name: container_include - reason: initial bulk -- name: container_include_logs - reason: initial bulk -- name: container_include_metrics - reason: initial bulk -- name: container_labels_as_tags - reason: initial bulk -- name: container_lifecycle.additional_endpoints - reason: initial bulk -- name: container_lifecycle.batch_max_concurrent_send - reason: initial bulk -- name: container_lifecycle.batch_max_content_size - reason: initial bulk -- name: container_lifecycle.batch_max_size - reason: initial bulk -- name: container_lifecycle.batch_wait - reason: initial bulk -- name: container_lifecycle.compression_kind - reason: initial bulk -- name: container_lifecycle.compression_level - reason: initial bulk -- name: container_lifecycle.connection_reset_interval - reason: initial bulk -- name: container_lifecycle.dd_url - reason: initial bulk -- name: container_lifecycle.dev_mode_no_ssl - reason: initial bulk -- name: container_lifecycle.enabled - reason: initial bulk -- name: container_lifecycle.input_chan_size - reason: initial bulk -- name: container_lifecycle.logs_dd_url - reason: initial bulk -- name: container_lifecycle.logs_no_ssl - reason: initial bulk -- name: container_lifecycle.sender_backoff_base - reason: initial bulk -- name: container_lifecycle.sender_backoff_factor - reason: initial bulk -- name: container_lifecycle.sender_backoff_max - reason: initial bulk -- name: container_lifecycle.sender_recovery_interval - reason: initial bulk -- name: container_lifecycle.sender_recovery_reset - reason: initial bulk -- name: container_lifecycle.use_compression - reason: initial bulk -- name: container_lifecycle.use_v2_api - reason: initial bulk -- name: container_lifecycle.zstd_compression_level - reason: initial bulk -- name: container_pid_mapper - reason: initial bulk -- name: container_proc_root - reason: initial bulk -- name: containerd_exclude_namespaces - reason: initial bulk -- name: containerd_namespace - reason: initial bulk -- name: containerd_namespaces - reason: initial bulk -- name: convert_dd_site_fqdn.enabled - reason: initial bulk -- name: core_agent.enabled - reason: initial bulk -- name: cri_socket_path - reason: initial bulk -- name: csi.driver - reason: initial bulk -- name: csi.enabled - reason: initial bulk -- name: data_observability.forwarder.additional_endpoints - reason: initial bulk -- name: data_observability.forwarder.batch_max_concurrent_send - reason: initial bulk -- name: data_observability.forwarder.batch_max_content_size - reason: initial bulk -- name: data_observability.forwarder.batch_max_size - reason: initial bulk -- name: data_observability.forwarder.batch_wait - reason: initial bulk -- name: data_observability.forwarder.compression_kind - reason: initial bulk -- name: data_observability.forwarder.compression_level - reason: initial bulk -- name: data_observability.forwarder.connection_reset_interval - reason: initial bulk -- name: data_observability.forwarder.dd_url - reason: initial bulk -- name: data_observability.forwarder.dev_mode_no_ssl - reason: initial bulk -- name: data_observability.forwarder.input_chan_size - reason: initial bulk -- name: data_observability.forwarder.logs_dd_url - reason: initial bulk -- name: data_observability.forwarder.logs_no_ssl - reason: initial bulk -- name: data_observability.forwarder.sender_backoff_base - reason: initial bulk -- name: data_observability.forwarder.sender_backoff_factor - reason: initial bulk -- name: data_observability.forwarder.sender_backoff_max - reason: initial bulk -- name: data_observability.forwarder.sender_recovery_interval - reason: initial bulk -- name: data_observability.forwarder.sender_recovery_reset - reason: initial bulk -- name: data_observability.forwarder.use_compression - reason: initial bulk -- name: data_observability.forwarder.use_v2_api - reason: initial bulk -- name: data_observability.forwarder.zstd_compression_level - reason: initial bulk -- name: data_observability.query_actions.enabled - reason: initial bulk -- name: data_plane.dogstatsd.enabled - reason: initial bulk -- name: data_plane.enabled - reason: initial bulk -- name: data_plane.otlp.enabled - reason: initial bulk -- name: data_plane.otlp.proxy.enabled - reason: initial bulk -- name: data_plane.otlp.proxy.receiver.protocols.grpc.endpoint - reason: initial bulk -- name: data_streams.forwarder.additional_endpoints - reason: initial bulk -- name: data_streams.forwarder.batch_max_concurrent_send - reason: initial bulk -- name: data_streams.forwarder.batch_max_content_size - reason: initial bulk -- name: data_streams.forwarder.batch_max_size - reason: initial bulk -- name: data_streams.forwarder.batch_wait - reason: initial bulk -- name: data_streams.forwarder.compression_kind - reason: initial bulk -- name: data_streams.forwarder.compression_level - reason: initial bulk -- name: data_streams.forwarder.connection_reset_interval - reason: initial bulk -- name: data_streams.forwarder.dd_url - reason: initial bulk -- name: data_streams.forwarder.dev_mode_no_ssl - reason: initial bulk -- name: data_streams.forwarder.input_chan_size - reason: initial bulk -- name: data_streams.forwarder.logs_dd_url - reason: initial bulk -- name: data_streams.forwarder.logs_no_ssl - reason: initial bulk -- name: data_streams.forwarder.sender_backoff_base - reason: initial bulk -- name: data_streams.forwarder.sender_backoff_factor - reason: initial bulk -- name: data_streams.forwarder.sender_backoff_max - reason: initial bulk -- name: data_streams.forwarder.sender_recovery_interval - reason: initial bulk -- name: data_streams.forwarder.sender_recovery_reset - reason: initial bulk -- name: data_streams.forwarder.use_compression - reason: initial bulk -- name: data_streams.forwarder.use_v2_api - reason: initial bulk -- name: data_streams.forwarder.zstd_compression_level - reason: initial bulk -- name: database_monitoring.activity.additional_endpoints - reason: initial bulk -- name: database_monitoring.activity.batch_max_concurrent_send - reason: initial bulk -- name: database_monitoring.activity.batch_max_content_size - reason: initial bulk -- name: database_monitoring.activity.batch_max_size - reason: initial bulk -- name: database_monitoring.activity.batch_wait - reason: initial bulk -- name: database_monitoring.activity.compression_kind - reason: initial bulk -- name: database_monitoring.activity.compression_level - reason: initial bulk -- name: database_monitoring.activity.connection_reset_interval - reason: initial bulk -- name: database_monitoring.activity.dd_url - reason: initial bulk -- name: database_monitoring.activity.dev_mode_no_ssl - reason: initial bulk -- name: database_monitoring.activity.input_chan_size - reason: initial bulk -- name: database_monitoring.activity.logs_dd_url - reason: initial bulk -- name: database_monitoring.activity.logs_no_ssl - reason: initial bulk -- name: database_monitoring.activity.sender_backoff_base - reason: initial bulk -- name: database_monitoring.activity.sender_backoff_factor - reason: initial bulk -- name: database_monitoring.activity.sender_backoff_max - reason: initial bulk -- name: database_monitoring.activity.sender_recovery_interval - reason: initial bulk -- name: database_monitoring.activity.sender_recovery_reset - reason: initial bulk -- name: database_monitoring.activity.use_compression - reason: initial bulk -- name: database_monitoring.activity.use_v2_api - reason: initial bulk -- name: database_monitoring.activity.zstd_compression_level - reason: initial bulk -- name: database_monitoring.autodiscovery.aurora.dbm_tag - reason: initial bulk -- name: database_monitoring.autodiscovery.aurora.discovery_interval - reason: initial bulk -- name: database_monitoring.autodiscovery.aurora.enabled - reason: initial bulk -- name: database_monitoring.autodiscovery.aurora.global_view_db_tag - reason: initial bulk -- name: database_monitoring.autodiscovery.aurora.query_timeout - reason: initial bulk -- name: database_monitoring.autodiscovery.aurora.region - reason: initial bulk -- name: database_monitoring.autodiscovery.aurora.tags - reason: initial bulk -- name: database_monitoring.autodiscovery.rds.dbm_tag - reason: initial bulk -- name: database_monitoring.autodiscovery.rds.discovery_interval - reason: initial bulk -- name: database_monitoring.autodiscovery.rds.enabled - reason: initial bulk -- name: database_monitoring.autodiscovery.rds.global_view_db_tag - reason: initial bulk -- name: database_monitoring.autodiscovery.rds.query_timeout - reason: initial bulk -- name: database_monitoring.autodiscovery.rds.region - reason: initial bulk -- name: database_monitoring.autodiscovery.rds.tags - reason: initial bulk -- name: database_monitoring.metrics.additional_endpoints - reason: initial bulk -- name: database_monitoring.metrics.batch_max_concurrent_send - reason: initial bulk -- name: database_monitoring.metrics.batch_max_content_size - reason: initial bulk -- name: database_monitoring.metrics.batch_max_size - reason: initial bulk -- name: database_monitoring.metrics.batch_wait - reason: initial bulk -- name: database_monitoring.metrics.compression_kind - reason: initial bulk -- name: database_monitoring.metrics.compression_level - reason: initial bulk -- name: database_monitoring.metrics.connection_reset_interval - reason: initial bulk -- name: database_monitoring.metrics.dd_url - reason: initial bulk -- name: database_monitoring.metrics.dev_mode_no_ssl - reason: initial bulk -- name: database_monitoring.metrics.input_chan_size - reason: initial bulk -- name: database_monitoring.metrics.logs_dd_url - reason: initial bulk -- name: database_monitoring.metrics.logs_no_ssl - reason: initial bulk -- name: database_monitoring.metrics.sender_backoff_base - reason: initial bulk -- name: database_monitoring.metrics.sender_backoff_factor - reason: initial bulk -- name: database_monitoring.metrics.sender_backoff_max - reason: initial bulk -- name: database_monitoring.metrics.sender_recovery_interval - reason: initial bulk -- name: database_monitoring.metrics.sender_recovery_reset - reason: initial bulk -- name: database_monitoring.metrics.use_compression - reason: initial bulk -- name: database_monitoring.metrics.use_v2_api - reason: initial bulk -- name: database_monitoring.metrics.zstd_compression_level - reason: initial bulk -- name: database_monitoring.samples.additional_endpoints - reason: initial bulk -- name: database_monitoring.samples.batch_max_concurrent_send - reason: initial bulk -- name: database_monitoring.samples.batch_max_content_size - reason: initial bulk -- name: database_monitoring.samples.batch_max_size - reason: initial bulk -- name: database_monitoring.samples.batch_wait - reason: initial bulk -- name: database_monitoring.samples.compression_kind - reason: initial bulk -- name: database_monitoring.samples.compression_level - reason: initial bulk -- name: database_monitoring.samples.connection_reset_interval - reason: initial bulk -- name: database_monitoring.samples.dd_url - reason: initial bulk -- name: database_monitoring.samples.dev_mode_no_ssl - reason: initial bulk -- name: database_monitoring.samples.input_chan_size - reason: initial bulk -- name: database_monitoring.samples.logs_dd_url - reason: initial bulk -- name: database_monitoring.samples.logs_no_ssl - reason: initial bulk -- name: database_monitoring.samples.sender_backoff_base - reason: initial bulk -- name: database_monitoring.samples.sender_backoff_factor - reason: initial bulk -- name: database_monitoring.samples.sender_backoff_max - reason: initial bulk -- name: database_monitoring.samples.sender_recovery_interval - reason: initial bulk -- name: database_monitoring.samples.sender_recovery_reset - reason: initial bulk -- name: database_monitoring.samples.use_compression - reason: initial bulk -- name: database_monitoring.samples.use_v2_api - reason: initial bulk -- name: database_monitoring.samples.zstd_compression_level - reason: initial bulk -- name: default_integration_http_timeout - reason: initial bulk -- name: delegated_auth.aws.region - reason: initial bulk -- name: delegated_auth.org_uuid - reason: initial bulk -- name: delegated_auth.provider - reason: initial bulk -- name: delegated_auth.refresh_interval_mins - reason: initial bulk -- name: disable_cluster_name_tag_key - reason: initial bulk -- name: disable_file_logging - reason: initial bulk -- name: disable_py3_validation - reason: initial bulk -- name: disable_unsafe_yaml - reason: initial bulk -- name: disk_check.use_core_loader - reason: initial bulk -- name: djm_config.enabled - reason: initial bulk -- name: docker_env_as_tags - reason: initial bulk -- name: docker_labels_as_tags - reason: initial bulk -- name: docker_query_timeout - reason: initial bulk -- name: dogstatsd_expiry_seconds - reason: initial bulk -- name: dogstatsd_host_socket_path - reason: Admission controller plumbing; not read by DSD server -- name: dogstatsd_mem_based_rate_limiter.enabled - reason: initial bulk -- name: dogstatsd_mem_based_rate_limiter.go_gc - reason: initial bulk -- name: dogstatsd_mem_based_rate_limiter.high_soft_limit - reason: initial bulk -- name: dogstatsd_mem_based_rate_limiter.low_soft_limit - reason: initial bulk -- name: dogstatsd_mem_based_rate_limiter.memory_ballast - reason: initial bulk -- name: dogstatsd_mem_based_rate_limiter.rate_check.factor - reason: initial bulk -- name: dogstatsd_mem_based_rate_limiter.rate_check.max - reason: initial bulk -- name: dogstatsd_mem_based_rate_limiter.rate_check.min - reason: initial bulk -- name: dogstatsd_mem_based_rate_limiter.soft_limit_freeos_check.factor - reason: initial bulk -- name: dogstatsd_mem_based_rate_limiter.soft_limit_freeos_check.max - reason: initial bulk -- name: dogstatsd_mem_based_rate_limiter.soft_limit_freeos_check.min - reason: initial bulk -- name: dogstatsd_no_aggregation_pipeline_batch_size - reason: initial bulk -- name: dogstatsd_packet_buffer_flush_timeout - reason: initial bulk -- name: dogstatsd_packet_buffer_size - reason: initial bulk -- name: dogstatsd_pipeline_autoadjust - reason: initial bulk -- name: dogstatsd_pipeline_count - reason: initial bulk -- name: dogstatsd_queue_size - reason: initial bulk -- name: dogstatsd_workers_count - reason: initial bulk -- name: ec2_imdsv2_transition_payload_enabled - reason: initial bulk -- name: ec2_metadata_timeout - reason: initial bulk -- name: ec2_metadata_token_lifetime - reason: initial bulk -- name: ec2_prefer_imdsv2 - reason: initial bulk -- name: ec2_prioritize_instance_id_as_hostname - reason: initial bulk -- name: ec2_use_dmi - reason: initial bulk -- name: ec2_use_windows_prefix_detection - reason: initial bulk -- name: ecs_agent_container_name - reason: initial bulk -- name: ecs_agent_url - reason: initial bulk -- name: ecs_collect_resource_tags_ec2 - reason: initial bulk -- name: ecs_deployment_mode - reason: initial bulk -- name: ecs_metadata_retry_initial_interval - reason: initial bulk -- name: ecs_metadata_retry_max_elapsed_time - reason: initial bulk -- name: ecs_metadata_retry_timeout_factor - reason: initial bulk -- name: ecs_metadata_timeout - reason: initial bulk -- name: ecs_resource_tags_replace_colon - reason: initial bulk -- name: ecs_task_cache_ttl - reason: initial bulk -- name: ecs_task_collection_burst - reason: initial bulk -- name: ecs_task_collection_enabled - reason: initial bulk -- name: ecs_task_collection_rate - reason: initial bulk -- name: eks_fargate - reason: initial bulk -- name: enable_cluster_agent_metadata_collection - reason: initial bulk -- name: enable_gohai - reason: initial bulk -- name: enable_json_stream_shared_compressor_buffers - reason: ADP does not use a shared compressor buffer pool; Rust request builders own fixed-capacity scratch and compression buffers. -- name: enable_metadata_collection - reason: initial bulk -- name: enable_payloads.json_to_v1_intake - reason: Legacy v1/intake endpoint; not implemented in ADP -- name: enable_signing_metadata_collection - reason: initial bulk -- name: enabled_rfc1123_compliant_cluster_name_tag - reason: initial bulk -- name: enhanced_metrics - reason: initial bulk -- name: entity_id - reason: ADP does not emit internal DogStatsD metrics; its own DogStatsD telemetry is exposed via OpenMetrics. -- name: event_management.forwarder.additional_endpoints - reason: initial bulk -- name: event_management.forwarder.batch_max_concurrent_send - reason: initial bulk -- name: event_management.forwarder.batch_max_content_size - reason: initial bulk -- name: event_management.forwarder.batch_max_size - reason: initial bulk -- name: event_management.forwarder.batch_wait - reason: initial bulk -- name: event_management.forwarder.compression_kind - reason: initial bulk -- name: event_management.forwarder.compression_level - reason: initial bulk -- name: event_management.forwarder.connection_reset_interval - reason: initial bulk -- name: event_management.forwarder.dd_url - reason: initial bulk -- name: event_management.forwarder.dev_mode_no_ssl - reason: initial bulk -- name: event_management.forwarder.input_chan_size - reason: initial bulk -- name: event_management.forwarder.logs_dd_url - reason: initial bulk -- name: event_management.forwarder.logs_no_ssl - reason: initial bulk -- name: event_management.forwarder.sender_backoff_base - reason: initial bulk -- name: event_management.forwarder.sender_backoff_factor - reason: initial bulk -- name: event_management.forwarder.sender_backoff_max - reason: initial bulk -- name: event_management.forwarder.sender_recovery_interval - reason: initial bulk -- name: event_management.forwarder.sender_recovery_reset - reason: initial bulk -- name: event_management.forwarder.use_compression - reason: initial bulk -- name: event_management.forwarder.use_v2_api - reason: initial bulk -- name: event_management.forwarder.zstd_compression_level - reason: initial bulk -- name: evp_proxy_config.additional_endpoints - reason: initial bulk -- name: evp_proxy_config.api_key - reason: initial bulk -- name: evp_proxy_config.dd_url - reason: initial bulk -- name: evp_proxy_config.delegated_auth.aws.region - reason: initial bulk -- name: evp_proxy_config.delegated_auth.org_uuid - reason: initial bulk -- name: evp_proxy_config.delegated_auth.provider - reason: initial bulk -- name: evp_proxy_config.delegated_auth.refresh_interval_mins - reason: initial bulk -- name: evp_proxy_config.enabled - reason: initial bulk -- name: evp_proxy_config.max_payload_size - reason: initial bulk -- name: evp_proxy_config.receiver_timeout - reason: initial bulk -- name: exclude_ec2_tags - reason: initial bulk -- name: exclude_gce_tags - reason: initial bulk -- name: exclude_pause_container - reason: initial bulk -- name: expected_tags_duration - reason: initial bulk -- name: expvar_port - reason: initial bulk -- name: external_metrics.aggregator - reason: initial bulk -- name: external_metrics_provider.api_key - reason: initial bulk -- name: external_metrics_provider.app_key - reason: initial bulk -- name: external_metrics_provider.batch_window - reason: initial bulk -- name: external_metrics_provider.bucket_size - reason: initial bulk -- name: external_metrics_provider.chunk_size - reason: initial bulk -- name: external_metrics_provider.config - reason: initial bulk -- name: external_metrics_provider.enable_datadogmetric_autogen - reason: initial bulk -- name: external_metrics_provider.enabled - reason: initial bulk -- name: external_metrics_provider.endpoint - reason: initial bulk -- name: external_metrics_provider.endpoints - reason: initial bulk -- name: external_metrics_provider.local_copy_refresh_rate - reason: initial bulk -- name: external_metrics_provider.max_age - reason: initial bulk -- name: external_metrics_provider.max_parallel_queries - reason: initial bulk -- name: external_metrics_provider.max_time_window - reason: initial bulk -- name: external_metrics_provider.num_workers - reason: initial bulk -- name: external_metrics_provider.port - reason: initial bulk -- name: external_metrics_provider.query_validity_period - reason: initial bulk -- name: external_metrics_provider.refresh_period - reason: initial bulk -- name: external_metrics_provider.rollup - reason: initial bulk -- name: external_metrics_provider.split_batches_with_backoff - reason: initial bulk -- name: external_metrics_provider.use_datadogmetric_crd - reason: initial bulk -- name: external_metrics_provider.wpa_controller - reason: initial bulk -- name: extra_config_providers - reason: initial bulk -- name: extra_listeners - reason: initial bulk -- name: extra_tags - reason: initial bulk -- name: fips.enabled - reason: initial bulk -- name: fips.https - reason: initial bulk -- name: fips.local_address - reason: initial bulk -- name: fips.port_range_start - reason: initial bulk -- name: fips.tls_verify - reason: initial bulk -- name: flare.profile_overhead_runtime - reason: initial bulk -- name: flare.rc_profiling.blocking_rate - reason: initial bulk -- name: flare.rc_profiling.mutex_fraction - reason: initial bulk -- name: flare.rc_profiling.profile_duration - reason: initial bulk -- name: flare.rc_streamlogs.duration - reason: initial bulk -- name: flare_provider_timeout - reason: initial bulk -- name: flare_stripped_keys - reason: initial bulk -- name: fleet_layers - reason: initial bulk -- name: fleet_policies_dir - reason: initial bulk -- name: gce_metadata_timeout - reason: initial bulk -- name: gce_send_project_id_tag - reason: initial bulk -- name: go_core_dump - reason: initial bulk -- name: gpu.disabled_collectors - reason: initial bulk -- name: gpu.enabled - reason: initial bulk -- name: gpu.integrate_with_workloadmeta_processes - reason: initial bulk -- name: gpu.nvml_lib_path - reason: initial bulk -- name: gpu.sp_process_metrics_request_timeout - reason: initial bulk -- name: gpu.use_sp_process_metrics - reason: initial bulk -- name: gpu.workload_tag_cache_size - reason: initial bulk -- name: ha_agent.enabled - reason: initial bulk -- name: ha_agent.group - reason: initial bulk -- name: health_platform.enabled - reason: initial bulk -- name: health_platform.forwarder.interval - reason: initial bulk -- name: health_platform.persist_on_kubernetes - reason: initial bulk -- name: health_port - reason: initial bulk -- name: histogram_percentiles - reason: initial bulk -- name: host_aliases - reason: initial bulk -- name: hostname - reason: initial bulk -- name: hostname_drift_initial_delay - reason: initial bulk -- name: hostname_drift_recurring_interval - reason: initial bulk -- name: hostname_file - reason: initial bulk -- name: hostname_force_config_as_canonical - reason: initial bulk -- name: hostname_fqdn - reason: initial bulk -- name: hostname_trust_uts_namespace - reason: initial bulk -- name: hostprofiler.additional_http_headers - reason: initial bulk -- name: hostprofiler.ddprofiling.enabled - reason: initial bulk -- name: hostprofiler.ddprofiling.period - reason: initial bulk -- name: hostprofiler.debug.verbosity - reason: initial bulk -- name: hpa_configmap_name - reason: initial bulk -- name: hpa_watcher_gc_period - reason: initial bulk -- name: hpa_watcher_polling_freq - reason: initial bulk -- name: http_dial_fallback_delay - reason: initial bulk -- name: ibm_metadata_timeout - reason: initial bulk -- name: ignore_autoconf - reason: initial bulk -- name: ignore_host_etc - reason: initial bulk -- name: include_ephemeral_containers - reason: initial bulk -- name: infrastructure_mode - reason: initial bulk -- name: installer.gc_interval - reason: initial bulk -- name: installer.mirror - reason: initial bulk -- name: installer.refresh_interval - reason: initial bulk -- name: installer.registry.auth - reason: initial bulk -- name: installer.registry.password - reason: initial bulk -- name: installer.registry.url - reason: initial bulk -- name: installer.registry.username - reason: initial bulk -- name: integration.additional - reason: initial bulk -- name: integration.basic.allowed - reason: initial bulk -- name: integration.enabled - reason: initial bulk -- name: integration.end_user_device.allowed - reason: initial bulk -- name: integration.excluded - reason: initial bulk -- name: integration.full.allowed - reason: initial bulk -- name: integration_check_status_enabled - reason: initial bulk -- name: integration_file_paths_allowlist - reason: initial bulk -- name: integration_ignore_untrusted_file_params - reason: initial bulk -- name: integration_profiling - reason: initial bulk -- name: integration_security_excluded_checks - reason: initial bulk -- name: integration_tracing - reason: initial bulk -- name: integration_tracing_exhaustive - reason: initial bulk -- name: integration_trusted_providers - reason: initial bulk -- name: internal_profiling.block_profile_rate - reason: initial bulk -- name: internal_profiling.capture_all_allocations - reason: initial bulk -- name: internal_profiling.cpu_duration - reason: initial bulk -- name: internal_profiling.custom_attributes - reason: initial bulk -- name: internal_profiling.delta_profiles - reason: initial bulk -- name: internal_profiling.enable_block_profiling - reason: initial bulk -- name: internal_profiling.enable_goroutine_stacktraces - reason: initial bulk -- name: internal_profiling.enable_mutex_profiling - reason: initial bulk -- name: internal_profiling.enabled - reason: initial bulk -- name: internal_profiling.extra_tags - reason: initial bulk -- name: internal_profiling.mutex_profile_fraction - reason: initial bulk -- name: internal_profiling.period - reason: initial bulk -- name: internal_profiling.profile_dd_url - reason: initial bulk -- name: internal_profiling.unix_socket - reason: initial bulk -- name: inventories_checks_configuration_enabled - reason: initial bulk -- name: inventories_collect_cloud_provider_account_id - reason: initial bulk -- name: inventories_configuration_enabled - reason: initial bulk -- name: inventories_diagnostics_enabled - reason: initial bulk -- name: inventories_enabled - reason: initial bulk -- name: inventories_first_run_delay - reason: initial bulk -- name: inventories_max_interval - reason: initial bulk -- name: inventories_min_interval - reason: initial bulk -- name: iot_host - reason: initial bulk -- name: ipc_address - reason: initial bulk -- name: ipc_cert_file_path - reason: initial bulk -- name: jmx_check_period - reason: initial bulk -- name: jmx_collection_timeout - reason: initial bulk -- name: jmx_custom_jars - reason: initial bulk -- name: jmx_java_tool_options - reason: initial bulk -- name: jmx_log_file - reason: initial bulk -- name: jmx_max_ram_percentage - reason: initial bulk -- name: jmx_max_restarts - reason: initial bulk -- name: jmx_reconnection_thread_pool_size - reason: initial bulk -- name: jmx_reconnection_timeout - reason: initial bulk -- name: jmx_restart_interval - reason: initial bulk -- name: jmx_statsd_client_buffer_size - reason: initial bulk -- name: jmx_statsd_client_queue_size - reason: initial bulk -- name: jmx_statsd_client_socket_timeout - reason: initial bulk -- name: jmx_statsd_client_use_non_blocking - reason: initial bulk -- name: jmx_statsd_telemetry_enabled - reason: initial bulk -- name: jmx_telemetry_enabled - reason: initial bulk -- name: jmx_thread_pool_size - reason: initial bulk -- name: jmx_use_cgroup_memory_limit - reason: initial bulk -- name: jmx_use_container_support - reason: initial bulk -- name: kube_cache_sync_timeout_seconds - reason: initial bulk -- name: kube_resources_namespace - reason: initial bulk -- name: kubeactions.enabled - reason: initial bulk -- name: kubelet_auth_token_path - reason: initial bulk -- name: kubelet_cache_pods_duration - reason: initial bulk -- name: kubelet_client_ca - reason: initial bulk -- name: kubelet_client_crt - reason: initial bulk -- name: kubelet_client_key - reason: initial bulk -- name: kubelet_collector_pull_interval - reason: initial bulk -- name: kubelet_core_check_enabled - reason: initial bulk -- name: kubelet_tls_verify - reason: initial bulk -- name: kubelet_use_api_server - reason: initial bulk -- name: kubernetes_ad_tags_disabled - reason: initial bulk -- name: kubernetes_apiserver_ca_path - reason: initial bulk -- name: kubernetes_apiserver_client_timeout - reason: initial bulk -- name: kubernetes_apiserver_informer_client_timeout - reason: initial bulk -- name: kubernetes_apiserver_tls_verify - reason: initial bulk -- name: kubernetes_apiserver_use_protobuf - reason: initial bulk -- name: kubernetes_collect_metadata_tags - reason: initial bulk -- name: kubernetes_event_collection_timeout - reason: initial bulk -- name: kubernetes_events_source_detection.enabled - reason: initial bulk -- name: kubernetes_http_kubelet_port - reason: initial bulk -- name: kubernetes_https_kubelet_port - reason: initial bulk -- name: kubernetes_informers_resync_period - reason: initial bulk -- name: kubernetes_kube_service_ignore_readiness - reason: initial bulk -- name: kubernetes_kubeconfig_path - reason: initial bulk -- name: kubernetes_kubelet_deviceplugins_cache_duration - reason: initial bulk -- name: kubernetes_kubelet_deviceplugins_socketdir - reason: initial bulk -- name: kubernetes_kubelet_host - reason: initial bulk -- name: kubernetes_kubelet_nodename - reason: initial bulk -- name: kubernetes_kubelet_podresources_socket - reason: initial bulk -- name: kubernetes_map_services_on_ip - reason: initial bulk -- name: kubernetes_metadata_streaming - reason: initial bulk -- name: kubernetes_metadata_tag_update_freq - reason: initial bulk -- name: kubernetes_namespace_annotations_as_tags - reason: initial bulk -- name: kubernetes_namespace_labels_as_tags - reason: initial bulk -- name: kubernetes_node_annotations_as_host_aliases - reason: initial bulk -- name: kubernetes_node_annotations_as_tags - reason: initial bulk -- name: kubernetes_node_label_as_cluster_name - reason: initial bulk -- name: kubernetes_node_labels_as_tags - reason: initial bulk -- name: kubernetes_persistent_volume_claims_as_tags - reason: initial bulk -- name: kubernetes_pod_annotations_as_tags - reason: initial bulk -- name: kubernetes_pod_expiration_duration - reason: initial bulk -- name: kubernetes_pod_labels_as_tags - reason: initial bulk -- name: kubernetes_resources_annotations_as_tags - reason: initial bulk -- name: kubernetes_resources_labels_as_tags - reason: initial bulk -- name: kubernetes_use_endpoint_slices - reason: initial bulk -- name: language_detection.enabled - reason: initial bulk -- name: language_detection.reporting.buffer_period - reason: initial bulk -- name: language_detection.reporting.enabled - reason: initial bulk -- name: language_detection.reporting.refresh_period - reason: initial bulk -- name: leader_election - reason: initial bulk -- name: leader_election_default_resource - reason: initial bulk -- name: leader_election_release_on_shutdown - reason: initial bulk -- name: leader_lease_duration - reason: initial bulk -- name: leader_lease_name - reason: initial bulk -- name: listeners - reason: initial bulk -- name: log_all_goroutines_when_unhealthy - reason: initial bulk -- name: log_enabled - reason: initial bulk -- name: log_file - reason: initial bulk -- name: log_file_max_rolls - reason: initial bulk -- name: log_file_max_size - reason: initial bulk -- name: log_format_json - reason: initial bulk -- name: log_level - reason: initial bulk -- name: log_to_console - reason: initial bulk -- name: log_to_syslog - reason: initial bulk -- name: logging_frequency - reason: "accepted divergence: ADP logs success below info level" -- name: logon_duration.enabled - reason: initial bulk -- name: logs_config.add_logsource_tag - reason: initial bulk -- name: logs_config.additional_endpoints - reason: initial bulk -- name: logs_config.aggregation_timeout - reason: initial bulk -- name: logs_config.api_key - reason: initial bulk -- name: logs_config.atomic_registry_write - reason: initial bulk -- name: logs_config.auditor_ttl - reason: initial bulk -- name: logs_config.auto_multi_line.enable_datetime_detection - reason: initial bulk -- name: logs_config.auto_multi_line.enable_json_aggregation - reason: initial bulk -- name: logs_config.auto_multi_line.enable_json_detection - reason: initial bulk -- name: logs_config.auto_multi_line.pattern_table_match_threshold - reason: initial bulk -- name: logs_config.auto_multi_line.pattern_table_max_size - reason: initial bulk -- name: logs_config.auto_multi_line.tag_aggregated_json - reason: initial bulk -- name: logs_config.auto_multi_line.timestamp_detector_match_threshold - reason: initial bulk -- name: logs_config.auto_multi_line.tokenizer_max_input_bytes - reason: initial bulk -- name: logs_config.auto_multi_line_default_match_threshold - reason: initial bulk -- name: logs_config.auto_multi_line_default_match_timeout - reason: initial bulk -- name: logs_config.auto_multi_line_default_sample_size - reason: initial bulk -- name: logs_config.auto_multi_line_detection - reason: initial bulk -- name: logs_config.auto_multi_line_detection_custom_samples - reason: initial bulk -- name: logs_config.auto_multi_line_detection_tagging - reason: initial bulk -- name: logs_config.auto_multi_line_extra_patterns - reason: initial bulk -- name: logs_config.batch_max_concurrent_send - reason: initial bulk -- name: logs_config.batch_max_content_size - reason: initial bulk -- name: logs_config.batch_max_size - reason: initial bulk -- name: logs_config.batch_wait - reason: initial bulk -- name: logs_config.close_timeout - reason: initial bulk -- name: logs_config.compression_kind - reason: initial bulk -- name: logs_config.compression_level - reason: initial bulk -- name: logs_config.connection_reset_interval - reason: initial bulk -- name: logs_config.container_collect_all - reason: initial bulk -- name: logs_config.container_runtime_waiting_timeout - reason: initial bulk -- name: logs_config.dd_port - reason: initial bulk -- name: logs_config.dd_url - reason: initial bulk -- name: logs_config.dd_url_443 - reason: initial bulk -- name: logs_config.delegated_auth.aws.region - reason: initial bulk -- name: logs_config.delegated_auth.org_uuid - reason: initial bulk -- name: logs_config.delegated_auth.provider - reason: initial bulk -- name: logs_config.delegated_auth.refresh_interval_mins - reason: initial bulk -- name: logs_config.dev_mode_no_ssl - reason: initial bulk -- name: logs_config.dev_mode_use_proto - reason: initial bulk -- name: logs_config.disable_distributed_senders - reason: initial bulk -- name: logs_config.docker_client_read_timeout - reason: initial bulk -- name: logs_config.docker_container_force_use_file - reason: initial bulk -- name: logs_config.docker_container_use_file - reason: initial bulk -- name: logs_config.docker_path_override - reason: initial bulk -- name: logs_config.enable_recursive_glob - reason: initial bulk -- name: logs_config.expected_tags_duration - reason: initial bulk -- name: logs_config.experimental_adaptive_sampling.burst_size - reason: initial bulk -- name: logs_config.experimental_adaptive_sampling.enabled - reason: initial bulk -- name: logs_config.experimental_adaptive_sampling.match_threshold - reason: initial bulk -- name: logs_config.experimental_adaptive_sampling.max_patterns - reason: initial bulk -- name: logs_config.experimental_adaptive_sampling.rate_limit - reason: initial bulk -- name: logs_config.experimental_adaptive_sampling.tokenizer_max_input_bytes - reason: initial bulk -- name: logs_config.file_scan_period - reason: initial bulk -- name: logs_config.file_wildcard_selection_mode - reason: initial bulk -- name: logs_config.fingerprint_config.count - reason: initial bulk -- name: logs_config.fingerprint_config.count_to_skip - reason: initial bulk -- name: logs_config.fingerprint_config.fingerprint_strategy - reason: initial bulk -- name: logs_config.fingerprint_config.max_bytes - reason: initial bulk -- name: logs_config.force_auto_multi_line_detection_v1 - reason: initial bulk -- name: logs_config.force_use_http - reason: initial bulk -- name: logs_config.force_use_tcp - reason: initial bulk -- name: logs_config.frame_size - reason: initial bulk -- name: logs_config.http_connectivity_retry_interval_max - reason: initial bulk -- name: logs_config.http_protocol - reason: initial bulk -- name: logs_config.http_timeout - reason: initial bulk -- name: logs_config.input_chan_size - reason: initial bulk -- name: logs_config.integrations_logs_disk_ratio - reason: initial bulk -- name: logs_config.integrations_logs_files_max_size - reason: initial bulk -- name: logs_config.integrations_logs_total_usage - reason: initial bulk -- name: logs_config.k8s_container_use_file - reason: initial bulk -- name: logs_config.k8s_container_use_kubelet_api - reason: initial bulk -- name: logs_config.kubelet_api_client_read_timeout - reason: initial bulk -- name: logs_config.logs_dd_url - reason: initial bulk -- name: logs_config.logs_no_ssl - reason: initial bulk -- name: logs_config.max_message_size_bytes - reason: initial bulk -- name: logs_config.message_channel_size - reason: initial bulk -- name: logs_config.open_files_limit - reason: initial bulk -- name: logs_config.payload_channel_size - reason: initial bulk -- name: logs_config.pipeline_failover.enabled - reason: initial bulk -- name: logs_config.pipeline_failover.router_channel_size - reason: initial bulk -- name: logs_config.pipelines - reason: initial bulk -- name: logs_config.process_exclude_agent - reason: initial bulk -- name: logs_config.processing_rules - reason: initial bulk -- name: logs_config.run_path - reason: initial bulk -- name: logs_config.sender_backoff_base - reason: initial bulk -- name: logs_config.sender_backoff_factor - reason: initial bulk -- name: logs_config.sender_backoff_max - reason: initial bulk -- name: logs_config.sender_recovery_interval - reason: initial bulk -- name: logs_config.sender_recovery_reset - reason: initial bulk -- name: logs_config.socks5_proxy_address - reason: initial bulk -- name: logs_config.stop_grace_period - reason: initial bulk -- name: logs_config.streaming.streamlogs_log_file - reason: initial bulk -- name: logs_config.tag_multi_line_logs - reason: initial bulk -- name: logs_config.tag_truncated_logs - reason: initial bulk -- name: logs_config.tagger_warmup_duration - reason: initial bulk -- name: logs_config.use_compression - reason: initial bulk -- name: logs_config.use_http - reason: initial bulk -- name: logs_config.use_podman_logs - reason: initial bulk -- name: logs_config.use_port_443 - reason: initial bulk -- name: logs_config.use_sourcehost_tag - reason: initial bulk -- name: logs_config.use_tcp - reason: initial bulk -- name: logs_config.use_v2_api - reason: initial bulk -- name: logs_config.validate_pod_container_id - reason: initial bulk -- name: logs_config.windows_open_file_timeout - reason: initial bulk -- name: logs_config.zstd_compression_level - reason: initial bulk -- name: logs_enabled - reason: initial bulk -- name: memtrack_enabled - reason: initial bulk -- name: metadata_endpoints_max_hostname_size - reason: initial bulk -- name: metadata_ip_resolution_from_hostname - reason: initial bulk -- name: metadata_provider_stop_timeout - reason: initial bulk -- name: metadata_providers - reason: initial bulk -- name: metric_tag_filterlist - reason: initial bulk -- name: metrics_port - reason: initial bulk -- name: multi_region_failover.failover_apm - reason: initial bulk -- name: multi_region_failover.failover_logs - reason: initial bulk -- name: multi_region_failover.logs_service_allowlist - reason: initial bulk -- name: multi_region_failover.remote_configuration.clients.cache_bypass_limit - reason: initial bulk -- name: multi_region_failover.remote_configuration.clients.ttl_seconds - reason: initial bulk -- name: multi_region_failover.remote_configuration.config_root - reason: initial bulk -- name: multi_region_failover.remote_configuration.director_root - reason: initial bulk -- name: multi_region_failover.remote_configuration.key - reason: initial bulk -- name: multi_region_failover.remote_configuration.max_backoff_interval - reason: initial bulk -- name: multi_region_failover.remote_configuration.max_backoff_time - reason: initial bulk -- name: multi_region_failover.remote_configuration.org_status_refresh_interval - reason: initial bulk -- name: multi_region_failover.remote_configuration.refresh_interval - reason: initial bulk -- name: network.id - reason: initial bulk -- name: network_check.use_core_loader - reason: initial bulk -- name: network_config_management.forwarder.additional_endpoints - reason: initial bulk -- name: network_config_management.forwarder.batch_max_concurrent_send - reason: initial bulk -- name: network_config_management.forwarder.batch_max_content_size - reason: initial bulk -- name: network_config_management.forwarder.batch_max_size - reason: initial bulk -- name: network_config_management.forwarder.batch_wait - reason: initial bulk -- name: network_config_management.forwarder.compression_kind - reason: initial bulk -- name: network_config_management.forwarder.compression_level - reason: initial bulk -- name: network_config_management.forwarder.connection_reset_interval - reason: initial bulk -- name: network_config_management.forwarder.dd_url - reason: initial bulk -- name: network_config_management.forwarder.dev_mode_no_ssl - reason: initial bulk -- name: network_config_management.forwarder.input_chan_size - reason: initial bulk -- name: network_config_management.forwarder.logs_dd_url - reason: initial bulk -- name: network_config_management.forwarder.logs_no_ssl - reason: initial bulk -- name: network_config_management.forwarder.sender_backoff_base - reason: initial bulk -- name: network_config_management.forwarder.sender_backoff_factor - reason: initial bulk -- name: network_config_management.forwarder.sender_backoff_max - reason: initial bulk -- name: network_config_management.forwarder.sender_recovery_interval - reason: initial bulk -- name: network_config_management.forwarder.sender_recovery_reset - reason: initial bulk -- name: network_config_management.forwarder.use_compression - reason: initial bulk -- name: network_config_management.forwarder.use_v2_api - reason: initial bulk -- name: network_config_management.forwarder.zstd_compression_level - reason: initial bulk -- name: network_devices.autodiscovery.allowed_failures - reason: initial bulk -- name: network_devices.autodiscovery.collect_device_metadata - reason: initial bulk -- name: network_devices.autodiscovery.collect_topology - reason: initial bulk -- name: network_devices.autodiscovery.collect_vpn - reason: initial bulk -- name: network_devices.autodiscovery.configs - reason: initial bulk -- name: network_devices.autodiscovery.discovery_allowed_failures - reason: initial bulk -- name: network_devices.autodiscovery.discovery_interval - reason: initial bulk -- name: network_devices.autodiscovery.loader - reason: initial bulk -- name: network_devices.autodiscovery.min_collection_interval - reason: initial bulk -- name: network_devices.autodiscovery.namespace - reason: initial bulk -- name: network_devices.autodiscovery.oid_batch_size - reason: initial bulk -- name: network_devices.autodiscovery.ping.count - reason: initial bulk -- name: network_devices.autodiscovery.ping.enabled - reason: initial bulk -- name: network_devices.autodiscovery.ping.interval - reason: initial bulk -- name: network_devices.autodiscovery.ping.linux.use_raw_socket - reason: initial bulk -- name: network_devices.autodiscovery.ping.timeout - reason: initial bulk -- name: network_devices.autodiscovery.retries - reason: initial bulk -- name: network_devices.autodiscovery.timeout - reason: initial bulk -- name: network_devices.autodiscovery.use_deduplication - reason: initial bulk -- name: network_devices.autodiscovery.use_device_id_as_hostname - reason: initial bulk -- name: network_devices.autodiscovery.workers - reason: initial bulk -- name: network_devices.default_scan.enabled - reason: initial bulk -- name: network_devices.default_scan.excluded_ips - reason: initial bulk -- name: network_devices.metadata.additional_endpoints - reason: initial bulk -- name: network_devices.metadata.batch_max_concurrent_send - reason: initial bulk -- name: network_devices.metadata.batch_max_content_size - reason: initial bulk -- name: network_devices.metadata.batch_max_size - reason: initial bulk -- name: network_devices.metadata.batch_wait - reason: initial bulk -- name: network_devices.metadata.compression_kind - reason: initial bulk -- name: network_devices.metadata.compression_level - reason: initial bulk -- name: network_devices.metadata.connection_reset_interval - reason: initial bulk -- name: network_devices.metadata.dd_url - reason: initial bulk -- name: network_devices.metadata.dev_mode_no_ssl - reason: initial bulk -- name: network_devices.metadata.input_chan_size - reason: initial bulk -- name: network_devices.metadata.logs_dd_url - reason: initial bulk -- name: network_devices.metadata.logs_no_ssl - reason: initial bulk -- name: network_devices.metadata.sender_backoff_base - reason: initial bulk -- name: network_devices.metadata.sender_backoff_factor - reason: initial bulk -- name: network_devices.metadata.sender_backoff_max - reason: initial bulk -- name: network_devices.metadata.sender_recovery_interval - reason: initial bulk -- name: network_devices.metadata.sender_recovery_reset - reason: initial bulk -- name: network_devices.metadata.use_compression - reason: initial bulk -- name: network_devices.metadata.use_v2_api - reason: initial bulk -- name: network_devices.metadata.zstd_compression_level - reason: initial bulk -- name: network_devices.namespace - reason: initial bulk -- name: network_devices.netflow.aggregator_buffer_size - reason: initial bulk -- name: network_devices.netflow.aggregator_flow_context_ttl - reason: initial bulk -- name: network_devices.netflow.aggregator_flush_interval - reason: initial bulk -- name: network_devices.netflow.aggregator_port_rollup_threshold - reason: initial bulk -- name: network_devices.netflow.aggregator_rollup_tracker_refresh_interval - reason: initial bulk -- name: network_devices.netflow.enabled - reason: initial bulk -- name: network_devices.netflow.forwarder.additional_endpoints - reason: initial bulk -- name: network_devices.netflow.forwarder.batch_max_concurrent_send - reason: initial bulk -- name: network_devices.netflow.forwarder.batch_max_content_size - reason: initial bulk -- name: network_devices.netflow.forwarder.batch_max_size - reason: initial bulk -- name: network_devices.netflow.forwarder.batch_wait - reason: initial bulk -- name: network_devices.netflow.forwarder.compression_kind - reason: initial bulk -- name: network_devices.netflow.forwarder.compression_level - reason: initial bulk -- name: network_devices.netflow.forwarder.connection_reset_interval - reason: initial bulk -- name: network_devices.netflow.forwarder.dd_url - reason: initial bulk -- name: network_devices.netflow.forwarder.dev_mode_no_ssl - reason: initial bulk -- name: network_devices.netflow.forwarder.input_chan_size - reason: initial bulk -- name: network_devices.netflow.forwarder.logs_dd_url - reason: initial bulk -- name: network_devices.netflow.forwarder.logs_no_ssl - reason: initial bulk -- name: network_devices.netflow.forwarder.sender_backoff_base - reason: initial bulk -- name: network_devices.netflow.forwarder.sender_backoff_factor - reason: initial bulk -- name: network_devices.netflow.forwarder.sender_backoff_max - reason: initial bulk -- name: network_devices.netflow.forwarder.sender_recovery_interval - reason: initial bulk -- name: network_devices.netflow.forwarder.sender_recovery_reset - reason: initial bulk -- name: network_devices.netflow.forwarder.use_compression - reason: initial bulk -- name: network_devices.netflow.forwarder.use_v2_api - reason: initial bulk -- name: network_devices.netflow.forwarder.zstd_compression_level - reason: initial bulk -- name: network_devices.netflow.listeners - reason: initial bulk -- name: network_devices.netflow.reverse_dns_enrichment_enabled - reason: initial bulk -- name: network_devices.netflow.stop_timeout - reason: initial bulk -- name: network_devices.snmp_traps.bind_host - reason: initial bulk -- name: network_devices.snmp_traps.community_strings - reason: initial bulk -- name: network_devices.snmp_traps.enabled - reason: initial bulk -- name: network_devices.snmp_traps.forwarder.additional_endpoints - reason: initial bulk -- name: network_devices.snmp_traps.forwarder.batch_max_concurrent_send - reason: initial bulk -- name: network_devices.snmp_traps.forwarder.batch_max_content_size - reason: initial bulk -- name: network_devices.snmp_traps.forwarder.batch_max_size - reason: initial bulk -- name: network_devices.snmp_traps.forwarder.batch_wait - reason: initial bulk -- name: network_devices.snmp_traps.forwarder.compression_kind - reason: initial bulk -- name: network_devices.snmp_traps.forwarder.compression_level - reason: initial bulk -- name: network_devices.snmp_traps.forwarder.connection_reset_interval - reason: initial bulk -- name: network_devices.snmp_traps.forwarder.dd_url - reason: initial bulk -- name: network_devices.snmp_traps.forwarder.dev_mode_no_ssl - reason: initial bulk -- name: network_devices.snmp_traps.forwarder.input_chan_size - reason: initial bulk -- name: network_devices.snmp_traps.forwarder.logs_dd_url - reason: initial bulk -- name: network_devices.snmp_traps.forwarder.logs_no_ssl - reason: initial bulk -- name: network_devices.snmp_traps.forwarder.sender_backoff_base - reason: initial bulk -- name: network_devices.snmp_traps.forwarder.sender_backoff_factor - reason: initial bulk -- name: network_devices.snmp_traps.forwarder.sender_backoff_max - reason: initial bulk -- name: network_devices.snmp_traps.forwarder.sender_recovery_interval - reason: initial bulk -- name: network_devices.snmp_traps.forwarder.sender_recovery_reset - reason: initial bulk -- name: network_devices.snmp_traps.forwarder.use_compression - reason: initial bulk -- name: network_devices.snmp_traps.forwarder.use_v2_api - reason: initial bulk -- name: network_devices.snmp_traps.forwarder.zstd_compression_level - reason: initial bulk -- name: network_devices.snmp_traps.port - reason: initial bulk -- name: network_devices.snmp_traps.stop_timeout - reason: initial bulk -- name: network_devices.snmp_traps.users - reason: initial bulk -- name: network_path.collector.dest_excludes - reason: initial bulk -- name: network_path.collector.disable_intra_vpc_collection - reason: initial bulk -- name: network_path.collector.disable_windows_driver - reason: initial bulk -- name: network_path.collector.e2e_queries - reason: initial bulk -- name: network_path.collector.filters - reason: initial bulk -- name: network_path.collector.flush_interval - reason: initial bulk -- name: network_path.collector.icmp_mode - reason: initial bulk -- name: network_path.collector.input_chan_size - reason: initial bulk -- name: network_path.collector.max_ttl - reason: initial bulk -- name: network_path.collector.monitor_ip_without_domain - reason: initial bulk -- name: network_path.collector.pathtest_contexts_limit - reason: initial bulk -- name: network_path.collector.pathtest_interval - reason: initial bulk -- name: network_path.collector.pathtest_max_burst_duration - reason: initial bulk -- name: network_path.collector.pathtest_max_per_minute - reason: initial bulk -- name: network_path.collector.pathtest_ttl - reason: initial bulk -- name: network_path.collector.processing_chan_size - reason: initial bulk -- name: network_path.collector.reverse_dns_enrichment.enabled - reason: initial bulk -- name: network_path.collector.reverse_dns_enrichment.timeout - reason: initial bulk -- name: network_path.collector.source_excludes - reason: initial bulk -- name: network_path.collector.tcp_method - reason: initial bulk -- name: network_path.collector.tcp_syn_paris_traceroute_mode - reason: initial bulk -- name: network_path.collector.timeout - reason: initial bulk -- name: network_path.collector.traceroute_queries - reason: initial bulk -- name: network_path.collector.workers - reason: initial bulk -- name: network_path.connections_monitoring.enabled - reason: initial bulk -- name: network_path.forwarder.additional_endpoints - reason: initial bulk -- name: network_path.forwarder.batch_max_concurrent_send - reason: initial bulk -- name: network_path.forwarder.batch_max_content_size - reason: initial bulk -- name: network_path.forwarder.batch_max_size - reason: initial bulk -- name: network_path.forwarder.batch_wait - reason: initial bulk -- name: network_path.forwarder.compression_kind - reason: initial bulk -- name: network_path.forwarder.compression_level - reason: initial bulk -- name: network_path.forwarder.connection_reset_interval - reason: initial bulk -- name: network_path.forwarder.dd_url - reason: initial bulk -- name: network_path.forwarder.dev_mode_no_ssl - reason: initial bulk -- name: network_path.forwarder.input_chan_size - reason: initial bulk -- name: network_path.forwarder.logs_dd_url - reason: initial bulk -- name: network_path.forwarder.logs_no_ssl - reason: initial bulk -- name: network_path.forwarder.sender_backoff_base - reason: initial bulk -- name: network_path.forwarder.sender_backoff_factor - reason: initial bulk -- name: network_path.forwarder.sender_backoff_max - reason: initial bulk -- name: network_path.forwarder.sender_recovery_interval - reason: initial bulk -- name: network_path.forwarder.sender_recovery_reset - reason: initial bulk -- name: network_path.forwarder.use_compression - reason: initial bulk -- name: network_path.forwarder.use_v2_api - reason: initial bulk -- name: network_path.forwarder.zstd_compression_level - reason: initial bulk -- name: notable_events.enabled - reason: initial bulk -- name: observability_pipelines_worker.logs.enabled - reason: OPW logs routing out of scope for ADP -- name: observability_pipelines_worker.logs.url - reason: OPW logs routing out of scope for ADP -- name: observability_pipelines_worker.traces.enabled - reason: OPW traces routing out of scope for ADP -- name: observability_pipelines_worker.traces.url - reason: OPW traces routing out of scope for ADP -- name: ol_proxy_config.additional_endpoints - reason: initial bulk -- name: ol_proxy_config.api_key - reason: initial bulk -- name: ol_proxy_config.api_version - reason: initial bulk -- name: ol_proxy_config.dd_url - reason: initial bulk -- name: ol_proxy_config.delegated_auth.aws.region - reason: initial bulk -- name: ol_proxy_config.delegated_auth.org_uuid - reason: initial bulk -- name: ol_proxy_config.delegated_auth.provider - reason: initial bulk -- name: ol_proxy_config.delegated_auth.refresh_interval_mins - reason: initial bulk -- name: ol_proxy_config.enabled - reason: initial bulk -- name: orchestrator_explorer.collector_discovery.enabled - reason: initial bulk -- name: orchestrator_explorer.container_scrubbing.enabled - reason: initial bulk -- name: orchestrator_explorer.custom_resources.max_count - reason: initial bulk -- name: orchestrator_explorer.custom_resources.ootb.enabled - reason: initial bulk -- name: orchestrator_explorer.custom_resources.ootb.gateway_api - reason: initial bulk -- name: orchestrator_explorer.custom_resources.ootb.ingress_controllers - reason: initial bulk -- name: orchestrator_explorer.custom_resources.ootb.service_mesh - reason: initial bulk -- name: orchestrator_explorer.custom_sensitive_annotations_labels - reason: initial bulk -- name: orchestrator_explorer.custom_sensitive_words - reason: initial bulk -- name: orchestrator_explorer.enabled - reason: initial bulk -- name: orchestrator_explorer.extra_tags - reason: initial bulk -- name: orchestrator_explorer.kubelet_config_check.enabled - reason: initial bulk -- name: orchestrator_explorer.manifest_collection.buffer_flush_interval - reason: initial bulk -- name: orchestrator_explorer.manifest_collection.buffer_manifest - reason: initial bulk -- name: orchestrator_explorer.manifest_collection.enabled - reason: initial bulk -- name: orchestrator_explorer.max_message_bytes - reason: initial bulk -- name: orchestrator_explorer.max_per_message - reason: initial bulk -- name: orchestrator_explorer.orchestrator_additional_endpoints - reason: initial bulk -- name: orchestrator_explorer.orchestrator_dd_url - reason: initial bulk -- name: orchestrator_explorer.terminated_pods.enabled - reason: initial bulk -- name: orchestrator_explorer.terminated_pods_improved.enabled - reason: initial bulk -- name: orchestrator_explorer.terminated_resources.enabled - reason: initial bulk -- name: orchestrator_explorer.use_legacy_endpoint - reason: initial bulk -- name: otel_standalone - reason: initial bulk -- name: otelcollector.converter.enabled - reason: initial bulk -- name: otelcollector.converter.features - reason: initial bulk -- name: otelcollector.enabled - reason: initial bulk -- name: otelcollector.extension_timeout - reason: initial bulk -- name: otelcollector.extension_url - reason: initial bulk -- name: otelcollector.flare.timeout - reason: initial bulk -- name: otelcollector.gateway.mode - reason: initial bulk -- name: otelcollector.installation_method - reason: initial bulk -- name: otelcollector.submit_dummy_metadata - reason: initial bulk -- name: otlp_config.debug.verbosity - reason: initial bulk -- name: otlp_config.grpc_port - reason: initial bulk -- name: otlp_config.http_port - reason: initial bulk -- name: otlp_config.logs.batch.flush_timeout - reason: initial bulk -- name: otlp_config.logs.batch.max_size - reason: initial bulk -- name: otlp_config.logs.batch.min_size - reason: initial bulk -- name: otlp_config.metrics.batch.flush_timeout - reason: initial bulk -- name: otlp_config.metrics.batch.max_size - reason: initial bulk -- name: otlp_config.metrics.batch.min_size - reason: initial bulk -- name: otlp_config.metrics.delta_ttl - reason: initial bulk -- name: otlp_config.metrics.histograms.mode - reason: initial bulk -- name: otlp_config.metrics.histograms.send_aggregation_metrics - reason: initial bulk -- name: otlp_config.metrics.histograms.send_count_sum_metrics - reason: initial bulk -- name: otlp_config.metrics.instrumentation_scope_metadata_as_tags - reason: initial bulk -- name: otlp_config.metrics.resource_attributes_as_tags - reason: initial bulk -- name: otlp_config.metrics.summaries.mode - reason: initial bulk -- name: otlp_config.metrics.sums.cumulative_monotonic_mode - reason: initial bulk -- name: otlp_config.metrics.sums.initial_cumulative_monotonic_value - reason: initial bulk -- name: otlp_config.metrics.tag_cardinality - reason: initial bulk -- name: otlp_config.metrics.tags - reason: initial bulk -- name: otlp_config.receiver.protocols.grpc.include_metadata - reason: initial bulk -- name: otlp_config.receiver.protocols.grpc.keepalive.enforcement_policy.min_time - reason: initial bulk -- name: otlp_config.receiver.protocols.grpc.max_concurrent_streams - reason: initial bulk -- name: otlp_config.receiver.protocols.grpc.read_buffer_size - reason: initial bulk -- name: otlp_config.receiver.protocols.grpc.write_buffer_size - reason: initial bulk -- name: otlp_config.receiver.protocols.http.cors.allowed_headers - reason: initial bulk -- name: otlp_config.receiver.protocols.http.cors.allowed_origins - reason: initial bulk -- name: otlp_config.receiver.protocols.http.include_metadata - reason: initial bulk -- name: otlp_config.receiver.protocols.http.max_request_body_size - reason: initial bulk -- name: otlp_config.traces.infra_attributes.enabled - reason: initial bulk -- name: otlp_config.traces.span_name_as_resource_name - reason: initial bulk -- name: otlp_config.traces.span_name_remappings - reason: initial bulk -- name: podman_db_path - reason: initial bulk -- name: prioritize_go_check_loader - reason: initial bulk -- name: private_action_runner.actions_allowlist - reason: initial bulk -- name: private_action_runner.enabled - reason: initial bulk -- name: private_action_runner.http_allow_imds_endpoint - reason: initial bulk -- name: private_action_runner.http_allowlist - reason: initial bulk -- name: private_action_runner.http_timeout_seconds - reason: initial bulk -- name: private_action_runner.identity_file_path - reason: initial bulk -- name: private_action_runner.identity_secret_name - reason: initial bulk -- name: private_action_runner.identity_use_k8s_secret - reason: initial bulk -- name: private_action_runner.log_file - reason: initial bulk -- name: private_action_runner.private_key - reason: initial bulk -- name: private_action_runner.restricted_shell_allowed_paths - reason: initial bulk -- name: private_action_runner.self_enroll - reason: initial bulk -- name: private_action_runner.task_concurrency - reason: initial bulk -- name: private_action_runner.task_timeout_seconds - reason: initial bulk -- name: private_action_runner.urn - reason: initial bulk -- name: proc_root - reason: initial bulk -- name: process_config.additional_endpoints - reason: initial bulk -- name: process_config.blacklist_patterns - reason: initial bulk -- name: process_config.cache_lookupid - reason: initial bulk -- name: process_config.cmd_port - reason: initial bulk -- name: process_config.container_collection.enabled - reason: initial bulk -- name: process_config.custom_sensitive_words - reason: initial bulk -- name: process_config.dd_agent_bin - reason: initial bulk -- name: process_config.dd_agent_env - reason: initial bulk -- name: process_config.disable_realtime_checks - reason: initial bulk -- name: process_config.drop_check_payloads - reason: initial bulk -- name: process_config.enabled - reason: initial bulk -- name: process_config.expvar_port - reason: initial bulk -- name: process_config.grpc_connection_timeout_secs - reason: initial bulk -- name: process_config.ignore_zombie_processes - reason: initial bulk -- name: process_config.internal_profiling.enabled - reason: initial bulk -- name: process_config.intervals.connections - reason: initial bulk -- name: process_config.intervals.container - reason: initial bulk -- name: process_config.intervals.container_realtime - reason: initial bulk -- name: process_config.intervals.process - reason: initial bulk -- name: process_config.intervals.process_realtime - reason: initial bulk -- name: process_config.language_detection.grpc_port - reason: initial bulk -- name: process_config.log_file - reason: initial bulk -- name: process_config.max_message_bytes - reason: initial bulk -- name: process_config.max_per_message - reason: initial bulk -- name: process_config.orchestrator_additional_endpoints - reason: initial bulk -- name: process_config.orchestrator_dd_url - reason: initial bulk -- name: process_config.process_collection.enabled - reason: initial bulk -- name: process_config.process_dd_url - reason: initial bulk -- name: process_config.process_discovery.enabled - reason: initial bulk -- name: process_config.process_discovery.hint_frequency - reason: initial bulk -- name: process_config.process_discovery.interval - reason: initial bulk -- name: process_config.process_queue_bytes - reason: initial bulk -- name: process_config.queue_size - reason: initial bulk -- name: process_config.rt_queue_size - reason: initial bulk -- name: process_config.scrub_args - reason: initial bulk -- name: process_config.strip_proc_arguments - reason: initial bulk -- name: process_config.windows.use_perf_counters - reason: initial bulk -- name: procfs_path - reason: initial bulk -- name: prometheus_scrape.checks - reason: initial bulk -- name: prometheus_scrape.enabled - reason: initial bulk -- name: prometheus_scrape.service_endpoints - reason: initial bulk -- name: prometheus_scrape.version - reason: initial bulk -- name: python3_linter_timeout - reason: initial bulk -- name: python_lazy_loading - reason: initial bulk -- name: remote_agent.configstream.enabled - reason: initial bulk -- name: remote_agent.configstream.sleep_interval - reason: initial bulk -- name: remote_agent.registry.enabled - reason: initial bulk -- name: remote_agent.registry.idle_timeout - reason: initial bulk -- name: remote_agent.registry.query_timeout - reason: initial bulk -- name: remote_agent.registry.recommended_refresh_interval - reason: initial bulk -- name: remote_configuration.agent_integrations.allow_list - reason: initial bulk -- name: remote_configuration.agent_integrations.allow_log_config_scheduling - reason: initial bulk -- name: remote_configuration.agent_integrations.block_list - reason: initial bulk -- name: remote_configuration.agent_integrations.enabled - reason: initial bulk -- name: remote_configuration.api_key - reason: initial bulk -- name: remote_configuration.apm_sampling.enabled - reason: initial bulk -- name: remote_configuration.clients.cache_bypass_limit - reason: initial bulk -- name: remote_configuration.clients.ttl_seconds - reason: initial bulk -- name: remote_configuration.config_root - reason: initial bulk -- name: remote_configuration.delegated_auth.aws.region - reason: initial bulk -- name: remote_configuration.delegated_auth.org_uuid - reason: initial bulk -- name: remote_configuration.delegated_auth.provider - reason: initial bulk -- name: remote_configuration.delegated_auth.refresh_interval_mins - reason: initial bulk -- name: remote_configuration.director_root - reason: initial bulk -- name: remote_configuration.enabled - reason: initial bulk -- name: remote_configuration.key - reason: initial bulk -- name: remote_configuration.max_backoff_interval - reason: initial bulk -- name: remote_configuration.no_tls - reason: initial bulk -- name: remote_configuration.no_tls_validation - reason: initial bulk -- name: remote_configuration.no_websocket_echo - reason: initial bulk -- name: remote_configuration.org_status_refresh_interval - reason: initial bulk -- name: remote_configuration.rc_dd_url - reason: initial bulk -- name: remote_configuration.refresh_interval - reason: initial bulk -- name: remote_policies - reason: initial bulk -- name: remote_tagger.max_concurrent_sync - reason: initial bulk -- name: remote_updates - reason: initial bulk -- name: reverse_dns_enrichment.cache.clean_interval - reason: initial bulk -- name: reverse_dns_enrichment.cache.enabled - reason: initial bulk -- name: reverse_dns_enrichment.cache.entry_ttl - reason: initial bulk -- name: reverse_dns_enrichment.cache.max_retries - reason: initial bulk -- name: reverse_dns_enrichment.cache.max_size - reason: initial bulk -- name: reverse_dns_enrichment.cache.persist_interval - reason: initial bulk -- name: reverse_dns_enrichment.chan_size - reason: initial bulk -- name: reverse_dns_enrichment.rate_limiter.enabled - reason: initial bulk -- name: reverse_dns_enrichment.rate_limiter.limit_per_sec - reason: initial bulk -- name: reverse_dns_enrichment.rate_limiter.limit_throttled_per_sec - reason: initial bulk -- name: reverse_dns_enrichment.rate_limiter.recovery_interval - reason: initial bulk -- name: reverse_dns_enrichment.rate_limiter.recovery_intervals - reason: initial bulk -- name: reverse_dns_enrichment.rate_limiter.throttle_error_threshold - reason: initial bulk -- name: reverse_dns_enrichment.workers - reason: initial bulk -- name: run_path - reason: initial bulk -- name: runtime_security_config.activity_dump.remote_storage.endpoints.additional_endpoints - reason: initial bulk -- name: runtime_security_config.activity_dump.remote_storage.endpoints.batch_max_concurrent_send - reason: initial bulk -- name: runtime_security_config.activity_dump.remote_storage.endpoints.batch_max_content_size - reason: initial bulk -- name: runtime_security_config.activity_dump.remote_storage.endpoints.batch_max_size - reason: initial bulk -- name: runtime_security_config.activity_dump.remote_storage.endpoints.batch_wait - reason: initial bulk -- name: runtime_security_config.activity_dump.remote_storage.endpoints.compression_kind - reason: initial bulk -- name: runtime_security_config.activity_dump.remote_storage.endpoints.compression_level - reason: initial bulk -- name: runtime_security_config.activity_dump.remote_storage.endpoints.connection_reset_interval - reason: initial bulk -- name: runtime_security_config.activity_dump.remote_storage.endpoints.dd_url - reason: initial bulk -- name: runtime_security_config.activity_dump.remote_storage.endpoints.dev_mode_no_ssl - reason: initial bulk -- name: runtime_security_config.activity_dump.remote_storage.endpoints.input_chan_size - reason: initial bulk -- name: runtime_security_config.activity_dump.remote_storage.endpoints.logs_dd_url - reason: initial bulk -- name: runtime_security_config.activity_dump.remote_storage.endpoints.logs_no_ssl - reason: initial bulk -- name: runtime_security_config.activity_dump.remote_storage.endpoints.sender_backoff_base - reason: initial bulk -- name: runtime_security_config.activity_dump.remote_storage.endpoints.sender_backoff_factor - reason: initial bulk -- name: runtime_security_config.activity_dump.remote_storage.endpoints.sender_backoff_max - reason: initial bulk -- name: runtime_security_config.activity_dump.remote_storage.endpoints.sender_recovery_interval - reason: initial bulk -- name: runtime_security_config.activity_dump.remote_storage.endpoints.sender_recovery_reset - reason: initial bulk -- name: runtime_security_config.activity_dump.remote_storage.endpoints.use_compression - reason: initial bulk -- name: runtime_security_config.activity_dump.remote_storage.endpoints.use_v2_api - reason: initial bulk -- name: runtime_security_config.activity_dump.remote_storage.endpoints.zstd_compression_level - reason: initial bulk -- name: runtime_security_config.cmd_socket - reason: initial bulk -- name: runtime_security_config.direct_send_from_system_probe - reason: initial bulk -- name: runtime_security_config.enabled - reason: initial bulk -- name: runtime_security_config.endpoints.additional_endpoints - reason: initial bulk -- name: runtime_security_config.endpoints.batch_max_concurrent_send - reason: initial bulk -- name: runtime_security_config.endpoints.batch_max_content_size - reason: initial bulk -- name: runtime_security_config.endpoints.batch_max_size - reason: initial bulk -- name: runtime_security_config.endpoints.batch_wait - reason: initial bulk -- name: runtime_security_config.endpoints.compression_kind - reason: initial bulk -- name: runtime_security_config.endpoints.compression_level - reason: initial bulk -- name: runtime_security_config.endpoints.connection_reset_interval - reason: initial bulk -- name: runtime_security_config.endpoints.dd_url - reason: initial bulk -- name: runtime_security_config.endpoints.dev_mode_no_ssl - reason: initial bulk -- name: runtime_security_config.endpoints.input_chan_size - reason: initial bulk -- name: runtime_security_config.endpoints.logs_dd_url - reason: initial bulk -- name: runtime_security_config.endpoints.logs_no_ssl - reason: initial bulk -- name: runtime_security_config.endpoints.sender_backoff_base - reason: initial bulk -- name: runtime_security_config.endpoints.sender_backoff_factor - reason: initial bulk -- name: runtime_security_config.endpoints.sender_backoff_max - reason: initial bulk -- name: runtime_security_config.endpoints.sender_recovery_interval - reason: initial bulk -- name: runtime_security_config.endpoints.sender_recovery_reset - reason: initial bulk -- name: runtime_security_config.endpoints.use_compression - reason: initial bulk -- name: runtime_security_config.endpoints.use_v2_api - reason: initial bulk -- name: runtime_security_config.endpoints.zstd_compression_level - reason: initial bulk -- name: runtime_security_config.event_grpc_server - reason: initial bulk -- name: runtime_security_config.socket - reason: initial bulk -- name: runtime_security_config.use_secruntime_track - reason: initial bulk -- name: sbom.additional_endpoints - reason: initial bulk -- name: sbom.batch_max_concurrent_send - reason: initial bulk -- name: sbom.batch_max_content_size - reason: initial bulk -- name: sbom.batch_max_size - reason: initial bulk -- name: sbom.batch_wait - reason: initial bulk -- name: sbom.cache.clean_interval - reason: initial bulk -- name: sbom.cache.max_disk_size - reason: initial bulk -- name: sbom.cache_directory - reason: initial bulk -- name: sbom.clear_cache_on_exit - reason: initial bulk -- name: sbom.compression_kind - reason: initial bulk -- name: sbom.compression_level - reason: initial bulk -- name: sbom.compute_dependencies - reason: initial bulk -- name: sbom.connection_reset_interval - reason: initial bulk -- name: sbom.container.enabled - reason: initial bulk -- name: sbom.container_image.additional_directories - reason: initial bulk -- name: sbom.container_image.allow_missing_repodigest - reason: initial bulk -- name: sbom.container_image.analyzers - reason: initial bulk -- name: sbom.container_image.check_disk_usage - reason: initial bulk -- name: sbom.container_image.container_exclude - reason: initial bulk -- name: sbom.container_image.container_include - reason: initial bulk -- name: sbom.container_image.enabled - reason: initial bulk -- name: sbom.container_image.exclude_pause_container - reason: initial bulk -- name: sbom.container_image.min_available_disk - reason: initial bulk -- name: sbom.container_image.overlayfs_direct_scan - reason: initial bulk -- name: sbom.container_image.overlayfs_disable_cache - reason: initial bulk -- name: sbom.container_image.scan_interval - reason: initial bulk -- name: sbom.container_image.scan_timeout - reason: initial bulk -- name: sbom.container_image.use_mount - reason: initial bulk -- name: sbom.container_image.use_spread_refresher - reason: initial bulk -- name: sbom.dd_url - reason: initial bulk -- name: sbom.dev_mode_no_ssl - reason: initial bulk -- name: sbom.enabled - reason: initial bulk -- name: sbom.host.additional_directories - reason: initial bulk -- name: sbom.host.analyzers - reason: initial bulk -- name: sbom.host.enabled - reason: initial bulk -- name: sbom.input_chan_size - reason: initial bulk -- name: sbom.logs_dd_url - reason: initial bulk -- name: sbom.logs_no_ssl - reason: initial bulk -- name: sbom.scan_queue.base_backoff - reason: initial bulk -- name: sbom.scan_queue.max_backoff - reason: initial bulk -- name: sbom.sender_backoff_base - reason: initial bulk -- name: sbom.sender_backoff_factor - reason: initial bulk -- name: sbom.sender_backoff_max - reason: initial bulk -- name: sbom.sender_recovery_interval - reason: initial bulk -- name: sbom.sender_recovery_reset - reason: initial bulk -- name: sbom.simplify_bom_refs - reason: initial bulk -- name: sbom.use_compression - reason: initial bulk -- name: sbom.use_v2_api - reason: initial bulk -- name: sbom.zstd_compression_level - reason: initial bulk -- name: scrubber.additional_keys - reason: initial bulk -- name: secret_allowed_k8s_namespace - reason: initial bulk -- name: secret_audit_file_max_size - reason: initial bulk -- name: secret_backend_arguments - reason: initial bulk -- name: secret_backend_command - reason: initial bulk -- name: secret_backend_command_allow_group_exec_perm - reason: initial bulk -- name: secret_backend_config - reason: initial bulk -- name: secret_backend_output_max_size - reason: initial bulk -- name: secret_backend_remove_trailing_line_break - reason: initial bulk -- name: secret_backend_skip_checks - reason: initial bulk -- name: secret_backend_timeout - reason: initial bulk -- name: secret_backend_type - reason: initial bulk -- name: secret_image_to_handle - reason: initial bulk -- name: secret_refresh_interval - reason: initial bulk -- name: secret_refresh_on_api_key_failure_interval - reason: initial bulk -- name: secret_refresh_scatter - reason: initial bulk -- name: secret_scope_integration_to_their_k8s_namespace - reason: initial bulk -- name: security_agent.cmd_port - reason: initial bulk -- name: security_agent.disable_thp - reason: initial bulk -- name: security_agent.expvar_port - reason: initial bulk -- name: security_agent.internal_profiling.api_key - reason: initial bulk -- name: security_agent.internal_profiling.block_profile_rate - reason: initial bulk -- name: security_agent.internal_profiling.cpu_duration - reason: initial bulk -- name: security_agent.internal_profiling.delta_profiles - reason: initial bulk -- name: security_agent.internal_profiling.enable_block_profiling - reason: initial bulk -- name: security_agent.internal_profiling.enable_goroutine_stacktraces - reason: initial bulk -- name: security_agent.internal_profiling.enable_mutex_profiling - reason: initial bulk -- name: security_agent.internal_profiling.enabled - reason: initial bulk -- name: security_agent.internal_profiling.env - reason: initial bulk -- name: security_agent.internal_profiling.extra_tags - reason: initial bulk -- name: security_agent.internal_profiling.mutex_profile_fraction - reason: initial bulk -- name: security_agent.internal_profiling.period - reason: initial bulk -- name: security_agent.internal_profiling.profile_dd_url - reason: initial bulk -- name: security_agent.internal_profiling.site - reason: initial bulk -- name: security_agent.internal_profiling.unix_socket - reason: initial bulk -- name: security_agent.log_file - reason: initial bulk -- name: serializer_experimental_use_v3_api.series.beta_route - reason: initial bulk -- name: serializer_experimental_use_v3_api.series.use_beta - reason: initial bulk -- name: server_timeout - reason: initial bulk -- name: serverless.enabled - reason: initial bulk -- name: serverless.logs_enabled - reason: initial bulk -- name: serverless.service_mapping - reason: initial bulk -- name: serverless.trace_enabled - reason: initial bulk -- name: serverless.trace_managed_services - reason: initial bulk -- name: service_discovery.forwarder.additional_endpoints - reason: initial bulk -- name: service_discovery.forwarder.batch_max_concurrent_send - reason: initial bulk -- name: service_discovery.forwarder.batch_max_content_size - reason: initial bulk -- name: service_discovery.forwarder.batch_max_size - reason: initial bulk -- name: service_discovery.forwarder.batch_wait - reason: initial bulk -- name: service_discovery.forwarder.compression_kind - reason: initial bulk -- name: service_discovery.forwarder.compression_level - reason: initial bulk -- name: service_discovery.forwarder.connection_reset_interval - reason: initial bulk -- name: service_discovery.forwarder.dd_url - reason: initial bulk -- name: service_discovery.forwarder.dev_mode_no_ssl - reason: initial bulk -- name: service_discovery.forwarder.input_chan_size - reason: initial bulk -- name: service_discovery.forwarder.logs_dd_url - reason: initial bulk -- name: service_discovery.forwarder.logs_no_ssl - reason: initial bulk -- name: service_discovery.forwarder.sender_backoff_base - reason: initial bulk -- name: service_discovery.forwarder.sender_backoff_factor - reason: initial bulk -- name: service_discovery.forwarder.sender_backoff_max - reason: initial bulk -- name: service_discovery.forwarder.sender_recovery_interval - reason: initial bulk -- name: service_discovery.forwarder.sender_recovery_reset - reason: initial bulk -- name: service_discovery.forwarder.use_compression - reason: initial bulk -- name: service_discovery.forwarder.use_v2_api - reason: initial bulk -- name: service_discovery.forwarder.zstd_compression_level - reason: initial bulk -- name: shared_library_check.enabled - reason: initial bulk -- name: shared_library_check.library_folder_path - reason: initial bulk -- name: snmp_listener.allowed_failures - reason: initial bulk -- name: snmp_listener.collect_device_metadata - reason: initial bulk -- name: snmp_listener.collect_topology - reason: initial bulk -- name: snmp_listener.configs - reason: initial bulk -- name: snmp_listener.discovery_allowed_failures - reason: initial bulk -- name: snmp_listener.discovery_interval - reason: initial bulk -- name: snmp_listener.loader - reason: initial bulk -- name: snmp_listener.min_collection_interval - reason: initial bulk -- name: snmp_listener.namespace - reason: initial bulk -- name: snmp_listener.oid_batch_size - reason: initial bulk -- name: snmp_listener.ping.count - reason: initial bulk -- name: snmp_listener.ping.enabled - reason: initial bulk -- name: snmp_listener.ping.interval - reason: initial bulk -- name: snmp_listener.ping.linux.use_raw_socket - reason: initial bulk -- name: snmp_listener.ping.timeout - reason: initial bulk -- name: snmp_listener.retries - reason: initial bulk -- name: snmp_listener.timeout - reason: initial bulk -- name: snmp_listener.use_device_id_as_hostname - reason: initial bulk -- name: snmp_listener.workers - reason: initial bulk -- name: software_inventory.enabled - reason: initial bulk -- name: software_inventory.forwarder.additional_endpoints - reason: initial bulk -- name: software_inventory.forwarder.batch_max_concurrent_send - reason: initial bulk -- name: software_inventory.forwarder.batch_max_content_size - reason: initial bulk -- name: software_inventory.forwarder.batch_max_size - reason: initial bulk -- name: software_inventory.forwarder.batch_wait - reason: initial bulk -- name: software_inventory.forwarder.compression_kind - reason: initial bulk -- name: software_inventory.forwarder.compression_level - reason: initial bulk -- name: software_inventory.forwarder.connection_reset_interval - reason: initial bulk -- name: software_inventory.forwarder.dd_url - reason: initial bulk -- name: software_inventory.forwarder.dev_mode_no_ssl - reason: initial bulk -- name: software_inventory.forwarder.input_chan_size - reason: initial bulk -- name: software_inventory.forwarder.logs_dd_url - reason: initial bulk -- name: software_inventory.forwarder.logs_no_ssl - reason: initial bulk -- name: software_inventory.forwarder.sender_backoff_base - reason: initial bulk -- name: software_inventory.forwarder.sender_backoff_factor - reason: initial bulk -- name: software_inventory.forwarder.sender_backoff_max - reason: initial bulk -- name: software_inventory.forwarder.sender_recovery_interval - reason: initial bulk -- name: software_inventory.forwarder.sender_recovery_reset - reason: initial bulk -- name: software_inventory.forwarder.use_compression - reason: initial bulk -- name: software_inventory.forwarder.use_v2_api - reason: initial bulk -- name: software_inventory.forwarder.zstd_compression_level - reason: initial bulk -- name: software_inventory.interval - reason: initial bulk -- name: software_inventory.jitter - reason: initial bulk -- name: synthetics.collector.enabled - reason: initial bulk -- name: synthetics.collector.flush_interval - reason: initial bulk -- name: synthetics.collector.workers - reason: initial bulk -- name: synthetics.forwarder.additional_endpoints - reason: initial bulk -- name: synthetics.forwarder.batch_max_concurrent_send - reason: initial bulk -- name: synthetics.forwarder.batch_max_content_size - reason: initial bulk -- name: synthetics.forwarder.batch_max_size - reason: initial bulk -- name: synthetics.forwarder.batch_wait - reason: initial bulk -- name: synthetics.forwarder.compression_kind - reason: initial bulk -- name: synthetics.forwarder.compression_level - reason: initial bulk -- name: synthetics.forwarder.connection_reset_interval - reason: initial bulk -- name: synthetics.forwarder.dd_url - reason: initial bulk -- name: synthetics.forwarder.dev_mode_no_ssl - reason: initial bulk -- name: synthetics.forwarder.input_chan_size - reason: initial bulk -- name: synthetics.forwarder.logs_dd_url - reason: initial bulk -- name: synthetics.forwarder.logs_no_ssl - reason: initial bulk -- name: synthetics.forwarder.sender_backoff_base - reason: initial bulk -- name: synthetics.forwarder.sender_backoff_factor - reason: initial bulk -- name: synthetics.forwarder.sender_backoff_max - reason: initial bulk -- name: synthetics.forwarder.sender_recovery_interval - reason: initial bulk -- name: synthetics.forwarder.sender_recovery_reset - reason: initial bulk -- name: synthetics.forwarder.use_compression - reason: initial bulk -- name: synthetics.forwarder.use_v2_api - reason: initial bulk -- name: synthetics.forwarder.zstd_compression_level - reason: initial bulk -- name: system_tray.log_file - reason: initial bulk -- name: tag_value_split_separator - reason: initial bulk -- name: tags - reason: initial bulk -- name: telemetry.enabled - reason: initial bulk -- name: telemetry.checks - reason: initial bulk -- name: telemetry.python_memory - reason: initial bulk -- name: trace_agent_host_socket_path - reason: initial bulk -- name: tracemalloc_blacklist - reason: initial bulk -- name: tracemalloc_debug - reason: initial bulk -- name: tracemalloc_exclude - reason: initial bulk -- name: tracemalloc_include - reason: initial bulk -- name: tracemalloc_whitelist - reason: initial bulk -- name: use_diskv2_check - reason: initial bulk -- name: use_dogstatsd - reason: Core Agent evaluates and sets data_plane.dogstatsd.enabled -- name: use_improved_cgroup_parser - reason: initial bulk -- name: use_networkv2_check - reason: initial bulk -- name: vector.logs.enabled - reason: OPW logs routing out of scope for ADP -- name: vector.logs.url - reason: OPW logs routing out of scope for ADP -- name: vector.traces.enabled - reason: OPW traces routing out of scope for ADP -- name: vector.traces.url - reason: OPW traces routing out of scope for ADP -- name: win_skip_com_init - reason: initial bulk -- name: windows_counter_init_failure_limit - reason: initial bulk -- name: windows_counter_refresh_interval - reason: initial bulk -- name: windows_use_pythonpath - reason: initial bulk -- name: workloadmeta.local_process_collector.collection_interval - reason: initial bulk -- name: workloadmeta.remote.recv_without_timeout - reason: initial bulk diff --git a/lib/saluki-components/src/common/datadog/config.rs b/lib/saluki-components/src/common/datadog/config.rs index ac9a94a2802..6f2a4efd526 100644 --- a/lib/saluki-components/src/common/datadog/config.rs +++ b/lib/saluki-components/src/common/datadog/config.rs @@ -862,11 +862,12 @@ mod tests { #[cfg(test)] mod config_smoke { + use datadog_agent_config_testsupport::config_registry::structs; + use datadog_agent_config_testsupport::run_config_smoke_tests; use serde_json::json; use super::ForwarderConfiguration; - use crate::config_registry::structs; - use crate::config_registry::test_support::run_config_smoke_tests; + use crate::config::{DatadogRemapper, KEY_ALIASES}; #[tokio::test] async fn smoke_test() { @@ -878,6 +879,8 @@ mod config_smoke { &[], json!({ "api_key": "smoke-test-api-key" }), |cfg| ForwarderConfiguration::from_configuration(&cfg).expect("ForwarderConfiguration should deserialize"), + KEY_ALIASES, + DatadogRemapper::new, ) .await } diff --git a/lib/saluki-components/src/common/datadog/proxy.rs b/lib/saluki-components/src/common/datadog/proxy.rs index bda8126934f..b48c5522f60 100644 --- a/lib/saluki-components/src/common/datadog/proxy.rs +++ b/lib/saluki-components/src/common/datadog/proxy.rs @@ -302,18 +302,26 @@ fn ip_in_cidr(network: IpAddr, prefix_len: u8, addr: IpAddr) -> bool { #[cfg(test)] mod config_smoke { + use datadog_agent_config_testsupport::config_registry::structs; + use datadog_agent_config_testsupport::run_config_smoke_tests; use serde_json::json; use super::ProxyConfiguration; - use crate::config_registry::structs; - use crate::config_registry::test_support::run_config_smoke_tests; + use crate::config::{DatadogRemapper, KEY_ALIASES}; #[tokio::test] async fn proxy_configuration_smoke_test() { - run_config_smoke_tests(structs::PROXY_CONFIGURATION, &[], json!({}), |cfg| { - cfg.as_typed::() - .expect("ProxyConfiguration should deserialize") - }) + run_config_smoke_tests( + structs::PROXY_CONFIGURATION, + &[], + json!({}), + |cfg| { + cfg.as_typed::() + .expect("ProxyConfiguration should deserialize") + }, + KEY_ALIASES, + DatadogRemapper::new, + ) .await } } diff --git a/lib/saluki-components/src/config_registry/classifier.rs b/lib/saluki-components/src/config_registry/classifier.rs deleted file mode 100644 index b9b85833181..00000000000 --- a/lib/saluki-components/src/config_registry/classifier.rs +++ /dev/null @@ -1,201 +0,0 @@ -use std::collections::HashMap; - -use serde_json::Value; - -use super::{PipelineAffinity, SchemaEntry, SupportLevel, ALL_ANNOTATIONS}; - -/// Result of classifying a single config key/value pair against the registry. -pub struct Classification { - /// The level at which this config key is supported by Saluki. - pub support_level: SupportLevel, - /// Whether the value matches the schema default. - pub is_default: bool, - /// Which pipelines this key's incompatibility warning applies to. - pub pipeline_affinity: PipelineAffinity, -} - -/// Classifies the support level of config keys and determines if a value is default. -/// -/// Only knows about annotated keys (`ALL_ANNOTATIONS`). Keys not in the registry - whether ignored, -/// unrecognized, or anything else - return `None` from [`classify`](Self::classify). -pub struct ConfigClassifier { - lookup: HashMap<&'static str, (&'static SchemaEntry, SupportLevel, PipelineAffinity)>, -} - -impl ConfigClassifier { - /// Builds a classifier from all annotated config keys. - pub fn new() -> Self { - let mut lookup = HashMap::new(); - - for &annotation in ALL_ANNOTATIONS.iter() { - let entry = ( - annotation.schema, - annotation.support_level, - annotation.pipeline_affinity, - ); - lookup.insert(annotation.yaml_path(), entry); - for alias in annotation.additional_yaml_paths { - lookup.insert(alias, entry); - } - } - - Self { lookup } - } - - /// Classifies a single config key/value pair against the registry. - /// - /// Returns `None` for keys not in `ALL_ANNOTATIONS` (ignored, unrecognized, etc.). - pub fn classify(&self, key: &str, value: &Value) -> Option { - let &(schema, support_level, pipeline_affinity) = self.lookup.get(key)?; - Some(Classification { - support_level, - is_default: is_default_value(schema, value), - pipeline_affinity, - }) - } -} - -/// Determines whether the runtime `value` matches the default value according to config registry. -/// We rely on the schema's default and the runtime value deserializing to the same `serde_json::Value`. -fn is_default_value(schema: &SchemaEntry, value: &Value) -> bool { - match schema.default { - Some(default_str) => match serde_json::from_str::(default_str) { - Ok(default_value) => *value == default_value, - Err(_) => false, - }, - None => match value { - Value::Null => true, - // Empty string is considered equivalent to null in config. - Value::String(s) => s.is_empty(), - _ => false, - }, - } -} - -#[cfg(test)] -mod tests { - use super::*; - use crate::config_registry::datadog::unsupported; - use crate::config_registry::SUPPORTED_ANNOTATIONS; - - fn classifier() -> ConfigClassifier { - ConfigClassifier::new() - } - - #[test] - fn full_non_default() { - let c = classifier(); - let result = c.classify("dogstatsd_port", &Value::Number(9999.into())).unwrap(); - assert_eq!(result.support_level, SupportLevel::Full); - assert!(!result.is_default); - } - - #[test] - fn full_default() { - let c = classifier(); - let result = c.classify("dogstatsd_port", &Value::Number(8125.into())).unwrap(); - assert_eq!(result.support_level, SupportLevel::Full); - assert!(result.is_default); - } - - #[test] - fn partial_non_default() { - let c = classifier(); - let partial = SUPPORTED_ANNOTATIONS - .iter() - .find(|a| a.support_level == SupportLevel::Partial) - .expect("need at least one Partial annotation for this test"); - let result = c - .classify(partial.yaml_path(), &Value::String("non_default_value".into())) - .unwrap(); - assert_eq!(result.support_level, SupportLevel::Partial); - } - - #[test] - // To whoever implements this config in the future: sorry! We just wanted to make sure this is - // working correctly by giving it a currently unsupported key. You can delete the unsupported - // tests or choose a different key. - fn incompatible_non_default() { - let c = classifier(); - let key = unsupported::TLS_HANDSHAKE_TIMEOUT.yaml_path(); - let result = c.classify(key, &Value::Number(999.into())).unwrap(); - assert!(matches!(result.support_level, SupportLevel::Incompatible(_))); - assert!(!result.is_default); - } - - #[test] - fn incompatible_default() { - let c = classifier(); - let ann = &unsupported::TLS_HANDSHAKE_TIMEOUT; - let result = c.classify(ann.yaml_path(), &Value::String("".into())).unwrap(); - assert!(matches!(result.support_level, SupportLevel::Incompatible(_))); - assert!(result.is_default); - } - - #[test] - fn not_in_registry_returns_none() { - let c = classifier(); - assert!(c.classify("totally_made_up_key", &Value::Bool(true)).is_none()); - assert!(c.classify("GUI_host", &Value::String("localhost".into())).is_none()); - } - - #[test] - fn alias_resolves_to_annotation() { - let c = classifier(); - let result = c - .classify("dogstatsd_expiry_seconds", &Value::Number(999.into())) - .unwrap(); - assert_eq!(result.support_level, SupportLevel::Full); - assert!(!result.is_default); - } - - #[test] - fn alias_default_matches_canonical() { - let c = classifier(); - let canonical = c.classify("counter_expiry_seconds", &Value::Null).unwrap(); - let alias = c.classify("dogstatsd_expiry_seconds", &Value::Null).unwrap(); - assert!(canonical.is_default); - assert!(alias.is_default); - } - - #[test] - fn log_payloads_is_supported() { - let c = classifier(); - let result = c.classify("log_payloads", &Value::Bool(true)).unwrap(); - assert_eq!(result.support_level, SupportLevel::Full); - assert!(!result.is_default); - } - - #[test] - fn none_default_null_is_default() { - let c = classifier(); - let ann = ALL_ANNOTATIONS - .iter() - .find(|a| a.schema.default.is_none()) - .expect("need an annotation with default: None"); - let result = c.classify(ann.yaml_path(), &Value::Null).unwrap(); - assert!(result.is_default); - } - - #[test] - fn none_default_empty_string_is_default() { - let c = classifier(); - let ann = ALL_ANNOTATIONS - .iter() - .find(|a| a.schema.default.is_none()) - .expect("need an annotation with default: None"); - let result = c.classify(ann.yaml_path(), &Value::String("".into())).unwrap(); - assert!(result.is_default); - } - - #[test] - fn none_default_non_empty_is_not_default() { - let c = classifier(); - let ann = ALL_ANNOTATIONS - .iter() - .find(|a| a.schema.default.is_none()) - .expect("need an annotation with default: None"); - let result = c.classify(ann.yaml_path(), &Value::String("something".into())).unwrap(); - assert!(!result.is_default); - } -} diff --git a/lib/saluki-components/src/config_registry/datadog/mod.rs b/lib/saluki-components/src/config_registry/datadog/mod.rs deleted file mode 100644 index 6e38ef3a6af..00000000000 --- a/lib/saluki-components/src/config_registry/datadog/mod.rs +++ /dev/null @@ -1,303 +0,0 @@ -//! Datadog Agent configuration registry entries. - -pub mod aggregate; -pub mod containerd; -pub mod dogstatsd; -pub mod dogstatsd_mapper; -pub mod dogstatsd_prefix_filter; -pub mod encoders; -pub mod forwarder; -pub mod get_typed; -pub mod mrf; -pub mod otlp; -pub mod proxy; -pub mod tag_filterlist; -pub mod trace_obfuscation; -pub(super) mod unsupported; - -use std::sync::LazyLock; - -use super::SalukiAnnotation; - -/// Supported saluki annotations across every sub-system, in registration order. -/// -/// The source of truth for which config keys saluki consumes partially or fully supports. -/// Used by the smoke test runner and runtime unknown-key detection. -pub(crate) static SUPPORTED_ANNOTATIONS: LazyLock> = LazyLock::new(|| { - let mut v = Vec::new(); - v.extend_from_slice(aggregate::ALL); - v.extend_from_slice(containerd::ALL); - v.extend_from_slice(dogstatsd::ALL); - v.extend_from_slice(dogstatsd_mapper::ALL); - v.extend_from_slice(forwarder::ALL); - v.extend_from_slice(get_typed::ALL); - v.extend_from_slice(mrf::ALL); - v.extend_from_slice(dogstatsd_prefix_filter::ALL); - v.extend_from_slice(encoders::ALL); - v.extend_from_slice(otlp::ALL); - v.extend_from_slice(proxy::ALL); - v.extend_from_slice(tag_filterlist::ALL); - v.extend_from_slice(trace_obfuscation::ALL); - v -}); - -/// Annotations for keys that Saluki intentionally doesn't support. -/// -/// All entries have [`Incompatible`](super::SupportLevel::Incompatible) and empty `used_by`. -pub(crate) static UNSUPPORTED_ANNOTATIONS: LazyLock> = LazyLock::new(|| { - let mut v = Vec::new(); - v.extend_from_slice(unsupported::ALL); - v -}); - -/// All saluki annotations: supported and unsupported combined. -/// -/// Used by the adp-runtime config check to classify every key in the resolved config. -pub(crate) static ALL_ANNOTATIONS: LazyLock> = LazyLock::new(|| { - let mut v = SUPPORTED_ANNOTATIONS.clone(); - v.extend_from_slice(&UNSUPPORTED_ANNOTATIONS); - v -}); - -#[cfg(test)] -mod registry_tests { - use std::collections::HashSet; - - use super::*; - use crate::config_registry::{PipelineAffinity, Schema, SupportLevel, ALL_SCHEMA_ENTRIES, IGNORED_ENTRIES}; - - fn check_for_duplicates(it: impl Iterator>) -> Result<(), String> { - let mut seen = std::collections::HashSet::new(); - let mut duplicates = Vec::new(); - for item in it { - let s = item.as_ref().to_owned(); - if !seen.insert(s.clone()) { - duplicates.push(s); - } - } - - if duplicates.is_empty() { - Ok(()) - } else { - Err(format!("\n{}", duplicates.join("\n"))) - } - } - - #[test] - fn pipelines_affinity_slice_is_non_empty() { - for annotation in ALL_ANNOTATIONS.iter() { - if let PipelineAffinity::Pipelines(ps) = annotation.pipeline_affinity { - assert!( - !ps.is_empty(), - "annotation '{}' has PipelineAffinity::Pipelines(&[]) - \ - At least one affected Pipeline is required. If all pipelines are affected, \ - use Pipeline::CrossCutting.", - annotation.yaml_path(), - ); - } - } - } - - #[test] - fn annotation_invariants() { - for annotation in SUPPORTED_ANNOTATIONS.iter() { - let path = annotation.yaml_path(); - match annotation.support_level { - SupportLevel::Full | SupportLevel::Partial => { - assert!( - !annotation.used_by.is_empty(), - "annotation '{}' has support level {:?} but used_by is empty — \ - add the consuming struct name(s) to used_by, or change the support level. \ - See config_registry/mod.rs module docs for details.", - path, - annotation.support_level, - ); - } - SupportLevel::Incompatible(_) => { - assert!( - annotation.used_by.is_empty(), - "annotation '{}' has support level Incompatible but used_by is not empty — \ - remove the struct name(s) from used_by, or change the support level. \ - See config_registry/mod.rs module docs for details.", - path, - ); - } - SupportLevel::Ignored | SupportLevel::Unrecognized => { - panic!( - "annotation '{}' has support level {:?} — \ - Ignored and Unrecognized are reserved for unannotated keys and must not \ - appear in a handwritten SalukiAnnotation. \ - See config_registry/mod.rs module docs for details.", - path, annotation.support_level - ); - } - } - } - } - - /// This test ensures that the same config key doesn't appear in both the supported and unsupported lists of - /// `SalukiAnnotations`. - #[test] - fn no_overlap_between_supported_and_unsupported() { - let supported_paths: HashSet<&str> = SUPPORTED_ANNOTATIONS.iter().map(|a| a.yaml_path()).collect(); - - let duplicates: Vec<&str> = UNSUPPORTED_ANNOTATIONS - .iter() - .map(|a| a.yaml_path()) - .filter(|p| supported_paths.contains(p)) - .collect(); - - if !duplicates.is_empty() { - panic!( - "{} key(s) appear in both SUPPORTED_ANNOTATIONS and UNSUPPORTED_ANNOTATIONS:\n{}\n\ - See config_registry/mod.rs module docs for details.", - duplicates.len(), - duplicates - .iter() - .map(|p| format!(" - {}", p)) - .collect::>() - .join("\n"), - ); - } - } - - #[test] - fn no_duplicates_in_supported_annotations() { - if let Err(dupes) = check_for_duplicates(SUPPORTED_ANNOTATIONS.iter().map(|&a| a.yaml_path())) { - panic!("Duplicates in SUPPORTED_ANNOTATIONS:{dupes}\nSee config_registry/mod.rs module docs for details."); - } - } - - #[test] - fn no_duplicates_in_unsupported_annotations() { - if let Err(dupes) = check_for_duplicates(UNSUPPORTED_ANNOTATIONS.iter().map(|&a| a.yaml_path())) { - panic!( - "Duplicates in UNSUPPORTED_ANNOTATIONS:{dupes}\nSee config_registry/mod.rs module docs for details." - ); - } - } - - #[test] - fn no_duplicates_in_ignored_keys() { - if let Err(dupes) = check_for_duplicates(IGNORED_ENTRIES.iter()) { - panic!("Duplicates in IGNORED_ENTRIES:{dupes}\nSee config_registry/mod.rs module docs for details."); - } - } - - #[test] - fn no_overlap_between_annotations_and_ignored() { - let annotation_paths: HashSet<&str> = ALL_ANNOTATIONS.iter().map(|a| a.yaml_path()).collect(); - let overlaps: Vec<&&str> = IGNORED_ENTRIES - .iter() - .filter(|k| annotation_paths.contains(**k)) - .collect(); - if !overlaps.is_empty() { - panic!( - "{} key(s) appear in both ALL_ANNOTATIONS and IGNORED_ENTRIES:\n{}\n\ - See config_registry/mod.rs module docs for details.", - overlaps.len(), - overlaps - .iter() - .map(|p| format!(" - {}", p)) - .collect::>() - .join("\n"), - ); - } - } - - #[test] - fn no_stale_entries() { - let schema_paths: HashSet<&str> = ALL_SCHEMA_ENTRIES.iter().map(|e| e.yaml_path).collect(); - - let stale_annotations: Vec<&str> = ALL_ANNOTATIONS - .iter() - .filter(|a| a.schema.schema == Schema::Datadog) - .map(|a| a.yaml_path()) - .filter(|p| !schema_paths.contains(p)) - .collect(); - - let stale_ignored: Vec<&&str> = IGNORED_ENTRIES.iter().filter(|k| !schema_paths.contains(**k)).collect(); - - if stale_annotations.is_empty() && stale_ignored.is_empty() { - return; - } - - let mut msg = String::new(); - if !stale_annotations.is_empty() { - msg.push_str(&format!( - "{} stale annotation(s) not in schema:\n{}\n", - stale_annotations.len(), - stale_annotations - .iter() - .map(|p| format!(" - {}", p)) - .collect::>() - .join("\n"), - )); - } - if !stale_ignored.is_empty() { - msg.push_str(&format!( - "{} stale ignored key(s) not in schema:\n{}", - stale_ignored.len(), - stale_ignored - .iter() - .map(|p| format!(" - {}", p)) - .collect::>() - .join("\n"), - )); - } - panic!("{msg}\nSee config_registry/mod.rs module docs for details."); - } - - #[test] - fn saluki_schema_entries_not_in_vendored_schema() { - let schema_paths: HashSet<&str> = ALL_SCHEMA_ENTRIES.iter().map(|e| e.yaml_path).collect(); - - let misclassified: Vec<&str> = ALL_ANNOTATIONS - .iter() - .filter(|a| a.schema.schema == Schema::Saluki) - .map(|a| a.yaml_path()) - .filter(|p| schema_paths.contains(p)) - .collect(); - - if !misclassified.is_empty() { - panic!( - "{} annotation(s) marked Schema::Saluki but found in ALL_SCHEMA_ENTRIES \ - (should reference the generated schema:: constant instead):\n{}\n\ - See config_registry/mod.rs module docs for details.", - misclassified.len(), - misclassified - .iter() - .map(|p| format!(" - {}", p)) - .collect::>() - .join("\n"), - ); - } - } - - #[test] - fn all_schema_entries_are_annotated_or_ignored() { - // The union of all annotated keys plus all the keys we intend to ignore. - let all_accounted_for_entries: HashSet<&str> = HashSet::from_iter( - ALL_ANNOTATIONS - .iter() - .map(|&annotation| annotation.yaml_path()) - .chain(IGNORED_ENTRIES.iter().copied()), - ); - - let mut missing_keys = Vec::new(); - for schema_key in ALL_SCHEMA_ENTRIES.iter().map(|&entry| entry.yaml_path) { - if !all_accounted_for_entries.contains(schema_key) { - missing_keys.push(schema_key); - } - } - - if !missing_keys.is_empty() { - panic!( - "{} config key(s) are missing from the Saluki registry: \n\n{}\n\n\ - See config_registry/mod.rs module docs for details.", - missing_keys.len(), - missing_keys.join("\n") - ); - } - } -} diff --git a/lib/saluki-components/src/config_registry/generated/mod.rs b/lib/saluki-components/src/config_registry/generated/mod.rs deleted file mode 100644 index 31e4f87f984..00000000000 --- a/lib/saluki-components/src/config_registry/generated/mod.rs +++ /dev/null @@ -1,8 +0,0 @@ -// Generated by build.rs from vendor/core_schema.yaml — DO NOT EDIT manually. -// Re-generated automatically whenever vendor/core_schema.yaml changes. - -/// Schema entries generated from the vendored Datadog Agent config schema. -#[allow(dead_code, missing_docs, non_upper_case_globals)] -pub mod schema { - include!(concat!(env!("OUT_DIR"), "/schema.rs")); -} diff --git a/lib/saluki-components/src/config_registry/mod.rs b/lib/saluki-components/src/config_registry/mod.rs deleted file mode 100644 index 585294daefa..00000000000 --- a/lib/saluki-components/src/config_registry/mod.rs +++ /dev/null @@ -1,388 +0,0 @@ -//! Configuration key registry. -//! -//! A programmatic registry of all recognized configuration keys. Each entry describes the key -//! purely from the configuration system's perspective: its canonical YAML path, the environment -//! variables that map to it, the shape of its value, and which internal config structs consume it. -//! -//! This registry is intentionally free of Rust field names and struct internals—it models the -//! configuration surface as an operator would see it, and can be used at runtime to detect -//! unknown or unsupported keys in a loaded configuration file. -//! -//! ## User Guide -//! -//! The config registry tests enforce uniqueness and completeness constraints similar to -//! primary-key and unique constraints in a relational database. Every key in the vendored -//! schema (`core_schema.yaml`) must appear in exactly one of two places: an annotation -//! ([`SalukiAnnotation`]) or the ignored-keys list (`etc/ignored_keys.yaml`). No key may -//! appear in both, and no key may appear twice within either list. -//! -//! If a test fails, it means one of these constraints was violated. Common scenarios: -//! -//! ### Adding a Configuration Key -//! -//! When Saluki gains support for a new key, add a [`SalukiAnnotation`] in the appropriate -//! `config_registry::datadog::*` submodule with [`SupportLevel::Full`] or -//! [`SupportLevel::Partial`] and a non-empty `used_by` list. If the key was previously in -//! `etc/ignored_keys.yaml`, remove it from there. If it was previously -//! [`SupportLevel::Incompatible`], move it from `datadog/unsupported.rs` to the -//! appropriate submodule and update its support level. -//! -//! ### Updating the Vendored Schema -//! -//! After updating `vendor/core_schema.yaml`, rebuild to regenerate the schema module -//! (the `build.rs` script handles this automatically). Any new keys will cause the -//! `all_schema_entries_are_annotated_or_ignored` test to fail. For each new key, decide: -//! -//! - **Irrelevant to ADP**: add to `etc/ignored_keys.yaml` with a reason. -//! - **Incompatible**: add to `datadog/unsupported.rs` with a [`Severity`] level. -//! - **Supported**: add to the appropriate `datadog/*.rs` submodule. -//! -//! If the update removed keys, the `no_stale_entries` test catches annotations or -//! ignored entries that reference keys no longer in the schema. Delete the stale entries. - -mod classifier; -pub mod datadog; -/// Generated schema entries from the vendored Datadog Agent config schema. -pub mod generated; - -pub use classifier::{Classification, ConfigClassifier}; - -pub(crate) use self::datadog::ALL_ANNOTATIONS; -#[cfg(any(test, feature = "config-test-support"))] -pub(crate) use self::datadog::SUPPORTED_ANNOTATIONS; -#[cfg(test)] -pub(crate) use self::generated::schema::ALL_SCHEMA_ENTRIES; -#[cfg(test)] -pub(crate) use self::generated::schema::IGNORED_ENTRIES; - -/// Declares a set of [`SalukiAnnotation`] constants and generates a companion `ALL` slice. -/// -/// Each entry declares one named `pub const` annotation. The macro also emits: -/// -/// ```ignore -/// pub const ALL: &[&SalukiAnnotation] = &[&NAME1, &NAME2, ...]; -/// ``` -/// -/// so that `datadog/mod.rs` can aggregate submodules with a single -/// `v.extend_from_slice(my_module::ALL)` line rather than listing every constant by name. -/// -/// # Example -/// -/// ```ignore -/// declare_annotations! { -/// /// Doc comment for PROXY_HTTP. -/// PROXY_HTTP = SalukiAnnotation { ... }; -/// PROXY_HTTPS = SalukiAnnotation { ... }; -/// } -/// ``` -#[macro_export] -macro_rules! declare_annotations { - ( $( $(#[$attr:meta])* $name:ident = $val:expr ;)+ ) => { - $( - $(#[$attr])* - pub const $name: $crate::config_registry::SalukiAnnotation = $val; - )+ - - /// All annotations declared in this module, in declaration order. - pub const ALL: &[$crate::config_registry::SalukiAnnotationRef] = &[ - $( &$name, )+ - ]; - }; -} - -/// Shared helpers for config smoke tests. -#[cfg(any(test, feature = "config-test-support"))] -pub mod test_support; - -/// Identifiers for known configuration structs. -/// -/// Used as values in [`SalukiAnnotation::used_by`] to declare which structs consume a given key. -/// Adding a new struct here is the first step when registering its configuration keys. -pub mod structs { - /// Identifier for `ProxyConfiguration`. - pub const PROXY_CONFIGURATION: &str = "ProxyConfiguration"; - /// Identifier for `ForwarderConfiguration`. - pub const FORWARDER_CONFIGURATION: &str = "ForwarderConfiguration"; - /// Identifier for `DogStatsDConfiguration`. - pub const DOGSTATSD_CONFIGURATION: &str = "DogStatsDConfiguration"; - /// Identifier for `ContainerdConfiguration`. - pub const CONTAINERD_CONFIGURATION: &str = "ContainerdConfiguration"; - /// Identifier for `OtlpConfiguration`. - pub const OTLP_CONFIGURATION: &str = "OtlpConfiguration"; - /// Identifier for `AggregateConfiguration`. - pub const AGGREGATE_CONFIGURATION: &str = "AggregateConfiguration"; - /// Identifier for `DogStatsDMapperConfiguration`. - pub const DOGSTATSD_MAPPER_CONFIGURATION: &str = "DogStatsDMapperConfiguration"; - /// Identifier for `DogStatsDDebugLogConfiguration`. - pub const DOGSTATSD_DEBUG_LOG_CONFIGURATION: &str = "DogStatsDDebugLogConfiguration"; - /// Identifier for `DogStatsDPrefixFilterConfiguration`. - pub const DOGSTATSD_PREFIX_FILTER_CONFIGURATION: &str = "DogStatsDPrefixFilterConfiguration"; - /// Identifier for `DatadogMetricsConfiguration`. - pub const DATADOG_METRICS_CONFIGURATION: &str = "DatadogMetricsConfiguration"; - /// Identifier for `DatadogTraceConfiguration`. - pub const DATADOG_TRACE_CONFIGURATION: &str = "DatadogTraceConfiguration"; - /// Identifier for `DatadogLogsConfiguration`. - pub const DATADOG_LOGS_CONFIGURATION: &str = "DatadogLogsConfiguration"; - /// Identifier for `DatadogEventsConfiguration`. - pub const DATADOG_EVENTS_CONFIGURATION: &str = "DatadogEventsConfiguration"; - /// Identifier for `DatadogServiceChecksConfiguration`. - pub const DATADOG_SERVICE_CHECKS_CONFIGURATION: &str = "DatadogServiceChecksConfiguration"; - /// Identifier for `DatadogApmStatsEncoderConfiguration`. - pub const DATADOG_APM_STATS_ENCODER_CONFIGURATION: &str = "DatadogApmStatsEncoderConfiguration"; - /// Identifier for `MrfConfiguration`. - pub const MRF_CONFIGURATION: &str = "MrfConfiguration"; - /// Identifier for `OtlpDecoderConfiguration`. - pub const OTLP_DECODER_CONFIGURATION: &str = "OtlpDecoderConfiguration"; - /// Identifier for `OtlpRelayConfiguration`. - pub const OTLP_RELAY_CONFIGURATION: &str = "OtlpRelayConfiguration"; - /// Identifier for `TraceObfuscationConfiguration`. - pub const TRACE_OBFUSCATION_CONFIGURATION: &str = "TraceObfuscationConfiguration"; - /// Identifier for `RemoteAgentClientConfiguration`. - pub const REMOTE_AGENT_CLIENT_CONFIGURATION: &str = "RemoteAgentClientConfiguration"; - /// Identifier for `TagFilterlistConfiguration`. - pub const TAG_FILTERLIST_CONFIGURATION: &str = "TagFilterlistConfiguration"; - /// Keys read via `get_typed` / `try_get_typed` rather than struct deserialization. - pub const GET_TYPED: &str = "get_typed"; -} - -/// The ADP pipeline a config key affects. -/// -/// Primary user-controlled toggles are represented. -#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)] -pub enum Pipeline { - /// DogStatsD metrics pipeline. - DogStatsD, - /// Agent checks pipeline. - Checks, - /// OTLP ingestion frontend. - Otlp, - /// Internal trace processing. Active when OTLP is enabled and proxy/relay mode (which uses the - /// core Agent for transport) is off. - Traces, -} - -/// Which pipelines a [`SalukiAnnotation`] affects. -#[derive(Clone, Copy, Debug, PartialEq, Eq)] -pub enum PipelineAffinity { - /// The list of pipelines affected by the `SalukiAnnotation`. - /// - /// This list must be non-empty, enforced by test. - Pipelines(&'static [Pipeline]), - /// The `SalukiAnnotation` affects all pipelines or ADP behavior as a whole. - CrossCutting, -} - -/// The `Severity` level of a config key that Saluki doesn't support. -#[derive(Clone, Copy, Debug, PartialEq, Eq)] -pub enum Severity { - /// Saluki's incompatibility with the key is considered minor. - Low, - - /// Saluki's incompatibility with the key is considered potentially impactful. - Medium, - - /// Saluki's incompatibility with the key is considered problematic. - High, -} - -/// How well saluki supports a given configuration key. -/// -/// Used in [`SalukiAnnotation`] to classify each key from saluki's perspective. `Ignored` is -/// reserved for keys in the schema that have no annotation at all—it must not appear in any -/// handwritten annotation. -/// -/// Invariants enforced at test time: -/// - `Full` and `Partial` require a non-empty `used_by` list. -/// - `Incompatible` requires an empty `used_by` list. -#[derive(Clone, Copy, Debug, PartialEq, Eq)] -pub enum SupportLevel { - /// Fully supported. The key is wired up end-to-end and must be consumed by at least one struct. - Full, - /// Partially supported. The key is consumed by at least one struct, but support is incomplete. - Partial, - /// Explicitly incompatible. Saluki doesn't support this key and may not behave as expected in - /// its presence; `used_by` must be empty. Support for the key may be added in the future but - /// tracking such intent isn't encoded here. - Incompatible(Severity), - /// Intentionally ignored. The key isn't relevant to Saluki. This assignment must be - /// intentionally chosen and specified for a key. We never assume that a key is `Ignored` just - /// because we're unaware of it. - #[allow(unused)] - Ignored, - /// Unrecognized. The Saluki codebase is unaware of the existence of this key. It's not in our - /// vendored datadog config schema, nor is it annotated. - #[allow(unused)] - Unrecognized, -} - -/// The shape of a configuration value. -/// -/// Describes how a value should be parsed from both YAML and environment variables. -/// `StringList` values are represented as a YAML sequence or a space-separated string in env vars. -#[derive(Clone, Copy, Debug, PartialEq, Eq)] -pub enum ValueType { - /// A boolean (`true` / `false`). - Bool, - /// A UTF-8 string. - String, - /// An unsigned integer. - Integer, - /// A floating-point number. - Float, - /// A list of strings (YAML sequence or space-separated env var string). - StringList, -} - -/// Which schema source of truth defined the `SchemaEntry` -#[derive(Debug, Clone, Copy, Eq, PartialEq, Hash)] -#[repr(u8)] -pub(crate) enum Schema { - /// Saluki defined the `SchemaEntry` and the key isn't expected to exist in the vendored Datadog config schema. - Saluki, - /// The vendored Datadog config schema defines the `SchemaEntry`. - Datadog, -} - -/// Schema-derived metadata for a single configuration key. -/// -/// Generated from the vendored Datadog Agent config schema. Contains only what the schema -/// knows: the canonical YAML path, declared environment variables, and value type. Saluki-specific -/// fields (`used_by`, etc.) live in [`SalukiAnnotation`] instead. -/// -/// Don't construct these manually—they're produced by `cargo xtask gen-config-schema` and -/// live in `config_registry::generated::schema`. -#[derive(Debug)] -pub struct SchemaEntry { - /// The source of truth from which this entry was derived. - #[allow(dead_code)] - pub(crate) schema: Schema, - - /// Canonical dot-separated YAML path for this key (for example, `"proxy.http"`). - pub yaml_path: &'static str, - - /// Environment variables that deliver this value, as declared in the schema. - /// - /// Empty when the schema marks the key `no-env` or lists no env vars. Annotations may - /// override this with additional or corrected env vars. - pub env_vars: &'static [&'static str], - - /// Shape of the value. - pub value_type: ValueType, - - /// JSON-encoded default value from the Agent schema, if present. - /// - /// Examples: `Some("true")`, `Some("8125")`, `Some("\"datadoghq.com\"")`, `None`. - /// Used by smoke tests to auto-detect when a generic test value matches the default - /// and flip it so the test actually exercises the field. - pub default: Option<&'static str>, -} - -/// Saluki-specific annotation for a single configuration key. -/// -/// Pairs a [`SchemaEntry`] (generated from the vendored schema) with the metadata that only -/// saluki knows: which internal config structs consume the key, and any corrections to the -/// schema's env var list. -/// -/// These are hand-written constants, one per key saluki cares about, and live in -/// `config_registry::datadog::*` submodules. They're never overwritten by codegen. -#[derive(Debug)] -pub struct SalukiAnnotation { - /// The schema entry this annotation enriches. - pub schema: &'static SchemaEntry, - - /// How well saluki supports this key. - /// - /// Must not be [`SupportLevel::Ignored`] or [`SupportLevel::Unrecognized`] which are reserved - /// for unannotated keys. - pub support_level: SupportLevel, - - /// Additional YAML paths beyond the canonical one in the schema (aliases). - /// - /// Most keys have no aliases; leave this as `&[]` unless the config system recognises - /// the key under more than one dot-separated path. - pub additional_yaml_paths: &'static [&'static str], - - /// Overrides the schema's `env_vars` list entirely when `Some`. - /// - /// Use when the schema marks a key `no-env` but env vars are actually supported, or when - /// the schema's list is incorrect or incomplete (for example, the proxy sub-keys). - pub env_var_override: Option<&'static [&'static str]>, - - /// Config structs that incorporate this key, as [`structs`] constants. - /// - /// Must be non-empty for [`SupportLevel::Full`] and [`SupportLevel::Partial`]. - /// Must be empty for [`SupportLevel::Incompatible`]. - pub used_by: &'static [&'static str], - - /// Overrides the schema's `value_type` when `Some`. - /// - /// Use when the schema declares a key as `Float` but the consuming Rust field is `i32` (or - /// similarly mismatched), so that smoke tests inject a value the struct can actually parse. - pub value_type_override: Option, - - /// Overrides the smoke-test injected value entirely when `Some`. - /// - /// Must be a valid JSON literal (for example, `Some("[{\"name\":\"test\"}]")`). Use when the field - /// requires a structured value that the generic `ValueType`-derived test values can't satisfy - /// (for example, JSON-encoded arrays or objects). - pub test_json: Option<&'static str>, - - /// Which pipelines this key affects. - pub pipeline_affinity: PipelineAffinity, -} - -/// A reference to a [`SalukiAnnotation`], used as the element type of `ALL` slices generated by -/// [`declare_annotations!`]. -pub type SalukiAnnotationRef = &'static SalukiAnnotation; - -impl SalukiAnnotation { - /// The canonical YAML path for this key (from the schema). - pub fn yaml_path(&self) -> &'static str { - self.schema.yaml_path - } - - /// All YAML paths for this key: canonical first, then any aliases. - pub fn all_yaml_paths(&self) -> impl Iterator { - std::iter::once(self.schema.yaml_path).chain(self.additional_yaml_paths.iter().copied()) - } - - /// Effective env vars: the override list if set, otherwise the schema's list. - pub fn effective_env_vars(&self) -> &'static [&'static str] { - self.env_var_override.unwrap_or(self.schema.env_vars) - } - - /// Shape of the value: override if set, otherwise from the schema. - pub fn value_type(&self) -> ValueType { - self.value_type_override.unwrap_or(self.schema.value_type) - } -} - -/// A fully resolved configuration key, derived from a [`SalukiAnnotation`] at registry init time. -/// -/// Used for runtime unknown-key detection and anywhere a flattened, owned view of a key is -/// needed. For test infrastructure, prefer working with [`SalukiAnnotation`] directly. -#[derive(Debug)] -pub struct ConfigKey { - /// All dot-separated YAML paths that deliver this value. - pub yaml_paths: Vec<&'static str>, - - /// All environment variables that deliver this value. - pub env_vars: Vec<&'static str>, - - /// Shape of the value. - pub value_type: ValueType, - - /// Config structs that incorporate this key, as [`structs`] constants. - pub used_by: &'static [&'static str], -} - -impl From<&SalukiAnnotation> for ConfigKey { - fn from(a: &SalukiAnnotation) -> Self { - ConfigKey { - yaml_paths: a.all_yaml_paths().collect(), - env_vars: a.effective_env_vars().to_vec(), - value_type: a.value_type(), - used_by: a.used_by, - } - } -} diff --git a/lib/saluki-components/src/decoders/otlp/mod.rs b/lib/saluki-components/src/decoders/otlp/mod.rs index 2f09fec1bb5..998575a9d33 100644 --- a/lib/saluki-components/src/decoders/otlp/mod.rs +++ b/lib/saluki-components/src/decoders/otlp/mod.rs @@ -184,17 +184,25 @@ impl Decoder for OtlpDecoder { #[cfg(test)] mod config_smoke { + use datadog_agent_config_testsupport::config_registry::structs; + use datadog_agent_config_testsupport::run_config_smoke_tests; use serde_json::json; use super::OtlpDecoderConfiguration; - use crate::config_registry::structs; - use crate::config_registry::test_support::run_config_smoke_tests; + use crate::config::{DatadogRemapper, KEY_ALIASES}; #[tokio::test] async fn smoke_test() { - run_config_smoke_tests(structs::OTLP_DECODER_CONFIGURATION, &[], json!({}), |cfg| { - OtlpDecoderConfiguration::from_configuration(&cfg).expect("OtlpDecoderConfiguration should deserialize") - }) + run_config_smoke_tests( + structs::OTLP_DECODER_CONFIGURATION, + &[], + json!({}), + |cfg| { + OtlpDecoderConfiguration::from_configuration(&cfg).expect("OtlpDecoderConfiguration should deserialize") + }, + KEY_ALIASES, + DatadogRemapper::new, + ) .await } } diff --git a/lib/saluki-components/src/destinations/dsd_debug_log/mod.rs b/lib/saluki-components/src/destinations/dsd_debug_log/mod.rs index 28a612f306a..9e0be957b09 100644 --- a/lib/saluki-components/src/destinations/dsd_debug_log/mod.rs +++ b/lib/saluki-components/src/destinations/dsd_debug_log/mod.rs @@ -342,14 +342,15 @@ mod tests { }; use bytesize::ByteSize; + use datadog_agent_config_testsupport::config_registry::structs; + use datadog_agent_config_testsupport::run_config_smoke_tests; use saluki_context::Context; use saluki_core::data_model::event::metric::Metric; use serde_json::json; use tempfile::tempdir; use super::{DogStatsDDebugLog, DogStatsDDebugLogConfiguration}; - use crate::config_registry::structs; - use crate::config_registry::test_support::run_config_smoke_tests; + use crate::config::{DatadogRemapper, KEY_ALIASES}; fn test_default_log_file_path() -> PathBuf { PathBuf::from("/tmp/default-dogstatsd-stats.log") @@ -430,10 +431,17 @@ mod tests { #[tokio::test] async fn smoke_test() { - run_config_smoke_tests(structs::DOGSTATSD_DEBUG_LOG_CONFIGURATION, &[], json!({}), |cfg| { - DogStatsDDebugLogConfiguration::from_configuration(&cfg, test_default_log_file_path()) - .expect("DogStatsDDebugLogConfiguration should deserialize") - }) + run_config_smoke_tests( + structs::DOGSTATSD_DEBUG_LOG_CONFIGURATION, + &[], + json!({}), + |cfg| { + DogStatsDDebugLogConfiguration::from_configuration(&cfg, test_default_log_file_path()) + .expect("DogStatsDDebugLogConfiguration should deserialize") + }, + KEY_ALIASES, + DatadogRemapper::new, + ) .await } diff --git a/lib/saluki-components/src/encoders/datadog/events/mod.rs b/lib/saluki-components/src/encoders/datadog/events/mod.rs index 29a2d56e8ed..77dffcf70c3 100644 --- a/lib/saluki-components/src/encoders/datadog/events/mod.rs +++ b/lib/saluki-components/src/encoders/datadog/events/mod.rs @@ -329,18 +329,26 @@ fn encode_eventd(eventd: &EventD, tags_deduplicator: &mut ReusableDeduplicator() - .expect("DatadogEventsConfiguration should deserialize") - }) + run_config_smoke_tests( + structs::DATADOG_EVENTS_CONFIGURATION, + &[], + json!({}), + |cfg| { + cfg.as_typed::() + .expect("DatadogEventsConfiguration should deserialize") + }, + KEY_ALIASES, + DatadogRemapper::new, + ) .await } } diff --git a/lib/saluki-components/src/encoders/datadog/logs/mod.rs b/lib/saluki-components/src/encoders/datadog/logs/mod.rs index b4deafd6716..8357a7faa16 100644 --- a/lib/saluki-components/src/encoders/datadog/logs/mod.rs +++ b/lib/saluki-components/src/encoders/datadog/logs/mod.rs @@ -263,18 +263,26 @@ impl EndpointEncoder for LogsEndpointEncoder { #[cfg(test)] mod config_smoke { + use datadog_agent_config_testsupport::config_registry::structs; + use datadog_agent_config_testsupport::run_config_smoke_tests; use serde_json::json; use super::DatadogLogsConfiguration; - use crate::config_registry::structs; - use crate::config_registry::test_support::run_config_smoke_tests; + use crate::config::{DatadogRemapper, KEY_ALIASES}; #[tokio::test] async fn smoke_test() { - run_config_smoke_tests(structs::DATADOG_LOGS_CONFIGURATION, &[], json!({}), |cfg| { - cfg.as_typed::() - .expect("DatadogLogsConfiguration should deserialize") - }) + run_config_smoke_tests( + structs::DATADOG_LOGS_CONFIGURATION, + &[], + json!({}), + |cfg| { + cfg.as_typed::() + .expect("DatadogLogsConfiguration should deserialize") + }, + KEY_ALIASES, + DatadogRemapper::new, + ) .await } } diff --git a/lib/saluki-components/src/encoders/datadog/metrics/mod.rs b/lib/saluki-components/src/encoders/datadog/metrics/mod.rs index 2e4567bd729..9bc3930ff17 100644 --- a/lib/saluki-components/src/encoders/datadog/metrics/mod.rs +++ b/lib/saluki-components/src/encoders/datadog/metrics/mod.rs @@ -1640,18 +1640,26 @@ mod tests { #[cfg(test)] mod config_smoke { + use datadog_agent_config_testsupport::config_registry::structs; + use datadog_agent_config_testsupport::run_config_smoke_tests; use serde_json::json; use super::DatadogMetricsConfiguration; - use crate::config_registry::structs; - use crate::config_registry::test_support::run_config_smoke_tests; + use crate::config::{DatadogRemapper, KEY_ALIASES}; #[tokio::test] async fn smoke_test() { - run_config_smoke_tests(structs::DATADOG_METRICS_CONFIGURATION, &[], json!({}), |cfg| { - cfg.as_typed::() - .expect("DatadogMetricsConfiguration should deserialize") - }) + run_config_smoke_tests( + structs::DATADOG_METRICS_CONFIGURATION, + &[], + json!({}), + |cfg| { + cfg.as_typed::() + .expect("DatadogMetricsConfiguration should deserialize") + }, + KEY_ALIASES, + DatadogRemapper::new, + ) .await } } diff --git a/lib/saluki-components/src/encoders/datadog/service_checks/mod.rs b/lib/saluki-components/src/encoders/datadog/service_checks/mod.rs index 9217b1b7ff4..e0e19fac48a 100644 --- a/lib/saluki-components/src/encoders/datadog/service_checks/mod.rs +++ b/lib/saluki-components/src/encoders/datadog/service_checks/mod.rs @@ -279,18 +279,26 @@ impl EndpointEncoder for ServiceChecksEndpointEncoder { #[cfg(test)] mod config_smoke { + use datadog_agent_config_testsupport::config_registry::structs; + use datadog_agent_config_testsupport::run_config_smoke_tests; use serde_json::json; use super::DatadogServiceChecksConfiguration; - use crate::config_registry::structs; - use crate::config_registry::test_support::run_config_smoke_tests; + use crate::config::{DatadogRemapper, KEY_ALIASES}; #[tokio::test] async fn smoke_test() { - run_config_smoke_tests(structs::DATADOG_SERVICE_CHECKS_CONFIGURATION, &[], json!({}), |cfg| { - cfg.as_typed::() - .expect("DatadogServiceChecksConfiguration should deserialize") - }) + run_config_smoke_tests( + structs::DATADOG_SERVICE_CHECKS_CONFIGURATION, + &[], + json!({}), + |cfg| { + cfg.as_typed::() + .expect("DatadogServiceChecksConfiguration should deserialize") + }, + KEY_ALIASES, + DatadogRemapper::new, + ) .await } } diff --git a/lib/saluki-components/src/encoders/datadog/stats/mod.rs b/lib/saluki-components/src/encoders/datadog/stats/mod.rs index 89c88c4a7da..5ff24cecf74 100644 --- a/lib/saluki-components/src/encoders/datadog/stats/mod.rs +++ b/lib/saluki-components/src/encoders/datadog/stats/mod.rs @@ -469,11 +469,12 @@ impl EndpointEncoder for StatsEndpointEncoder { #[cfg(test)] mod config_smoke { + use datadog_agent_config_testsupport::config_registry::structs; + use datadog_agent_config_testsupport::run_config_smoke_tests; use serde_json::json; use super::DatadogApmStatsEncoderConfiguration; - use crate::config_registry::structs; - use crate::config_registry::test_support::run_config_smoke_tests; + use crate::config::{DatadogRemapper, KEY_ALIASES}; #[tokio::test] async fn smoke_test() { @@ -485,6 +486,8 @@ mod config_smoke { cfg.as_typed::() .expect("DatadogApmStatsEncoderConfiguration should deserialize") }, + KEY_ALIASES, + DatadogRemapper::new, ) .await } diff --git a/lib/saluki-components/src/encoders/datadog/traces/mod.rs b/lib/saluki-components/src/encoders/datadog/traces/mod.rs index 36c1048a090..1a1c94eb2e5 100644 --- a/lib/saluki-components/src/encoders/datadog/traces/mod.rs +++ b/lib/saluki-components/src/encoders/datadog/traces/mod.rs @@ -975,18 +975,26 @@ mod tests { #[cfg(test)] mod config_smoke { + use datadog_agent_config_testsupport::config_registry::structs; + use datadog_agent_config_testsupport::run_config_smoke_tests; use serde_json::json; use super::DatadogTraceConfiguration; - use crate::config_registry::structs; - use crate::config_registry::test_support::run_config_smoke_tests; + use crate::config::{DatadogRemapper, KEY_ALIASES}; #[tokio::test] async fn smoke_test() { - run_config_smoke_tests(structs::DATADOG_TRACE_CONFIGURATION, &[], json!({}), |cfg| { - cfg.as_typed::() - .expect("DatadogTraceConfiguration should deserialize") - }) + run_config_smoke_tests( + structs::DATADOG_TRACE_CONFIGURATION, + &[], + json!({}), + |cfg| { + cfg.as_typed::() + .expect("DatadogTraceConfiguration should deserialize") + }, + KEY_ALIASES, + DatadogRemapper::new, + ) .await } } diff --git a/lib/saluki-components/src/lib.rs b/lib/saluki-components/src/lib.rs index fea3d8f3d17..3e8e17f2700 100644 --- a/lib/saluki-components/src/lib.rs +++ b/lib/saluki-components/src/lib.rs @@ -8,7 +8,6 @@ mod common; pub mod config; -pub mod config_registry; pub mod decoders; pub mod destinations; pub mod encoders; diff --git a/lib/saluki-components/src/relays/otlp/mod.rs b/lib/saluki-components/src/relays/otlp/mod.rs index 8e9f9a238c6..a0f4bec2950 100644 --- a/lib/saluki-components/src/relays/otlp/mod.rs +++ b/lib/saluki-components/src/relays/otlp/mod.rs @@ -264,18 +264,26 @@ impl OtlpHandler for RelayHandler { #[cfg(test)] mod config_smoke { + use datadog_agent_config_testsupport::config_registry::structs; + use datadog_agent_config_testsupport::run_config_smoke_tests; use serde_json::json; use super::OtlpRelayConfiguration; - use crate::config_registry::structs; - use crate::config_registry::test_support::run_config_smoke_tests; + use crate::config::{DatadogRemapper, KEY_ALIASES}; #[tokio::test] async fn smoke_test() { - run_config_smoke_tests(structs::OTLP_RELAY_CONFIGURATION, &[], json!({}), |cfg| { - cfg.as_typed::() - .expect("OtlpRelayConfiguration should deserialize") - }) + run_config_smoke_tests( + structs::OTLP_RELAY_CONFIGURATION, + &[], + json!({}), + |cfg| { + cfg.as_typed::() + .expect("OtlpRelayConfiguration should deserialize") + }, + KEY_ALIASES, + DatadogRemapper::new, + ) .await } } diff --git a/lib/saluki-components/src/sources/dogstatsd/mod.rs b/lib/saluki-components/src/sources/dogstatsd/mod.rs index fc8a5186285..1de72e316fa 100644 --- a/lib/saluki-components/src/sources/dogstatsd/mod.rs +++ b/lib/saluki-components/src/sources/dogstatsd/mod.rs @@ -2604,18 +2604,26 @@ mod tests { #[cfg(test)] mod config_smoke { + use datadog_agent_config_testsupport::config_registry::structs; + use datadog_agent_config_testsupport::run_config_smoke_tests; use serde_json::json; use super::DogStatsDConfiguration; - use crate::config_registry::structs; - use crate::config_registry::test_support::run_config_smoke_tests; + use crate::config::{DatadogRemapper, KEY_ALIASES}; #[tokio::test] async fn smoke_test() { - run_config_smoke_tests(structs::DOGSTATSD_CONFIGURATION, &[], json!({}), |cfg| { - cfg.as_typed::() - .expect("DogStatsDConfiguration should deserialize") - }) + run_config_smoke_tests( + structs::DOGSTATSD_CONFIGURATION, + &[], + json!({}), + |cfg| { + cfg.as_typed::() + .expect("DogStatsDConfiguration should deserialize") + }, + KEY_ALIASES, + DatadogRemapper::new, + ) .await } } diff --git a/lib/saluki-components/src/sources/otlp/mod.rs b/lib/saluki-components/src/sources/otlp/mod.rs index 46b4ab198b8..0f936b3766e 100644 --- a/lib/saluki-components/src/sources/otlp/mod.rs +++ b/lib/saluki-components/src/sources/otlp/mod.rs @@ -487,17 +487,23 @@ async fn run_converter( #[cfg(test)] mod config_smoke { + use datadog_agent_config_testsupport::config_registry::structs; + use datadog_agent_config_testsupport::run_config_smoke_tests; use serde_json::json; use super::OtlpConfiguration; - use crate::config_registry::structs; - use crate::config_registry::test_support::run_config_smoke_tests; + use crate::config::{DatadogRemapper, KEY_ALIASES}; #[tokio::test] async fn smoke_test() { - run_config_smoke_tests(structs::OTLP_CONFIGURATION, &[], json!({ "otlp_config": {} }), |cfg| { - OtlpConfiguration::from_configuration(&cfg).expect("OtlpConfiguration should deserialize") - }) + run_config_smoke_tests( + structs::OTLP_CONFIGURATION, + &[], + json!({ "otlp_config": {} }), + |cfg| OtlpConfiguration::from_configuration(&cfg).expect("OtlpConfiguration should deserialize"), + KEY_ALIASES, + DatadogRemapper::new, + ) .await } } diff --git a/lib/saluki-components/src/transforms/aggregate/mod.rs b/lib/saluki-components/src/transforms/aggregate/mod.rs index 22d3ad6b388..1122181cc9c 100644 --- a/lib/saluki-components/src/transforms/aggregate/mod.rs +++ b/lib/saluki-components/src/transforms/aggregate/mod.rs @@ -1519,11 +1519,12 @@ mod tests { #[cfg(test)] mod config_smoke { + use datadog_agent_config_testsupport::config_registry::structs; + use datadog_agent_config_testsupport::run_config_smoke_tests; use serde_json::json; use super::AggregateConfiguration; - use crate::config_registry::structs; - use crate::config_registry::test_support::run_config_smoke_tests; + use crate::config::{DatadogRemapper, KEY_ALIASES}; #[tokio::test] async fn smoke_test() { @@ -1540,6 +1541,8 @@ mod config_smoke { cfg.as_typed::() .expect("AggregateConfiguration should deserialize") }, + KEY_ALIASES, + DatadogRemapper::new, ) .await } diff --git a/lib/saluki-components/src/transforms/dogstatsd_mapper/mod.rs b/lib/saluki-components/src/transforms/dogstatsd_mapper/mod.rs index 49ad35a563a..a3ce2e33f5c 100644 --- a/lib/saluki-components/src/transforms/dogstatsd_mapper/mod.rs +++ b/lib/saluki-components/src/transforms/dogstatsd_mapper/mod.rs @@ -1164,18 +1164,26 @@ mod tests { #[cfg(test)] mod config_smoke { + use datadog_agent_config_testsupport::config_registry::structs; + use datadog_agent_config_testsupport::run_config_smoke_tests; use serde_json::json; use super::DogStatsDMapperConfiguration; - use crate::config_registry::structs; - use crate::config_registry::test_support::run_config_smoke_tests; + use crate::config::{DatadogRemapper, KEY_ALIASES}; #[tokio::test] async fn smoke_test() { - run_config_smoke_tests(structs::DOGSTATSD_MAPPER_CONFIGURATION, &[], json!({}), |cfg| { - cfg.as_typed::() - .expect("DogStatsDMapperConfiguration should deserialize") - }) + run_config_smoke_tests( + structs::DOGSTATSD_MAPPER_CONFIGURATION, + &[], + json!({}), + |cfg| { + cfg.as_typed::() + .expect("DogStatsDMapperConfiguration should deserialize") + }, + KEY_ALIASES, + DatadogRemapper::new, + ) .await } } diff --git a/lib/saluki-components/src/transforms/trace_obfuscation/mod.rs b/lib/saluki-components/src/transforms/trace_obfuscation/mod.rs index c4ca487dab2..11fa1daaa28 100644 --- a/lib/saluki-components/src/transforms/trace_obfuscation/mod.rs +++ b/lib/saluki-components/src/transforms/trace_obfuscation/mod.rs @@ -309,18 +309,26 @@ impl SynchronousTransform for TraceObfuscation { #[cfg(test)] mod config_smoke { + use datadog_agent_config_testsupport::config_registry::structs; + use datadog_agent_config_testsupport::run_config_smoke_tests; use serde_json::json; use super::TraceObfuscationConfiguration; - use crate::config_registry::structs; - use crate::config_registry::test_support::run_config_smoke_tests; + use crate::config::{DatadogRemapper, KEY_ALIASES}; #[tokio::test] async fn smoke_test() { - run_config_smoke_tests(structs::TRACE_OBFUSCATION_CONFIGURATION, &[], json!({}), |cfg| { - TraceObfuscationConfiguration::from_apm_configuration(&cfg) - .expect("TraceObfuscationConfiguration should deserialize") - }) + run_config_smoke_tests( + structs::TRACE_OBFUSCATION_CONFIGURATION, + &[], + json!({}), + |cfg| { + TraceObfuscationConfiguration::from_apm_configuration(&cfg) + .expect("TraceObfuscationConfiguration should deserialize") + }, + KEY_ALIASES, + DatadogRemapper::new, + ) .await } } From 10ec6bbc07eb109186320f7c9700362b3b89124f Mon Sep 17 00:00:00 2001 From: Matthew James Briggs Date: Fri, 5 Jun 2026 18:26:46 +0200 Subject: [PATCH 2/4] chore(licenses): sync third-party license file with dd-rust-license-tool v1.0.6 --- LICENSE-3rdparty.csv | 71 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 71 insertions(+) diff --git a/LICENSE-3rdparty.csv b/LICENSE-3rdparty.csv index 78a1df2b776..cadb9d092ca 100644 --- a/LICENSE-3rdparty.csv +++ b/LICENSE-3rdparty.csv @@ -7,17 +7,24 @@ allocator-api2,https://github.com/zakarumych/allocator-api2,MIT OR Apache-2.0,Za android_system_properties,https://github.com/nical/android_system_properties,MIT OR Apache-2.0,Nicolas Silva anes,https://github.com/zrzka/anes-rs,MIT OR Apache-2.0,Robert Vojta anstyle,https://github.com/rust-cli/anstyle,MIT OR Apache-2.0,The anstyle Authors +antithesis-instrumentation,https://github.com/antithesishq/antithesis-instrumentation-rust,MIT,The antithesis-instrumentation Authors antithesis_sdk,https://github.com/antithesishq/antithesis-sdk-rust,MIT,The antithesis_sdk Authors anyhow,https://github.com/dtolnay/anyhow,MIT OR Apache-2.0,David Tolnay arc-swap,https://github.com/vorner/arc-swap,MIT OR Apache-2.0,Michal 'vorner' Vaner argh,https://github.com/google/argh,BSD-3-Clause,"Taylor Cramer , Benjamin Brittain , Erick Tryzelaar " +argh_derive,https://github.com/google/argh,BSD-3-Clause,"Taylor Cramer , Benjamin Brittain , Erick Tryzelaar " +argh_shared,https://github.com/google/argh,BSD-3-Clause,"Taylor Cramer , Benjamin Brittain , Erick Tryzelaar " arrayvec,https://github.com/bluss/arrayvec,MIT OR Apache-2.0,bluss asn1-rs,https://github.com/rusticata/asn1-rs,MIT OR Apache-2.0,Pierre Chifflier +asn1-rs-derive,https://github.com/rusticata/asn1-rs,MIT OR Apache-2.0,Pierre Chifflier +asn1-rs-impl,https://github.com/rusticata/asn1-rs,MIT OR Apache-2.0,Pierre Chifflier async-compression,https://github.com/Nullus157/async-compression,MIT OR Apache-2.0,"Wim Looman , Allen Bui " async-stream,https://github.com/tokio-rs/async-stream,MIT,Carl Lerche +async-stream-impl,https://github.com/tokio-rs/async-stream,MIT,Carl Lerche async-trait,https://github.com/dtolnay/async-trait,MIT OR Apache-2.0,David Tolnay atomic,https://github.com/Amanieu/atomic-rs,Apache-2.0 OR MIT,Amanieu d'Antras atomic-waker,https://github.com/smol-rs/atomic-waker,Apache-2.0 OR MIT,"Stjepan Glavina , Contributors to futures-rs" +aws-lc-fips-sys,https://github.com/aws/aws-lc-rs,ISC AND (Apache-2.0 OR ISC) AND OpenSSL,AWS-LC aws-lc-rs,https://github.com/aws/aws-lc-rs,ISC AND (Apache-2.0 OR ISC),AWS-LibCrypto aws-lc-sys,https://github.com/aws/aws-lc-rs,ISC AND (Apache-2.0 OR ISC) AND Apache-2.0 AND MIT AND BSD-3-Clause AND (Apache-2.0 OR ISC OR MIT) AND (Apache-2.0 OR ISC OR MIT-0),AWS-LC axum,https://github.com/tokio-rs/axum,MIT,The axum Authors @@ -31,6 +38,7 @@ bitflags,https://github.com/bitflags/bitflags,MIT OR Apache-2.0,The Rust Project bitmask-enum,https://github.com/Lukas3674/rust-bitmask-enum,MIT OR Apache-2.0,Lukas3674 block-buffer,https://github.com/RustCrypto/utils,MIT OR Apache-2.0,RustCrypto Developers bollard,https://github.com/fussybeaver/bollard,Apache-2.0,Bollard contributors +bollard-stubs,https://github.com/fussybeaver/bollard,Apache-2.0,Bollard contributors bs58,https://github.com/Nullus157/bs58-rs,MIT OR Apache-2.0,The bs58 Authors bumpalo,https://github.com/fitzgen/bumpalo,MIT OR Apache-2.0,Nick Fitzgerald byte-unit,https://github.com/magiclen/byte-unit,MIT,Magic Len @@ -40,12 +48,16 @@ bytes,https://github.com/tokio-rs/bytes,MIT,"Carl Lerche , Se bytesize,https://github.com/bytesize-rs/bytesize,Apache-2.0,"Hyunsik Choi , MrCroxx , Rob Ede " cast,https://github.com/japaric/cast.rs,MIT OR Apache-2.0,Jorge Aparicio cc,https://github.com/rust-lang/cc-rs,MIT OR Apache-2.0,Alex Crichton +cexpr,https://github.com/jethrogb/rust-cexpr,Apache-2.0 OR MIT,Jethro Beekman cfg-if,https://github.com/rust-lang/cfg-if,MIT OR Apache-2.0,Alex Crichton chacha20,https://github.com/RustCrypto/stream-ciphers,MIT OR Apache-2.0,RustCrypto Developers chrono,https://github.com/chronotope/chrono,MIT OR Apache-2.0,The chrono Authors chrono-tz,https://github.com/chronotope/chrono-tz,MIT OR Apache-2.0,The chrono-tz Authors chumsky,https://codeberg.org/zesterer/chumsky,MIT,"Joshua Barretto , Elijah Hartvigsen " ciborium,https://github.com/enarx/ciborium,Apache-2.0,Nathaniel McCallum +ciborium-io,https://github.com/enarx/ciborium,Apache-2.0,Nathaniel McCallum +ciborium-ll,https://github.com/enarx/ciborium,Apache-2.0,Nathaniel McCallum +clang-sys,https://github.com/KyleMayes/clang-sys,Apache-2.0,Kyle Mayes clap,https://github.com/clap-rs/clap,MIT OR Apache-2.0,The clap Authors clap_builder,https://github.com/clap-rs/clap,MIT OR Apache-2.0,The clap_builder Authors clap_derive,https://github.com/clap-rs/clap,MIT OR Apache-2.0,The clap_derive Authors @@ -53,9 +65,12 @@ clap_lex,https://github.com/clap-rs/clap,MIT OR Apache-2.0,The clap_lex Authors colored,https://github.com/mackwic/colored,MPL-2.0,Thomas Wickham combine,https://github.com/Marwes/combine,MIT,Markus Westerlind comfy-table,https://github.com/nukesor/comfy-table,MIT,Arne Beer +compression-codecs,https://github.com/Nullus157/async-compression,MIT OR Apache-2.0,"Wim Looman , Allen Bui " +compression-core,https://github.com/Nullus157/async-compression,MIT OR Apache-2.0,"Wim Looman , Allen Bui " const-fnv1a-hash,https://github.com/HindrikStegenga/const-fnv1a-hash,MIT,The const-fnv1a-hash Authors const-hex,https://github.com/danipopes/const-hex,MIT OR Apache-2.0,DaniPopes <57450786+DaniPopes@users.noreply.github.com> core-foundation,https://github.com/servo/core-foundation-rs,MIT OR Apache-2.0,The Servo Project Developers +core-foundation-sys,https://github.com/servo/core-foundation-rs,MIT OR Apache-2.0,The Servo Project Developers cpufeatures,https://github.com/RustCrypto/utils,MIT OR Apache-2.0,RustCrypto Developers crc32fast,https://github.com/srijs/rust-crc32fast,MIT OR Apache-2.0,"Sam Rijs , Alex Crichton " criterion-plot,https://github.com/criterion-rs/criterion.rs,Apache-2.0 OR MIT,"Jorge Aparicio , Brook Heisler " @@ -70,11 +85,14 @@ crossterm_winapi,https://github.com/crossterm-rs/crossterm-winapi,MIT,T. Post crunchy,https://github.com/eira-fransham/crunchy,MIT,Eira Fransham crypto-common,https://github.com/RustCrypto/traits,MIT OR Apache-2.0,RustCrypto Developers darling,https://github.com/TedDriggs/darling,MIT,Ted Driggs +darling_core,https://github.com/TedDriggs/darling,MIT,Ted Driggs +darling_macro,https://github.com/TedDriggs/darling,MIT,Ted Driggs data-encoding,https://github.com/ia0/data-encoding,MIT,Julien Cretin der-parser,https://github.com/rusticata/der-parser,MIT OR Apache-2.0,Pierre Chifflier deranged,https://github.com/jhpratt/deranged,MIT OR Apache-2.0,Jacob Pratt derive-ex,https://github.com/frozenlib/derive-ex,MIT OR Apache-2.0,frozenlib derive_more,https://github.com/JelteF/derive_more,MIT,Jelte Fennema +derive_more-impl,https://github.com/JelteF/derive_more,MIT,Jelte Fennema digest,https://github.com/RustCrypto/traits,MIT OR Apache-2.0,RustCrypto Developers displaydoc,https://github.com/yaahc/displaydoc,MIT OR Apache-2.0,Jane Lusby document-features,https://github.com/slint-ui/document-features,MIT OR Apache-2.0,Slint Developers @@ -97,6 +115,7 @@ flate2,https://github.com/rust-lang/flate2-rs,MIT OR Apache-2.0,"Alex Crichton < float-cmp,https://github.com/mikedilger/float-cmp,MIT,Mike Dilger fnv,https://github.com/servo/rust-fnv,Apache-2.0 OR MIT,Alex Crichton foldhash,https://github.com/orlp/foldhash,Zlib,Orson Peters +form_urlencoded,https://github.com/servo/rust-url,MIT OR Apache-2.0,The rust-url developers fs4,https://github.com/al8n/fs4-rs,MIT OR Apache-2.0,"Dan Burkert , Al Liu " futures,https://github.com/rust-lang/futures-rs,MIT OR Apache-2.0,The futures Authors futures-channel,https://github.com/rust-lang/futures-rs,MIT OR Apache-2.0,The futures-channel Authors @@ -107,6 +126,7 @@ futures-macro,https://github.com/rust-lang/futures-rs,MIT OR Apache-2.0,The futu futures-sink,https://github.com/rust-lang/futures-rs,MIT OR Apache-2.0,The futures-sink Authors futures-task,https://github.com/rust-lang/futures-rs,MIT OR Apache-2.0,The futures-task Authors futures-util,https://github.com/rust-lang/futures-rs,MIT OR Apache-2.0,The futures-util Authors +generator,https://github.com/Xudong-Huang/generator-rs,MIT OR Apache-2.0,Xudong Huang generic-array,https://github.com/fizyk20/generic-array,MIT,"Bartłomiej Kamiński , Aaron Trent " getrandom,https://github.com/rust-random/getrandom,MIT OR Apache-2.0,The Rand Project Developers gimli,https://github.com/gimli-rs/gimli,MIT OR Apache-2.0,The gimli Authors @@ -117,6 +137,7 @@ hash32,https://github.com/japaric/hash32,MIT OR Apache-2.0,Jorge Aparicio hashbrown,https://github.com/rust-lang/hashbrown,MIT OR Apache-2.0,The hashbrown Authors headers,https://github.com/hyperium/headers,MIT,Sean McArthur +headers-core,https://github.com/hyperium/headers,MIT,Sean McArthur heapless,https://github.com/rust-embedded/heapless,MIT OR Apache-2.0,"Jorge Aparicio , Per Lindgren , Emil Fresk " heck,https://github.com/withoutboats/heck,MIT OR Apache-2.0,The heck Authors hex,https://github.com/KokaKiwi/rust-hex,MIT OR Apache-2.0,KokaKiwi @@ -126,6 +147,7 @@ hickory-resolver,https://github.com/hickory-dns/hickory-dns,MIT OR Apache-2.0,Th home,https://github.com/rust-lang/cargo,MIT OR Apache-2.0,Brian Anderson http,https://github.com/hyperium/http,MIT OR Apache-2.0,"Alex Crichton , Carl Lerche , Sean McArthur " http-body,https://github.com/hyperium/http-body,MIT,"Carl Lerche , Lucio Franco , Sean McArthur " +http-body-util,https://github.com/hyperium/http-body,MIT,"Carl Lerche , Lucio Franco , Sean McArthur " http-serde-ext,https://github.com/andrewtoth/http-serde-ext,MIT,Andrew Toth httparse,https://github.com/seanmonstar/httparse,MIT OR Apache-2.0,Sean McArthur httpdate,https://github.com/pyfisch/httpdate,MIT OR Apache-2.0,Pyfisch @@ -149,6 +171,7 @@ icu_provider,https://github.com/unicode-org/icu4x,Unicode-3.0,The ICU4X Project id-arena,https://github.com/fitzgen/id-arena,MIT OR Apache-2.0,"Nick Fitzgerald , Aleksey Kladov " iddqd,https://github.com/oxidecomputer/iddqd,MIT OR Apache-2.0,The iddqd Authors ident_case,https://github.com/TedDriggs/ident_case,MIT OR Apache-2.0,Ted Driggs +idna,https://github.com/servo/rust-url,MIT OR Apache-2.0,The rust-url developers idna_adapter,https://github.com/hsivonen/idna_adapter,Apache-2.0 OR MIT,The rust-url developers impls,https://github.com/nvzqz/impls,MIT OR Apache-2.0,"Nikolai Vazquez, Nadrieril Feneanar" indexmap,https://github.com/indexmap-rs/indexmap,Apache-2.0 OR MIT,The indexmap Authors @@ -158,6 +181,7 @@ ipnet,https://github.com/krisprice/ipnet,MIT OR Apache-2.0,Kris Price jiff,https://github.com/BurntSushi/jiff,Unlicense OR MIT,Andrew Gallant +jiff-static,https://github.com/BurntSushi/jiff,Unlicense OR MIT,Andrew Gallant jni,https://github.com/jni-rs/jni-rs,MIT OR Apache-2.0,jni team jni-macros,https://github.com/jni-rs/jni-rs,MIT OR Apache-2.0,The jni-macros Authors jni-sys,https://github.com/jni-rs/jni-sys,MIT OR Apache-2.0,"Steven Fackler , Robert Bragg " @@ -168,6 +192,8 @@ jsonpath-rust,https://github.com/besok/jsonpath-rust,MIT,BorisZhguchev keccak,https://github.com/RustCrypto/sponges,Apache-2.0 OR MIT,RustCrypto Developers kube,https://github.com/kube-rs/kube,Apache-2.0,"clux , Natalie Klestrup Röijezon , kazk " +kube-client,https://github.com/kube-rs/kube,Apache-2.0,"clux , Natalie Klestrup Röijezon , kazk " +kube-core,https://github.com/kube-rs/kube,Apache-2.0,"clux , Natalie Klestrup Röijezon , kazk " lading-payload,https://github.com/datadog/lading,MIT,"Brian L. Troutwine , George Hahn leb128fmt,https://github.com/bluk/leb128fmt,MIT OR Apache-2.0,Bryant Luk @@ -175,11 +201,16 @@ libc,https://github.com/rust-lang/libc,MIT OR Apache-2.0,The Rust Project Develo libloading,https://github.com/nagisa/rust_libloading,ISC,Simonas Kazlauskas libm,https://github.com/rust-lang/compiler-builtins,MIT,"Alex Crichton , Amanieu d'Antras , Jorge Aparicio , Trevor Gross " linkme,https://github.com/dtolnay/linkme,MIT OR Apache-2.0,David Tolnay +linkme-impl,https://github.com/dtolnay/linkme,MIT OR Apache-2.0,David Tolnay linux-raw-sys,https://github.com/sunfishcode/linux-raw-sys,Apache-2.0 WITH LLVM-exception OR Apache-2.0 OR MIT,Dan Gohman litemap,https://github.com/unicode-org/icu4x,Unicode-3.0,The ICU4X Project Developers litrs,https://github.com/LukasKalbertodt/litrs,MIT OR Apache-2.0,Lukas Kalbertodt +lock_api,https://github.com/Amanieu/parking_lot,MIT OR Apache-2.0,Amanieu d'Antras log,https://github.com/rust-lang/log,MIT OR Apache-2.0,The Rust Project Developers logos,https://github.com/maciejhirsz/logos,MIT OR Apache-2.0,"Maciej Hirsz , Jérome Eertmans (maintainer) " +logos-codegen,https://github.com/maciejhirsz/logos,MIT OR Apache-2.0,"Maciej Hirsz , Jérome Eertmans (maintainer) " +logos-derive,https://github.com/maciejhirsz/logos,MIT OR Apache-2.0,"Maciej Hirsz , Jérome Eertmans (maintainer) " +loom,https://github.com/tokio-rs/loom,MIT,Carl Lerche lru-slab,https://github.com/Ralith/lru-slab,MIT OR Apache-2.0 OR Zlib,Benjamin Saunders mach2,https://github.com/JohnTitor/mach2,BSD-2-Clause OR MIT OR Apache-2.0,The mach2 Authors matchers,https://github.com/hawkw/matchers,MIT,Eliza Weisman @@ -188,6 +219,7 @@ matrixmultiply,https://github.com/bluss/matrixmultiply,MIT OR Apache-2.0,"bluss, memchr,https://github.com/BurntSushi/memchr,Unlicense OR MIT,"Andrew Gallant , bluss" memoffset,https://github.com/Gilnaa/memoffset,MIT,Gilad Naaman metrics,https://github.com/metrics-rs/metrics,MIT,Toby Lawrence +metrics-util,https://github.com/metrics-rs/metrics,MIT,Toby Lawrence mime,https://github.com/hyperium/mime,MIT OR Apache-2.0,Sean McArthur minimal-lexical,https://github.com/Alexhuszagh/minimal-lexical,MIT OR Apache-2.0,Alex Huszagh miniz_oxide,https://github.com/Frommi/miniz_oxide/tree/master/miniz_oxide,MIT OR Zlib OR Apache-2.0,"Frommi , oyvindln , Rich Geldreich richgel99@gmail.com" @@ -222,18 +254,26 @@ ordered-float,https://github.com/reem/rust-ordered-float,MIT,"Jonathan Reem papaya,https://github.com/ibraheemdev/papaya,MIT,Ibraheem Ahmed parking_lot,https://github.com/Amanieu/parking_lot,MIT OR Apache-2.0,Amanieu d'Antras +parking_lot_core,https://github.com/Amanieu/parking_lot,MIT OR Apache-2.0,Amanieu d'Antras pastey,https://github.com/as1100k/pastey,MIT OR Apache-2.0,"Aditya Kumar , David Tolnay " pear,https://github.com/SergioBenitez/Pear,MIT OR Apache-2.0,Sergio Benitez pear_codegen,https://github.com/SergioBenitez/Pear,MIT OR Apache-2.0,Sergio Benitez pem,https://github.com/jcreekmore/pem-rs,MIT,Jonathan Creekmore +percent-encoding,https://github.com/servo/rust-url,MIT OR Apache-2.0,The rust-url developers pest,https://github.com/pest-parser/pest,MIT OR Apache-2.0,Dragoș Tiselice +pest_derive,https://github.com/pest-parser/pest,MIT OR Apache-2.0,Dragoș Tiselice +pest_generator,https://github.com/pest-parser/pest,MIT OR Apache-2.0,Dragoș Tiselice +pest_meta,https://github.com/pest-parser/pest,MIT OR Apache-2.0,Dragoș Tiselice petgraph,https://github.com/petgraph/petgraph,MIT OR Apache-2.0,"bluss, mitchmindtree" phf,https://github.com/rust-phf/rust-phf,MIT,Steven Fackler +phf_shared,https://github.com/rust-phf/rust-phf,MIT,Steven Fackler piecemeal,https://github.com/tobz/piecemeal,Apache-2.0,Toby Lawrence pin-project,https://github.com/taiki-e/pin-project,Apache-2.0 OR MIT,The pin-project Authors pin-project-internal,https://github.com/taiki-e/pin-project,Apache-2.0 OR MIT,The pin-project-internal Authors pin-project-lite,https://github.com/taiki-e/pin-project-lite,Apache-2.0 OR MIT,The pin-project-lite Authors plotters,https://github.com/plotters-rs/plotters,MIT,Hao Hou +plotters-backend,https://github.com/plotters-rs/plotters,MIT,Hao Hou +plotters-svg,https://github.com/plotters-rs/plotters,MIT,Hao Hou portable-atomic,https://github.com/taiki-e/portable-atomic,Apache-2.0 OR MIT,The portable-atomic Authors portable-atomic-util,https://github.com/taiki-e/portable-atomic-util,Apache-2.0 OR MIT,The portable-atomic-util Authors potential_utf,https://github.com/unicode-org/icu4x,Unicode-3.0,The ICU4X Project Developers @@ -245,8 +285,12 @@ proc-macro2,https://github.com/dtolnay/proc-macro2,MIT OR Apache-2.0,"David Toln proc-macro2-diagnostics,https://github.com/SergioBenitez/proc-macro2-diagnostics,MIT OR Apache-2.0,Sergio Benitez proptest,https://github.com/proptest-rs/proptest,MIT OR Apache-2.0,Jason Lingle prost,https://github.com/tokio-rs/prost,Apache-2.0,"Dan Burkert , Lucio Franco , Casper Meijn , Tokio Contributors " +prost-build,https://github.com/tokio-rs/prost,Apache-2.0,"Dan Burkert , Lucio Franco , Casper Meijn , Tokio Contributors " +prost-derive,https://github.com/tokio-rs/prost,Apache-2.0,"Dan Burkert , Lucio Franco , Casper Meijn , Tokio Contributors " +prost-types,https://github.com/tokio-rs/prost,Apache-2.0,"Dan Burkert , Lucio Franco , Casper Meijn , Tokio Contributors " protobuf,https://github.com/stepancheg/rust-protobuf,MIT,Stepan Koltsov protobuf-parse,https://github.com/stepancheg/rust-protobuf/tree/master/protobuf-parse,MIT,Stepan Koltsov +protobuf-support,https://github.com/stepancheg/rust-protobuf,MIT,Stepan Koltsov quanta,https://github.com/metrics-rs/quanta,MIT,Toby Lawrence quick_cache,https://github.com/arthurprs/quick-cache,MIT,Arthur Silva quinn,https://github.com/quinn-rs/quinn,MIT OR Apache-2.0,The quinn Authors @@ -256,6 +300,7 @@ quote,https://github.com/dtolnay/quote,MIT OR Apache-2.0,David Tolnay regex,https://github.com/rust-lang/regex,MIT OR Apache-2.0,"The Rust Project Developers, Andrew Gallant " +regex-automata,https://github.com/rust-lang/regex,MIT OR Apache-2.0,"The Rust Project Developers, Andrew Gallant " +regex-syntax,https://github.com/rust-lang/regex,MIT OR Apache-2.0,"The Rust Project Developers, Andrew Gallant " reqwest,https://github.com/seanmonstar/reqwest,MIT OR Apache-2.0,Sean McArthur resolv-conf,https://github.com/hickory-dns/resolv-conf,MIT OR Apache-2.0,The resolv-conf Authors ring,https://github.com/briansmith/ring,Apache-2.0 AND ISC,The ring Authors @@ -291,20 +338,25 @@ rustversion,https://github.com/dtolnay/rustversion,MIT OR Apache-2.0,David Tolna ryu,https://github.com/dtolnay/ryu,Apache-2.0 OR BSL-1.0,David Tolnay same-file,https://github.com/BurntSushi/same-file,Unlicense OR MIT,Andrew Gallant schannel,https://github.com/steffengy/schannel-rs,MIT,"Steven Fackler , Steffen Butzer " +scoped-tls,https://github.com/alexcrichton/scoped-tls,MIT OR Apache-2.0,Alex Crichton scopeguard,https://github.com/bluss/scopeguard,MIT OR Apache-2.0,bluss secrecy,https://github.com/iqlusioninc/crates/tree/main/secrecy,Apache-2.0 OR MIT,Tony Arcieri security-framework,https://github.com/kornelski/rust-security-framework,MIT OR Apache-2.0,"Steven Fackler , Kornel " +security-framework-sys,https://github.com/kornelski/rust-security-framework,MIT OR Apache-2.0,"Steven Fackler , Kornel " seize,https://github.com/ibraheemdev/seize,MIT,Ibraheem Ahmed semver,https://github.com/dtolnay/semver,MIT OR Apache-2.0,David Tolnay serde,https://github.com/serde-rs/serde,MIT OR Apache-2.0,"Erick Tryzelaar , David Tolnay " serde-value,https://github.com/arcnmx/serde-value,MIT,arcnmx serde_bytes,https://github.com/serde-rs/bytes,MIT OR Apache-2.0,David Tolnay +serde_core,https://github.com/serde-rs/serde,MIT OR Apache-2.0,"Erick Tryzelaar , David Tolnay " +serde_derive,https://github.com/serde-rs/serde,MIT OR Apache-2.0,"Erick Tryzelaar , David Tolnay " serde_html_form,https://github.com/jplatte/serde_html_form,MIT,The serde_html_form Authors serde_json,https://github.com/serde-rs/json,MIT OR Apache-2.0,"Erick Tryzelaar , David Tolnay " serde_path_to_error,https://github.com/dtolnay/path-to-error,MIT OR Apache-2.0,David Tolnay serde_repr,https://github.com/dtolnay/serde-repr,MIT OR Apache-2.0,David Tolnay serde_spanned,https://github.com/toml-rs/toml,MIT OR Apache-2.0,The serde_spanned Authors serde_tuple,https://github.com/kardeiz/serde_tuple,MIT,Jacob Brown +serde_tuple_macros,https://github.com/kardeiz/serde_tuple,MIT,Jacob Brown serde_urlencoded,https://github.com/nox/serde_urlencoded,MIT OR Apache-2.0,Anthony Ramine serde_with,https://github.com/jonasbb/serde_with,MIT OR Apache-2.0,"Jonas Bushart, Marcin Kaźmierczak" serde_with_macros,https://github.com/jonasbb/serde_with,MIT OR Apache-2.0,Jonas Bushart @@ -324,42 +376,55 @@ sketches-ddsketch,https://github.com/mheffner/rust-sketches-ddsketch,Apache-2.0, slab,https://github.com/tokio-rs/slab,MIT,Carl Lerche smallvec,https://github.com/servo/rust-smallvec,MIT OR Apache-2.0,The Servo Project Developers snafu,https://github.com/shepmaster/snafu,MIT OR Apache-2.0,Jake Goulding +snafu-derive,https://github.com/shepmaster/snafu,MIT OR Apache-2.0,Jake Goulding socket2,https://github.com/rust-lang/socket2,MIT OR Apache-2.0,"Alex Crichton , Thomas de Zeeuw " sponge-cursor,https://github.com/RustCrypto/utils,MIT OR Apache-2.0,RustCrypto Developers stable_deref_trait,https://github.com/storyyeller/stable_deref_trait,MIT OR Apache-2.0,Robert Grosse strsim,https://github.com/rapidfuzz/strsim-rs,MIT,"Danny Guo , maxbachmann " structmeta,https://github.com/frozenlib/structmeta,MIT OR Apache-2.0,frozenlib +structmeta-derive,https://github.com/frozenlib/structmeta,MIT OR Apache-2.0,frozenlib subtle,https://github.com/dalek-cryptography/subtle,BSD-3-Clause,"Isis Lovecruft , Henry de Valence " symlink,https://gitlab.com/chris-morgan/symlink,MIT OR Apache-2.0,Chris Morgan syn,https://github.com/dtolnay/syn,MIT OR Apache-2.0,David Tolnay sync_wrapper,https://github.com/Actyx/sync_wrapper,Apache-2.0,Actyx AG synstructure,https://github.com/mystor/synstructure,MIT,Nika Layzell system-configuration,https://github.com/mullvad/system-configuration-rs,MIT OR Apache-2.0,Mullvad VPN +system-configuration-sys,https://github.com/mullvad/system-configuration-rs,MIT OR Apache-2.0,Mullvad VPN tagptr,https://github.com/oliver-giersch/tagptr,MIT OR Apache-2.0,Oliver Giersch target-triple,https://github.com/dtolnay/target-triple,MIT OR Apache-2.0,David Tolnay tempfile,https://github.com/Stebalien/tempfile,MIT OR Apache-2.0,"Steven Allen , The Rust Project Developers, Ashley Mannix , Jason White " termcolor,https://github.com/BurntSushi/termcolor,Unlicense OR MIT,Andrew Gallant thiserror,https://github.com/dtolnay/thiserror,MIT OR Apache-2.0,David Tolnay +thiserror-impl,https://github.com/dtolnay/thiserror,MIT OR Apache-2.0,David Tolnay thousands,https://github.com/tov/thousands-rs,MIT OR Apache-2.0,Jesse A. Tov thread_local,https://github.com/Amanieu/thread_local-rs,MIT OR Apache-2.0,Amanieu d'Antras tikv-jemalloc-sys,https://github.com/tikv/jemallocator,MIT OR Apache-2.0,"Alex Crichton , Gonzalo Brito Gadeschi , The TiKV Project Developers" tikv-jemallocator,https://github.com/tikv/jemallocator,MIT OR Apache-2.0,"Alex Crichton , Gonzalo Brito Gadeschi , Simon Sapin , Steven Fackler , The TiKV Project Developers" time,https://github.com/time-rs/time,MIT OR Apache-2.0,"Jacob Pratt , Time contributors" +time-core,https://github.com/time-rs/time,MIT OR Apache-2.0,"Jacob Pratt , Time contributors" +time-macros,https://github.com/time-rs/time,MIT OR Apache-2.0,"Jacob Pratt , Time contributors" tinystr,https://github.com/unicode-org/icu4x,Unicode-3.0,The ICU4X Project Developers tinytemplate,https://github.com/bheisler/TinyTemplate,Apache-2.0 OR MIT,Brook Heisler tinyvec,https://github.com/Lokathor/tinyvec,Zlib OR Apache-2.0 OR MIT,Lokathor tinyvec_macros,https://github.com/Soveu/tinyvec_macros,MIT OR Apache-2.0 OR Zlib,Soveu tokio,https://github.com/tokio-rs/tokio,MIT,Tokio Contributors +tokio-macros,https://github.com/tokio-rs/tokio,MIT,Tokio Contributors tokio-rustls,https://github.com/rustls/tokio-rustls,MIT OR Apache-2.0,The tokio-rustls Authors +tokio-stream,https://github.com/tokio-rs/tokio,MIT,Tokio Contributors tokio-tungstenite,https://github.com/snapview/tokio-tungstenite,MIT,"Daniel Abramov , Alexey Galakhov " +tokio-util,https://github.com/tokio-rs/tokio,MIT,Tokio Contributors tokio-vsock,https://github.com/rust-vsock/tokio-vsock,Apache-2.0,"fsyncd, rust-vsock" toml,https://github.com/toml-rs/toml,MIT OR Apache-2.0,The toml Authors toml_datetime,https://github.com/toml-rs/toml,MIT OR Apache-2.0,The toml_datetime Authors toml_parser,https://github.com/toml-rs/toml,MIT OR Apache-2.0,The toml_parser Authors toml_writer,https://github.com/toml-rs/toml,MIT OR Apache-2.0,The toml_writer Authors tonic,https://github.com/hyperium/tonic,MIT,Lucio Franco +tonic-build,https://github.com/hyperium/tonic,MIT,Lucio Franco +tonic-prost,https://github.com/hyperium/tonic,MIT,Lucio Franco tower,https://github.com/tower-rs/tower,MIT,Tower Maintainers tower-http,https://github.com/tower-rs/tower-http,MIT,Tower Maintainers +tower-layer,https://github.com/tower-rs/tower,MIT,Tower Maintainers +tower-service,https://github.com/tower-rs/tower,MIT,Tower Maintainers tracing,https://github.com/tokio-rs/tracing,MIT,"Eliza Weisman , Tokio Contributors " tracing-appender,https://github.com/tokio-rs/tracing,MIT,"Zeki Sherif , Tokio Contributors " tracing-attributes,https://github.com/tokio-rs/tracing,MIT,"Tokio Contributors , Eliza Weisman , David Barsky " @@ -410,7 +475,9 @@ webpki-root-certs,https://github.com/rustls/webpki-roots,CDLA-Permissive-2.0,The which,https://github.com/harryfei/which-rs,MIT,Harry Fei widestring,https://github.com/VoidStarKat/widestring-rs,MIT OR Apache-2.0,The widestring Authors winapi,https://github.com/retep998/winapi-rs,MIT OR Apache-2.0,Peter Atashian +winapi-i686-pc-windows-gnu,https://github.com/retep998/winapi-rs,MIT OR Apache-2.0,Peter Atashian winapi-util,https://github.com/BurntSushi/winapi-util,Unlicense OR MIT,Andrew Gallant +winapi-x86_64-pc-windows-gnu,https://github.com/retep998/winapi-rs,MIT OR Apache-2.0,Peter Atashian windows-core,https://github.com/microsoft/windows-rs,MIT OR Apache-2.0,The windows-core Authors windows-implement,https://github.com/microsoft/windows-rs,MIT OR Apache-2.0,The windows-implement Authors windows-interface,https://github.com/microsoft/windows-rs,MIT OR Apache-2.0,The windows-interface Authors @@ -431,6 +498,9 @@ windows_x86_64_gnullvm,https://github.com/microsoft/windows-rs,MIT OR Apache-2.0 windows_x86_64_msvc,https://github.com/microsoft/windows-rs,MIT OR Apache-2.0,Microsoft winnow,https://github.com/winnow-rs/winnow,MIT,The winnow Authors wit-bindgen,https://github.com/bytecodealliance/wit-bindgen,Apache-2.0 WITH LLVM-exception OR Apache-2.0 OR MIT,Alex Crichton +wit-bindgen-core,https://github.com/bytecodealliance/wit-bindgen,Apache-2.0 WITH LLVM-exception OR Apache-2.0 OR MIT,Alex Crichton +wit-bindgen-rust,https://github.com/bytecodealliance/wit-bindgen,Apache-2.0 WITH LLVM-exception OR Apache-2.0 OR MIT,Alex Crichton +wit-bindgen-rust-macro,https://github.com/bytecodealliance/wit-bindgen,Apache-2.0 WITH LLVM-exception OR Apache-2.0 OR MIT,Alex Crichton wit-component,https://github.com/bytecodealliance/wasm-tools/tree/main/crates/wit-component,Apache-2.0 WITH LLVM-exception OR Apache-2.0 OR MIT,Peter Huene wit-parser,https://github.com/bytecodealliance/wasm-tools/tree/main/crates/wit-parser,Apache-2.0 WITH LLVM-exception OR Apache-2.0 OR MIT,Alex Crichton writeable,https://github.com/unicode-org/icu4x,Unicode-3.0,The ICU4X Project Developers @@ -440,6 +510,7 @@ yasna,https://github.com/qnighy/yasna.rs,MIT OR Apache-2.0,Masaki Hara yoke-derive,https://github.com/unicode-org/icu4x,Unicode-3.0,Manish Goregaokar zerocopy,https://github.com/google/zerocopy,BSD-2-Clause OR Apache-2.0 OR MIT,"Joshua Liebow-Feeser , Jack Wrenn " +zerocopy-derive,https://github.com/google/zerocopy,BSD-2-Clause OR Apache-2.0 OR MIT,"Joshua Liebow-Feeser , Jack Wrenn " zerofrom,https://github.com/unicode-org/icu4x,Unicode-3.0,The ICU4X Project Developers zerofrom-derive,https://github.com/unicode-org/icu4x,Unicode-3.0,Manish Goregaokar zeroize,https://github.com/RustCrypto/utils,Apache-2.0 OR MIT,The RustCrypto Project Developers From 082cc7c197ebadefad9dcbed0f9473277af7b324 Mon Sep 17 00:00:00 2001 From: Matthew James Briggs Date: Fri, 5 Jun 2026 18:45:32 +0200 Subject: [PATCH 3/4] remove an oops file --- .../config-testsupport/dogstatsd.md | 565 ------------------ 1 file changed, 565 deletions(-) delete mode 100644 lib/datadog-agent/config-testsupport/dogstatsd.md diff --git a/lib/datadog-agent/config-testsupport/dogstatsd.md b/lib/datadog-agent/config-testsupport/dogstatsd.md deleted file mode 100644 index 0f3d23d347b..00000000000 --- a/lib/datadog-agent/config-testsupport/dogstatsd.md +++ /dev/null @@ -1,565 +0,0 @@ -# Configuring DogStatsD on Agent Data Plane - - - -The DogStatsD implementation on ADP has been redesigned in Rust for better resource guarantees and -efficiency. Because the architecture is different from the original implementation, certain -configuration values may behave differently, be planned but not yet implemented, or not apply at -all. This page documents those nuances. - -ADP is designed to be transparent: customers configure DogStatsD the same way they always have. The -sections below call out the cases where that is either not yet true, or not quite possible. - -If you find an error on this page, please [open an issue]. - - -[open an issue]: https://github.com/DataDog/saluki/issues - - -## Unsupported Settings - - -### Being Worked On - -The following settings are not yet supported in ADP but are planned with GitHub issue links for -tracking. - -| Config Key | Description | Issue | -| ------------------------------------------------------- | ----------------------------------------------- | ------- | -| `dogstatsd_experimental_http.enabled` | Enable experimental HTTP/H2C DSD listener | [#1682] | -| `dogstatsd_experimental_http.listen_address` | Bind address for experimental HTTP DSD listener | [#1682] | -| `dogstatsd_pipe_name` | Windows named pipe path | [#1466] | -| `dogstatsd_windows_pipe_security_descriptor` | Windows named pipe ACL descriptor | [#1466] | -| `forwarder_apikey_validation_interval` | API key check interval (minutes) | [#1357] | -| `serializer_experimental_use_v3_api.compression_level` | V3 API zstd compression level | [#1468] | -| `serializer_experimental_use_v3_api.series.endpoints` | Endpoints enabled for V3 series API | [#1468] | -| `serializer_experimental_use_v3_api.series.validate` | Dual-send v2+v3 series for validation | [#1468] | -| `serializer_experimental_use_v3_api.sketches.endpoints` | Endpoints enabling v3 sketches API | [#1468] | -| `serializer_experimental_use_v3_api.sketches.validate` | Dual-send v2+v3 sketches for validation | [#1468] | -| `sslkeylogfile` | TLS key log file path | [#1372] | -| `tls_handshake_timeout` | HTTP TLS handshake timeout | [#178] | - - -### Not Planned - -The following settings exist in the core agent but are not planned for ADP, typically because ADP's -architecture is fundamentally different or the feature is platform-specific. - -| Config Key | Description | Reason | -| ----------------------------------------------------------------- | ------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `aggregator_buffer_size` | Channel buffer depth for aggregator queues | Saluki topology uses fixed interconnect sizes and construction-time wiring; no per-component config knobs. | -| `aggregator_flush_metrics_and_serialize_in_parallel_buffer_size` | Parallel flush: series/sketch buffer size | Saluki topology uses fixed interconnect sizes; no per-component config knobs. | -| `aggregator_flush_metrics_and_serialize_in_parallel_chan_size` | Parallel flush: channel size | Saluki topology uses fixed interconnect sizes; no per-component config knobs. | -| `aggregator_stop_timeout` | Timeout (s) for aggregator flush on stop | Saluki topology uses fixed interconnect sizes and construction-time wiring; no per-component config knobs. | -| `aggregator_use_tags_store` | Enable shared tag deduplication store | Core agent concept with no ADP analog. | -| `config_id` | Fleet Automation config ID tag | Core Agent uses this only on Agent HA telemetry metrics. | -| `dogstatsd_disable_verbose_logs` | Suppress noisy parse error logs | ADP does not emit the verbose parse-error logs that this key filters in the core Agent, so there is nothing to suppress. | -| `dogstatsd_host_socket_path` | Host UDS socket dir for DSD | Not read by DSD server; admission controller only. | -| `dogstatsd_mem_based_rate_limiter.enabled` | Memory-based rate limiter toggle | See below | -| `dogstatsd_mem_based_rate_limiter.go_gc` | Memory rate limiter GC percent | Go GC-specific; ADP uses `memory_limit` instead. | -| `dogstatsd_mem_based_rate_limiter.high_soft_limit` | Memory rate limiter high soft limit | Go GC-specific; ADP uses `memory_limit` instead. | -| `dogstatsd_mem_based_rate_limiter.low_soft_limit` | Memory rate limiter low soft limit | Go GC-specific; ADP uses `memory_limit` instead. | -| `dogstatsd_mem_based_rate_limiter.memory_ballast` | Memory rate limiter heap ballast size | Go GC-specific; ADP uses `memory_limit` instead. | -| `dogstatsd_mem_based_rate_limiter.rate_check.factor` | Memory rate limiter check factor | Go GC-specific; ADP uses `memory_limit` instead. | -| `dogstatsd_mem_based_rate_limiter.rate_check.max` | Memory rate limiter check max interval | Go GC-specific; ADP uses `memory_limit` instead. | -| `dogstatsd_mem_based_rate_limiter.rate_check.min` | Memory rate limiter check min interval | Go GC-specific; ADP uses `memory_limit` instead. | -| `dogstatsd_mem_based_rate_limiter.soft_limit_freeos_check.factor` | Memory rate limiter FreeOS check factor | Go GC-specific; ADP uses `memory_limit` instead. | -| `dogstatsd_mem_based_rate_limiter.soft_limit_freeos_check.max` | Memory rate limiter FreeOS check max | Go GC-specific; ADP uses `memory_limit` instead. | -| `dogstatsd_mem_based_rate_limiter.soft_limit_freeos_check.min` | Memory rate limiter FreeOS check min | Go GC-specific; ADP uses `memory_limit` instead. | -| `dogstatsd_no_aggregation_pipeline_batch_size` | No-aggregation pipeline batch size | Fixed in ADP topology. | -| `dogstatsd_packet_buffer_flush_timeout` | Packet buffer flush timeout | ADP decodes inline. | -| `dogstatsd_packet_buffer_size` | Datagrams per packet buffer | ADP decodes inline. | -| `dogstatsd_pipeline_autoadjust` | Auto-adjust pipeline workers | ADP uses async tasks. | -| `dogstatsd_pipeline_count` | Parallel processing pipelines | ADP uses async tasks. | -| `dogstatsd_queue_size` | Packet channel buffer size | ADP uses async tasks. | -| `dogstatsd_stats_buffer` | Internal stats buffer size | ADP does not expose the core agent's packet-per-second expvar endpoint, so there is no persistent stats endpoint buffer to configure. | -| `dogstatsd_stats_enable` | Enable internal stats endpoint | See below | -| `dogstatsd_stats_port` | Internal stats endpoint port | ADP does not expose the core agent's packet-per-second expvar endpoint, so `dogstatsd_stats_port` has no effect. | -| `dogstatsd_telemetry_enabled_listener_id` | Per-listener telemetry tagging | Not feasible to thread listener identity through ADP's async decode pipeline. | -| `dogstatsd_workers_count` | Number of DSD processing workers | ADP uses async tasks. | -| `enable_json_stream_shared_compressor_buffers` | Pre-allocate shared compressor buffers | ADP does not use a shared compressor buffer pool; Rust request builders own fixed-capacity scratch and compression buffers. | -| `entity_id` | Agent pod entity ID | ADP internal DogStatsD telemetry uses OpenMetrics. | -| `heroku_dyno` | Heroku dyno telemetry mode | See below | -| `logging_frequency` | Transaction success log interval | The core agent uses `logging_frequency` to throttle repetitive successful transaction logs. ADP logs successful forwarder operations below the default `info` level, so there is no matching info-level success-log stream to throttle. This key is intentionally unused. | -| `use_dogstatsd` | Master DogStatsD enable toggle | Core Agent evaluates and sets `data_plane.dogstatsd.enabled`. | - -### `dogstatsd_mem_based_rate_limiter.enabled` - -The Core Agent exposes 11 keys under this prefix to apply backpressure when the Go -process approaches its memory limit. They work by manipulating Go's garbage collector -(`debug.SetGCPercent`, `debug.FreeOSMemory`), allocating a large heap ballast to adjust -GC heuristics, and blocking goroutines to slow packet ingestion. None of these mechanisms -have an equivalent in Rust, and ADP does not use a Go runtime. - -ADP takes a different approach to the same problem using explicit static memory accounting -and a process-level RSS limit. All 11 `dogstatsd_mem_based_rate_limiter.*` keys are not -planned. See [Memory Management](../memory.md) for details. - -### DogStatsD statistics (`dogstatsd_stats_enable` / `dogstatsd_metrics_stats_enable`) - -The core agent has two DogStatsD statistics mechanisms with different scopes. -`dogstatsd_stats_enable` enables packet-level throughput statistics from a ring buffer, exposed as -Go expvar data on `dogstatsd_stats_port` (default `5000`). Operators must configure an OpenMetrics -check to scrape that endpoint before the data is submitted. `dogstatsd_metrics_stats_enable` -enables runtime-toggleable metric-level debug statistics that track count and last-seen time per -unique metric and tag combination. That data powers the core agent's `dogstatsd-stats` CLI command -and HTTP endpoint. - -ADP does not mirror the packet-level statistics config path. Instead, ADP provides an on-demand -metric-level view through a DogStatsD statistics destination that is always wired into the -topology, but only collects data during a time-bounded request. To collect statistics, run -`agent-data-plane dogstatsd stats --duration-secs N` or call the privileged -`/dogstatsd/stats?collection_duration_secs=N` API. The handler waits for the requested collection -window, then returns count and last-seen time per metric context inline as JSON. The CLI uses the -same API and renders the result as either summary or cardinality analysis. - -ADP also exposes internal DogStatsD telemetry through its OpenMetrics endpoint, always-on at -`http:///metrics` (the unprivileged API endpoint; default port `5100`). Scrape -that endpoint to collect aggregate DogStatsD counters such as processed message counts, packet and -byte counts, packet pool usage, and channel latency. This endpoint is separate from -`/dogstatsd/stats`: it does not return the per-metric count and last-seen map, and it is not -controlled by the core agent's `dogstatsd_stats_*` keys. - -ADP does not expose the core agent's packet-per-second expvar endpoint or a persistent per-metric -DogStatsD statistics endpoint to scrape. You do not need to set up scraper configuration for this -per-metric data. The config keys `dogstatsd_stats_enable`, `dogstatsd_stats_buffer`, and -`dogstatsd_stats_port` have no effect in ADP. See [#1352]. - -### `heroku_dyno` - -The `heroku_dyno` setting affects the core Agent's self-telemetry heartbeat. It changes the Agent -flavor used by the core Agent aggregator so the running heartbeat is emitted as -`datadog.heroku_agent.running`. - -ADP does not run in the supported Heroku Agent package path: the Heroku Agent package excludes the -`agent-data-plane` dependency, and the Heroku Datadog launch script starts the core Agent, trace Agent, and -optionally process Agent without launching an `agent-data-plane` process. ADP also does not emit the -core Agent's `datadog..running` series. - -Because the affected heartbeat is core-Agent-owned and ADP is not part of the supported Heroku -deployment path, ADP does not implement `heroku_dyno`. See [#1753]. - - -## Behavioral Differences - - - -The following settings are recognized by both ADP and the core agent, but with different behavior or -default values. - -| Config Key | Description | -| ---------------------------------- | ----------------------------------------- | -| `dogstatsd_mapper_cache_size` | Mapper result LRU cache size | -| `dogstatsd_metrics_stats_enable` | Enable per-metric debug stats | -| `log_level` | Log verbosity directives | -| `min_tls_version` | Minimum TLS version for HTTPS connections | -| `multi_region_failover.enabled` | Enable multi-region failover mode | -| `serializer_zstd_compressor_level` | Zstd compression level | -| `skip_ssl_validation` | Skip TLS cert validation | -| `statsd_forward_host` | UDP packet forwarding destination host | - -### `dogstatsd_mapper_cache_size` - -ADP and the core agent both cache mapper results to skip regex evaluation on repeat -metric names. With the default value of `1000`, and with any positive integer, behavior -matches the core agent: results are cached in an LRU keyed by the original metric name, -including a negative-cache entry for names that match no profile. - -The two implementations diverge when this setting is `0`. In the core agent, `0` is -rejected by the underlying LRU library, which causes the entire mapper to be silently -disabled: mapping profiles configured by `dogstatsd_mapper_profiles` are not applied. In -ADP, `0` disables the result cache only; mapping profiles still run, so each metric pays -the regex evaluation cost without amortization. - -If you previously set `dogstatsd_mapper_cache_size: 0` in the core agent to turn off the -mapper, clear `dogstatsd_mapper_profiles` instead when running ADP. - -### `dogstatsd_metrics_stats_enable` - -See `dogstatsd_stats_enable` - -### `log_level` - -ADP accepts `log_level` as the startup logging control. A plain level applies to -ADP-owned and Saluki-owned targets only, including `agent_data_plane`, `saluki_*`, and -runtime crates under `lib/`. - -```yaml -log_level: debug -``` - -This keeps third-party dependencies such as `hyper`, `tokio`, and `tonic` at their -default filtering unless you opt them in. - -To control dependency logs or set a global fallback, use advanced `EnvFilter` directives -in `log_level`. ADP applies those directive strings as configured: - -```yaml -log_level: warn,agent_data_plane=debug,hyper=warn -``` - -### `min_tls_version` - -ADP supports `min_tls_version` for Datadog intake forwarding through the shared Datadog -forwarder. The default is `tlsv1.2`, which allows TLS 1.2 and TLS 1.3. To require TLS -1.3 only, set `min_tls_version: tlsv1.3` or `DD_MIN_TLS_VERSION=tlsv1.3`. - -The core agent also accepts `tlsv1.0` and `tlsv1.1`. ADP accepts those values for -configuration compatibility, but clamps them to TLS 1.2 because ADP uses `rustls`, which -does not support TLS 1.0 or TLS 1.1. - -This setting does not affect ADP IPC, local privileged APIs, ADP control-plane clients, -OTLP proxying to the core agent, or unrelated HTTP clients. - -### `multi_region_failover.enabled` - -ADP supports multi-region failover for metrics. When `multi_region_failover.enabled` and -`multi_region_failover.failover_metrics` are both `true`, ADP forwards metrics to the -primary Datadog endpoint and to a second MRF endpoint. - -To enable the MRF metrics branch at startup, configure `multi_region_failover.api_key` -and one of `multi_region_failover.site` or `multi_region_failover.dd_url`. If the MRF -endpoint configuration is incomplete, ADP skips the MRF branch and continues forwarding -to the primary endpoint. - -ADP does not fall back to the primary `api_key`, `site`, or `dd_url` for MRF traffic. -`multi_region_failover.enabled` and endpoint selection are resolved at startup. -`multi_region_failover.failover_metrics`, `multi_region_failover.metric_allowlist`, and -`multi_region_failover.api_key` can refresh from live configuration after the MRF branch -is enabled. - -| Config Key | Behavior | Default | -| ---------------------------------------- | -------------------------------------------------------------------------- | ------- | -| `multi_region_failover.enabled` | Enables multi-region failover mode. | `false` | -| `multi_region_failover.failover_metrics` | Enables metrics forwarding to the failover region when MRF is enabled. | `false` | -| `multi_region_failover.metric_allowlist` | Exact metric names to forward to MRF. Empty or unset forwards all metrics. | `[]` | -| `multi_region_failover.api_key` | API key for the failover-region endpoint. | unset | -| `multi_region_failover.site` | Datadog site for the failover region, used as `https://app.mrf.`. | unset | -| `multi_region_failover.dd_url` | Explicit failover intake URL. Takes precedence over `site` when set. | unset | - -### `serializer_zstd_compressor_level` - -ADP defaults to level 3 vs Agent level 1. ADP intentionally compresses better. Key is recognized by both; default divergence is intentional. - -### `skip_ssl_validation` - -ADP supports `skip_ssl_validation` for Datadog intake forwarding through the shared -Datadog forwarder. The default is `false`, which preserves normal server certificate -validation. When enabled, this setting affects the Datadog intake clients used by metrics, -logs, traces, events, and service checks that flow through the shared forwarder. - -This setting does not affect ADP IPC, local privileged APIs, ADP control-plane clients, -OTLP proxying to the core agent, or unrelated HTTP clients. In FIPS builds, ADP rejects -`skip_ssl_validation: true` because disabling TLS certificate validation is not -FIPS-compliant. - -### `statsd_forward_host` - -ADP supports DogStatsD forwarding when both `statsd_forward_host` and -`statsd_forward_port` are set. ADP forwards each framed DogStatsD message over UDP to the -configured destination before parsing, filtering, mapping, or aggregation. Forwarding -does not preserve the core Agent's packet-buffer grouping, so forwarded UDP datagrams may -be split differently while carrying the same DogStatsD messages. ADP logs setup failures -and tracks send failures through telemetry. - - -## Compatibility Unknown - - - -The following settings need further investigation. ADP behavior may differ from the core agent in -ways that are not yet fully characterized. - -| Config Key | Description | Issue | -| -------------------------------------------------------- | --------------------------------------------- | ------- | -| `autoscaling.failover.enabled` | Enable autoscaling failover metric routing | [#1684] | -| `autoscaling.failover.metrics` | Metric names forwarded to DCA for failover | [#1684] | -| `cluster_agent.enabled` | Enable Cluster Agent communication | [#1684] | -| `forwarder_flush_to_disk_mem_ratio` | Mem-to-disk flush threshold | [#1364] | -| `forwarder_low_prio_buffer_size` | Low-priority request queue size | [#1362] | -| `forwarder_max_concurrent_requests` | Max concurrent HTTP requests | [#1363] | -| `forwarder_requeue_buffer_size` | In-memory re-queue buffer size | [#1755] | -| `forwarder_retry_queue_capacity_time_interval_sec` | Retry queue time-based capacity | [#1365] | -| `forwarder_stop_timeout` | Timeout (s) for forwarder graceful stop | [#1754] | -| `telemetry.dogstatsd.aggregator_channel_latency_buckets` | Histogram buckets: DSD aggregator channel lag | [#1679] | -| `telemetry.dogstatsd.listeners_channel_latency_buckets` | Histogram buckets: listener channel latency | [#1679] | -| `telemetry.dogstatsd.listeners_latency_buckets` | Histogram buckets: listener processing | [#1679] | -| `telemetry.dogstatsd_origin` | Per-origin processed-metrics telemetry | [#1679] | - -## ADP-Only Settings - - - -The following settings are specific to ADP and have no equivalent in the core agent. - -| Config Key | Description | Default | -| --------------------------------------------------------------- | ------------------------------------------ | ------- | -| `aggregate_context_limit` | Max contexts per aggregation window | | -| `aggregate_flush_interval` | Aggregator flush period | | -| `aggregate_passthrough_idle_flush_timeout` | Passthrough buffer flush delay | | -| `aggregate_window_duration_seconds` | Aggregation window size | | -| `apm_config.obfuscation.sql.dbms` | SQL obfuscation DBMS dialect | | -| `apm_config.obfuscation.sql.dollar_quoted_func` | Preserve dollar-quoted SQL functions | | -| `apm_config.obfuscation.sql.keep_sql_alias` | Preserve SQL aliases in obfuscation | | -| `apm_config.obfuscation.sql.replace_digits` | Replace digits in SQL obfuscation | | -| `apm_config.obfuscation.sql.table_names` | Collect table names during obfuscation | | -| `counter_expiry_seconds` | Idle counter keep-alive duration | 300 | -| `data_plane.remote_agent_enabled` | Enable remote agent mode | true | -| `data_plane.use_new_config_stream_endpoint` | Use new config stream endpoint | | -| `dogstatsd_allow_context_heap_allocs` | Allow heap allocations for contexts | | -| `dogstatsd_autoscale_udp_listeners` | Bind multiple UDP sockets via SO_REUSEPORT | | -| `dogstatsd_buffer_count` | Number of receive buffers | | -| `dogstatsd_cached_contexts_limit` | Max cached metric contexts | | -| `dogstatsd_cached_tagsets_limit` | Max cached tagsets | | -| `dogstatsd_mapper_string_interner_size` | Mapper string interner capacity | | -| `dogstatsd_minimum_sample_rate` | Floor for metric sample rates | | -| `dogstatsd_permissive_decoding` | Relaxes decoder strictness | true | -| `dogstatsd_string_interner_size_bytes` | Explicit byte budget for context interner | | -| `dogstatsd_tcp_port` | TCP listen port for DSD | | -| `flush_timeout_secs` | Encoder flush timeout (secs) | | -| `memory_limit` | Process memory limit | | -| `memory_slop_factor` | Memory accounting slop fraction | 0.25 | -| `otlp_allow_context_heap_allocs` | Allow heap allocations for OTLP contexts | | -| `otlp_cached_contexts_limit` | Max cached OTLP metric contexts | | -| `otlp_cached_tagsets_limit` | Max cached OTLP tagsets | | -| `otlp_config.receiver.protocols.http.transport` | OTLP HTTP receiver transport | | -| `otlp_config.traces.enable_otlp_compute_top_level_by_span_kind` | Enable OTLP top-level-by-span-kind | | -| `otlp_config.traces.ignore_missing_datadog_fields` | Ignore missing Datadog fields in OTLP | | -| `otlp_config.traces.string_interner_size` | OTLP trace string interner capacity | | -| `otlp_string_interner_size` | OTLP context interner capacity | | -| `serializer_max_metrics_per_payload` | Max metrics per payload | | - -### `dogstatsd_minimum_sample_rate` - -ADP enforces a minimum sample rate on incoming metrics to prevent memory exhaustion from extremely low sample rates on histograms and sketches. Sending metrics with a very high inverse sample rate (for example `@0.0000001`) can cause unbounded memory growth in a sketch; this setting prevents that. The default is conservative enough that normal clients are unaffected. - -### `dogstatsd_permissive_decoding` - -By default, ADP parses DogStatsD packets with the same leniency as the core agent, accepting packets that technically violate the spec. Setting this to `false` enables strict mode, which rejects non-conformant packets. Strict mode is not available in the core agent. - -### `memory_limit` / `memory_slop_factor` - -ADP uses an explicit process memory limit (`memory_limit`) rather than relying on Go's garbage collector. The `memory_slop_factor` reserves a fraction of the limit to account for allocations not tracked by ADP's internal accounting. When memory usage approaches `memory_limit`, ADP's global limiter begins exerting backpressure (see `enable_global_limiter`). - -### `memory_slop_factor` - -See `memory_limit` above. - -### `data_plane.remote_agent_enabled` / `data_plane.use_new_config_stream_endpoint` - -These two keys are transitional flags being phased out. Both will be implied by `data_plane.standalone_mode=false` in a future release. Do not rely on them for new deployments. - -### `data_plane.use_new_config_stream_endpoint` - -See `data_plane.remote_agent_enabled` above. - - -## Transparent Settings - - - -The following settings work in ADP with the same behavior as the core agent. - -To enable syslog logging, set `log_to_syslog: true`. Console logging remains controlled by -`log_to_console`; enabling syslog does not disable console or file logging. If `syslog_uri` is empty -while syslog logging is enabled, ADP uses the platform default local syslog socket: -`unixgram:///dev/log` on Linux and `unixgram:///var/run/syslog` on macOS. Set `syslog_rfc: true` -when the receiving syslog daemon expects the Agent's RFC-style header. - -### DogStatsD metric debug log - -ADP supports the core agent's DogStatsD metric debug log. To write this file, set -`dogstatsd_metrics_stats_enable: true`. `dogstatsd_logging_enabled` also must be `true`; it defaults -to `true`, so most configurations only need to enable `dogstatsd_metrics_stats_enable`. - -When `dogstatsd_logging_enabled` is `true`, ADP connects an extra DogStatsD destination to the -decoded metric stream. The destination writes one line per metric sample with the metric name, tags, -count, and last-seen time while `dogstatsd_metrics_stats_enable` is `true`. When -`dogstatsd_metrics_stats_enable` is `false`, the destination drains decoded metrics and drops them. -This lets runtime configuration changes start and stop the debug log without rebuilding the -topology. This feature is for support and troubleshooting. It does not change normal metric -forwarding, and it does not replace the on-demand `/dogstatsd/stats` API. - -Use these settings to control the file: - -| Config Key | Behavior | -| ------------------------------ | ------------------------------------------------------------------------------------------- | -| `dogstatsd_log_file` | Output path. If empty, ADP uses the platform default DogStatsD stats log path. | -| `dogstatsd_log_file_max_rolls` | Number of rotated files to keep. Defaults to `3`. | -| `dogstatsd_log_file_max_size` | Maximum active file size before rotation. Defaults to `10Mb`. | -| `dogstatsd_logging_enabled` | Controls whether ADP wires the debug log destination into the topology. Defaults to `true`. | - -The default `dogstatsd_log_file` path is -`/var/log/datadog/dogstatsd_info/dogstatsd-stats.log` on Linux and other Unix platforms, -`/opt/datadog-agent/logs/dogstatsd_info/dogstatsd-stats.log` on macOS, and -`%ProgramData%\datadog\logs\dogstatsd_info\dogstatsd-stats.log` on Windows. - -This debug log differs from the `dogstatsd_capture_*` settings. The debug log records decoded metric -summaries after DogStatsD parsing. The capture settings record raw DogStatsD traffic for packet-level -investigation, and they remain tracked separately under [#1381]. - -### Payload debug logging (`log_payloads`) - -ADP supports `log_payloads` for debugging metric, event, and service check payload contents before -they enter Datadog encoders. To see these logs, set `log_payloads: true` and run with debug-level -logging enabled. - -When enabled, ADP logs decoded payload objects: scalar series metrics, sketches/distributions, -events, and service checks. These logs can contain high-volume customer data, including metric names, -tags, host and container metadata, event text, and service check messages. Use this setting only -while diagnosing payload content. - -ADP does not dump the exact encoded JSON or protobuf HTTP request body, and it does not log -compressed wire payload bytes. - -| Config Key | Description | -| -------------------------------------------------------------- | -------------------------------------------------- | -| `additional_endpoints` | Dual-ship to extra endpoints | -| `allow_arbitrary_tags` | Relax backend tag validation via HTTP header | -| `api_key` | API key for endpoint auth | -| `apm_config.obfuscation.credit_cards.enabled` | apm_config.obfuscation.credit_cards.enabled | -| `apm_config.obfuscation.credit_cards.keep_values` | apm_config.obfuscation.credit_cards.keep_values | -| `apm_config.obfuscation.credit_cards.luhn` | apm_config.obfuscation.credit_cards.luhn | -| `apm_config.obfuscation.elasticsearch.enabled` | apm_config.obfuscation.elasticsearch.enabled | -| `apm_config.obfuscation.elasticsearch.keep_values` | apm_config.obfuscation.elasticsearch.keep_values | -| `apm_config.obfuscation.elasticsearch.obfuscate_sql_values` | Obfuscate SQL values in ES queries | -| `apm_config.obfuscation.http.remove_paths_with_digits` | Strip numeric segments from HTTP paths | -| `apm_config.obfuscation.http.remove_query_string` | apm_config.obfuscation.http.remove_query_string | -| `apm_config.obfuscation.memcached.enabled` | apm_config.obfuscation.memcached.enabled | -| `apm_config.obfuscation.memcached.keep_command` | apm_config.obfuscation.memcached.keep_command | -| `apm_config.obfuscation.mongodb.enabled` | apm_config.obfuscation.mongodb.enabled | -| `apm_config.obfuscation.mongodb.keep_values` | apm_config.obfuscation.mongodb.keep_values | -| `apm_config.obfuscation.mongodb.obfuscate_sql_values` | Obfuscate SQL values in MongoDB queries | -| `apm_config.obfuscation.opensearch.enabled` | apm_config.obfuscation.opensearch.enabled | -| `apm_config.obfuscation.opensearch.keep_values` | apm_config.obfuscation.opensearch.keep_values | -| `apm_config.obfuscation.opensearch.obfuscate_sql_values` | Obfuscate SQL values in OpenSearch queries | -| `apm_config.obfuscation.redis.enabled` | apm_config.obfuscation.redis.enabled | -| `apm_config.obfuscation.redis.remove_all_args` | apm_config.obfuscation.redis.remove_all_args | -| `apm_config.obfuscation.valkey.enabled` | apm_config.obfuscation.valkey.enabled | -| `apm_config.obfuscation.valkey.remove_all_args` | apm_config.obfuscation.valkey.remove_all_args | -| `bind_host` | Global listen host fallback | -| `cmd_port` | Datadog Agent IPC/CMD API port | -| `cri_connection_timeout` | CRI container runtime connection timeout (s) | -| `cri_query_timeout` | CRI container runtime query timeout (s) | -| `data_plane.dogstatsd.aggregator_tag_filter_cache_capacity` | Tag-filter deduplication cache size | -| `dd_url` | Override intake endpoint URL | -| `dogstatsd_buffer_size` | Receive buffer size (bytes) | -| `dogstatsd_capture_depth` | Traffic capture channel depth | -| `dogstatsd_capture_path` | Traffic capture file location | -| `dogstatsd_context_expiry_seconds` | Context cache TTL (seconds) | -| `dogstatsd_entity_id_precedence` | Entity ID over auto-detection | -| `dogstatsd_eol_required` | Require newline-terminated messages | -| `dogstatsd_flush_incomplete_buckets` | Flush open buckets on shutdown | -| `dogstatsd_log_file` | DSD dedicated log file path | -| `dogstatsd_log_file_max_rolls` | DSD log file max roll count | -| `dogstatsd_log_file_max_size` | DSD log file max size | -| `dogstatsd_logging_enabled` | Enables DSD metric logging | -| `dogstatsd_mapper_profiles` | Metric mapping profile definitions | -| `dogstatsd_no_aggregation_pipeline` | Enable no-agg timestamped path | -| `dogstatsd_non_local_traffic` | Accept non-localhost UDP/TCP | -| `dogstatsd_origin_detection` | Enable UDS origin detection | -| `dogstatsd_origin_detection_client` | Honor client origin proto fields | -| `dogstatsd_origin_optout_enabled` | Allow clients to opt out origin | -| `dogstatsd_port` | UDP listen port | -| `dogstatsd_so_rcvbuf` | Socket receive buffer size | -| `dogstatsd_socket` | UDS datagram socket path | -| `dogstatsd_stream_log_too_big` | Log oversized UDS stream frames | -| `dogstatsd_stream_socket` | UDS stream socket path | -| `dogstatsd_string_interner_size` | String interner capacity | -| `dogstatsd_tag_cardinality` | Default tag cardinality level | -| `dogstatsd_tags` | Extra tags added to all DSD data | -| `enable_payloads.events` | Allow sending event payloads | -| `enable_payloads.series` | Allow sending series payloads | -| `enable_payloads.service_checks` | Allow sending service check payloads | -| `enable_payloads.sketches` | Allow sending sketch payloads | -| `env` | Agent environment name | -| `forwarder_backoff_base` | Retry backoff base (secs) | -| `forwarder_backoff_factor` | Retry backoff jitter factor | -| `forwarder_backoff_max` | Retry backoff ceiling (secs) | -| `forwarder_connection_reset_interval` | HTTP conn reset interval (secs) | -| `forwarder_high_prio_buffer_size` | High-priority request queue size | -| `forwarder_http_protocol` | HTTP version selection (auto/http1/http2) | -| `forwarder_num_workers` | Concurrent forwarder workers | -| `forwarder_outdated_file_in_days` | Days before retry files are deleted | -| `forwarder_recovery_interval` | Backoff recovery decrease factor | -| `forwarder_recovery_reset` | Reset errors on success | -| `forwarder_retry_queue_max_size` | Retry queue max size (deprecated) | -| `forwarder_retry_queue_payloads_max_size` | Retry queue max size (bytes) | -| `forwarder_storage_max_disk_ratio` | Max disk usage ratio for retry | -| `forwarder_storage_max_size_in_bytes` | Max on-disk retry storage size | -| `forwarder_storage_path` | On-disk retry storage directory | -| `forwarder_timeout` | Forwarder HTTP request timeout | -| `histogram_aggregates` | Histogram aggregate statistics | -| `histogram_copy_to_distribution` | Copy histograms to distributions | -| `histogram_copy_to_distribution_prefix` | Prefix for hist-to-dist copies | -| `log_format_rfc3339` | Use RFC 3339 timestamps in log output | -| `log_payloads` | Debug-log decoded payload contents before encoding | -| `metric_filterlist` | Metric name blocklist | -| `metric_filterlist_match_prefix` | Blocklist uses prefix matching | -| `multi_region_failover.api_key` | API key for the failover-region endpoint | -| `multi_region_failover.dd_url` | Failover intake URL | -| `multi_region_failover.failover_metrics` | Enable metrics forwarding to failover region | -| `multi_region_failover.metric_allowlist` | Metric name allowlist for MRF forwarding | -| `multi_region_failover.site` | Datadog site for the failover region | -| `no_proxy_nonexact_match` | Domain/CIDR `no_proxy` matching | -| `observability_pipelines_worker.metrics.enabled` | Route metrics to OPW instance | -| `observability_pipelines_worker.metrics.url` | OPW metrics intake URL | -| `origin_detection_unified` | Unified origin detection mode | -| `otlp_config.logs.enabled` | otlp_config.logs.enabled | -| `otlp_config.metrics.enabled` | otlp_config.metrics.enabled | -| `otlp_config.receiver.protocols.grpc.endpoint` | otlp_config.receiver.protocols.grpc.endpoint | -| `otlp_config.receiver.protocols.grpc.max_recv_msg_size_mib` | Max OTLP inbound gRPC message size (MiB) | -| `otlp_config.receiver.protocols.grpc.transport` | otlp_config.receiver.protocols.grpc.transport | -| `otlp_config.receiver.protocols.http.endpoint` | otlp_config.receiver.protocols.http.endpoint | -| `otlp_config.traces.enabled` | otlp_config.traces.enabled | -| `otlp_config.traces.internal_port` | otlp_config.traces.internal_port | -| `otlp_config.traces.probabilistic_sampler.sampling_percentage` | OTLP trace sampling percentage | -| `provider_kind` | Provider kind static tag | -| `proxy.http` | HTTP proxy URL | -| `proxy.https` | HTTPS proxy URL | -| `proxy.no_proxy` | Hosts bypassing proxy | -| `serializer_compressor_kind` | Payload compression algorithm | -| `serializer_max_payload_size` | Max compressed payload size (generic) | -| `serializer_max_series_payload_size` | Max compressed V2 series payload size | -| `serializer_max_series_points_per_payload` | Max data points per series payload | -| `serializer_max_series_uncompressed_payload_size` | Max uncompressed V2 series payload size | -| `serializer_max_uncompressed_payload_size` | Max uncompressed payload size (generic) | -| `site` | Datadog site domain | -| `statsd_forward_port` | UDP packet forwarding destination port | -| `statsd_metric_blocklist` | List of metric names to block/drop | -| `statsd_metric_blocklist_match_prefix` | Treat blocklist entries as prefixes | -| `statsd_metric_namespace` | Prefix prepended to all metric names | -| `statsd_metric_namespace_blacklist` | Prefixes exempt from namespace | -| `syslog_rfc` | Use RFC-style syslog header | -| `syslog_uri` | Syslog destination URI | -| `use_proxy_for_cloud_metadata` | Proxy cloud metadata endpoints | -| `use_v2_api.series` | Send series via V2 protobuf endpoint | -| `vector.metrics.enabled` | Route metrics to OPW (legacy alias) | -| `vector.metrics.url` | OPW metrics intake URL (legacy alias) | -| `vsock_addr` | vsock address for Agent IPC endpoint | - - -[#178]: https://github.com/DataDog/saluki/issues/178 -[#1350]: https://github.com/DataDog/saluki/issues/1350 -[#1352]: https://github.com/DataDog/saluki/issues/1352 -[#1357]: https://github.com/DataDog/saluki/issues/1357 -[#1360]: https://github.com/DataDog/saluki/issues/1360 -[#1361]: https://github.com/DataDog/saluki/issues/1361 -[#1362]: https://github.com/DataDog/saluki/issues/1362 -[#1363]: https://github.com/DataDog/saluki/issues/1363 -[#1364]: https://github.com/DataDog/saluki/issues/1364 -[#1365]: https://github.com/DataDog/saluki/issues/1365 -[#1372]: https://github.com/DataDog/saluki/issues/1372 -[#1381]: https://github.com/DataDog/saluki/issues/1381 -[#1466]: https://github.com/DataDog/saluki/issues/1466 -[#1468]: https://github.com/DataDog/saluki/issues/1468 -[#1679]: https://github.com/DataDog/saluki/issues/1679 -[#1681]: https://github.com/DataDog/saluki/issues/1681 -[#1682]: https://github.com/DataDog/saluki/issues/1682 -[#1684]: https://github.com/DataDog/saluki/issues/1684 -[#1687]: https://github.com/DataDog/saluki/issues/1687 -[#1749]: https://github.com/DataDog/saluki/issues/1749 -[#1753]: https://github.com/DataDog/saluki/issues/1753 -[#1754]: https://github.com/DataDog/saluki/issues/1754 -[#1755]: https://github.com/DataDog/saluki/issues/1755 - From 817e4051900215ea2a7934283324c6fbc8a92aba Mon Sep 17 00:00:00 2001 From: Matthew James Briggs Date: Sat, 6 Jun 2026 08:50:02 +0200 Subject: [PATCH 4/4] fix heroku_dyno and dogstatsd_telemetry_enabled_listener_id severity --- .../config-testsupport/src/config_registry/unsupported.rs | 4 ++-- lib/datadog-agent/config/schema/schema_overlay.yaml | 4 ++-- lib/datadog-agent/config/src/classifier/classifier_data.rs | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/lib/datadog-agent/config-testsupport/src/config_registry/unsupported.rs b/lib/datadog-agent/config-testsupport/src/config_registry/unsupported.rs index 6a2015e8473..a4aef0f4e8a 100644 --- a/lib/datadog-agent/config-testsupport/src/config_registry/unsupported.rs +++ b/lib/datadog-agent/config-testsupport/src/config_registry/unsupported.rs @@ -63,7 +63,7 @@ crate::declare_annotations! { /// `dogstatsd_telemetry_enabled_listener_id`-Per-listener telemetry tagging DOGSTATSD_TELEMETRY_ENABLED_LISTENER_ID = SalukiAnnotation { schema: &schema::DOGSTATSD_TELEMETRY_ENABLED_LISTENER_ID, - support_level: SupportLevel::Incompatible(Severity::Low), + support_level: SupportLevel::Incompatible(Severity::Medium), additional_yaml_paths: &[], env_var_override: None, used_by: &[], @@ -338,7 +338,7 @@ crate::declare_annotations! { /// `heroku_dyno`-Heroku dyno telemetry mode HEROKU_DYNO = SalukiAnnotation { schema: &schema::HEROKU_DYNO, - support_level: SupportLevel::Incompatible(Severity::Low), + support_level: SupportLevel::Incompatible(Severity::High), additional_yaml_paths: &[], env_var_override: None, used_by: &[], diff --git a/lib/datadog-agent/config/schema/schema_overlay.yaml b/lib/datadog-agent/config/schema/schema_overlay.yaml index fd866e3095a..9e9407a5f9a 100644 --- a/lib/datadog-agent/config/schema/schema_overlay.yaml +++ b/lib/datadog-agent/config/schema/schema_overlay.yaml @@ -1601,7 +1601,7 @@ unsupported: issue: "#1352" dogstatsd_telemetry_enabled_listener_id: - severity: low + severity: medium planned: false pipelines: [ dogstatsd ] description: "Per-listener telemetry tagging" @@ -1654,7 +1654,7 @@ unsupported: issue: "#1357" heroku_dyno: - severity: low + severity: high planned: false pipelines: [ cross_cutting ] description: "Heroku dyno telemetry mode" diff --git a/lib/datadog-agent/config/src/classifier/classifier_data.rs b/lib/datadog-agent/config/src/classifier/classifier_data.rs index 515f59deaba..adc65c0ea4b 100644 --- a/lib/datadog-agent/config/src/classifier/classifier_data.rs +++ b/lib/datadog-agent/config/src/classifier/classifier_data.rs @@ -280,7 +280,7 @@ pub(crate) static CLASSIFIER_ENTRIES: &[ClassifierEntry] = &[ ClassifierEntry { yaml_path: "dogstatsd_telemetry_enabled_listener_id", aliases: &[], - support_level: SupportLevel::Incompatible(Severity::Low), + support_level: SupportLevel::Incompatible(Severity::Medium), pipeline_affinity: PipelineAffinity::Pipelines(&[Pipeline::DogStatsD]), default: Some("false"), }, @@ -322,7 +322,7 @@ pub(crate) static CLASSIFIER_ENTRIES: &[ClassifierEntry] = &[ ClassifierEntry { yaml_path: "heroku_dyno", aliases: &[], - support_level: SupportLevel::Incompatible(Severity::Low), + support_level: SupportLevel::Incompatible(Severity::High), pipeline_affinity: PipelineAffinity::CrossCutting, default: Some("false"), },