Skip to main content

dynamo_runtime/config/
environment_names.rs

1// SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
2// SPDX-License-Identifier: Apache-2.0
3
4//! Environment variable name constants for centralized management across the codebase
5//!
6//! This module provides centralized environment variable name constants to ensure
7//! consistency and avoid duplication across the codebase, similar to how
8//! `prometheus_names.rs` manages metric names.
9//!
10//! ## Organization
11//!
12//! Environment variables are organized by functional area:
13//! - **Logging**: Log level, configuration, and OTLP tracing
14//! - **Runtime**: Tokio runtime configuration and system server settings
15//! - **NATS**: NATS client connection and authentication
16//! - **ETCD**: ETCD client connection and authentication
17//! - **Event Plane**: Event transport selection (NATS)
18//! - **KVBM**: Key-Value Block Manager configuration
19//! - **LLM**: Language model inference configuration
20//! - **Model**: Model loading and caching
21//! - **Worker**: Worker lifecycle and shutdown
22//! - **Testing**: Test-specific configuration
23//! - **Mocker**: Mocker (mock scheduler/KV manager) configuration
24
25/// Logging and tracing environment variables
26pub mod logging {
27    /// Log level (e.g., "debug", "info", "warn", "error")
28    pub const DYN_LOG: &str = "DYN_LOG";
29
30    /// Path to logging configuration file
31    pub const DYN_LOGGING_CONFIG_PATH: &str = "DYN_LOGGING_CONFIG_PATH";
32
33    /// Enable JSONL logging format
34    pub const DYN_LOGGING_JSONL: &str = "DYN_LOGGING_JSONL";
35
36    /// Disable ANSI terminal colors in logs
37    pub const DYN_SDK_DISABLE_ANSI_LOGGING: &str = "DYN_SDK_DISABLE_ANSI_LOGGING";
38
39    /// Use local timezone for logging timestamps (default is UTC)
40    pub const DYN_LOG_USE_LOCAL_TZ: &str = "DYN_LOG_USE_LOCAL_TZ";
41
42    /// Enable span event logging (create/close events)
43    pub const DYN_LOGGING_SPAN_EVENTS: &str = "DYN_LOGGING_SPAN_EVENTS";
44
45    /// OTLP (OpenTelemetry Protocol) tracing configuration
46    pub mod otlp {
47        /// Enable OTLP trace exporting (set to "1" to enable)
48        pub const OTEL_EXPORT_ENABLED: &str = "OTEL_EXPORT_ENABLED";
49
50        /// OTLP exporter endpoint URL
51        /// Spec: https://opentelemetry.io/docs/specs/otel/protocol/exporter/
52        pub const OTEL_EXPORTER_OTLP_TRACES_ENDPOINT: &str = "OTEL_EXPORTER_OTLP_TRACES_ENDPOINT";
53
54        /// Service name for OTLP traces
55        pub const OTEL_SERVICE_NAME: &str = "OTEL_SERVICE_NAME";
56    }
57}
58
59/// Runtime configuration environment variables
60///
61/// These control the Tokio runtime, system health/metrics server, and worker behavior
62pub mod runtime {
63    /// Number of async worker threads for Tokio runtime
64    pub const DYN_RUNTIME_NUM_WORKER_THREADS: &str = "DYN_RUNTIME_NUM_WORKER_THREADS";
65
66    /// Maximum number of blocking threads for Tokio runtime
67    pub const DYN_RUNTIME_MAX_BLOCKING_THREADS: &str = "DYN_RUNTIME_MAX_BLOCKING_THREADS";
68
69    /// System status server configuration
70    pub mod system {
71        /// Enable system status server for health and metrics endpoints
72        /// ⚠️ DEPRECATED: will be removed soon
73        pub const DYN_SYSTEM_ENABLED: &str = "DYN_SYSTEM_ENABLED";
74
75        /// System status server host
76        pub const DYN_SYSTEM_HOST: &str = "DYN_SYSTEM_HOST";
77
78        /// System status server port
79        pub const DYN_SYSTEM_PORT: &str = "DYN_SYSTEM_PORT";
80
81        /// Use endpoint health status for system health
82        /// ⚠️ DEPRECATED: No longer used
83        pub const DYN_SYSTEM_USE_ENDPOINT_HEALTH_STATUS: &str =
84            "DYN_SYSTEM_USE_ENDPOINT_HEALTH_STATUS";
85
86        /// Starting health status for the system
87        pub const DYN_SYSTEM_STARTING_HEALTH_STATUS: &str = "DYN_SYSTEM_STARTING_HEALTH_STATUS";
88
89        /// Health check endpoint path
90        pub const DYN_SYSTEM_HEALTH_PATH: &str = "DYN_SYSTEM_HEALTH_PATH";
91
92        /// Liveness check endpoint path
93        pub const DYN_SYSTEM_LIVE_PATH: &str = "DYN_SYSTEM_LIVE_PATH";
94    }
95
96    /// Compute configuration
97    pub mod compute {
98        /// Prefix for compute-related environment variables
99        pub const PREFIX: &str = "DYN_COMPUTE_";
100    }
101
102    /// Canary deployment configuration
103    pub mod canary {
104        /// Wait time in seconds for canary deployments
105        pub const DYN_CANARY_WAIT_TIME: &str = "DYN_CANARY_WAIT_TIME";
106    }
107}
108
109/// Worker lifecycle environment variables
110pub mod worker {
111    /// Graceful shutdown timeout in seconds
112    pub const DYN_WORKER_GRACEFUL_SHUTDOWN_TIMEOUT: &str = "DYN_WORKER_GRACEFUL_SHUTDOWN_TIMEOUT";
113}
114
115/// NATS transport environment variables
116pub mod nats {
117    /// NATS server address (e.g., "nats://localhost:4222")
118    pub const NATS_SERVER: &str = "NATS_SERVER";
119
120    /// NATS authentication environment variables (checked in priority order)
121    pub mod auth {
122        /// Username for NATS authentication (use with NATS_AUTH_PASSWORD)
123        pub const NATS_AUTH_USERNAME: &str = "NATS_AUTH_USERNAME";
124
125        /// Password for NATS authentication (use with NATS_AUTH_USERNAME)
126        pub const NATS_AUTH_PASSWORD: &str = "NATS_AUTH_PASSWORD";
127
128        /// Token for NATS authentication
129        pub const NATS_AUTH_TOKEN: &str = "NATS_AUTH_TOKEN";
130
131        /// NKey for NATS authentication
132        pub const NATS_AUTH_NKEY: &str = "NATS_AUTH_NKEY";
133
134        /// Path to NATS credentials file
135        pub const NATS_AUTH_CREDENTIALS_FILE: &str = "NATS_AUTH_CREDENTIALS_FILE";
136    }
137
138    /// NATS stream configuration
139    pub mod stream {
140        /// Maximum age for messages in NATS stream (in seconds)
141        pub const DYN_NATS_STREAM_MAX_AGE: &str = "DYN_NATS_STREAM_MAX_AGE";
142    }
143}
144
145/// ETCD transport environment variables
146pub mod etcd {
147    /// ETCD endpoints (comma-separated list of URLs)
148    pub const ETCD_ENDPOINTS: &str = "ETCD_ENDPOINTS";
149
150    /// ETCD authentication environment variables
151    pub mod auth {
152        /// Username for ETCD authentication
153        pub const ETCD_AUTH_USERNAME: &str = "ETCD_AUTH_USERNAME";
154
155        /// Password for ETCD authentication
156        pub const ETCD_AUTH_PASSWORD: &str = "ETCD_AUTH_PASSWORD";
157
158        /// Path to CA certificate for ETCD TLS
159        pub const ETCD_AUTH_CA: &str = "ETCD_AUTH_CA";
160
161        /// Path to client certificate for ETCD TLS
162        pub const ETCD_AUTH_CLIENT_CERT: &str = "ETCD_AUTH_CLIENT_CERT";
163
164        /// Path to client key for ETCD TLS
165        pub const ETCD_AUTH_CLIENT_KEY: &str = "ETCD_AUTH_CLIENT_KEY";
166    }
167}
168
169/// Key-Value Block Manager (KVBM) environment variables
170pub mod kvbm {
171    /// Enable KVBM metrics endpoint
172    pub const DYN_KVBM_METRICS: &str = "DYN_KVBM_METRICS";
173
174    /// KVBM metrics endpoint port
175    pub const DYN_KVBM_METRICS_PORT: &str = "DYN_KVBM_METRICS_PORT";
176
177    /// Enable KVBM recording for debugging.
178    pub const DYN_KVBM_ENABLE_RECORD: &str = "DYN_KVBM_ENABLE_RECORD";
179
180    /// Disable disk offload filter
181    pub const DYN_KVBM_DISABLE_DISK_OFFLOAD_FILTER: &str = "DYN_KVBM_DISABLE_DISK_OFFLOAD_FILTER";
182
183    /// CPU cache configuration
184    pub mod cpu_cache {
185        /// CPU cache size in GB
186        pub const DYN_KVBM_CPU_CACHE_GB: &str = "DYN_KVBM_CPU_CACHE_GB";
187
188        /// CPU cache size in number of blocks (override)
189        pub const DYN_KVBM_CPU_CACHE_OVERRIDE_NUM_BLOCKS: &str =
190            "DYN_KVBM_CPU_CACHE_OVERRIDE_NUM_BLOCKS";
191    }
192
193    /// Disk cache configuration
194    pub mod disk_cache {
195        /// Disk cache size in GB
196        pub const DYN_KVBM_DISK_CACHE_GB: &str = "DYN_KVBM_DISK_CACHE_GB";
197
198        /// Disk cache size in number of blocks (override)
199        pub const DYN_KVBM_DISK_CACHE_OVERRIDE_NUM_BLOCKS: &str =
200            "DYN_KVBM_DISK_CACHE_OVERRIDE_NUM_BLOCKS";
201    }
202
203    /// Object storage configuration
204    pub mod object_storage {
205        /// Enable object storage. Set to "1" to enable.
206        pub const DYN_KVBM_OBJECT_ENABLED: &str = "DYN_KVBM_OBJECT_ENABLED";
207
208        /// Bucket name for object storage cache
209        /// Supports `{worker_id}` template for per-worker buckets
210        /// Example: "kv-cache-{worker_id}"
211        pub const DYN_KVBM_OBJECT_BUCKET: &str = "DYN_KVBM_OBJECT_BUCKET";
212
213        /// Endpoint for object storage
214        pub const DYN_KVBM_OBJECT_ENDPOINT: &str = "DYN_KVBM_OBJECT_ENDPOINT";
215
216        /// Region for object storage
217        pub const DYN_KVBM_OBJECT_REGION: &str = "DYN_KVBM_OBJECT_REGION";
218
219        /// Access key for authentication
220        pub const DYN_KVBM_OBJECT_ACCESS_KEY: &str = "DYN_KVBM_OBJECT_ACCESS_KEY";
221
222        /// Secret key for authentication
223        pub const DYN_KVBM_OBJECT_SECRET_KEY: &str = "DYN_KVBM_OBJECT_SECRET_KEY";
224
225        /// Number of blocks to store in object storage
226        pub const DYN_KVBM_OBJECT_NUM_BLOCKS: &str = "DYN_KVBM_OBJECT_NUM_BLOCKS";
227    }
228    /// Transfer configuration
229    pub mod transfer {
230        /// Maximum number of blocks per transfer batch
231        pub const DYN_KVBM_TRANSFER_BATCH_SIZE: &str = "DYN_KVBM_TRANSFER_BATCH_SIZE";
232    }
233
234    /// KVBM leader (distributed mode) configuration
235    pub mod leader {
236        /// Timeout in seconds for KVBM leader and worker initialization
237        pub const DYN_KVBM_LEADER_WORKER_INIT_TIMEOUT_SECS: &str =
238            "DYN_KVBM_LEADER_WORKER_INIT_TIMEOUT_SECS";
239
240        /// ZMQ host for KVBM leader
241        pub const DYN_KVBM_LEADER_ZMQ_HOST: &str = "DYN_KVBM_LEADER_ZMQ_HOST";
242
243        /// ZMQ publish port for KVBM leader
244        pub const DYN_KVBM_LEADER_ZMQ_PUB_PORT: &str = "DYN_KVBM_LEADER_ZMQ_PUB_PORT";
245
246        /// ZMQ acknowledgment port for KVBM leader
247        pub const DYN_KVBM_LEADER_ZMQ_ACK_PORT: &str = "DYN_KVBM_LEADER_ZMQ_ACK_PORT";
248    }
249
250    /// NIXL backend configuration
251    pub mod nixl {
252        /// Prefix for NIXL backend environment variables
253        /// Pattern: DYN_KVBM_NIXL_BACKEND_<backend>=true/false
254        /// Example: DYN_KVBM_NIXL_BACKEND_UCX=true
255        pub const PREFIX: &str = "DYN_KVBM_NIXL_BACKEND_";
256    }
257}
258
259/// LLM (Language Model) inference environment variables
260pub mod llm {
261    /// HTTP body size limit in MB
262    pub const DYN_HTTP_BODY_LIMIT_MB: &str = "DYN_HTTP_BODY_LIMIT_MB";
263
264    pub const DYN_HTTP_GRACEFUL_SHUTDOWN_TIMEOUT_SECS: &str =
265        "DYN_HTTP_GRACEFUL_SHUTDOWN_TIMEOUT_SECS";
266
267    /// Enable LoRA adapter support (set to "true" to enable)
268    pub const DYN_LORA_ENABLED: &str = "DYN_LORA_ENABLED";
269
270    /// LoRA cache directory path
271    pub const DYN_LORA_PATH: &str = "DYN_LORA_PATH";
272
273    /// Enable the experimental Anthropic Messages API endpoint (/v1/messages)
274    pub const DYN_ENABLE_ANTHROPIC_API: &str = "DYN_ENABLE_ANTHROPIC_API";
275
276    /// Metrics configuration
277    pub mod metrics {
278        /// Custom metrics prefix (overrides default "dynamo_frontend")
279        pub const DYN_METRICS_PREFIX: &str = "DYN_METRICS_PREFIX";
280
281        /// Histogram bucket configuration (pattern: <PREFIX>_MIN, <PREFIX>_MAX, <PREFIX>_COUNT)
282        /// Example: DYN_HISTOGRAM_TTFT_MIN, DYN_HISTOGRAM_TTFT_MAX, DYN_HISTOGRAM_TTFT_COUNT
283        pub const HISTOGRAM_PREFIX: &str = "DYN_HISTOGRAM_";
284    }
285}
286
287/// Model loading and caching environment variables
288pub mod model {
289    /// Model Express configuration
290    pub mod model_express {
291        /// Model Express server endpoint URL
292        pub const MODEL_EXPRESS_URL: &str = "MODEL_EXPRESS_URL";
293
294        /// Model Express cache path
295        pub const MODEL_EXPRESS_CACHE_PATH: &str = "MODEL_EXPRESS_CACHE_PATH";
296    }
297
298    /// Hugging Face configuration
299    pub mod huggingface {
300        /// Hugging Face authentication token
301        pub const HF_TOKEN: &str = "HF_TOKEN";
302
303        /// Hugging Face Hub cache directory
304        pub const HF_HUB_CACHE: &str = "HF_HUB_CACHE";
305
306        /// Hugging Face home directory
307        pub const HF_HOME: &str = "HF_HOME";
308
309        /// Offline mode - skip API calls when model is cached
310        /// Set to "1" or "true" to enable
311        pub const HF_HUB_OFFLINE: &str = "HF_HUB_OFFLINE";
312    }
313}
314
315/// Event Plane transport environment variables
316pub mod event_plane {
317    /// Event transport selection: "zmq" or "nats". Default: "nats"
318    pub const DYN_EVENT_PLANE: &str = "DYN_EVENT_PLANE";
319
320    /// Event plane codec selection: "json" or "msgpack".
321    pub const DYN_EVENT_PLANE_CODEC: &str = "DYN_EVENT_PLANE_CODEC";
322}
323
324/// ZMQ Broker environment variables
325pub mod zmq_broker {
326    /// Explicit ZMQ broker URL (takes precedence over discovery)
327    /// Format: "xsub=<url1>[;<url2>...] , xpub=<url1>[;<url2>...]"
328    /// Example: "xsub=tcp://broker:5555 , xpub=tcp://broker:5556"
329    pub const DYN_ZMQ_BROKER_URL: &str = "DYN_ZMQ_BROKER_URL";
330
331    /// Enable ZMQ broker discovery mode
332    pub const DYN_ZMQ_BROKER_ENABLED: &str = "DYN_ZMQ_BROKER_ENABLED";
333
334    /// XSUB bind address (broker binary only)
335    pub const ZMQ_BROKER_XSUB_BIND: &str = "ZMQ_BROKER_XSUB_BIND";
336
337    /// XPUB bind address (broker binary only)
338    pub const ZMQ_BROKER_XPUB_BIND: &str = "ZMQ_BROKER_XPUB_BIND";
339
340    /// Namespace for broker discovery registration
341    pub const ZMQ_BROKER_NAMESPACE: &str = "ZMQ_BROKER_NAMESPACE";
342}
343
344/// CUDA and GPU environment variables
345pub mod cuda {
346    /// Path to custom CUDA fatbin file.
347    ///
348    /// Note: build.rs files cannot import this constant at build time,
349    /// so they must define local constants with the same value.
350    pub const DYN_FATBIN_PATH: &str = "DYN_FATBIN_PATH";
351}
352
353/// Build-time environment variables
354pub mod build {
355    /// Cargo output directory for build artifacts
356    ///
357    /// Note: This constant cannot be used with the `env!()` macro,
358    /// which requires a string literal at compile time.
359    /// Build scripts (build.rs) also cannot import this constant.
360    pub const OUT_DIR: &str = "OUT_DIR";
361}
362
363/// Mocker (mock scheduler/KV manager) environment variables
364pub mod mocker {
365    /// Enable structured KV cache allocation/eviction trace logs (set to "1" or "true" to enable)
366    pub const DYN_MOCKER_KV_CACHE_TRACE: &str = "DYN_MOCKER_KV_CACHE_TRACE";
367
368    /// Use the original direct() code path in the mocker request dispatch.
369    ///
370    /// This path is race-prone during startup; prefer leaving it unset unless you are
371    /// explicitly trying to reproduce the original behavior.
372    pub const DYN_MOCKER_SYNC_DIRECT: &str = "DYN_MOCKER_SYNC_DIRECT";
373}
374
375/// Testing environment variables
376pub mod testing {
377    /// Enable queued-up request processing in tests
378    pub const DYN_QUEUED_UP_PROCESSING: &str = "DYN_QUEUED_UP_PROCESSING";
379
380    /// Soak test run duration (e.g., "3s", "5m")
381    pub const DYN_SOAK_RUN_DURATION: &str = "DYN_SOAK_RUN_DURATION";
382
383    /// Soak test batch load size
384    pub const DYN_SOAK_BATCH_LOAD: &str = "DYN_SOAK_BATCH_LOAD";
385}
386
387#[cfg(test)]
388mod tests {
389    use super::*;
390
391    #[test]
392    fn test_no_duplicate_env_var_names() {
393        use std::collections::HashSet;
394
395        let mut seen = HashSet::new();
396        let vars = [
397            // Logging
398            logging::DYN_LOG,
399            logging::DYN_LOGGING_CONFIG_PATH,
400            logging::DYN_LOGGING_JSONL,
401            logging::DYN_SDK_DISABLE_ANSI_LOGGING,
402            logging::DYN_LOG_USE_LOCAL_TZ,
403            logging::DYN_LOGGING_SPAN_EVENTS,
404            logging::otlp::OTEL_EXPORT_ENABLED,
405            logging::otlp::OTEL_EXPORTER_OTLP_TRACES_ENDPOINT,
406            logging::otlp::OTEL_SERVICE_NAME,
407            // Runtime
408            runtime::DYN_RUNTIME_NUM_WORKER_THREADS,
409            runtime::DYN_RUNTIME_MAX_BLOCKING_THREADS,
410            runtime::system::DYN_SYSTEM_ENABLED,
411            runtime::system::DYN_SYSTEM_HOST,
412            runtime::system::DYN_SYSTEM_PORT,
413            runtime::system::DYN_SYSTEM_USE_ENDPOINT_HEALTH_STATUS,
414            runtime::system::DYN_SYSTEM_STARTING_HEALTH_STATUS,
415            runtime::system::DYN_SYSTEM_HEALTH_PATH,
416            runtime::system::DYN_SYSTEM_LIVE_PATH,
417            runtime::canary::DYN_CANARY_WAIT_TIME,
418            // Worker
419            worker::DYN_WORKER_GRACEFUL_SHUTDOWN_TIMEOUT,
420            // NATS
421            nats::NATS_SERVER,
422            nats::auth::NATS_AUTH_USERNAME,
423            nats::auth::NATS_AUTH_PASSWORD,
424            nats::auth::NATS_AUTH_TOKEN,
425            nats::auth::NATS_AUTH_NKEY,
426            nats::auth::NATS_AUTH_CREDENTIALS_FILE,
427            nats::stream::DYN_NATS_STREAM_MAX_AGE,
428            // ETCD
429            etcd::ETCD_ENDPOINTS,
430            etcd::auth::ETCD_AUTH_USERNAME,
431            etcd::auth::ETCD_AUTH_PASSWORD,
432            etcd::auth::ETCD_AUTH_CA,
433            etcd::auth::ETCD_AUTH_CLIENT_CERT,
434            etcd::auth::ETCD_AUTH_CLIENT_KEY,
435            // KVBM
436            kvbm::DYN_KVBM_METRICS,
437            kvbm::DYN_KVBM_METRICS_PORT,
438            kvbm::DYN_KVBM_ENABLE_RECORD,
439            kvbm::DYN_KVBM_DISABLE_DISK_OFFLOAD_FILTER,
440            kvbm::cpu_cache::DYN_KVBM_CPU_CACHE_GB,
441            kvbm::cpu_cache::DYN_KVBM_CPU_CACHE_OVERRIDE_NUM_BLOCKS,
442            kvbm::disk_cache::DYN_KVBM_DISK_CACHE_GB,
443            kvbm::disk_cache::DYN_KVBM_DISK_CACHE_OVERRIDE_NUM_BLOCKS,
444            kvbm::leader::DYN_KVBM_LEADER_WORKER_INIT_TIMEOUT_SECS,
445            kvbm::leader::DYN_KVBM_LEADER_ZMQ_HOST,
446            kvbm::leader::DYN_KVBM_LEADER_ZMQ_PUB_PORT,
447            kvbm::leader::DYN_KVBM_LEADER_ZMQ_ACK_PORT,
448            // LLM
449            llm::DYN_HTTP_BODY_LIMIT_MB,
450            llm::DYN_LORA_ENABLED,
451            llm::DYN_LORA_PATH,
452            llm::DYN_ENABLE_ANTHROPIC_API,
453            llm::metrics::DYN_METRICS_PREFIX,
454            // Model
455            model::model_express::MODEL_EXPRESS_URL,
456            model::model_express::MODEL_EXPRESS_CACHE_PATH,
457            model::huggingface::HF_TOKEN,
458            model::huggingface::HF_HUB_CACHE,
459            model::huggingface::HF_HOME,
460            model::huggingface::HF_HUB_OFFLINE,
461            // Event Plane
462            event_plane::DYN_EVENT_PLANE,
463            event_plane::DYN_EVENT_PLANE_CODEC,
464            // ZMQ Broker
465            zmq_broker::DYN_ZMQ_BROKER_URL,
466            zmq_broker::DYN_ZMQ_BROKER_ENABLED,
467            zmq_broker::ZMQ_BROKER_XSUB_BIND,
468            zmq_broker::ZMQ_BROKER_XPUB_BIND,
469            zmq_broker::ZMQ_BROKER_NAMESPACE,
470            // CUDA
471            cuda::DYN_FATBIN_PATH,
472            // Build
473            build::OUT_DIR,
474            // Mocker
475            mocker::DYN_MOCKER_KV_CACHE_TRACE,
476            mocker::DYN_MOCKER_SYNC_DIRECT,
477            // Testing
478            testing::DYN_QUEUED_UP_PROCESSING,
479            testing::DYN_SOAK_RUN_DURATION,
480            testing::DYN_SOAK_BATCH_LOAD,
481        ];
482
483        for var in &vars {
484            if !seen.insert(var) {
485                panic!("Duplicate environment variable name: {}", var);
486            }
487        }
488    }
489
490    #[test]
491    fn test_naming_conventions() {
492        // Dynamo-specific vars should start with DYN_
493        assert!(runtime::DYN_RUNTIME_NUM_WORKER_THREADS.starts_with("DYN_"));
494        assert!(runtime::system::DYN_SYSTEM_ENABLED.starts_with("DYN_"));
495        assert!(kvbm::DYN_KVBM_METRICS.starts_with("DYN_"));
496        assert!(worker::DYN_WORKER_GRACEFUL_SHUTDOWN_TIMEOUT.starts_with("DYN_"));
497
498        // NATS vars should start with NATS_
499        assert!(nats::NATS_SERVER.starts_with("NATS_"));
500        assert!(nats::auth::NATS_AUTH_USERNAME.starts_with("NATS_AUTH_"));
501
502        // ETCD vars should start with ETCD_
503        assert!(etcd::ETCD_ENDPOINTS.starts_with("ETCD_"));
504        assert!(etcd::auth::ETCD_AUTH_USERNAME.starts_with("ETCD_AUTH_"));
505
506        // OpenTelemetry vars should start with OTEL_
507        assert!(logging::otlp::OTEL_EXPORT_ENABLED.starts_with("OTEL_"));
508        assert!(logging::otlp::OTEL_SERVICE_NAME.starts_with("OTEL_"));
509    }
510}