@@ -3,7 +3,7 @@ use alloy_provider::{ProviderBuilder, RootProvider};
33use clap:: Parser ;
44use jsonrpsee:: server:: Server ;
55use op_alloy_network:: Optimism ;
6- use opentelemetry:: trace:: { Span , TraceContextExt , Tracer , TracerProvider } ;
6+ use opentelemetry:: trace:: { SamplingResult , Span , TraceContextExt , Tracer , TracerProvider } ;
77use 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//};
2727use 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 } ;
3030use opentelemetry_semantic_conventions as semcov;
3131
3232mod 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]
105137async 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