use serde::{Deserialize, Serialize};
use std::collections::{BTreeMap, HashMap};
#[derive(Debug, Clone, Deserialize, Serialize, Default)]
#[serde(deny_unknown_fields)]
pub struct OpenTelemetryConfig {
#[serde(default)]
pub resource: OpenTelemetryResource,
pub exporter: Option<Exporter>,
#[serde(default)]
pub tracing: TracingConfig,
#[serde(default)]
pub metrics: MetricsConfig,
}
impl OpenTelemetryConfig {
#[must_use]
pub fn tracing_exporter(&self) -> Option<&Exporter> {
self.tracing.exporter.as_ref().or(self.exporter.as_ref())
}
#[must_use]
pub fn metrics_exporter(&self) -> Option<&Exporter> {
self.metrics.exporter.as_ref().or(self.exporter.as_ref())
}
}
#[derive(Debug, Clone, Deserialize, Serialize)]
#[serde(deny_unknown_fields)]
pub struct OpenTelemetryResource {
#[serde(default = "default_service_name")]
pub service_name: String,
#[serde(default)]
pub attributes: BTreeMap<String, String>,
}
fn default_service_name() -> String {
"cyberfabric".to_owned()
}
impl Default for OpenTelemetryResource {
fn default() -> Self {
Self {
service_name: default_service_name(),
attributes: BTreeMap::default(),
}
}
}
#[derive(Debug, Clone, Deserialize, Serialize, Default)]
#[serde(deny_unknown_fields)]
pub struct TracingConfig {
pub enabled: bool,
pub exporter: Option<Exporter>,
pub sampler: Option<Sampler>,
pub propagation: Option<Propagation>,
pub http: Option<HttpOpts>,
pub logs_correlation: Option<LogsCorrelation>,
}
#[derive(Debug, Clone, Deserialize, Serialize, Default)]
#[serde(deny_unknown_fields)]
pub struct MetricsConfig {
pub enabled: bool,
pub exporter: Option<Exporter>,
#[serde(skip_serializing_if = "Option::is_none")]
pub cardinality_limit: Option<usize>,
}
#[derive(Debug, Default, Clone, Deserialize, Serialize, PartialEq, Eq, Copy)]
#[serde(rename_all = "snake_case")]
pub enum ExporterKind {
#[default]
OtlpGrpc,
OtlpHttp,
}
#[derive(Debug, Clone, Deserialize, Serialize)]
pub struct Exporter {
pub kind: ExporterKind,
pub endpoint: Option<String>,
pub headers: Option<HashMap<String, String>>,
pub timeout_ms: Option<u64>,
}
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq)]
#[serde(rename_all = "snake_case")]
pub enum Sampler {
ParentBasedAlwaysOn {},
ParentBasedRatio {
#[serde(skip_serializing_if = "Option::is_none")]
ratio: Option<f64>,
},
AlwaysOn {},
AlwaysOff {},
}
#[derive(Debug, Clone, Deserialize, Serialize)]
pub struct Propagation {
pub w3c_trace_context: Option<bool>,
}
#[derive(Debug, Clone, Deserialize, Serialize)]
pub struct HttpOpts {
pub inject_request_id_header: Option<String>,
pub record_headers: Option<Vec<String>>,
}
#[derive(Debug, Clone, Deserialize, Serialize)]
pub struct LogsCorrelation {
pub inject_trace_ids_into_logs: Option<bool>,
}