Skip to content

Commit f282659

Browse files
authored
Pull sampling probability from env var OTEL_TRACES_SAMPLER_ARG in the default sdk config (#737)
Signed-off-by: jbtrystram <jbtrystram@redhat.com>
1 parent e07cc03 commit f282659

File tree

1 file changed

+67
-0
lines changed

1 file changed

+67
-0
lines changed

opentelemetry-sdk/src/trace/config.rs

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
//! Configuration represents the global tracing configuration, overrides
44
//! can be set for the default OpenTelemetry limits and Sampler.
55
use crate::trace::{span_limit::SpanLimits, Sampler, ShouldSample};
6+
use opentelemetry_api::global::{handle_error, Error};
67
use opentelemetry_api::trace::IdGenerator;
78
use std::env;
89
use std::str::FromStr;
@@ -123,6 +124,72 @@ impl Default for Config {
123124
config.span_limits.max_links_per_span = max_links_per_span;
124125
}
125126

127+
let sampler_arg = env::var("OTEL_TRACES_SAMPLER_ARG").ok();
128+
if let Ok(sampler) = env::var("OTEL_TRACES_SAMPLER") {
129+
config.sampler = match sampler.as_str() {
130+
"always_on" => Box::new(Sampler::AlwaysOn),
131+
"always_off" => Box::new(Sampler::AlwaysOff),
132+
"traceidratio" => {
133+
let ratio = sampler_arg.and_then(|r| r.parse::<f64>().ok());
134+
if let Some(r) = ratio {
135+
Box::new(Sampler::TraceIdRatioBased(r))
136+
} else {
137+
handle_error(
138+
Error::Other(String::from(
139+
"Missing or invalid OTEL_TRACES_SAMPLER_ARG value. Falling back to default: 1.0"))
140+
);
141+
Box::new(Sampler::TraceIdRatioBased(1.0))
142+
}
143+
}
144+
"parentbased_always_on" => {
145+
Box::new(Sampler::ParentBased(Box::new(Sampler::AlwaysOn)))
146+
}
147+
"parentbased_always_off" => {
148+
Box::new(Sampler::ParentBased(Box::new(Sampler::AlwaysOff)))
149+
}
150+
"parentbased_traceidratio" => {
151+
let ratio = sampler_arg.and_then(|r| r.parse::<f64>().ok());
152+
if let Some(r) = ratio {
153+
Box::new(Sampler::ParentBased(Box::new(Sampler::TraceIdRatioBased(
154+
r,
155+
))))
156+
} else {
157+
handle_error(
158+
Error::Other(String::from(
159+
"Missing or invalid OTEL_TRACES_SAMPLER_ARG value. Falling back to default: 1.0"
160+
)));
161+
Box::new(Sampler::ParentBased(Box::new(Sampler::TraceIdRatioBased(
162+
1.0,
163+
))))
164+
}
165+
}
166+
"parentbased_jaeger_remote" => {
167+
handle_error(
168+
Error::Other(String::from(
169+
"Unimplemented parentbased_jaeger_remote sampler. Falling back to default: parentbased_always_on"
170+
)));
171+
Box::new(Sampler::ParentBased(Box::new(Sampler::AlwaysOn)))
172+
}
173+
"jaeger_remote" => {
174+
handle_error(
175+
Error::Other(String::from("Unimplemented jaeger_remote sampler. Falling back to default: parentbased_always_on")));
176+
Box::new(Sampler::ParentBased(Box::new(Sampler::AlwaysOn)))
177+
}
178+
"xray" => {
179+
handle_error(
180+
Error::Other(String::from("Unimplemented xray sampler. Falling back to default: parentbased_always_on")));
181+
Box::new(Sampler::ParentBased(Box::new(Sampler::AlwaysOn)))
182+
}
183+
s => {
184+
handle_error(
185+
Error::Other(format!("Unrecognised OTEL_TRACES_SAMPLER value: {}. Falling back to default: parentbased_always_on",
186+
s
187+
)));
188+
Box::new(Sampler::ParentBased(Box::new(Sampler::AlwaysOn)))
189+
}
190+
}
191+
}
192+
126193
config
127194
}
128195
}

0 commit comments

Comments
 (0)