Skip to main content

modkit/telemetry/
config.rs

1//! OpenTelemetry tracing and metrics configuration types
2//!
3//! These types define the configuration structure for OpenTelemetry distributed
4//! tracing and metrics.
5
6use serde::{Deserialize, Serialize};
7use std::collections::HashMap;
8
9/// Tracing configuration for OpenTelemetry distributed tracing
10#[derive(Debug, Clone, Deserialize, Serialize, Default)]
11pub struct TracingConfig {
12    pub enabled: bool,
13    pub service_name: Option<String>,
14    pub exporter: Option<Exporter>,
15    pub sampler: Option<Sampler>,
16    pub propagation: Option<Propagation>,
17    pub resource: Option<HashMap<String, String>>,
18    pub http: Option<HttpOpts>,
19    pub logs_correlation: Option<LogsCorrelation>,
20    #[serde(default)]
21    pub metrics: MetricsConfig,
22}
23
24/// Metrics configuration for OpenTelemetry metrics collection
25#[derive(Debug, Clone, Deserialize, Serialize, Default)]
26pub struct MetricsConfig {
27    pub enabled: bool,
28    pub exporter: Option<Exporter>,
29    /// Maximum number of distinct attribute combinations per instrument.
30    /// When the limit is reached, new combinations are folded into an
31    /// overflow data point.  `None` means the SDK default is used.
32    #[serde(skip_serializing_if = "Option::is_none")]
33    pub cardinality_limit: Option<usize>,
34}
35
36#[derive(Debug, Default, Clone, Deserialize, Serialize, PartialEq, Eq, Copy)]
37#[serde(rename_all = "snake_case")]
38pub enum ExporterKind {
39    #[default]
40    OtlpGrpc,
41    OtlpHttp,
42}
43
44#[derive(Debug, Clone, Deserialize, Serialize)]
45pub struct Exporter {
46    pub kind: ExporterKind,
47    pub endpoint: Option<String>,
48    pub headers: Option<HashMap<String, String>>,
49    pub timeout_ms: Option<u64>,
50}
51
52#[derive(Debug, Clone, Deserialize, Serialize, PartialEq)]
53#[serde(rename_all = "snake_case")]
54pub enum Sampler {
55    ParentBasedAlwaysOn {},
56    ParentBasedRatio {
57        #[serde(skip_serializing_if = "Option::is_none")]
58        ratio: Option<f64>,
59    },
60    AlwaysOn {},
61    AlwaysOff {},
62}
63
64#[derive(Debug, Clone, Deserialize, Serialize)]
65pub struct Propagation {
66    pub w3c_trace_context: Option<bool>,
67}
68
69#[derive(Debug, Clone, Deserialize, Serialize)]
70pub struct HttpOpts {
71    pub inject_request_id_header: Option<String>,
72    pub record_headers: Option<Vec<String>>,
73}
74
75#[derive(Debug, Clone, Deserialize, Serialize)]
76pub struct LogsCorrelation {
77    pub inject_trace_ids_into_logs: Option<bool>,
78}