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: "data_plane.otlp.receiver_grpc_endpoint_temporary",
28 description: "ADP OTLP gRPC listen endpoint",
29 default: "localhost:6317",
30 documentation: Some(
31 "Temporary development key for setting ADP's OTLP listen endpoints independently from the Agent's.",
32 ),
33 value_type: "ValueType::String",
34 schema_default: Some("localhost:6317"),
35 env_vars: &[],
36 env_var_override: None,
37 additional_yaml_paths: &[],
38 used_by: &["TYPED_CONFIG_SYSTEM"],
39 test_json: None,
40 pipeline_affinity: "PipelineAffinity::Pipelines(&[Pipeline::Otlp])",
41 filename: "data_plane.rs",
42 },
43 SalukiKey {
44 yaml_path: "data_plane.otlp.receiver_http_endpoint_temporary",
45 description: "ADP OTLP HTTP listen endpoint",
46 default: "localhost:6318",
47 documentation: Some(
48 "Temporary development key for setting ADP's OTLP listen endpoints independently from the Agent's.",
49 ),
50 value_type: "ValueType::String",
51 schema_default: Some("localhost:6318"),
52 env_vars: &[],
53 env_var_override: None,
54 additional_yaml_paths: &[],
55 used_by: &["TYPED_CONFIG_SYSTEM"],
56 test_json: None,
57 pipeline_affinity: "PipelineAffinity::Pipelines(&[Pipeline::Otlp])",
58 filename: "data_plane.rs",
59 },
60 SalukiKey {
62 yaml_path: "dogstatsd_allow_context_heap_allocs",
63 description: "Allow heap allocations for contexts",
64 default: "true",
65 documentation: None,
66 value_type: "ValueType::Bool",
67 schema_default: Some("true"),
68 env_vars: &[],
69 env_var_override: None,
70 additional_yaml_paths: &[],
71 used_by: &["TYPED_CONFIG_SYSTEM"],
72 test_json: None,
73 pipeline_affinity: "PipelineAffinity::Pipelines(&[Pipeline::DogStatsD])",
74 filename: "dogstatsd.rs",
75 },
76 SalukiKey {
77 yaml_path: "dogstatsd_autoscale_udp_listeners",
78 description: "Bind multiple UDP sockets via SO_REUSEPORT",
79 default: "false",
80 documentation: None,
81 value_type: "ValueType::Bool",
82 schema_default: Some("false"),
83 env_vars: &[],
84 env_var_override: None,
85 additional_yaml_paths: &[],
86 used_by: &["TYPED_CONFIG_SYSTEM"],
87 test_json: None,
88 pipeline_affinity: "PipelineAffinity::Pipelines(&[Pipeline::DogStatsD])",
89 filename: "dogstatsd.rs",
90 },
91 SalukiKey {
92 yaml_path: "dogstatsd_buffer_count",
93 description: "Baseline receive buffers",
94 default: "128",
95 documentation: None,
96 value_type: "ValueType::Integer",
97 schema_default: Some("128"),
98 env_vars: &[],
99 env_var_override: None,
100 additional_yaml_paths: &[],
101 used_by: &["TYPED_CONFIG_SYSTEM"],
102 test_json: None,
103 pipeline_affinity: "PipelineAffinity::Pipelines(&[Pipeline::DogStatsD])",
104 filename: "dogstatsd.rs",
105 },
106 SalukiKey {
107 yaml_path: "dogstatsd_buffer_count_max",
108 description: "Maximum receive buffer count",
109 default: "32768",
110 documentation: None,
111 value_type: "ValueType::Integer",
112 schema_default: Some("32768"),
113 env_vars: &[],
114 env_var_override: None,
115 additional_yaml_paths: &[],
116 used_by: &["TYPED_CONFIG_SYSTEM"],
117 test_json: None,
118 pipeline_affinity: "PipelineAffinity::Pipelines(&[Pipeline::DogStatsD])",
119 filename: "dogstatsd.rs",
120 },
121 SalukiKey {
122 yaml_path: "dogstatsd_cached_contexts_limit",
123 description: "Max cached metric contexts",
124 default: "500000",
125 documentation: None,
126 value_type: "ValueType::Integer",
127 schema_default: Some("500000"),
128 env_vars: &[],
129 env_var_override: None,
130 additional_yaml_paths: &[],
131 used_by: &["TYPED_CONFIG_SYSTEM"],
132 test_json: None,
133 pipeline_affinity: "PipelineAffinity::Pipelines(&[Pipeline::DogStatsD])",
134 filename: "dogstatsd.rs",
135 },
136 SalukiKey {
137 yaml_path: "dogstatsd_cached_tagsets_limit",
138 description: "Max cached tagsets",
139 default: "500000",
140 documentation: None,
141 value_type: "ValueType::Integer",
142 schema_default: Some("500000"),
143 env_vars: &[],
144 env_var_override: None,
145 additional_yaml_paths: &[],
146 used_by: &["TYPED_CONFIG_SYSTEM"],
147 test_json: None,
148 pipeline_affinity: "PipelineAffinity::Pipelines(&[Pipeline::DogStatsD])",
149 filename: "dogstatsd.rs",
150 },
151 SalukiKey {
152 yaml_path: "dogstatsd_minimum_sample_rate",
153 description: "Floor for metric sample rates",
154 default: "0.000000003845",
155 documentation: Some(
156 "ADP enforces a minimum sample rate on incoming metrics to prevent memory exhaustion \
157 from extremely low sample rates on histograms and sketches. Sending metrics with a \
158 very high inverse sample rate (for example `@0.0000001`) can cause unbounded memory \
159 growth in a sketch; this setting prevents that. The default is conservative enough \
160 that normal clients are unaffected.",
161 ),
162 value_type: "ValueType::Float",
163 schema_default: Some("0.000000003845"),
164 env_vars: &[],
165 env_var_override: None,
166 additional_yaml_paths: &[],
167 used_by: &["TYPED_CONFIG_SYSTEM"],
168 test_json: None,
169 pipeline_affinity: "PipelineAffinity::Pipelines(&[Pipeline::DogStatsD])",
170 filename: "dogstatsd.rs",
171 },
172 SalukiKey {
173 yaml_path: "metric_tag_value_allowlist",
174 description: "Per-metric tag value allow-list",
175 default: "[]",
176 documentation: Some(concat!(
177 "### `metric_tag_value_allowlist`\n\n",
178 "Use `metric_tag_value_allowlist` to bound metric cardinality by retaining selected values for a tag. ",
179 "Configure each list item with a `metric_prefix`, a `tag_name`, and the `values` to retain. The rule ",
180 "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 ",
181 "`on_miss: replace` and configure `replacement`; the replacement defaults to `other`.\n\n",
182 "```yaml\n",
183 "metric_tag_value_allowlist:\n",
184 " - metric_prefix: requests.\n",
185 " tag_name: customer_id\n",
186 " values: [customer-1, customer-2]\n",
187 " on_miss: replace\n",
188 " replacement: other\n",
189 "```\n\n",
190 "This ADP-only key is independent from `metric_tag_filterlist`. Remote Config updates to ",
191 "`metric_tag_filterlist` therefore do not replace locally configured value allow-lists. Value allow-list ",
192 "changes require an ADP restart in this initial implementation. Rules apply to counters and sketch-backed ",
193 "metrics before aggregation, including instrumented and origin tags. ADP matches `metric_prefix` after ",
194 "DogStatsD mapper rewrites and `statsd_metric_namespace` prefixing, so configure the final metric name ",
195 "produced by those steps.\n\n",
196 "Whole-tag filtering runs first. If `metric_tag_filterlist` uses `action: include`, add the value-filtered ",
197 "tag key to its `tags` list or the whole-tag rule removes it before value filtering. Value rules do not ",
198 "operate on bare tags such as `customer_id`, because they have no value. An empty string in a key/value ",
199 "tag such as `customer_id:` is a value and is subject to the allow-list; include `\"\"` in `values` to ",
200 "retain it. An empty `values` list treats every key/value tag as a mismatch.\n\n",
201 "Distinct metric prefixes must not overlap, even when the rules target different tags. Multiple rules may ",
202 "use the same prefix when they target different tags. ADP rejects overlapping rules at startup so each ",
203 "metric matches at most one prefix. ADP also rejects empty metric prefixes and tag names, duplicate prefix ",
204 "and tag pairs, and tag names containing `:`. As with ",
205 "`metric_tag_filterlist`, ADP does not trim configured strings: prefixes, tag names, values, and replacements ",
206 "preserve whitespace and match exactly. Configure a replacement that cannot collide with a real tag value.",
207 )),
208 value_type: "ValueType::String",
209 schema_default: Some("[]"),
210 env_vars: &[],
211 env_var_override: Some(&[]),
212 additional_yaml_paths: &[],
213 used_by: &["TYPED_CONFIG_SYSTEM"],
214 test_json: Some(
215 r#"[{"metric_prefix":"smoke.","tag_name":"customer_id","values":["customer-1"],"on_miss":"replace","replacement":"other"}]"#,
216 ),
217 pipeline_affinity: "PipelineAffinity::Pipelines(&[Pipeline::DogStatsD])",
218 filename: "tag_filterlist.rs",
219 },
220 SalukiKey {
221 yaml_path: "dogstatsd_permissive_decoding",
222 description: "Relaxes decoder strictness",
223 default: "true",
224 documentation: Some(
225 "By default, ADP parses DogStatsD packets with the same leniency as the core agent, \
226 accepting packets that technically violate the spec. Setting this to `false` enables \
227 strict mode, which rejects non-conformant packets. Strict mode is not available in \
228 the core agent.",
229 ),
230 value_type: "ValueType::Bool",
231 schema_default: Some("true"),
232 env_vars: &[],
233 env_var_override: None,
234 additional_yaml_paths: &[],
235 used_by: &["TYPED_CONFIG_SYSTEM"],
236 test_json: None,
237 pipeline_affinity: "PipelineAffinity::Pipelines(&[Pipeline::DogStatsD])",
238 filename: "dogstatsd.rs",
239 },
240 SalukiKey {
241 yaml_path: "dogstatsd_string_interner_size_bytes",
242 description: "Explicit byte budget for context interner",
243 default: "",
244 documentation: Some(
245 "Accepts a bare integer number of bytes or a human-readable byte-size string such as `12MiB`. \
246 When unset, ADP derives the byte budget from `dogstatsd_string_interner_size`.",
247 ),
248 value_type: "ValueType::String",
249 schema_default: None,
250 env_vars: &[],
251 env_var_override: None,
252 additional_yaml_paths: &[],
253 used_by: &["TYPED_CONFIG_SYSTEM"],
254 test_json: Some(r#""12MiB""#),
255 pipeline_affinity: "PipelineAffinity::Pipelines(&[Pipeline::DogStatsD])",
256 filename: "dogstatsd.rs",
257 },
258 SalukiKey {
259 yaml_path: "dogstatsd_tcp_port",
260 description: "DogStatsD TCP listen port; 0 disables TCP",
261 default: "0",
262 documentation: None,
263 value_type: "ValueType::Integer",
264 schema_default: Some("0"),
265 env_vars: &[],
266 env_var_override: None,
267 additional_yaml_paths: &[],
268 used_by: &["TYPED_CONFIG_SYSTEM"],
269 test_json: None,
270 pipeline_affinity: "PipelineAffinity::Pipelines(&[Pipeline::DogStatsD])",
271 filename: "dogstatsd.rs",
272 },
273 SalukiKey {
275 yaml_path: "otlp_config.traces.enable_otlp_compute_top_level_by_span_kind",
276 description: "Enable OTLP top-level-by-span-kind",
277 default: "",
278 documentation: None,
279 value_type: "ValueType::Bool",
280 schema_default: Some("true"),
281 env_vars: &[],
282 env_var_override: None,
283 additional_yaml_paths: &[],
284 used_by: &["TYPED_CONFIG_SYSTEM"],
285 test_json: None,
286 pipeline_affinity: "PipelineAffinity::Pipelines(&[Pipeline::Traces])",
287 filename: "otlp.rs",
288 },
289 SalukiKey {
290 yaml_path: "otlp_config.traces.ignore_missing_datadog_fields",
291 description: "Ignore missing Datadog fields in OTLP",
292 default: "",
293 documentation: None,
294 value_type: "ValueType::Bool",
295 schema_default: None,
296 env_vars: &[],
297 env_var_override: None,
298 additional_yaml_paths: &[],
299 used_by: &["TYPED_CONFIG_SYSTEM"],
300 test_json: None,
301 pipeline_affinity: "PipelineAffinity::Pipelines(&[Pipeline::Traces])",
302 filename: "otlp.rs",
303 },
304 SalukiKey {
305 yaml_path: "otlp_config.traces.string_interner_size",
306 description: "OTLP trace string interner capacity",
307 default: "",
308 documentation: None,
309 value_type: "ValueType::Integer",
310 schema_default: None,
311 env_vars: &[],
312 env_var_override: None,
313 additional_yaml_paths: &[],
314 used_by: &["TYPED_CONFIG_SYSTEM"],
315 test_json: None,
316 pipeline_affinity: "PipelineAffinity::Pipelines(&[Pipeline::Traces])",
317 filename: "otlp.rs",
318 },
319 SalukiKey {
320 yaml_path: "otlp_config.receiver.protocols.http.transport",
321 description: "OTLP HTTP receiver transport",
322 default: "",
323 documentation: None,
324 value_type: "ValueType::String",
325 schema_default: None,
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::Otlp])",
332 filename: "otlp.rs",
333 },
334 SalukiKey {
335 yaml_path: "otlp_allow_context_heap_allocs",
336 description: "Allow heap allocations for OTLP contexts",
337 default: "",
338 documentation: None,
339 value_type: "ValueType::Bool",
340 schema_default: Some("true"),
341 env_vars: &[],
342 env_var_override: None,
343 additional_yaml_paths: &[],
344 used_by: &["TYPED_CONFIG_SYSTEM"],
345 test_json: None,
346 pipeline_affinity: "PipelineAffinity::Pipelines(&[Pipeline::Otlp])",
347 filename: "otlp.rs",
348 },
349 SalukiKey {
350 yaml_path: "otlp_cached_contexts_limit",
351 description: "Max cached OTLP metric contexts",
352 default: "",
353 documentation: None,
354 value_type: "ValueType::Integer",
355 schema_default: None,
356 env_vars: &[],
357 env_var_override: None,
358 additional_yaml_paths: &[],
359 used_by: &["TYPED_CONFIG_SYSTEM"],
360 test_json: None,
361 pipeline_affinity: "PipelineAffinity::Pipelines(&[Pipeline::Otlp])",
362 filename: "otlp.rs",
363 },
364 SalukiKey {
365 yaml_path: "otlp_cached_tagsets_limit",
366 description: "Max cached OTLP tagsets",
367 default: "",
368 documentation: None,
369 value_type: "ValueType::Integer",
370 schema_default: None,
371 env_vars: &[],
372 env_var_override: None,
373 additional_yaml_paths: &[],
374 used_by: &["TYPED_CONFIG_SYSTEM"],
375 test_json: None,
376 pipeline_affinity: "PipelineAffinity::Pipelines(&[Pipeline::Otlp])",
377 filename: "otlp.rs",
378 },
379 SalukiKey {
380 yaml_path: "otlp_string_interner_size",
381 description: "OTLP context interner capacity",
382 default: "",
383 documentation: None,
384 value_type: "ValueType::Integer",
385 schema_default: None,
386 env_vars: &[],
387 env_var_override: None,
388 additional_yaml_paths: &[],
389 used_by: &["TYPED_CONFIG_SYSTEM"],
390 test_json: None,
391 pipeline_affinity: "PipelineAffinity::Pipelines(&[Pipeline::Otlp])",
392 filename: "otlp.rs",
393 },
394 SalukiKey {
396 yaml_path: "aggregate_window_duration_seconds",
397 description: "Aggregation window size",
398 default: "",
399 documentation: None,
400 value_type: "ValueType::Integer",
401 schema_default: None,
402 env_vars: &[],
403 env_var_override: None,
404 additional_yaml_paths: &[],
405 used_by: &["TYPED_CONFIG_SYSTEM"],
406 test_json: None,
407 pipeline_affinity: "PipelineAffinity::Pipelines(&[Pipeline::DogStatsD, Pipeline::Checks])",
408 filename: "aggregate.rs",
409 },
410 SalukiKey {
411 yaml_path: "aggregate_flush_interval",
412 description: "Aggregator flush period",
413 default: "",
414 documentation: None,
415 value_type: "ValueType::String",
416 schema_default: None,
417 env_vars: &[],
418 env_var_override: None,
419 additional_yaml_paths: &[],
420 used_by: &["TYPED_CONFIG_SYSTEM"],
421 test_json: Some(r#"{"secs": 42, "nanos": 0}"#),
422 pipeline_affinity: "PipelineAffinity::Pipelines(&[Pipeline::DogStatsD, Pipeline::Checks])",
423 filename: "aggregate.rs",
424 },
425 SalukiKey {
426 yaml_path: "aggregate_context_limit",
427 description: "Max contexts per aggregation window",
428 default: "",
429 documentation: None,
430 value_type: "ValueType::Integer",
431 schema_default: None,
432 env_vars: &[],
433 env_var_override: None,
434 additional_yaml_paths: &[],
435 used_by: &["TYPED_CONFIG_SYSTEM"],
436 test_json: None,
437 pipeline_affinity: "PipelineAffinity::Pipelines(&[Pipeline::DogStatsD, Pipeline::Checks])",
438 filename: "aggregate.rs",
439 },
440 SalukiKey {
441 yaml_path: "aggregate_passthrough_idle_flush_timeout",
442 description: "Passthrough buffer flush delay",
443 default: "",
444 documentation: None,
445 value_type: "ValueType::String",
446 schema_default: None,
447 env_vars: &[],
448 env_var_override: None,
449 additional_yaml_paths: &[],
450 used_by: &["TYPED_CONFIG_SYSTEM"],
451 test_json: Some(r#"{"secs": 42, "nanos": 0}"#),
452 pipeline_affinity: "PipelineAffinity::Pipelines(&[Pipeline::DogStatsD, Pipeline::Checks])",
453 filename: "aggregate.rs",
454 },
455 SalukiKey {
457 yaml_path: "apm_config.obfuscation.sql.dbms",
458 description: "SQL obfuscation DBMS dialect",
459 default: "",
460 documentation: None,
461 value_type: "ValueType::String",
462 schema_default: None,
463 env_vars: &[],
464 env_var_override: None,
465 additional_yaml_paths: &[],
466 used_by: &["TYPED_CONFIG_SYSTEM"],
467 test_json: None,
468 pipeline_affinity: "PipelineAffinity::Pipelines(&[Pipeline::Traces])",
469 filename: "trace_obfuscation.rs",
470 },
471 SalukiKey {
472 yaml_path: "apm_config.obfuscation.sql.dollar_quoted_func",
473 description: "Preserve dollar-quoted SQL functions",
474 default: "",
475 documentation: None,
476 value_type: "ValueType::Bool",
477 schema_default: None,
478 env_vars: &[],
479 env_var_override: None,
480 additional_yaml_paths: &[],
481 used_by: &["TYPED_CONFIG_SYSTEM"],
482 test_json: None,
483 pipeline_affinity: "PipelineAffinity::Pipelines(&[Pipeline::Traces])",
484 filename: "trace_obfuscation.rs",
485 },
486 SalukiKey {
487 yaml_path: "apm_config.obfuscation.sql.keep_sql_alias",
488 description: "Preserve SQL aliases in obfuscation",
489 default: "",
490 documentation: None,
491 value_type: "ValueType::Bool",
492 schema_default: None,
493 env_vars: &[],
494 env_var_override: None,
495 additional_yaml_paths: &[],
496 used_by: &["TYPED_CONFIG_SYSTEM"],
497 test_json: None,
498 pipeline_affinity: "PipelineAffinity::Pipelines(&[Pipeline::Traces])",
499 filename: "trace_obfuscation.rs",
500 },
501 SalukiKey {
502 yaml_path: "apm_config.obfuscation.sql.replace_digits",
503 description: "Replace digits in SQL obfuscation",
504 default: "",
505 documentation: None,
506 value_type: "ValueType::Bool",
507 schema_default: None,
508 env_vars: &[],
509 env_var_override: None,
510 additional_yaml_paths: &[],
511 used_by: &["TYPED_CONFIG_SYSTEM"],
512 test_json: None,
513 pipeline_affinity: "PipelineAffinity::Pipelines(&[Pipeline::Traces])",
514 filename: "trace_obfuscation.rs",
515 },
516 SalukiKey {
517 yaml_path: "apm_config.obfuscation.sql.table_names",
518 description: "Collect table names during obfuscation",
519 default: "",
520 documentation: None,
521 value_type: "ValueType::Bool",
522 schema_default: None,
523 env_vars: &[],
524 env_var_override: None,
525 additional_yaml_paths: &[],
526 used_by: &["TYPED_CONFIG_SYSTEM"],
527 test_json: None,
528 pipeline_affinity: "PipelineAffinity::Pipelines(&[Pipeline::Traces])",
529 filename: "trace_obfuscation.rs",
530 },
531 SalukiKey {
533 yaml_path: "flush_timeout_secs",
534 description: "Encoder flush timeout (secs)",
535 default: "",
536 documentation: None,
537 value_type: "ValueType::Integer",
538 schema_default: None,
539 env_vars: &[],
540 env_var_override: None,
541 additional_yaml_paths: &[],
542 used_by: &["TYPED_CONFIG_SYSTEM"],
543 test_json: None,
544 pipeline_affinity: "PipelineAffinity::Pipelines(&[Pipeline::Checks, Pipeline::Traces, Pipeline::DogStatsD])",
545 filename: "encoders.rs",
546 },
547 SalukiKey {
548 yaml_path: "serializer_max_metrics_per_payload",
549 description: "Max metrics per payload",
550 default: "",
551 documentation: None,
552 value_type: "ValueType::Integer",
553 schema_default: None,
554 env_vars: &[],
555 env_var_override: None,
556 additional_yaml_paths: &[],
557 used_by: &["TYPED_CONFIG_SYSTEM"],
558 test_json: None,
559 pipeline_affinity: "PipelineAffinity::Pipelines(&[Pipeline::Checks, Pipeline::DogStatsD])",
560 filename: "encoders.rs",
561 },
562 SalukiKey {
564 yaml_path: "dogstatsd_mapper_string_interner_size",
565 description: "Mapper string interner byte capacity",
566 default: "64KiB",
567 documentation: Some(
568 "Controls the pre-allocated byte capacity for interning mapped metric names and tags. The default is \
569 `64KiB`. Set this to a nonzero byte count; you can use a bare number of bytes or a human-readable \
570 byte-size string such as `64KiB`. Larger values increase memory usage.",
571 ),
572 value_type: "ValueType::Integer",
573 schema_default: None,
574 env_vars: &[],
575 env_var_override: None,
576 additional_yaml_paths: &[],
577 used_by: &["TYPED_CONFIG_SYSTEM"],
578 test_json: None,
579 pipeline_affinity: "PipelineAffinity::Pipelines(&[Pipeline::DogStatsD])",
580 filename: "dogstatsd_mapper.rs",
581 },
582 SalukiKey {
584 yaml_path: "memory_limit",
585 description: "Process memory limit",
586 default: "",
587 documentation: Some(
588 "### `memory_limit` / `memory_slop_factor`
589
590\
591 ADP uses an explicit process memory limit (`memory_limit`) rather than relying on \
592 Go's garbage collector. The `memory_slop_factor` reserves a fraction of the limit \
593 to account for allocations not tracked by ADP's internal accounting. When memory \
594 usage approaches `memory_limit`, ADP's global limiter begins exerting backpressure \
595 (see `enable_global_limiter`).",
596 ),
597 value_type: "ValueType::String",
598 schema_default: None,
599 env_vars: &[],
600 env_var_override: None,
601 additional_yaml_paths: &[],
602 used_by: &["TYPED_CONFIG_SYSTEM"],
603 test_json: None,
604 pipeline_affinity: "PipelineAffinity::CrossCutting",
605 filename: "accounting.rs",
606 },
607 SalukiKey {
608 yaml_path: "memory_slop_factor",
609 description: "Memory accounting slop fraction",
610 default: "0.25",
611 documentation: Some("See `memory_limit` above."),
612 value_type: "ValueType::Float",
613 schema_default: Some("0.25"),
614 env_vars: &[],
615 env_var_override: None,
616 additional_yaml_paths: &[],
617 used_by: &["TYPED_CONFIG_SYSTEM"],
618 test_json: None,
619 pipeline_affinity: "PipelineAffinity::CrossCutting",
620 filename: "accounting.rs",
621 },
622 SalukiKey {
623 yaml_path: "enable_global_limiter",
624 description: "Global memory limiter toggle",
625 default: "true",
626 documentation: Some(
627 "Controls whether the global memory limiter exerts backpressure as memory usage \
628 approaches `memory_limit`. The default is `true`. When set to `false`, the limiter \
629 becomes a no-op and only the memory bounds of the running components influence \
630 memory usage.",
631 ),
632 value_type: "ValueType::Bool",
633 schema_default: Some("true"),
634 env_vars: &[],
635 env_var_override: None,
636 additional_yaml_paths: &[],
637 used_by: &["TYPED_CONFIG_SYSTEM"],
638 test_json: None,
639 pipeline_affinity: "PipelineAffinity::CrossCutting",
640 filename: "accounting.rs",
641 },
642 SalukiKey {
643 yaml_path: "memory_mode",
644 description: "Memory bounds validation mode",
645 default: "disabled",
646 documentation: Some(
647 "Controls how the calculated memory bounds are reconciled against `memory_limit`. The \
648 default is `disabled`. Accepted values: `disabled` skips bounds validation and applies \
649 no memory limiting; `permissive` logs a warning when the bounds do not fit within the \
650 limit and starts anyway; `strict` refuses to start. Under `permissive` and `strict`, \
651 the global memory limiter is active only when a limit is in effect (configured or \
652 detected from cgroups) and `enable_global_limiter` is `true`.",
653 ),
654 value_type: "ValueType::String",
655 schema_default: Some("disabled"),
656 env_vars: &[],
657 env_var_override: None,
658 additional_yaml_paths: &[],
659 used_by: &["TYPED_CONFIG_SYSTEM"],
660 test_json: None,
661 pipeline_affinity: "PipelineAffinity::CrossCutting",
662 filename: "accounting.rs",
663 },
664];