1pub struct SalukiKey {
6 pub yaml_path: &'static str,
7 pub description: &'static str,
8 pub default: &'static str,
9 pub documentation: Option<&'static str>,
12 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 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 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 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 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 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 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 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 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 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 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];