Skip to main content

saluki_components/config_registry/datadog/
forwarder.rs

1//! Annotations for ForwarderConfiguration keys (endpoint, retry, and forwarder settings).
2use crate::config_registry::{generated::schema, structs, PipelineAffinity, SalukiAnnotation, SupportLevel, ValueType};
3
4// All keys are labeled as CrossCutting because the forwarder configuration can affect any pipeline.
5crate::declare_annotations! {
6    // ── Endpoint ──────────────────────────────────────────────────────────────
7
8    /// `api_key`—Datadog API key for authentication.
9    API_KEY = SalukiAnnotation {
10        schema: &schema::API_KEY,
11        support_level: SupportLevel::Full,
12        additional_yaml_paths: &[],
13        env_var_override: None,
14        used_by: &[structs::FORWARDER_CONFIGURATION],
15        value_type_override: None,
16        test_json: None,
17        pipeline_affinity: PipelineAffinity::CrossCutting,
18    };
19
20    /// `site`—Datadog site domain (for example, `datadoghq.com`).
21    SITE = SalukiAnnotation {
22        schema: &schema::SITE,
23        support_level: SupportLevel::Full,
24        additional_yaml_paths: &[],
25        env_var_override: None,
26        used_by: &[structs::FORWARDER_CONFIGURATION],
27        value_type_override: None,
28        test_json: None,
29        pipeline_affinity: PipelineAffinity::CrossCutting,
30    };
31
32    /// `dd_url`—explicit intake URL, overrides `site`.
33    DD_URL = SalukiAnnotation {
34        schema: &schema::DD_URL,
35        support_level: SupportLevel::Full,
36        additional_yaml_paths: &[],
37        env_var_override: None,
38        used_by: &[structs::FORWARDER_CONFIGURATION],
39        value_type_override: None,
40        test_json: None,
41        pipeline_affinity: PipelineAffinity::CrossCutting,
42    };
43
44    /// `observability_pipelines_worker.metrics.enabled`—route metrics to OPW.
45    OBSERVABILITY_PIPELINES_WORKER_METRICS_ENABLED = SalukiAnnotation {
46        schema: &schema::OBSERVABILITY_PIPELINES_WORKER_METRICS_ENABLED,
47        support_level: SupportLevel::Full,
48        additional_yaml_paths: &[],
49        env_var_override: Some(&["DD_OBSERVABILITY_PIPELINES_WORKER_METRICS_ENABLED"]),
50        used_by: &[structs::FORWARDER_CONFIGURATION],
51        value_type_override: None,
52        test_json: None,
53        pipeline_affinity: PipelineAffinity::CrossCutting,
54    };
55
56    /// `observability_pipelines_worker.metrics.url`—OPW metrics intake URL.
57    OBSERVABILITY_PIPELINES_WORKER_METRICS_URL = SalukiAnnotation {
58        schema: &schema::OBSERVABILITY_PIPELINES_WORKER_METRICS_URL,
59        support_level: SupportLevel::Full,
60        additional_yaml_paths: &[],
61        env_var_override: Some(&["DD_OBSERVABILITY_PIPELINES_WORKER_METRICS_URL"]),
62        used_by: &[structs::FORWARDER_CONFIGURATION],
63        value_type_override: None,
64        test_json: None,
65        pipeline_affinity: PipelineAffinity::CrossCutting,
66    };
67
68    /// `vector.metrics.enabled`—route metrics to OPW (legacy alias).
69    VECTOR_METRICS_ENABLED = SalukiAnnotation {
70        schema: &schema::VECTOR_METRICS_ENABLED,
71        support_level: SupportLevel::Full,
72        additional_yaml_paths: &[],
73        env_var_override: Some(&["DD_VECTOR_METRICS_ENABLED"]),
74        used_by: &[structs::FORWARDER_CONFIGURATION],
75        value_type_override: None,
76        test_json: None,
77        pipeline_affinity: PipelineAffinity::CrossCutting,
78    };
79
80    /// `vector.metrics.url`—OPW metrics intake URL (legacy alias).
81    VECTOR_METRICS_URL = SalukiAnnotation {
82        schema: &schema::VECTOR_METRICS_URL,
83        support_level: SupportLevel::Full,
84        additional_yaml_paths: &[],
85        env_var_override: Some(&["DD_VECTOR_METRICS_URL"]),
86        used_by: &[structs::FORWARDER_CONFIGURATION],
87        value_type_override: None,
88        test_json: None,
89        pipeline_affinity: PipelineAffinity::CrossCutting,
90    };
91
92    /// `additional_endpoints`—extra intake endpoints (JSON map of host → API keys).
93    /// Uses a structured `test_json` because the field uses PickFirst<(DisplayFromStr, _)>.
94    ADDITIONAL_ENDPOINTS = SalukiAnnotation {
95        schema: &schema::ADDITIONAL_ENDPOINTS,
96        support_level: SupportLevel::Full,
97        additional_yaml_paths: &[],
98        env_var_override: None,
99        used_by: &[structs::FORWARDER_CONFIGURATION],
100        value_type_override: None,
101        test_json: Some(r#"{"smoke-host-1.example.com": ["smoke-api-key"]}"#),
102        pipeline_affinity: PipelineAffinity::CrossCutting,
103    };
104
105    // ── ForwarderConfiguration direct fields ──────────────────────────────────
106
107    /// `forwarder_num_workers`—max concurrent requests per endpoint. Schema Float; field usize.
108    FORWARDER_NUM_WORKERS = SalukiAnnotation {
109        schema: &schema::FORWARDER_NUM_WORKERS,
110        support_level: SupportLevel::Full,
111        additional_yaml_paths: &[],
112        env_var_override: None,
113        used_by: &[structs::FORWARDER_CONFIGURATION],
114        value_type_override: Some(ValueType::Integer),
115        test_json: None,
116        pipeline_affinity: PipelineAffinity::CrossCutting,
117    };
118
119    /// `forwarder_timeout`—request timeout in seconds. Schema Float; field u64.
120    FORWARDER_TIMEOUT = SalukiAnnotation {
121        schema: &schema::FORWARDER_TIMEOUT,
122        support_level: SupportLevel::Full,
123        additional_yaml_paths: &[],
124        env_var_override: None,
125        used_by: &[structs::FORWARDER_CONFIGURATION],
126        value_type_override: Some(ValueType::Integer),
127        test_json: None,
128        pipeline_affinity: PipelineAffinity::CrossCutting,
129    };
130
131    /// `forwarder_high_prio_buffer_size`—max pending requests per endpoint. Schema Float; field usize.
132    FORWARDER_HIGH_PRIO_BUFFER_SIZE = SalukiAnnotation {
133        schema: &schema::FORWARDER_HIGH_PRIO_BUFFER_SIZE,
134        support_level: SupportLevel::Full,
135        additional_yaml_paths: &[],
136        env_var_override: None,
137        used_by: &[structs::FORWARDER_CONFIGURATION],
138        value_type_override: Some(ValueType::Integer),
139        test_json: None,
140        pipeline_affinity: PipelineAffinity::CrossCutting,
141    };
142
143    /// `forwarder_connection_reset_interval`—seconds between connection resets. Schema Float; field u64.
144    FORWARDER_CONNECTION_RESET_INTERVAL = SalukiAnnotation {
145        schema: &schema::FORWARDER_CONNECTION_RESET_INTERVAL,
146        support_level: SupportLevel::Full,
147        additional_yaml_paths: &[],
148        env_var_override: None,
149        used_by: &[structs::FORWARDER_CONFIGURATION],
150        value_type_override: Some(ValueType::Integer),
151        test_json: None,
152        pipeline_affinity: PipelineAffinity::CrossCutting,
153    };
154
155    /// `forwarder_http_protocol`—HTTP version selection for outgoing forwarder requests.
156    FORWARDER_HTTP_PROTOCOL = SalukiAnnotation {
157        schema: &schema::FORWARDER_HTTP_PROTOCOL,
158        support_level: SupportLevel::Full,
159        additional_yaml_paths: &[],
160        env_var_override: None,
161        used_by: &[structs::FORWARDER_CONFIGURATION],
162        value_type_override: None,
163        test_json: Some("\"http1\""),
164        pipeline_affinity: PipelineAffinity::CrossCutting,
165    };
166
167    /// `skip_ssl_validation`—disables TLS certificate validation for Datadog intake forwarding.
168    SKIP_SSL_VALIDATION = SalukiAnnotation {
169        schema: &schema::SKIP_SSL_VALIDATION,
170        support_level: SupportLevel::Full,
171        additional_yaml_paths: &[],
172        env_var_override: Some(&["DD_SKIP_SSL_VALIDATION"]),
173        used_by: &[structs::FORWARDER_CONFIGURATION],
174        value_type_override: None,
175        test_json: None,
176        pipeline_affinity: PipelineAffinity::CrossCutting,
177    };
178
179    /// `min_tls_version`—minimum TLS version for Datadog intake forwarding.
180    MIN_TLS_VERSION = SalukiAnnotation {
181        schema: &schema::MIN_TLS_VERSION,
182        support_level: SupportLevel::Partial,
183        additional_yaml_paths: &[],
184        env_var_override: Some(&["DD_MIN_TLS_VERSION"]),
185        used_by: &[structs::FORWARDER_CONFIGURATION],
186        value_type_override: None,
187        test_json: None,
188        pipeline_affinity: PipelineAffinity::CrossCutting,
189    };
190
191    /// `allow_arbitrary_tags`—signals backend tag validation relaxation.
192    ALLOW_ARBITRARY_TAGS = SalukiAnnotation {
193        schema: &schema::ALLOW_ARBITRARY_TAGS,
194        support_level: SupportLevel::Full,
195        additional_yaml_paths: &[],
196        env_var_override: Some(&["DD_ALLOW_ARBITRARY_TAGS"]),
197        used_by: &[structs::FORWARDER_CONFIGURATION],
198        value_type_override: None,
199        test_json: None,
200        pipeline_affinity: PipelineAffinity::CrossCutting,
201    };
202
203    // ── RetryConfiguration fields ─────────────────────────────────────────────
204
205    /// `forwarder_backoff_base`—base growth rate for retry backoff in seconds.
206    FORWARDER_BACKOFF_BASE = SalukiAnnotation {
207        schema: &schema::FORWARDER_BACKOFF_BASE,
208        support_level: SupportLevel::Full,
209        additional_yaml_paths: &[],
210        env_var_override: None,
211        used_by: &[structs::FORWARDER_CONFIGURATION],
212        value_type_override: None,
213        test_json: None,
214        pipeline_affinity: PipelineAffinity::CrossCutting,
215    };
216
217    /// `forwarder_backoff_factor`—jitter factor for retry backoff.
218    FORWARDER_BACKOFF_FACTOR = SalukiAnnotation {
219        schema: &schema::FORWARDER_BACKOFF_FACTOR,
220        support_level: SupportLevel::Full,
221        additional_yaml_paths: &[],
222        env_var_override: None,
223        used_by: &[structs::FORWARDER_CONFIGURATION],
224        value_type_override: None,
225        test_json: None,
226        pipeline_affinity: PipelineAffinity::CrossCutting,
227    };
228
229    /// `forwarder_backoff_max`—maximum retry backoff duration in seconds.
230    FORWARDER_BACKOFF_MAX = SalukiAnnotation {
231        schema: &schema::FORWARDER_BACKOFF_MAX,
232        support_level: SupportLevel::Full,
233        additional_yaml_paths: &[],
234        env_var_override: None,
235        used_by: &[structs::FORWARDER_CONFIGURATION],
236        value_type_override: None,
237        test_json: None,
238        pipeline_affinity: PipelineAffinity::CrossCutting,
239    };
240
241    /// `forwarder_recovery_interval`—error count decrease on success. Schema Float; field u32.
242    FORWARDER_RECOVERY_INTERVAL = SalukiAnnotation {
243        schema: &schema::FORWARDER_RECOVERY_INTERVAL,
244        support_level: SupportLevel::Full,
245        additional_yaml_paths: &[],
246        env_var_override: None,
247        used_by: &[structs::FORWARDER_CONFIGURATION],
248        value_type_override: Some(ValueType::Integer),
249        test_json: None,
250        pipeline_affinity: PipelineAffinity::CrossCutting,
251    };
252
253    /// `forwarder_recovery_reset`—reset error count on successful request.
254    FORWARDER_RECOVERY_RESET = SalukiAnnotation {
255        schema: &schema::FORWARDER_RECOVERY_RESET,
256        support_level: SupportLevel::Full,
257        additional_yaml_paths: &[],
258        env_var_override: None,
259        used_by: &[structs::FORWARDER_CONFIGURATION],
260        value_type_override: None,
261        test_json: None,
262        pipeline_affinity: PipelineAffinity::CrossCutting,
263    };
264
265    /// `forwarder_retry_queue_max_size`—(deprecated) max in-memory retry queue size in bytes. Schema Float; field `Option<u64>`.
266    FORWARDER_RETRY_QUEUE_MAX_SIZE = SalukiAnnotation {
267        schema: &schema::FORWARDER_RETRY_QUEUE_MAX_SIZE,
268        support_level: SupportLevel::Full,
269        additional_yaml_paths: &[],
270        env_var_override: None,
271        used_by: &[structs::FORWARDER_CONFIGURATION],
272        value_type_override: Some(ValueType::Integer),
273        test_json: None,
274        pipeline_affinity: PipelineAffinity::CrossCutting,
275    };
276
277    /// `forwarder_retry_queue_payloads_max_size`—max in-memory retry queue size in bytes. Schema Float; field `Option<u64>`.
278    FORWARDER_RETRY_QUEUE_PAYLOADS_MAX_SIZE = SalukiAnnotation {
279        schema: &schema::FORWARDER_RETRY_QUEUE_PAYLOADS_MAX_SIZE,
280        support_level: SupportLevel::Full,
281        additional_yaml_paths: &[],
282        env_var_override: None,
283        used_by: &[structs::FORWARDER_CONFIGURATION],
284        value_type_override: Some(ValueType::Integer),
285        test_json: None,
286        pipeline_affinity: PipelineAffinity::CrossCutting,
287    };
288
289    /// `forwarder_storage_max_disk_ratio`—max disk usage fraction before stopping on-disk queue.
290    FORWARDER_STORAGE_MAX_DISK_RATIO = SalukiAnnotation {
291        schema: &schema::FORWARDER_STORAGE_MAX_DISK_RATIO,
292        support_level: SupportLevel::Full,
293        additional_yaml_paths: &[],
294        env_var_override: None,
295        used_by: &[structs::FORWARDER_CONFIGURATION],
296        value_type_override: None,
297        test_json: None,
298        pipeline_affinity: PipelineAffinity::CrossCutting,
299    };
300
301    /// `forwarder_storage_max_size_in_bytes`—max on-disk retry queue size. Schema Float; field u64.
302    FORWARDER_STORAGE_MAX_SIZE_IN_BYTES = SalukiAnnotation {
303        schema: &schema::FORWARDER_STORAGE_MAX_SIZE_IN_BYTES,
304        support_level: SupportLevel::Full,
305        additional_yaml_paths: &[],
306        env_var_override: None,
307        used_by: &[structs::FORWARDER_CONFIGURATION],
308        value_type_override: Some(ValueType::Integer),
309        test_json: None,
310        pipeline_affinity: PipelineAffinity::CrossCutting,
311    };
312
313    /// `forwarder_storage_path`—directory for on-disk retry queue.
314    FORWARDER_STORAGE_PATH = SalukiAnnotation {
315        schema: &schema::FORWARDER_STORAGE_PATH,
316        support_level: SupportLevel::Full,
317        additional_yaml_paths: &[],
318        env_var_override: None,
319        used_by: &[structs::FORWARDER_CONFIGURATION],
320        value_type_override: None,
321        test_json: None,
322        pipeline_affinity: PipelineAffinity::CrossCutting,
323    };
324}