toolkit/telemetry/
config.rs1use serde::{Deserialize, Serialize};
7use std::collections::{BTreeMap, HashMap};
8
9#[derive(Debug, Clone, Deserialize, Serialize, Default)]
12#[serde(deny_unknown_fields)]
13pub struct OpenTelemetryConfig {
14 #[serde(default)]
15 pub resource: OpenTelemetryResource,
16 pub exporter: Option<Exporter>,
19 #[serde(default)]
20 pub tracing: TracingConfig,
21 #[serde(default)]
22 pub metrics: MetricsConfig,
23}
24
25impl OpenTelemetryConfig {
26 #[must_use]
28 pub fn tracing_exporter(&self) -> Option<&Exporter> {
29 self.tracing.exporter.as_ref().or(self.exporter.as_ref())
30 }
31 #[must_use]
33 pub fn metrics_exporter(&self) -> Option<&Exporter> {
34 self.metrics.exporter.as_ref().or(self.exporter.as_ref())
35 }
36 #[must_use]
41 pub fn inject_trace_ids_into_logs(&self) -> bool {
42 self.tracing
43 .logs_correlation
44 .as_ref()
45 .and_then(|c| c.inject_trace_ids_into_logs)
46 .unwrap_or(false)
47 }
48}
49
50#[derive(Debug, Clone, Deserialize, Serialize)]
52#[serde(deny_unknown_fields)]
53pub struct OpenTelemetryResource {
54 #[serde(default = "default_service_name")]
56 pub service_name: String,
57 #[serde(default)]
59 pub attributes: BTreeMap<String, String>,
60}
61
62fn default_service_name() -> String {
64 "cf-gears".to_owned()
65}
66
67impl Default for OpenTelemetryResource {
68 fn default() -> Self {
69 Self {
70 service_name: default_service_name(),
71 attributes: BTreeMap::default(),
72 }
73 }
74}
75
76#[derive(Debug, Clone, Deserialize, Serialize, Default)]
78#[serde(deny_unknown_fields)]
79pub struct TracingConfig {
80 pub enabled: bool,
81 pub exporter: Option<Exporter>,
84 pub sampler: Option<Sampler>,
85 pub propagation: Option<Propagation>,
86 pub http: Option<HttpOpts>,
87 pub logs_correlation: Option<LogsCorrelation>,
88}
89
90#[derive(Debug, Clone, Deserialize, Serialize, Default)]
92#[serde(deny_unknown_fields)]
93pub struct MetricsConfig {
94 pub enabled: bool,
95 pub exporter: Option<Exporter>,
98 #[serde(skip_serializing_if = "Option::is_none")]
102 pub cardinality_limit: Option<usize>,
103}
104
105#[derive(Debug, Default, Clone, Deserialize, Serialize, PartialEq, Eq, Copy)]
106#[serde(rename_all = "snake_case")]
107pub enum ExporterKind {
108 #[default]
109 OtlpGrpc,
110 OtlpHttp,
111}
112
113#[derive(Debug, Clone, Deserialize, Serialize)]
114pub struct Exporter {
115 #[serde(default)]
120 pub kind: ExporterKind,
121 pub endpoint: Option<String>,
122 pub headers: Option<HashMap<String, String>>,
123 pub timeout_ms: Option<u64>,
124}
125
126#[derive(Debug, Clone, Deserialize, Serialize, PartialEq)]
127#[serde(rename_all = "snake_case")]
128pub enum Sampler {
129 ParentBasedAlwaysOn {},
130 ParentBasedRatio {
131 #[serde(skip_serializing_if = "Option::is_none")]
132 ratio: Option<f64>,
133 },
134 AlwaysOn {},
135 AlwaysOff {},
136}
137
138#[derive(Debug, Clone, Deserialize, Serialize)]
139pub struct Propagation {
140 pub w3c_trace_context: Option<bool>,
141}
142
143#[derive(Debug, Clone, Deserialize, Serialize)]
144pub struct HttpOpts {
145 pub inject_request_id_header: Option<String>,
146 pub record_headers: Option<Vec<String>>,
147}
148
149#[derive(Debug, Clone, Deserialize, Serialize)]
150pub struct LogsCorrelation {
151 pub inject_trace_ids_into_logs: Option<bool>,
152}