Skip to main content

datadog_agent_config_overlay_model/
saluki_keys.rs

1//! ADP-only configuration keys that are not in the Datadog Agent schema.
2//! Shared between registry_gen.rs (for config registry annotations) and doc_gen.rs (for the
3//! ADP-Only documentation section).
4
5pub struct SalukiKey {
6    pub yaml_path: &'static str,
7    pub description: &'static str,
8    pub default: &'static str,
9    /// Multi-line documentation rendered as a prose section below the ADP-Only table.
10    /// If the text starts with `#`, the heading is taken from the text itself.
11    pub documentation: Option<&'static str>,
12    // Fields used only by registry_gen:
13    pub value_type: &'static str,
14    pub schema_default: Option<&'static str>,
15    pub env_vars: &'static [&'static str],
16    pub env_var_override: Option<&'static [&'static str]>,
17    pub additional_yaml_paths: &'static [&'static str],
18    pub used_by: &'static [&'static str],
19    pub test_json: Option<&'static str>,
20    pub pipeline_affinity: &'static str,
21    pub filename: &'static str,
22}
23
24pub static SALUKI_KEYS: &[SalukiKey] = &[
25    // ── metrics_endpoint_routing.rs ───────────────────────────────────────
26    SalukiKey {
27        yaml_path: "experimental.metrics_endpoint_routing.metric_allowlist",
28        description: "Per-endpoint metric allow lists",
29        default: "{}",
30        documentation: Some(concat!(
31            "### `experimental.metrics_endpoint_routing.metric_allowlist`\n\n",
32            "ADP can route a selected subset of metrics to the primary intake or to specific additional ",
33            "endpoints. This experimental routing is independent of Multi-Region Failover.\n\n",
34            "> [!WARNING]\n",
35            "> Settings under `experimental` are unstable and may change, move, or be removed. ",
36            "Do not rely on backward compatibility.\n\n",
37            "Key `experimental.metrics_endpoint_routing.metric_allowlist` by the exact configured endpoint string. ",
38            "For the ",
39            "primary, use the effective endpoint configured through `dd_url` or derived from `site`. Configure ",
40            "additional destinations and their API keys through `additional_endpoints`, and use those exact map ",
41            "keys. The allowlist filters both series and sketches by metric name. ",
42            "A metric is forwarded if its name matches this exact list or the endpoint's ",
43            "`metric_prefix_allowlist`. If both lists are empty, no metrics are sent to that endpoint. ",
44            "Endpoints absent from both policy maps retain their ordinary behavior.\n\n",
45            "ADP rejects a policy whose endpoint matches neither the primary endpoint nor a key in ",
46            "`additional_endpoints`, preventing a typo from silently sending an unfiltered stream. Endpoint policies ",
47            "are read when the topology is built, so changing the map requires an ADP restart. An absent or empty ",
48            "pair of policy maps leaves ordinary endpoint routing unchanged.\n\n",
49            "To filter the primary while leaving an additional endpoint on its ordinary full stream:\n\n",
50            "```yaml\n",
51            "api_key: <primary-api-key>\n",
52            "dd_url: https://app.us5.datadoghq.com\n",
53            "additional_endpoints:\n",
54            "  https://app.datadoghq.com:\n",
55            "    - <secondary-api-key>\n",
56            "# Experimental keys may change, move, or be removed without backward compatibility.\n",
57            "experimental:\n",
58            "  metrics_endpoint_routing:\n",
59            "    metric_allowlist:\n",
60            "      https://app.us5.datadoghq.com:\n",
61            "        - allowed.metric\n",
62            "```\n\n",
63            "To leave the primary on its ordinary full stream while filtering only additional endpoints, omit the ",
64            "primary URL from the policy map:\n\n",
65            "```yaml\n",
66            "api_key: <primary-api-key>\n",
67            "dd_url: https://app.us5.datadoghq.com\n",
68            "additional_endpoints:\n",
69            "  https://app.datadoghq.com:\n",
70            "    - <us1-api-key>\n",
71            "  https://app.datadoghq.eu:\n",
72            "    - <eu1-api-key>\n",
73            "experimental:\n",
74            "  metrics_endpoint_routing:\n",
75            "    metric_allowlist:\n",
76            "      https://app.datadoghq.com:\n",
77            "        - critical.slo\n",
78            "      https://app.datadoghq.eu:\n",
79            "        - billing.latency\n",
80            "```",
81        )),
82        value_type: "ValueType::StringMapList",
83        schema_default: Some("{}"),
84        env_vars: &[],
85        env_var_override: None,
86        additional_yaml_paths: &[],
87        used_by: &["TYPED_CONFIG_SYSTEM"],
88        test_json: Some(r#"{"https://app.datadoghq.com":["allowed.metric"]}"#),
89        pipeline_affinity: "PipelineAffinity::CrossCutting",
90        filename: "metrics_endpoint_routing.rs",
91    },
92    SalukiKey {
93        yaml_path: "experimental.metrics_endpoint_routing.metric_prefix_allowlist",
94        description: "Per-endpoint literal metric-prefix allow lists",
95        default: "{}",
96        documentation: Some(concat!(
97            "### `experimental.metrics_endpoint_routing.metric_prefix_allowlist`\n\n",
98            "Allows metric-name families at selected primary or additional endpoints. Defaults to `{}`. ",
99            "Endpoint keys follow the same rules as `metric_allowlist`; an unknown endpoint is rejected. ",
100            "These experimental settings may change, move, or be removed without backward compatibility.\n\n",
101            "Prefixes are case-sensitive literal strings, using the same starts-with semantics as the DogStatsD ",
102            "filterlist's prefix mode. There are no wildcards or regular expressions: `billing.` matches ",
103            "`billing.latency` but not `billing_other`. A prefix without the dot, `billing`, matches both. ",
104            "An empty string prefix matches every metric name; an empty list allows no names.\n\n",
105            "A metric matching either an exact name in `metric_allowlist` or a prefix in this map is forwarded. ",
106            "This applies to both series and sketches. Endpoints present in either map are filtered; endpoints ",
107            "absent from both keep ordinary delivery. If both lists for a selected endpoint are empty, all its ",
108            "metrics are dropped. Prefixes also allow future names in the family, ",
109            "so choose them carefully to avoid forwarding more traffic than intended.\n\n",
110            "To combine exact names and prefixes for one endpoint:\n\n",
111            "```yaml\n",
112            "experimental:\n",
113            "  metrics_endpoint_routing:\n",
114            "    metric_allowlist:\n",
115            "      https://primary.example.com:\n",
116            "        - critical.slo\n",
117            "    metric_prefix_allowlist:\n",
118            "      https://primary.example.com:\n",
119            "        - billing.\n",
120            "```\n\n",
121            "The example endpoint must also be configured as the primary or an additional endpoint.",
122        )),
123        value_type: "ValueType::StringMapList",
124        schema_default: Some("{}"),
125        env_vars: &[],
126        env_var_override: None,
127        additional_yaml_paths: &[],
128        used_by: &["TYPED_CONFIG_SYSTEM"],
129        test_json: Some(r#"{"https://primary.example.com":["billing."]}"#),
130        pipeline_affinity: "PipelineAffinity::CrossCutting",
131        filename: "metrics_endpoint_routing.rs",
132    },
133    // ── data_plane.rs ────────────────────────────────────────────────────────
134    SalukiKey {
135        yaml_path: "data_plane.experimental.apm.enabled",
136        description: "Run the experimental APM proxy in front of the trace-agent",
137        default: "false",
138        documentation: Some(
139            "### `data_plane.experimental.apm.*`
140
141\
142             With `data_plane.experimental.apm.enabled` set, ADP takes over the trace-agent's receiver. It \
143             listens where the trace-agent normally does (`apm_config.receiver_port`, \
144             `apm_config.receiver_socket`, `apm_config.apm_non_local_traffic`, and `bind_host`) and forwards \
145             every request to the trace-agent at `data_plane.experimental.apm.proxy_destination`. The Datadog \
146             Agent moves the trace-agent's receiver to that address.
147
148\
149             `data_plane.experimental.apm.proxy_destination` accepts either an HTTP endpoint \
150             (`http://host:port`, such as the default `http://127.0.0.1:8127`) or a Unix domain socket \
151             (`unix:///path/to/socket`, such as `unix:///var/run/datadog/trace-agent.socket`).
152
153\
154             Prefer an `http://` destination. Over a `unix://` destination, the trace-agent attributes requests \
155             that carry no container headers, and whose container ADP couldn't resolve, to ADP's own container.
156
157\
158             > [!WARNING]
159\
160             > Settings under `experimental` are unstable and may change, move, or be removed. Do not rely on \
161             backward compatibility.",
162        ),
163        value_type: "ValueType::Bool",
164        schema_default: Some("false"),
165        env_vars: &[],
166        env_var_override: None,
167        additional_yaml_paths: &[],
168        used_by: &["TYPED_CONFIG_SYSTEM"],
169        test_json: None,
170        pipeline_affinity: "PipelineAffinity::Pipelines(&[Pipeline::Traces])",
171        filename: "data_plane.rs",
172    },
173    SalukiKey {
174        yaml_path: "data_plane.experimental.apm.proxy_destination",
175        description: "HTTP or Unix socket URL of the relocated trace-agent",
176        default: "http://127.0.0.1:8127",
177        documentation: None,
178        value_type: "ValueType::String",
179        schema_default: Some("http://127.0.0.1:8127"),
180        env_vars: &[],
181        env_var_override: None,
182        additional_yaml_paths: &[],
183        used_by: &["TYPED_CONFIG_SYSTEM"],
184        test_json: None,
185        pipeline_affinity: "PipelineAffinity::Pipelines(&[Pipeline::Traces])",
186        filename: "data_plane.rs",
187    },
188    SalukiKey {
189        yaml_path: "data_plane.otlp.receiver_grpc_endpoint_temporary",
190        description: "ADP OTLP gRPC listen endpoint",
191        default: "localhost:6317",
192        documentation: Some(
193            "Temporary development key for setting ADP's OTLP listen endpoints independently from the Agent's.",
194        ),
195        value_type: "ValueType::String",
196        schema_default: Some("localhost:6317"),
197        env_vars: &[],
198        env_var_override: None,
199        additional_yaml_paths: &[],
200        used_by: &["TYPED_CONFIG_SYSTEM"],
201        test_json: None,
202        pipeline_affinity: "PipelineAffinity::Pipelines(&[Pipeline::Otlp])",
203        filename: "data_plane.rs",
204    },
205    SalukiKey {
206        yaml_path: "data_plane.otlp.receiver_http_endpoint_temporary",
207        description: "ADP OTLP HTTP listen endpoint",
208        default: "localhost:6318",
209        documentation: Some(
210            "Temporary development key for setting ADP's OTLP listen endpoints independently from the Agent's.",
211        ),
212        value_type: "ValueType::String",
213        schema_default: Some("localhost:6318"),
214        env_vars: &[],
215        env_var_override: None,
216        additional_yaml_paths: &[],
217        used_by: &["TYPED_CONFIG_SYSTEM"],
218        test_json: None,
219        pipeline_affinity: "PipelineAffinity::Pipelines(&[Pipeline::Otlp])",
220        filename: "data_plane.rs",
221    },
222    // ── dogstatsd.rs ─────────────────────────────────────────────────────────
223    SalukiKey {
224        yaml_path: "dogstatsd_allow_context_heap_allocs",
225        description: "Allow heap allocations for contexts",
226        default: "true",
227        documentation: None,
228        value_type: "ValueType::Bool",
229        schema_default: Some("true"),
230        env_vars: &[],
231        env_var_override: None,
232        additional_yaml_paths: &[],
233        used_by: &["TYPED_CONFIG_SYSTEM"],
234        test_json: None,
235        pipeline_affinity: "PipelineAffinity::Pipelines(&[Pipeline::DogStatsD])",
236        filename: "dogstatsd.rs",
237    },
238    SalukiKey {
239        yaml_path: "dogstatsd_autoscale_udp_listeners",
240        description: "Bind multiple UDP sockets via SO_REUSEPORT",
241        default: "false",
242        documentation: None,
243        value_type: "ValueType::Bool",
244        schema_default: Some("false"),
245        env_vars: &[],
246        env_var_override: None,
247        additional_yaml_paths: &[],
248        used_by: &["TYPED_CONFIG_SYSTEM"],
249        test_json: None,
250        pipeline_affinity: "PipelineAffinity::Pipelines(&[Pipeline::DogStatsD])",
251        filename: "dogstatsd.rs",
252    },
253    SalukiKey {
254        yaml_path: "dogstatsd_buffer_count",
255        description: "Baseline receive buffers",
256        default: "128",
257        documentation: None,
258        value_type: "ValueType::Integer",
259        schema_default: Some("128"),
260        env_vars: &[],
261        env_var_override: None,
262        additional_yaml_paths: &[],
263        used_by: &["TYPED_CONFIG_SYSTEM"],
264        test_json: None,
265        pipeline_affinity: "PipelineAffinity::Pipelines(&[Pipeline::DogStatsD])",
266        filename: "dogstatsd.rs",
267    },
268    SalukiKey {
269        yaml_path: "dogstatsd_buffer_count_max",
270        description: "Maximum receive buffer count",
271        default: "32768",
272        documentation: None,
273        value_type: "ValueType::Integer",
274        schema_default: Some("32768"),
275        env_vars: &[],
276        env_var_override: None,
277        additional_yaml_paths: &[],
278        used_by: &["TYPED_CONFIG_SYSTEM"],
279        test_json: None,
280        pipeline_affinity: "PipelineAffinity::Pipelines(&[Pipeline::DogStatsD])",
281        filename: "dogstatsd.rs",
282    },
283    SalukiKey {
284        yaml_path: "dogstatsd_cached_contexts_limit",
285        description: "Max cached metric contexts",
286        default: "500000",
287        documentation: None,
288        value_type: "ValueType::Integer",
289        schema_default: Some("500000"),
290        env_vars: &[],
291        env_var_override: None,
292        additional_yaml_paths: &[],
293        used_by: &["TYPED_CONFIG_SYSTEM"],
294        test_json: None,
295        pipeline_affinity: "PipelineAffinity::Pipelines(&[Pipeline::DogStatsD])",
296        filename: "dogstatsd.rs",
297    },
298    SalukiKey {
299        yaml_path: "dogstatsd_cached_tagsets_limit",
300        description: "Max cached tagsets",
301        default: "500000",
302        documentation: None,
303        value_type: "ValueType::Integer",
304        schema_default: Some("500000"),
305        env_vars: &[],
306        env_var_override: None,
307        additional_yaml_paths: &[],
308        used_by: &["TYPED_CONFIG_SYSTEM"],
309        test_json: None,
310        pipeline_affinity: "PipelineAffinity::Pipelines(&[Pipeline::DogStatsD])",
311        filename: "dogstatsd.rs",
312    },
313    SalukiKey {
314        yaml_path: "dogstatsd_minimum_sample_rate",
315        description: "Floor for metric sample rates",
316        default: "0.000000003845",
317        documentation: Some(
318            "ADP enforces a minimum sample rate on incoming metrics to prevent memory exhaustion \
319             from extremely low sample rates on histograms and sketches. Sending metrics with a \
320             very high inverse sample rate (for example `@0.0000001`) can cause unbounded memory \
321             growth in a sketch; this setting prevents that. The default is conservative enough \
322             that normal clients are unaffected.",
323        ),
324        value_type: "ValueType::Float",
325        schema_default: Some("0.000000003845"),
326        env_vars: &[],
327        env_var_override: None,
328        additional_yaml_paths: &[],
329        used_by: &["TYPED_CONFIG_SYSTEM"],
330        test_json: None,
331        pipeline_affinity: "PipelineAffinity::Pipelines(&[Pipeline::DogStatsD])",
332        filename: "dogstatsd.rs",
333    },
334    SalukiKey {
335        yaml_path: "metric_tag_value_allowlist",
336        description: "Per-metric tag value allow-list",
337        default: "[]",
338        documentation: Some(concat!(
339            "### `metric_tag_value_allowlist`\n\n",
340            "Use `metric_tag_value_allowlist` to bound metric cardinality by retaining selected values for a tag. ",
341            "Configure each list item with a `metric_prefix`, a `tag_name`, and the `values` to retain. The rule ",
342            "applies to every metric whose name starts with the prefix. Values not in the list lose the tag by default. To aggregate them under a sentinel instead, set ",
343            "`on_miss: replace` and configure `replacement`; the replacement defaults to `other`.\n\n",
344            "```yaml\n",
345            "metric_tag_value_allowlist:\n",
346            "  - metric_prefix: requests.\n",
347            "    tag_name: customer_id\n",
348            "    values: [customer-1, customer-2]\n",
349            "    on_miss: replace\n",
350            "    replacement: other\n",
351            "```\n\n",
352            "This ADP-only key is independent from `metric_tag_filterlist`. Remote Config updates to ",
353            "`metric_tag_filterlist` therefore do not replace locally configured value allow-lists. Value allow-list ",
354            "changes require an ADP restart in this initial implementation. Rules apply to counters and sketch-backed ",
355            "metrics before aggregation, including instrumented and origin tags. Like `metric_tag_filterlist`, value ",
356            "rules apply only to metrics that ADP aggregates. Metrics that carry an explicit client timestamp go ",
357            "through the no-aggregation pipeline (`dogstatsd_no_aggregation_pipeline`) and keep their tags unchanged. ",
358            "ADP matches `metric_prefix` after DogStatsD mapper rewrites and `statsd_metric_namespace` prefixing, so ",
359            "configure the final metric name produced by those steps.\n\n",
360            "Whole-tag filtering runs first. If `metric_tag_filterlist` uses `action: include`, add the value-filtered ",
361            "tag key to its `tags` list or the whole-tag rule removes it before value filtering. Value rules do not ",
362            "operate on bare tags such as `customer_id`, because they have no value. An empty string in a key/value ",
363            "tag such as `customer_id:` is a value and is subject to the allow-list; include `\"\"` in `values` to ",
364            "retain it. An empty `values` list treats every key/value tag as a mismatch.\n\n",
365            "Distinct metric prefixes must not overlap, even when the rules target different tags. Multiple rules may ",
366            "use the same prefix when they target different tags. ADP rejects overlapping rules at startup so each ",
367            "metric matches at most one prefix. ADP also rejects empty metric prefixes and tag names, duplicate prefix ",
368            "and tag pairs, and tag names containing `:`. As with ",
369            "`metric_tag_filterlist`, ADP does not trim configured strings: prefixes, tag names, values, and replacements ",
370            "preserve whitespace and match exactly. Configure a replacement that cannot collide with a real tag value.",
371        )),
372        value_type: "ValueType::String",
373        schema_default: Some("[]"),
374        env_vars: &[],
375        env_var_override: Some(&[]),
376        additional_yaml_paths: &[],
377        used_by: &["TYPED_CONFIG_SYSTEM"],
378        test_json: Some(
379            r#"[{"metric_prefix":"smoke.","tag_name":"customer_id","values":["customer-1"],"on_miss":"replace","replacement":"other"}]"#,
380        ),
381        pipeline_affinity: "PipelineAffinity::Pipelines(&[Pipeline::DogStatsD])",
382        filename: "tag_filterlist.rs",
383    },
384    SalukiKey {
385        yaml_path: "dogstatsd_permissive_decoding",
386        description: "Relaxes decoder strictness",
387        default: "true",
388        documentation: Some(
389            "By default, ADP parses DogStatsD packets with the same leniency as the core agent, \
390             accepting packets that technically violate the spec. Setting this to `false` enables \
391             strict mode, which rejects non-conformant packets. Strict mode is not available in \
392             the core agent.",
393        ),
394        value_type: "ValueType::Bool",
395        schema_default: Some("true"),
396        env_vars: &[],
397        env_var_override: None,
398        additional_yaml_paths: &[],
399        used_by: &["TYPED_CONFIG_SYSTEM"],
400        test_json: None,
401        pipeline_affinity: "PipelineAffinity::Pipelines(&[Pipeline::DogStatsD])",
402        filename: "dogstatsd.rs",
403    },
404    SalukiKey {
405        yaml_path: "dogstatsd_string_interner_size_bytes",
406        description: "Explicit byte budget for context interner",
407        default: "",
408        documentation: Some(
409            "Accepts a bare integer number of bytes or a human-readable byte-size string such as `12MiB`. \
410             When unset, ADP derives the byte budget from `dogstatsd_string_interner_size`.",
411        ),
412        value_type: "ValueType::String",
413        schema_default: None,
414        env_vars: &[],
415        env_var_override: None,
416        additional_yaml_paths: &[],
417        used_by: &["TYPED_CONFIG_SYSTEM"],
418        test_json: Some(r#""12MiB""#),
419        pipeline_affinity: "PipelineAffinity::Pipelines(&[Pipeline::DogStatsD])",
420        filename: "dogstatsd.rs",
421    },
422    SalukiKey {
423        yaml_path: "dogstatsd_tcp_port",
424        description: "DogStatsD TCP listen port; 0 disables TCP",
425        default: "0",
426        documentation: None,
427        value_type: "ValueType::Integer",
428        schema_default: Some("0"),
429        env_vars: &[],
430        env_var_override: None,
431        additional_yaml_paths: &[],
432        used_by: &["TYPED_CONFIG_SYSTEM"],
433        test_json: None,
434        pipeline_affinity: "PipelineAffinity::Pipelines(&[Pipeline::DogStatsD])",
435        filename: "dogstatsd.rs",
436    },
437    // ── otlp.rs ──────────────────────────────────────────────────────────────
438    SalukiKey {
439        yaml_path: "otlp_config.traces.enable_otlp_compute_top_level_by_span_kind",
440        description: "Enable OTLP top-level-by-span-kind",
441        default: "",
442        documentation: None,
443        value_type: "ValueType::Bool",
444        schema_default: Some("true"),
445        env_vars: &[],
446        env_var_override: None,
447        additional_yaml_paths: &[],
448        used_by: &["TYPED_CONFIG_SYSTEM"],
449        test_json: None,
450        pipeline_affinity: "PipelineAffinity::Pipelines(&[Pipeline::Traces])",
451        filename: "otlp.rs",
452    },
453    SalukiKey {
454        yaml_path: "otlp_config.traces.ignore_missing_datadog_fields",
455        description: "Ignore missing Datadog fields in OTLP",
456        default: "",
457        documentation: None,
458        value_type: "ValueType::Bool",
459        schema_default: None,
460        env_vars: &[],
461        env_var_override: None,
462        additional_yaml_paths: &[],
463        used_by: &["TYPED_CONFIG_SYSTEM"],
464        test_json: None,
465        pipeline_affinity: "PipelineAffinity::Pipelines(&[Pipeline::Traces])",
466        filename: "otlp.rs",
467    },
468    SalukiKey {
469        yaml_path: "otlp_config.traces.string_interner_size",
470        description: "OTLP trace string interner capacity",
471        default: "",
472        documentation: None,
473        value_type: "ValueType::Integer",
474        schema_default: None,
475        env_vars: &[],
476        env_var_override: None,
477        additional_yaml_paths: &[],
478        used_by: &["TYPED_CONFIG_SYSTEM"],
479        test_json: None,
480        pipeline_affinity: "PipelineAffinity::Pipelines(&[Pipeline::Traces])",
481        filename: "otlp.rs",
482    },
483    SalukiKey {
484        yaml_path: "otlp_config.receiver.protocols.http.transport",
485        description: "OTLP HTTP receiver transport",
486        default: "",
487        documentation: None,
488        value_type: "ValueType::String",
489        schema_default: None,
490        env_vars: &[],
491        env_var_override: None,
492        additional_yaml_paths: &[],
493        used_by: &["TYPED_CONFIG_SYSTEM"],
494        test_json: None,
495        pipeline_affinity: "PipelineAffinity::Pipelines(&[Pipeline::Otlp])",
496        filename: "otlp.rs",
497    },
498    SalukiKey {
499        yaml_path: "otlp_allow_context_heap_allocs",
500        description: "Allow heap allocations for OTLP contexts",
501        default: "",
502        documentation: None,
503        value_type: "ValueType::Bool",
504        schema_default: Some("true"),
505        env_vars: &[],
506        env_var_override: None,
507        additional_yaml_paths: &[],
508        used_by: &["TYPED_CONFIG_SYSTEM"],
509        test_json: None,
510        pipeline_affinity: "PipelineAffinity::Pipelines(&[Pipeline::Otlp])",
511        filename: "otlp.rs",
512    },
513    SalukiKey {
514        yaml_path: "otlp_cached_contexts_limit",
515        description: "Max cached OTLP metric contexts",
516        default: "",
517        documentation: None,
518        value_type: "ValueType::Integer",
519        schema_default: None,
520        env_vars: &[],
521        env_var_override: None,
522        additional_yaml_paths: &[],
523        used_by: &["TYPED_CONFIG_SYSTEM"],
524        test_json: None,
525        pipeline_affinity: "PipelineAffinity::Pipelines(&[Pipeline::Otlp])",
526        filename: "otlp.rs",
527    },
528    SalukiKey {
529        yaml_path: "otlp_cached_tagsets_limit",
530        description: "Max cached OTLP tagsets",
531        default: "",
532        documentation: None,
533        value_type: "ValueType::Integer",
534        schema_default: None,
535        env_vars: &[],
536        env_var_override: None,
537        additional_yaml_paths: &[],
538        used_by: &["TYPED_CONFIG_SYSTEM"],
539        test_json: None,
540        pipeline_affinity: "PipelineAffinity::Pipelines(&[Pipeline::Otlp])",
541        filename: "otlp.rs",
542    },
543    SalukiKey {
544        yaml_path: "otlp_string_interner_size",
545        description: "OTLP context interner capacity",
546        default: "",
547        documentation: None,
548        value_type: "ValueType::Integer",
549        schema_default: None,
550        env_vars: &[],
551        env_var_override: None,
552        additional_yaml_paths: &[],
553        used_by: &["TYPED_CONFIG_SYSTEM"],
554        test_json: None,
555        pipeline_affinity: "PipelineAffinity::Pipelines(&[Pipeline::Otlp])",
556        filename: "otlp.rs",
557    },
558    // ── aggregate.rs ─────────────────────────────────────────────────────────
559    SalukiKey {
560        yaml_path: "aggregate_window_duration_seconds",
561        description: "Aggregation window size",
562        default: "",
563        documentation: None,
564        value_type: "ValueType::Integer",
565        schema_default: None,
566        env_vars: &[],
567        env_var_override: None,
568        additional_yaml_paths: &[],
569        used_by: &["TYPED_CONFIG_SYSTEM"],
570        test_json: None,
571        pipeline_affinity: "PipelineAffinity::Pipelines(&[Pipeline::DogStatsD, Pipeline::Checks])",
572        filename: "aggregate.rs",
573    },
574    SalukiKey {
575        yaml_path: "aggregate_flush_interval",
576        description: "Aggregator flush period",
577        default: "",
578        documentation: None,
579        value_type: "ValueType::String",
580        schema_default: None,
581        env_vars: &[],
582        env_var_override: None,
583        additional_yaml_paths: &[],
584        used_by: &["TYPED_CONFIG_SYSTEM"],
585        test_json: Some(r#"{"secs": 42, "nanos": 0}"#),
586        pipeline_affinity: "PipelineAffinity::Pipelines(&[Pipeline::DogStatsD, Pipeline::Checks])",
587        filename: "aggregate.rs",
588    },
589    SalukiKey {
590        yaml_path: "aggregate_context_limit",
591        description: "Max contexts per aggregation window",
592        default: "",
593        documentation: None,
594        value_type: "ValueType::Integer",
595        schema_default: None,
596        env_vars: &[],
597        env_var_override: None,
598        additional_yaml_paths: &[],
599        used_by: &["TYPED_CONFIG_SYSTEM"],
600        test_json: None,
601        pipeline_affinity: "PipelineAffinity::Pipelines(&[Pipeline::DogStatsD, Pipeline::Checks])",
602        filename: "aggregate.rs",
603    },
604    SalukiKey {
605        yaml_path: "aggregate_passthrough_idle_flush_timeout",
606        description: "Passthrough buffer flush delay",
607        default: "",
608        documentation: None,
609        value_type: "ValueType::String",
610        schema_default: None,
611        env_vars: &[],
612        env_var_override: None,
613        additional_yaml_paths: &[],
614        used_by: &["TYPED_CONFIG_SYSTEM"],
615        test_json: Some(r#"{"secs": 42, "nanos": 0}"#),
616        pipeline_affinity: "PipelineAffinity::Pipelines(&[Pipeline::DogStatsD, Pipeline::Checks])",
617        filename: "aggregate.rs",
618    },
619    // ── trace_obfuscation.rs ─────────────────────────────────────────────────
620    SalukiKey {
621        yaml_path: "apm_config.obfuscation.sql.dbms",
622        description: "SQL obfuscation DBMS dialect",
623        default: "",
624        documentation: None,
625        value_type: "ValueType::String",
626        schema_default: None,
627        env_vars: &[],
628        env_var_override: None,
629        additional_yaml_paths: &[],
630        used_by: &["TYPED_CONFIG_SYSTEM"],
631        test_json: None,
632        pipeline_affinity: "PipelineAffinity::Pipelines(&[Pipeline::Traces])",
633        filename: "trace_obfuscation.rs",
634    },
635    SalukiKey {
636        yaml_path: "apm_config.obfuscation.sql.dollar_quoted_func",
637        description: "Preserve dollar-quoted SQL functions",
638        default: "",
639        documentation: None,
640        value_type: "ValueType::Bool",
641        schema_default: None,
642        env_vars: &[],
643        env_var_override: None,
644        additional_yaml_paths: &[],
645        used_by: &["TYPED_CONFIG_SYSTEM"],
646        test_json: None,
647        pipeline_affinity: "PipelineAffinity::Pipelines(&[Pipeline::Traces])",
648        filename: "trace_obfuscation.rs",
649    },
650    SalukiKey {
651        yaml_path: "apm_config.obfuscation.sql.keep_sql_alias",
652        description: "Preserve SQL aliases in obfuscation",
653        default: "",
654        documentation: None,
655        value_type: "ValueType::Bool",
656        schema_default: None,
657        env_vars: &[],
658        env_var_override: None,
659        additional_yaml_paths: &[],
660        used_by: &["TYPED_CONFIG_SYSTEM"],
661        test_json: None,
662        pipeline_affinity: "PipelineAffinity::Pipelines(&[Pipeline::Traces])",
663        filename: "trace_obfuscation.rs",
664    },
665    SalukiKey {
666        yaml_path: "apm_config.obfuscation.sql.replace_digits",
667        description: "Replace digits in SQL obfuscation",
668        default: "",
669        documentation: None,
670        value_type: "ValueType::Bool",
671        schema_default: None,
672        env_vars: &[],
673        env_var_override: None,
674        additional_yaml_paths: &[],
675        used_by: &["TYPED_CONFIG_SYSTEM"],
676        test_json: None,
677        pipeline_affinity: "PipelineAffinity::Pipelines(&[Pipeline::Traces])",
678        filename: "trace_obfuscation.rs",
679    },
680    SalukiKey {
681        yaml_path: "apm_config.obfuscation.sql.table_names",
682        description: "Collect table names during obfuscation",
683        default: "",
684        documentation: None,
685        value_type: "ValueType::Bool",
686        schema_default: None,
687        env_vars: &[],
688        env_var_override: None,
689        additional_yaml_paths: &[],
690        used_by: &["TYPED_CONFIG_SYSTEM"],
691        test_json: None,
692        pipeline_affinity: "PipelineAffinity::Pipelines(&[Pipeline::Traces])",
693        filename: "trace_obfuscation.rs",
694    },
695    // ── encoders.rs ──────────────────────────────────────────────────────────
696    SalukiKey {
697        yaml_path: "flush_timeout_secs",
698        description: "Encoder flush timeout (secs)",
699        default: "",
700        documentation: None,
701        value_type: "ValueType::Integer",
702        schema_default: None,
703        env_vars: &[],
704        env_var_override: None,
705        additional_yaml_paths: &[],
706        used_by: &["TYPED_CONFIG_SYSTEM"],
707        test_json: None,
708        pipeline_affinity: "PipelineAffinity::Pipelines(&[Pipeline::Checks, Pipeline::Traces, Pipeline::DogStatsD])",
709        filename: "encoders.rs",
710    },
711    SalukiKey {
712        yaml_path: "serializer_max_metrics_per_payload",
713        description: "Max metrics per payload",
714        default: "",
715        documentation: None,
716        value_type: "ValueType::Integer",
717        schema_default: None,
718        env_vars: &[],
719        env_var_override: None,
720        additional_yaml_paths: &[],
721        used_by: &["TYPED_CONFIG_SYSTEM"],
722        test_json: None,
723        pipeline_affinity: "PipelineAffinity::Pipelines(&[Pipeline::Checks, Pipeline::DogStatsD])",
724        filename: "encoders.rs",
725    },
726    // ── dogstatsd_mapper.rs ──────────────────────────────────────────────────
727    SalukiKey {
728        yaml_path: "dogstatsd_mapper_string_interner_size",
729        description: "Mapper string interner byte capacity",
730        default: "64KiB",
731        documentation: Some(
732            "Controls the pre-allocated byte capacity for interning mapped metric names and tags. The default is \
733             `64KiB`. Set this to a nonzero byte count; you can use a bare number of bytes or a human-readable \
734             byte-size string such as `64KiB`. Larger values increase memory usage.",
735        ),
736        value_type: "ValueType::Integer",
737        schema_default: None,
738        env_vars: &[],
739        env_var_override: None,
740        additional_yaml_paths: &[],
741        used_by: &["TYPED_CONFIG_SYSTEM"],
742        test_json: None,
743        pipeline_affinity: "PipelineAffinity::Pipelines(&[Pipeline::DogStatsD])",
744        filename: "dogstatsd_mapper.rs",
745    },
746    // ── accounting.rs ────────────────────────────────────────────────────────
747    SalukiKey {
748        yaml_path: "memory_limit",
749        description: "Process memory limit",
750        default: "",
751        documentation: Some(
752            "### `memory_limit` / `memory_slop_factor`
753
754\
755             ADP uses an explicit process memory limit (`memory_limit`) rather than relying on \
756             Go's garbage collector. The `memory_slop_factor` reserves a fraction of the limit \
757             to account for allocations not tracked by ADP's internal accounting. When memory \
758             usage approaches `memory_limit`, ADP's global limiter begins exerting backpressure \
759             (see `enable_global_limiter`).",
760        ),
761        value_type: "ValueType::String",
762        schema_default: None,
763        env_vars: &[],
764        env_var_override: None,
765        additional_yaml_paths: &[],
766        used_by: &["TYPED_CONFIG_SYSTEM"],
767        test_json: None,
768        pipeline_affinity: "PipelineAffinity::CrossCutting",
769        filename: "accounting.rs",
770    },
771    SalukiKey {
772        yaml_path: "memory_slop_factor",
773        description: "Memory accounting slop fraction",
774        default: "0.25",
775        documentation: Some("See `memory_limit` above."),
776        value_type: "ValueType::Float",
777        schema_default: Some("0.25"),
778        env_vars: &[],
779        env_var_override: None,
780        additional_yaml_paths: &[],
781        used_by: &["TYPED_CONFIG_SYSTEM"],
782        test_json: None,
783        pipeline_affinity: "PipelineAffinity::CrossCutting",
784        filename: "accounting.rs",
785    },
786    SalukiKey {
787        yaml_path: "enable_global_limiter",
788        description: "Global memory limiter toggle",
789        default: "true",
790        documentation: Some(
791            "Controls whether the global memory limiter exerts backpressure as memory usage \
792             approaches `memory_limit`. The default is `true`. When set to `false`, the limiter \
793             becomes a no-op and only the memory bounds of the running components influence \
794             memory usage.",
795        ),
796        value_type: "ValueType::Bool",
797        schema_default: Some("true"),
798        env_vars: &[],
799        env_var_override: None,
800        additional_yaml_paths: &[],
801        used_by: &["TYPED_CONFIG_SYSTEM"],
802        test_json: None,
803        pipeline_affinity: "PipelineAffinity::CrossCutting",
804        filename: "accounting.rs",
805    },
806    SalukiKey {
807        yaml_path: "memory_mode",
808        description: "Memory bounds validation mode",
809        default: "disabled",
810        documentation: Some(
811            "Controls how the calculated memory bounds are reconciled against `memory_limit`. The \
812             default is `disabled`. Accepted values: `disabled` skips bounds validation and applies \
813             no memory limiting; `permissive` logs a warning when the bounds do not fit within the \
814             limit and starts anyway; `strict` refuses to start. Under `permissive` and `strict`, \
815             the global memory limiter is active only when a limit is in effect (configured or \
816             detected from cgroups) and `enable_global_limiter` is `true`.",
817        ),
818        value_type: "ValueType::String",
819        schema_default: Some("disabled"),
820        env_vars: &[],
821        env_var_override: None,
822        additional_yaml_paths: &[],
823        used_by: &["TYPED_CONFIG_SYSTEM"],
824        test_json: None,
825        pipeline_affinity: "PipelineAffinity::CrossCutting",
826        filename: "accounting.rs",
827    },
828];