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.apm.dispatch_timeout",
136        description: "How long the v1.0 trace receiver waits for the pipeline to accept a payload",
137        // Spelled out rather than `1s`: this string is rendered into the generated configuration table, where the
138        // style checker requires a nonbreaking space between a number and a unit. `schema_default` below carries the
139        // machine-readable form. Compare `data_plane.stop_timeout`, whose `default` is the prose value "derived".
140        default: "1 second",
141        documentation: None,
142        value_type: "ValueType::String",
143        schema_default: Some("1s"),
144        env_vars: &[],
145        env_var_override: None,
146        additional_yaml_paths: &[],
147        used_by: &["TYPED_CONFIG_SYSTEM"],
148        test_json: None,
149        pipeline_affinity: "PipelineAffinity::Pipelines(&[Pipeline::Traces])",
150        filename: "data_plane.rs",
151    },
152    SalukiKey {
153        yaml_path: "data_plane.apm.enabled",
154        description: "Enable the ADP v1.0 APM trace pipeline",
155        default: "false",
156        documentation: Some(
157            "### `data_plane.apm.*`
158
159\
160             ADP can receive Datadog v1.0 (`idx`/ETP) tracer payloads directly, over \
161             `POST /v1.0/traces`, and forward them to the traces intake without going through the \
162             trace-agent. The pipeline is off by default.
163
164\
165             These keys are deliberately separate from `apm_config.receiver_port`, \
166             `apm_config.receiver_socket`, `apm_config.max_payload_size`, and \
167             `apm_config.apm_non_local_traffic`. Those configure the trace-agent's receiver, which \
168             keeps running on port `8126` alongside ADP, so the two listeners need independent \
169             settings. Point each tracer at exactly one of the two: fanning the same traffic to both \
170             double-counts APM stats.
171
172\
173             Only `/v1.0/traces` is served. Tracers that need `/v0.4/traces`, `/v0.5/traces`, or the \
174             profiling and telemetry proxy routes must stay pointed at the trace-agent.",
175        ),
176        value_type: "ValueType::Bool",
177        schema_default: Some("false"),
178        env_vars: &[],
179        env_var_override: None,
180        additional_yaml_paths: &[],
181        used_by: &["TYPED_CONFIG_SYSTEM"],
182        test_json: None,
183        pipeline_affinity: "PipelineAffinity::Pipelines(&[Pipeline::Traces])",
184        filename: "data_plane.rs",
185    },
186    SalukiKey {
187        yaml_path: "data_plane.apm.max_payload_size",
188        description: "Maximum accepted v1.0 trace request body size",
189        default: "26214400",
190        documentation: None,
191        value_type: "ValueType::String",
192        schema_default: Some("26214400"),
193        env_vars: &[],
194        env_var_override: None,
195        additional_yaml_paths: &[],
196        used_by: &["TYPED_CONFIG_SYSTEM"],
197        test_json: None,
198        pipeline_affinity: "PipelineAffinity::Pipelines(&[Pipeline::Traces])",
199        filename: "data_plane.rs",
200    },
201    SalukiKey {
202        yaml_path: "data_plane.apm.non_local_traffic",
203        description: "Allow the v1.0 trace receiver to bind a non-loopback address",
204        default: "false",
205        documentation: None,
206        value_type: "ValueType::Bool",
207        schema_default: Some("false"),
208        env_vars: &[],
209        env_var_override: None,
210        additional_yaml_paths: &[],
211        used_by: &["TYPED_CONFIG_SYSTEM"],
212        test_json: None,
213        pipeline_affinity: "PipelineAffinity::Pipelines(&[Pipeline::Traces])",
214        filename: "data_plane.rs",
215    },
216    SalukiKey {
217        yaml_path: "data_plane.apm.receiver_endpoint",
218        description: "ADP v1.0 trace receiver TCP endpoint",
219        default: "localhost:8127",
220        documentation: None,
221        value_type: "ValueType::String",
222        schema_default: Some("localhost:8127"),
223        env_vars: &[],
224        env_var_override: None,
225        additional_yaml_paths: &[],
226        used_by: &["TYPED_CONFIG_SYSTEM"],
227        test_json: None,
228        pipeline_affinity: "PipelineAffinity::Pipelines(&[Pipeline::Traces])",
229        filename: "data_plane.rs",
230    },
231    SalukiKey {
232        yaml_path: "data_plane.apm.receiver_socket",
233        description: "ADP v1.0 trace receiver Unix domain socket path",
234        default: "",
235        documentation: None,
236        value_type: "ValueType::String",
237        schema_default: None,
238        env_vars: &[],
239        env_var_override: None,
240        additional_yaml_paths: &[],
241        used_by: &["TYPED_CONFIG_SYSTEM"],
242        test_json: None,
243        pipeline_affinity: "PipelineAffinity::Pipelines(&[Pipeline::Traces])",
244        filename: "data_plane.rs",
245    },
246    SalukiKey {
247        yaml_path: "data_plane.otlp.receiver_grpc_endpoint_temporary",
248        description: "ADP OTLP gRPC listen endpoint",
249        default: "localhost:6317",
250        documentation: Some(
251            "Temporary development key for setting ADP's OTLP listen endpoints independently from the Agent's.",
252        ),
253        value_type: "ValueType::String",
254        schema_default: Some("localhost:6317"),
255        env_vars: &[],
256        env_var_override: None,
257        additional_yaml_paths: &[],
258        used_by: &["TYPED_CONFIG_SYSTEM"],
259        test_json: None,
260        pipeline_affinity: "PipelineAffinity::Pipelines(&[Pipeline::Otlp])",
261        filename: "data_plane.rs",
262    },
263    SalukiKey {
264        yaml_path: "data_plane.otlp.receiver_http_endpoint_temporary",
265        description: "ADP OTLP HTTP listen endpoint",
266        default: "localhost:6318",
267        documentation: Some(
268            "Temporary development key for setting ADP's OTLP listen endpoints independently from the Agent's.",
269        ),
270        value_type: "ValueType::String",
271        schema_default: Some("localhost:6318"),
272        env_vars: &[],
273        env_var_override: None,
274        additional_yaml_paths: &[],
275        used_by: &["TYPED_CONFIG_SYSTEM"],
276        test_json: None,
277        pipeline_affinity: "PipelineAffinity::Pipelines(&[Pipeline::Otlp])",
278        filename: "data_plane.rs",
279    },
280    // ── dogstatsd.rs ─────────────────────────────────────────────────────────
281    SalukiKey {
282        yaml_path: "dogstatsd_allow_context_heap_allocs",
283        description: "Allow heap allocations for contexts",
284        default: "true",
285        documentation: None,
286        value_type: "ValueType::Bool",
287        schema_default: Some("true"),
288        env_vars: &[],
289        env_var_override: None,
290        additional_yaml_paths: &[],
291        used_by: &["TYPED_CONFIG_SYSTEM"],
292        test_json: None,
293        pipeline_affinity: "PipelineAffinity::Pipelines(&[Pipeline::DogStatsD])",
294        filename: "dogstatsd.rs",
295    },
296    SalukiKey {
297        yaml_path: "dogstatsd_autoscale_udp_listeners",
298        description: "Bind multiple UDP sockets via SO_REUSEPORT",
299        default: "false",
300        documentation: None,
301        value_type: "ValueType::Bool",
302        schema_default: Some("false"),
303        env_vars: &[],
304        env_var_override: None,
305        additional_yaml_paths: &[],
306        used_by: &["TYPED_CONFIG_SYSTEM"],
307        test_json: None,
308        pipeline_affinity: "PipelineAffinity::Pipelines(&[Pipeline::DogStatsD])",
309        filename: "dogstatsd.rs",
310    },
311    SalukiKey {
312        yaml_path: "dogstatsd_buffer_count",
313        description: "Baseline receive buffers",
314        default: "128",
315        documentation: None,
316        value_type: "ValueType::Integer",
317        schema_default: Some("128"),
318        env_vars: &[],
319        env_var_override: None,
320        additional_yaml_paths: &[],
321        used_by: &["TYPED_CONFIG_SYSTEM"],
322        test_json: None,
323        pipeline_affinity: "PipelineAffinity::Pipelines(&[Pipeline::DogStatsD])",
324        filename: "dogstatsd.rs",
325    },
326    SalukiKey {
327        yaml_path: "dogstatsd_buffer_count_max",
328        description: "Maximum receive buffer count",
329        default: "32768",
330        documentation: None,
331        value_type: "ValueType::Integer",
332        schema_default: Some("32768"),
333        env_vars: &[],
334        env_var_override: None,
335        additional_yaml_paths: &[],
336        used_by: &["TYPED_CONFIG_SYSTEM"],
337        test_json: None,
338        pipeline_affinity: "PipelineAffinity::Pipelines(&[Pipeline::DogStatsD])",
339        filename: "dogstatsd.rs",
340    },
341    SalukiKey {
342        yaml_path: "dogstatsd_cached_contexts_limit",
343        description: "Max cached metric contexts",
344        default: "500000",
345        documentation: None,
346        value_type: "ValueType::Integer",
347        schema_default: Some("500000"),
348        env_vars: &[],
349        env_var_override: None,
350        additional_yaml_paths: &[],
351        used_by: &["TYPED_CONFIG_SYSTEM"],
352        test_json: None,
353        pipeline_affinity: "PipelineAffinity::Pipelines(&[Pipeline::DogStatsD])",
354        filename: "dogstatsd.rs",
355    },
356    SalukiKey {
357        yaml_path: "dogstatsd_cached_tagsets_limit",
358        description: "Max cached tagsets",
359        default: "500000",
360        documentation: None,
361        value_type: "ValueType::Integer",
362        schema_default: Some("500000"),
363        env_vars: &[],
364        env_var_override: None,
365        additional_yaml_paths: &[],
366        used_by: &["TYPED_CONFIG_SYSTEM"],
367        test_json: None,
368        pipeline_affinity: "PipelineAffinity::Pipelines(&[Pipeline::DogStatsD])",
369        filename: "dogstatsd.rs",
370    },
371    SalukiKey {
372        yaml_path: "dogstatsd_minimum_sample_rate",
373        description: "Floor for metric sample rates",
374        default: "0.000000003845",
375        documentation: Some(
376            "ADP enforces a minimum sample rate on incoming metrics to prevent memory exhaustion \
377             from extremely low sample rates on histograms and sketches. Sending metrics with a \
378             very high inverse sample rate (for example `@0.0000001`) can cause unbounded memory \
379             growth in a sketch; this setting prevents that. The default is conservative enough \
380             that normal clients are unaffected.",
381        ),
382        value_type: "ValueType::Float",
383        schema_default: Some("0.000000003845"),
384        env_vars: &[],
385        env_var_override: None,
386        additional_yaml_paths: &[],
387        used_by: &["TYPED_CONFIG_SYSTEM"],
388        test_json: None,
389        pipeline_affinity: "PipelineAffinity::Pipelines(&[Pipeline::DogStatsD])",
390        filename: "dogstatsd.rs",
391    },
392    SalukiKey {
393        yaml_path: "metric_tag_value_allowlist",
394        description: "Per-metric tag value allow-list",
395        default: "[]",
396        documentation: Some(concat!(
397            "### `metric_tag_value_allowlist`\n\n",
398            "Use `metric_tag_value_allowlist` to bound metric cardinality by retaining selected values for a tag. ",
399            "Configure each list item with a `metric_prefix`, a `tag_name`, and the `values` to retain. The rule ",
400            "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 ",
401            "`on_miss: replace` and configure `replacement`; the replacement defaults to `other`.\n\n",
402            "```yaml\n",
403            "metric_tag_value_allowlist:\n",
404            "  - metric_prefix: requests.\n",
405            "    tag_name: customer_id\n",
406            "    values: [customer-1, customer-2]\n",
407            "    on_miss: replace\n",
408            "    replacement: other\n",
409            "```\n\n",
410            "This ADP-only key is independent from `metric_tag_filterlist`. Remote Config updates to ",
411            "`metric_tag_filterlist` therefore do not replace locally configured value allow-lists. Value allow-list ",
412            "changes require an ADP restart in this initial implementation. Rules apply to counters and sketch-backed ",
413            "metrics before aggregation, including instrumented and origin tags. Like `metric_tag_filterlist`, value ",
414            "rules apply only to metrics that ADP aggregates. Metrics that carry an explicit client timestamp go ",
415            "through the no-aggregation pipeline (`dogstatsd_no_aggregation_pipeline`) and keep their tags unchanged. ",
416            "ADP matches `metric_prefix` after DogStatsD mapper rewrites and `statsd_metric_namespace` prefixing, so ",
417            "configure the final metric name produced by those steps.\n\n",
418            "Whole-tag filtering runs first. If `metric_tag_filterlist` uses `action: include`, add the value-filtered ",
419            "tag key to its `tags` list or the whole-tag rule removes it before value filtering. Value rules do not ",
420            "operate on bare tags such as `customer_id`, because they have no value. An empty string in a key/value ",
421            "tag such as `customer_id:` is a value and is subject to the allow-list; include `\"\"` in `values` to ",
422            "retain it. An empty `values` list treats every key/value tag as a mismatch.\n\n",
423            "Distinct metric prefixes must not overlap, even when the rules target different tags. Multiple rules may ",
424            "use the same prefix when they target different tags. ADP rejects overlapping rules at startup so each ",
425            "metric matches at most one prefix. ADP also rejects empty metric prefixes and tag names, duplicate prefix ",
426            "and tag pairs, and tag names containing `:`. As with ",
427            "`metric_tag_filterlist`, ADP does not trim configured strings: prefixes, tag names, values, and replacements ",
428            "preserve whitespace and match exactly. Configure a replacement that cannot collide with a real tag value.",
429        )),
430        value_type: "ValueType::String",
431        schema_default: Some("[]"),
432        env_vars: &[],
433        env_var_override: Some(&[]),
434        additional_yaml_paths: &[],
435        used_by: &["TYPED_CONFIG_SYSTEM"],
436        test_json: Some(
437            r#"[{"metric_prefix":"smoke.","tag_name":"customer_id","values":["customer-1"],"on_miss":"replace","replacement":"other"}]"#,
438        ),
439        pipeline_affinity: "PipelineAffinity::Pipelines(&[Pipeline::DogStatsD])",
440        filename: "tag_filterlist.rs",
441    },
442    SalukiKey {
443        yaml_path: "dogstatsd_permissive_decoding",
444        description: "Relaxes decoder strictness",
445        default: "true",
446        documentation: Some(
447            "By default, ADP parses DogStatsD packets with the same leniency as the core agent, \
448             accepting packets that technically violate the spec. Setting this to `false` enables \
449             strict mode, which rejects non-conformant packets. Strict mode is not available in \
450             the core agent.",
451        ),
452        value_type: "ValueType::Bool",
453        schema_default: Some("true"),
454        env_vars: &[],
455        env_var_override: None,
456        additional_yaml_paths: &[],
457        used_by: &["TYPED_CONFIG_SYSTEM"],
458        test_json: None,
459        pipeline_affinity: "PipelineAffinity::Pipelines(&[Pipeline::DogStatsD])",
460        filename: "dogstatsd.rs",
461    },
462    SalukiKey {
463        yaml_path: "dogstatsd_string_interner_size_bytes",
464        description: "Explicit byte budget for context interner",
465        default: "",
466        documentation: Some(
467            "Accepts a bare integer number of bytes or a human-readable byte-size string such as `12MiB`. \
468             When unset, ADP derives the byte budget from `dogstatsd_string_interner_size`.",
469        ),
470        value_type: "ValueType::String",
471        schema_default: None,
472        env_vars: &[],
473        env_var_override: None,
474        additional_yaml_paths: &[],
475        used_by: &["TYPED_CONFIG_SYSTEM"],
476        test_json: Some(r#""12MiB""#),
477        pipeline_affinity: "PipelineAffinity::Pipelines(&[Pipeline::DogStatsD])",
478        filename: "dogstatsd.rs",
479    },
480    SalukiKey {
481        yaml_path: "dogstatsd_tcp_port",
482        description: "DogStatsD TCP listen port; 0 disables TCP",
483        default: "0",
484        documentation: None,
485        value_type: "ValueType::Integer",
486        schema_default: Some("0"),
487        env_vars: &[],
488        env_var_override: None,
489        additional_yaml_paths: &[],
490        used_by: &["TYPED_CONFIG_SYSTEM"],
491        test_json: None,
492        pipeline_affinity: "PipelineAffinity::Pipelines(&[Pipeline::DogStatsD])",
493        filename: "dogstatsd.rs",
494    },
495    // ── otlp.rs ──────────────────────────────────────────────────────────────
496    SalukiKey {
497        yaml_path: "otlp_config.traces.enable_otlp_compute_top_level_by_span_kind",
498        description: "Enable OTLP top-level-by-span-kind",
499        default: "",
500        documentation: None,
501        value_type: "ValueType::Bool",
502        schema_default: Some("true"),
503        env_vars: &[],
504        env_var_override: None,
505        additional_yaml_paths: &[],
506        used_by: &["TYPED_CONFIG_SYSTEM"],
507        test_json: None,
508        pipeline_affinity: "PipelineAffinity::Pipelines(&[Pipeline::Traces])",
509        filename: "otlp.rs",
510    },
511    SalukiKey {
512        yaml_path: "otlp_config.traces.ignore_missing_datadog_fields",
513        description: "Ignore missing Datadog fields in OTLP",
514        default: "",
515        documentation: None,
516        value_type: "ValueType::Bool",
517        schema_default: None,
518        env_vars: &[],
519        env_var_override: None,
520        additional_yaml_paths: &[],
521        used_by: &["TYPED_CONFIG_SYSTEM"],
522        test_json: None,
523        pipeline_affinity: "PipelineAffinity::Pipelines(&[Pipeline::Traces])",
524        filename: "otlp.rs",
525    },
526    SalukiKey {
527        yaml_path: "otlp_config.traces.string_interner_size",
528        description: "OTLP trace string interner capacity",
529        default: "",
530        documentation: None,
531        value_type: "ValueType::Integer",
532        schema_default: None,
533        env_vars: &[],
534        env_var_override: None,
535        additional_yaml_paths: &[],
536        used_by: &["TYPED_CONFIG_SYSTEM"],
537        test_json: None,
538        pipeline_affinity: "PipelineAffinity::Pipelines(&[Pipeline::Traces])",
539        filename: "otlp.rs",
540    },
541    SalukiKey {
542        yaml_path: "otlp_config.receiver.protocols.http.transport",
543        description: "OTLP HTTP receiver transport",
544        default: "",
545        documentation: None,
546        value_type: "ValueType::String",
547        schema_default: None,
548        env_vars: &[],
549        env_var_override: None,
550        additional_yaml_paths: &[],
551        used_by: &["TYPED_CONFIG_SYSTEM"],
552        test_json: None,
553        pipeline_affinity: "PipelineAffinity::Pipelines(&[Pipeline::Otlp])",
554        filename: "otlp.rs",
555    },
556    SalukiKey {
557        yaml_path: "otlp_allow_context_heap_allocs",
558        description: "Allow heap allocations for OTLP contexts",
559        default: "",
560        documentation: None,
561        value_type: "ValueType::Bool",
562        schema_default: Some("true"),
563        env_vars: &[],
564        env_var_override: None,
565        additional_yaml_paths: &[],
566        used_by: &["TYPED_CONFIG_SYSTEM"],
567        test_json: None,
568        pipeline_affinity: "PipelineAffinity::Pipelines(&[Pipeline::Otlp])",
569        filename: "otlp.rs",
570    },
571    SalukiKey {
572        yaml_path: "otlp_cached_contexts_limit",
573        description: "Max cached OTLP metric contexts",
574        default: "",
575        documentation: None,
576        value_type: "ValueType::Integer",
577        schema_default: None,
578        env_vars: &[],
579        env_var_override: None,
580        additional_yaml_paths: &[],
581        used_by: &["TYPED_CONFIG_SYSTEM"],
582        test_json: None,
583        pipeline_affinity: "PipelineAffinity::Pipelines(&[Pipeline::Otlp])",
584        filename: "otlp.rs",
585    },
586    SalukiKey {
587        yaml_path: "otlp_cached_tagsets_limit",
588        description: "Max cached OTLP tagsets",
589        default: "",
590        documentation: None,
591        value_type: "ValueType::Integer",
592        schema_default: None,
593        env_vars: &[],
594        env_var_override: None,
595        additional_yaml_paths: &[],
596        used_by: &["TYPED_CONFIG_SYSTEM"],
597        test_json: None,
598        pipeline_affinity: "PipelineAffinity::Pipelines(&[Pipeline::Otlp])",
599        filename: "otlp.rs",
600    },
601    SalukiKey {
602        yaml_path: "otlp_string_interner_size",
603        description: "OTLP context interner capacity",
604        default: "",
605        documentation: None,
606        value_type: "ValueType::Integer",
607        schema_default: None,
608        env_vars: &[],
609        env_var_override: None,
610        additional_yaml_paths: &[],
611        used_by: &["TYPED_CONFIG_SYSTEM"],
612        test_json: None,
613        pipeline_affinity: "PipelineAffinity::Pipelines(&[Pipeline::Otlp])",
614        filename: "otlp.rs",
615    },
616    // ── aggregate.rs ─────────────────────────────────────────────────────────
617    SalukiKey {
618        yaml_path: "aggregate_window_duration_seconds",
619        description: "Aggregation window size",
620        default: "",
621        documentation: None,
622        value_type: "ValueType::Integer",
623        schema_default: None,
624        env_vars: &[],
625        env_var_override: None,
626        additional_yaml_paths: &[],
627        used_by: &["TYPED_CONFIG_SYSTEM"],
628        test_json: None,
629        pipeline_affinity: "PipelineAffinity::Pipelines(&[Pipeline::DogStatsD, Pipeline::Checks])",
630        filename: "aggregate.rs",
631    },
632    SalukiKey {
633        yaml_path: "aggregate_flush_interval",
634        description: "Aggregator flush period",
635        default: "",
636        documentation: None,
637        value_type: "ValueType::String",
638        schema_default: None,
639        env_vars: &[],
640        env_var_override: None,
641        additional_yaml_paths: &[],
642        used_by: &["TYPED_CONFIG_SYSTEM"],
643        test_json: Some(r#"{"secs": 42, "nanos": 0}"#),
644        pipeline_affinity: "PipelineAffinity::Pipelines(&[Pipeline::DogStatsD, Pipeline::Checks])",
645        filename: "aggregate.rs",
646    },
647    SalukiKey {
648        yaml_path: "aggregate_context_limit",
649        description: "Max contexts per aggregation window",
650        default: "",
651        documentation: None,
652        value_type: "ValueType::Integer",
653        schema_default: None,
654        env_vars: &[],
655        env_var_override: None,
656        additional_yaml_paths: &[],
657        used_by: &["TYPED_CONFIG_SYSTEM"],
658        test_json: None,
659        pipeline_affinity: "PipelineAffinity::Pipelines(&[Pipeline::DogStatsD, Pipeline::Checks])",
660        filename: "aggregate.rs",
661    },
662    SalukiKey {
663        yaml_path: "aggregate_passthrough_idle_flush_timeout",
664        description: "Passthrough buffer flush delay",
665        default: "",
666        documentation: None,
667        value_type: "ValueType::String",
668        schema_default: None,
669        env_vars: &[],
670        env_var_override: None,
671        additional_yaml_paths: &[],
672        used_by: &["TYPED_CONFIG_SYSTEM"],
673        test_json: Some(r#"{"secs": 42, "nanos": 0}"#),
674        pipeline_affinity: "PipelineAffinity::Pipelines(&[Pipeline::DogStatsD, Pipeline::Checks])",
675        filename: "aggregate.rs",
676    },
677    // ── trace_obfuscation.rs ─────────────────────────────────────────────────
678    SalukiKey {
679        yaml_path: "apm_config.obfuscation.sql.dbms",
680        description: "SQL obfuscation DBMS dialect",
681        default: "",
682        documentation: None,
683        value_type: "ValueType::String",
684        schema_default: None,
685        env_vars: &[],
686        env_var_override: None,
687        additional_yaml_paths: &[],
688        used_by: &["TYPED_CONFIG_SYSTEM"],
689        test_json: None,
690        pipeline_affinity: "PipelineAffinity::Pipelines(&[Pipeline::Traces])",
691        filename: "trace_obfuscation.rs",
692    },
693    SalukiKey {
694        yaml_path: "apm_config.obfuscation.sql.dollar_quoted_func",
695        description: "Preserve dollar-quoted SQL functions",
696        default: "",
697        documentation: None,
698        value_type: "ValueType::Bool",
699        schema_default: None,
700        env_vars: &[],
701        env_var_override: None,
702        additional_yaml_paths: &[],
703        used_by: &["TYPED_CONFIG_SYSTEM"],
704        test_json: None,
705        pipeline_affinity: "PipelineAffinity::Pipelines(&[Pipeline::Traces])",
706        filename: "trace_obfuscation.rs",
707    },
708    SalukiKey {
709        yaml_path: "apm_config.obfuscation.sql.keep_sql_alias",
710        description: "Preserve SQL aliases in obfuscation",
711        default: "",
712        documentation: None,
713        value_type: "ValueType::Bool",
714        schema_default: None,
715        env_vars: &[],
716        env_var_override: None,
717        additional_yaml_paths: &[],
718        used_by: &["TYPED_CONFIG_SYSTEM"],
719        test_json: None,
720        pipeline_affinity: "PipelineAffinity::Pipelines(&[Pipeline::Traces])",
721        filename: "trace_obfuscation.rs",
722    },
723    SalukiKey {
724        yaml_path: "apm_config.obfuscation.sql.replace_digits",
725        description: "Replace digits in SQL obfuscation",
726        default: "",
727        documentation: None,
728        value_type: "ValueType::Bool",
729        schema_default: None,
730        env_vars: &[],
731        env_var_override: None,
732        additional_yaml_paths: &[],
733        used_by: &["TYPED_CONFIG_SYSTEM"],
734        test_json: None,
735        pipeline_affinity: "PipelineAffinity::Pipelines(&[Pipeline::Traces])",
736        filename: "trace_obfuscation.rs",
737    },
738    SalukiKey {
739        yaml_path: "apm_config.obfuscation.sql.table_names",
740        description: "Collect table names during obfuscation",
741        default: "",
742        documentation: None,
743        value_type: "ValueType::Bool",
744        schema_default: None,
745        env_vars: &[],
746        env_var_override: None,
747        additional_yaml_paths: &[],
748        used_by: &["TYPED_CONFIG_SYSTEM"],
749        test_json: None,
750        pipeline_affinity: "PipelineAffinity::Pipelines(&[Pipeline::Traces])",
751        filename: "trace_obfuscation.rs",
752    },
753    // ── encoders.rs ──────────────────────────────────────────────────────────
754    SalukiKey {
755        yaml_path: "flush_timeout_secs",
756        description: "Encoder flush timeout (secs)",
757        default: "",
758        documentation: None,
759        value_type: "ValueType::Integer",
760        schema_default: None,
761        env_vars: &[],
762        env_var_override: None,
763        additional_yaml_paths: &[],
764        used_by: &["TYPED_CONFIG_SYSTEM"],
765        test_json: None,
766        pipeline_affinity: "PipelineAffinity::Pipelines(&[Pipeline::Checks, Pipeline::Traces, Pipeline::DogStatsD])",
767        filename: "encoders.rs",
768    },
769    SalukiKey {
770        yaml_path: "serializer_max_metrics_per_payload",
771        description: "Max metrics per payload",
772        default: "",
773        documentation: None,
774        value_type: "ValueType::Integer",
775        schema_default: None,
776        env_vars: &[],
777        env_var_override: None,
778        additional_yaml_paths: &[],
779        used_by: &["TYPED_CONFIG_SYSTEM"],
780        test_json: None,
781        pipeline_affinity: "PipelineAffinity::Pipelines(&[Pipeline::Checks, Pipeline::DogStatsD])",
782        filename: "encoders.rs",
783    },
784    // ── dogstatsd_mapper.rs ──────────────────────────────────────────────────
785    SalukiKey {
786        yaml_path: "dogstatsd_mapper_string_interner_size",
787        description: "Mapper string interner byte capacity",
788        default: "64KiB",
789        documentation: Some(
790            "Controls the pre-allocated byte capacity for interning mapped metric names and tags. The default is \
791             `64KiB`. Set this to a nonzero byte count; you can use a bare number of bytes or a human-readable \
792             byte-size string such as `64KiB`. Larger values increase memory usage.",
793        ),
794        value_type: "ValueType::Integer",
795        schema_default: None,
796        env_vars: &[],
797        env_var_override: None,
798        additional_yaml_paths: &[],
799        used_by: &["TYPED_CONFIG_SYSTEM"],
800        test_json: None,
801        pipeline_affinity: "PipelineAffinity::Pipelines(&[Pipeline::DogStatsD])",
802        filename: "dogstatsd_mapper.rs",
803    },
804    // ── accounting.rs ────────────────────────────────────────────────────────
805    SalukiKey {
806        yaml_path: "memory_limit",
807        description: "Process memory limit",
808        default: "",
809        documentation: Some(
810            "### `memory_limit` / `memory_slop_factor`
811
812\
813             ADP uses an explicit process memory limit (`memory_limit`) rather than relying on \
814             Go's garbage collector. The `memory_slop_factor` reserves a fraction of the limit \
815             to account for allocations not tracked by ADP's internal accounting. When memory \
816             usage approaches `memory_limit`, ADP's global limiter begins exerting backpressure \
817             (see `enable_global_limiter`).",
818        ),
819        value_type: "ValueType::String",
820        schema_default: None,
821        env_vars: &[],
822        env_var_override: None,
823        additional_yaml_paths: &[],
824        used_by: &["TYPED_CONFIG_SYSTEM"],
825        test_json: None,
826        pipeline_affinity: "PipelineAffinity::CrossCutting",
827        filename: "accounting.rs",
828    },
829    SalukiKey {
830        yaml_path: "memory_slop_factor",
831        description: "Memory accounting slop fraction",
832        default: "0.25",
833        documentation: Some("See `memory_limit` above."),
834        value_type: "ValueType::Float",
835        schema_default: Some("0.25"),
836        env_vars: &[],
837        env_var_override: None,
838        additional_yaml_paths: &[],
839        used_by: &["TYPED_CONFIG_SYSTEM"],
840        test_json: None,
841        pipeline_affinity: "PipelineAffinity::CrossCutting",
842        filename: "accounting.rs",
843    },
844    SalukiKey {
845        yaml_path: "enable_global_limiter",
846        description: "Global memory limiter toggle",
847        default: "true",
848        documentation: Some(
849            "Controls whether the global memory limiter exerts backpressure as memory usage \
850             approaches `memory_limit`. The default is `true`. When set to `false`, the limiter \
851             becomes a no-op and only the memory bounds of the running components influence \
852             memory usage.",
853        ),
854        value_type: "ValueType::Bool",
855        schema_default: Some("true"),
856        env_vars: &[],
857        env_var_override: None,
858        additional_yaml_paths: &[],
859        used_by: &["TYPED_CONFIG_SYSTEM"],
860        test_json: None,
861        pipeline_affinity: "PipelineAffinity::CrossCutting",
862        filename: "accounting.rs",
863    },
864    SalukiKey {
865        yaml_path: "memory_mode",
866        description: "Memory bounds validation mode",
867        default: "disabled",
868        documentation: Some(
869            "Controls how the calculated memory bounds are reconciled against `memory_limit`. The \
870             default is `disabled`. Accepted values: `disabled` skips bounds validation and applies \
871             no memory limiting; `permissive` logs a warning when the bounds do not fit within the \
872             limit and starts anyway; `strict` refuses to start. Under `permissive` and `strict`, \
873             the global memory limiter is active only when a limit is in effect (configured or \
874             detected from cgroups) and `enable_global_limiter` is `true`.",
875        ),
876        value_type: "ValueType::String",
877        schema_default: Some("disabled"),
878        env_vars: &[],
879        env_var_override: None,
880        additional_yaml_paths: &[],
881        used_by: &["TYPED_CONFIG_SYSTEM"],
882        test_json: None,
883        pipeline_affinity: "PipelineAffinity::CrossCutting",
884        filename: "accounting.rs",
885    },
886];