Skip to content

Commit ffa0545

Browse files
committed
feat: Add support for configurable trace sampling behaviour
1 parent 05bca5c commit ffa0545

File tree

1 file changed

+50
-18
lines changed

1 file changed

+50
-18
lines changed

src/telemetry.rs

Lines changed: 50 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
use opentelemetry::global;
2-
use opentelemetry_sdk::propagation::TraceContextPropagator;
32
use opentelemetry_otlp::WithExportConfig;
3+
use opentelemetry_sdk::propagation::TraceContextPropagator;
44
use tracing::Subscriber;
5-
use tracing_subscriber::{prelude::*, Layer, registry::LookupSpan};
5+
use tracing_subscriber::{prelude::*, registry::LookupSpan, Layer};
66

77
pub fn setup() {
88
global::set_text_map_propagator(TraceContextPropagator::new());
@@ -50,16 +50,49 @@ fn load_otlp_headers() -> tonic::metadata::MetadataMap {
5050
tracing_metadata
5151
}
5252

53-
fn load_output_layer<S>() -> Box<dyn Layer<S> + Send + Sync + 'static>
54-
where S: Subscriber + Send + Sync,
55-
for<'a> S: LookupSpan<'a>,
53+
fn load_trace_sampler() -> opentelemetry_sdk::trace::Sampler {
54+
fn get_trace_ratio() -> f64 {
55+
std::env::var("OTEL_TRACES_SAMPLER_ARG")
56+
.ok()
57+
.and_then(|ratio| ratio.parse().ok())
58+
.unwrap_or(1.0)
59+
}
60+
61+
match std::env::var("OTEL_TRACES_SAMPLER") {
62+
Ok(&"always_on") => opentelemetry_sdk::trace::Sampler::AlwaysOn,
63+
Ok(&"always_off") => opentelemetry_sdk::trace::Sampler::AlwaysOff,
64+
Ok(&"traceidratio") => {
65+
opentelemetry_sdk::trace::Sampler::TraceIdRatioBased(get_trace_ratio())
66+
}
67+
Ok(&"parentbased_always_on") => opentelemetry_sdk::trace::Sampler::ParentBased(
68+
opentelemetry_sdk::trace::Sampler::AlwaysOn,
69+
),
70+
Ok(&"parentbased_always_off") => opentelemetry_sdk::trace::Sampler::ParentBased(
71+
opentelemetry_sdk::trace::Sampler::AlwaysOff,
72+
),
73+
Ok(&"parentbased_traceidratio") => opentelemetry_sdk::trace::Sampler::ParentBased(
74+
opentelemetry_sdk::trace::Sampler::TraceIdRatioBased(get_trace_ratio()),
75+
),
76+
_ => opentelemetry_sdk::trace::Sampler::AlwaysOn,
77+
}
78+
}
79+
80+
fn load_output_layer<S>() -> Box<dyn Layer<S> + Send + Sync + 'static>
81+
where
82+
S: Subscriber + Send + Sync,
83+
for<'a> S: LookupSpan<'a>,
5684
{
5785
#[cfg(not(debug_assertions))]
5886
let tracing_endpoint = std::env::var("OTEL_EXPORTER_OTLP_ENDPOINT").ok();
5987

6088
#[cfg(debug_assertions)]
6189
let tracing_endpoint = Some("https://api.honeycomb.io:443".to_string());
6290

91+
let sampling_ratio = std::env::var("OTEL_EXPORTER_OTLP_SAMPLING_RATIO")
92+
.ok()
93+
.and_then(|ratio| ratio.parse().ok())
94+
.unwrap_or(1.0);
95+
6396
if let Some(endpoint) = tracing_endpoint {
6497
let metadata = load_otlp_headers();
6598
let tracer = opentelemetry_otlp::new_pipeline()
@@ -70,22 +103,21 @@ for<'a> S: LookupSpan<'a>,
70103
.with_endpoint(endpoint)
71104
.with_metadata(metadata),
72105
)
73-
.with_trace_config(opentelemetry_sdk::trace::config().with_resource(
74-
opentelemetry_sdk::Resource::new(vec![
75-
opentelemetry::KeyValue::new("service.name", "grey"),
76-
opentelemetry::KeyValue::new("service.version", version!("v")),
77-
opentelemetry::KeyValue::new("host.os", std::env::consts::OS),
78-
opentelemetry::KeyValue::new("host.architecture", std::env::consts::ARCH),
79-
]),
80-
))
106+
.with_trace_config(
107+
opentelemetry_sdk::trace::config()
108+
.with_resource(opentelemetry_sdk::Resource::new(vec![
109+
opentelemetry::KeyValue::new("service.name", "grey"),
110+
opentelemetry::KeyValue::new("service.version", version!("v")),
111+
opentelemetry::KeyValue::new("host.os", std::env::consts::OS),
112+
opentelemetry::KeyValue::new("host.architecture", std::env::consts::ARCH),
113+
]))
114+
.with_sampler(load_trace_sampler()),
115+
)
81116
.install_batch(opentelemetry_sdk::runtime::Tokio)
82117
.unwrap();
83118

84-
tracing_opentelemetry::layer()
85-
.with_tracer(tracer)
86-
.boxed()
119+
tracing_opentelemetry::layer().with_tracer(tracer).boxed()
87120
} else {
88-
tracing_subscriber::fmt::layer()
89-
.boxed()
121+
tracing_subscriber::fmt::layer().boxed()
90122
}
91123
}

0 commit comments

Comments
 (0)