1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
use opentelemetry::sdk::trace::BatchSpanProcessor;
use opentelemetry::sdk::trace::Builder;
use schemars::JsonSchema;
use serde::Deserialize;
use serde::Serialize;
use tower::BoxError;
use super::agent_endpoint;
use super::deser_endpoint;
use super::AgentEndpoint;
use crate::plugins::telemetry::config::GenericWith;
use crate::plugins::telemetry::config::Trace;
use crate::plugins::telemetry::tracing::BatchProcessorConfig;
use crate::plugins::telemetry::tracing::SpanProcessorExt;
use crate::plugins::telemetry::tracing::TracingConfigurator;
#[derive(Debug, Clone, Deserialize, Serialize, JsonSchema)]
#[serde(deny_unknown_fields)]
pub(crate) struct Config {
#[serde(deserialize_with = "deser_endpoint")]
#[schemars(schema_with = "agent_endpoint")]
pub(crate) endpoint: AgentEndpoint,
#[serde(default)]
pub(crate) batch_processor: BatchProcessorConfig,
}
impl TracingConfigurator for Config {
fn apply(&self, builder: Builder, trace_config: &Trace) -> Result<Builder, BoxError> {
tracing::info!("configuring Datadog tracing: {}", self.batch_processor);
let url = match &self.endpoint {
AgentEndpoint::Default(_) => None,
AgentEndpoint::Url(s) => Some(s),
};
let exporter = opentelemetry_datadog::new_pipeline()
.with(&url, |b, e| {
b.with_agent_endpoint(e.to_string().trim_end_matches('/'))
})
.with_service_name(trace_config.service_name.clone())
.with_trace_config(trace_config.into())
.build_exporter()?;
Ok(builder.with_span_processor(
BatchSpanProcessor::builder(exporter, opentelemetry::runtime::Tokio)
.with_batch_config(self.batch_processor.clone().into())
.build()
.filtered(),
))
}
}
#[cfg(test)]
mod tests {
use reqwest::Url;
use super::*;
use crate::plugins::telemetry::tracing::AgentDefault;
#[test]
fn endpoint_configuration() {
let config: Config = serde_yaml::from_str("endpoint: default").unwrap();
assert_eq!(
AgentEndpoint::Default(AgentDefault::Default),
config.endpoint
);
let config: Config = serde_yaml::from_str("endpoint: collector:1234").unwrap();
assert_eq!(
AgentEndpoint::Url(Url::parse("http://collector:1234").unwrap()),
config.endpoint
);
let config: Config = serde_yaml::from_str("endpoint: https://collector:1234").unwrap();
assert_eq!(
AgentEndpoint::Url(Url::parse("https://collector:1234").unwrap()),
config.endpoint
);
}
}