Skip to content

Commit a99d07b

Browse files
committed
add agent sampler
1 parent d7984e8 commit a99d07b

File tree

2 files changed

+39
-7
lines changed

2 files changed

+39
-7
lines changed

crates/ingress-rpc/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,5 +40,5 @@ opentelemetry-otlp.workspace = true
4040
opentelemetry_sdk.workspace = true
4141
tracing-opentelemetry.workspace = true
4242
reqwest.workspace = true
43-
opentelemetry-datadog = { workspace = true, features = ["reqwest-client"]}
43+
opentelemetry-datadog = { workspace = true, features = ["reqwest-client", "agent-sampling"]}
4444
opentelemetry-semantic-conventions.workspace = true

crates/ingress-rpc/src/main.rs

Lines changed: 38 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ use alloy_provider::{ProviderBuilder, RootProvider};
33
use clap::Parser;
44
use jsonrpsee::server::Server;
55
use op_alloy_network::Optimism;
6-
use opentelemetry::trace::{Span, TraceContextExt, Tracer, TracerProvider};
6+
use opentelemetry::trace::{SamplingResult, Span, TraceContextExt, Tracer, TracerProvider};
77
use opentelemetry::{Key, KeyValue, Value, global};
88
//use opentelemetry_otlp::WithExportConfig;
99
//use opentelemetry_sdk::Resource;
@@ -25,8 +25,8 @@ use url::Url;
2525
// InstrumentationScope, Key, KeyValue, Value,
2626
//};
2727
use opentelemetry::InstrumentationScope;
28-
use opentelemetry_datadog::{ApiVersion, new_pipeline};
29-
use opentelemetry_sdk::trace::{self, RandomIdGenerator, Sampler};
28+
use opentelemetry_datadog::{ApiVersion, DatadogTraceStateBuilder, new_pipeline};
29+
use opentelemetry_sdk::trace::{self, RandomIdGenerator, ShouldSample};
3030
use opentelemetry_semantic_conventions as semcov;
3131

3232
mod queue;
@@ -101,6 +101,38 @@ fn bar() {
101101
span.end()
102102
}
103103

104+
#[derive(Debug, Clone)]
105+
struct AgentBasedSampler;
106+
107+
impl ShouldSample for AgentBasedSampler {
108+
fn should_sample(
109+
&self,
110+
parent_context: Option<&opentelemetry::Context>,
111+
_trace_id: opentelemetry::trace::TraceId,
112+
_name: &str,
113+
_span_kind: &opentelemetry::trace::SpanKind,
114+
_attributes: &[opentelemetry::KeyValue],
115+
_links: &[opentelemetry::trace::Link],
116+
) -> opentelemetry::trace::SamplingResult {
117+
let trace_state = parent_context
118+
.map(
119+
|parent_context| parent_context.span().span_context().trace_state().clone(), // inherit sample decision from parent span
120+
)
121+
.unwrap_or_else(|| {
122+
DatadogTraceStateBuilder::default()
123+
.with_priority_sampling(true) // always sample root span(span without remote or local parent)
124+
.with_measuring(true) // datadog-agent will create metric for this span for APM
125+
.build()
126+
});
127+
128+
SamplingResult {
129+
decision: opentelemetry::trace::SamplingDecision::RecordAndSample, // send all spans to datadog-agent
130+
attributes: vec![],
131+
trace_state,
132+
}
133+
}
134+
}
135+
104136
#[tokio::main]
105137
async fn main() -> anyhow::Result<()> {
106138
dotenvy::dotenv().ok();
@@ -126,7 +158,7 @@ async fn main() -> anyhow::Result<()> {
126158
let otlp_endpoint = format!("http://{}:{}", &dd_host, &config.tracing_otlp_port);
127159

128160
// from: https://github.com/flashbots/rollup-boost/blob/08ebd3e75a8f4c7ebc12db13b042dee04e132c05/crates/rollup-boost/src/tracing.rs#L127
129-
let filter_name = "tips-ingress-rpc".to_string();
161+
let filter_name = "tips_ingress_rpc".to_string();
130162

131163
let global_filter = Targets::new()
132164
.with_default(LevelFilter::INFO)
@@ -142,7 +174,7 @@ async fn main() -> anyhow::Result<()> {
142174

143175
global::set_text_map_propagator(opentelemetry_sdk::propagation::TraceContextPropagator::new());
144176
let mut trace_cfg = trace::Config::default();
145-
trace_cfg.sampler = Box::new(Sampler::AlwaysOn);
177+
trace_cfg.sampler = Box::new(AgentBasedSampler);
146178
trace_cfg.id_generator = Box::new(RandomIdGenerator::default());
147179

148180
// `with_agent_endpoint` or `with_http_client`?
@@ -292,7 +324,7 @@ mod tests {
292324

293325
fn build_provider() -> SdkTracerProvider {
294326
let mut trace_cfg = trace::Config::default();
295-
trace_cfg.sampler = Box::new(Sampler::AlwaysOn);
327+
trace_cfg.sampler = Box::new(AgentBasedSampler);
296328
trace_cfg.id_generator = Box::new(RandomIdGenerator::default());
297329

298330
let provider = new_pipeline()

0 commit comments

Comments
 (0)