1
1
use opentelemetry:: global;
2
- use opentelemetry_sdk:: propagation:: TraceContextPropagator ;
3
2
use opentelemetry_otlp:: WithExportConfig ;
3
+ use opentelemetry_sdk:: propagation:: TraceContextPropagator ;
4
4
use tracing:: Subscriber ;
5
- use tracing_subscriber:: { prelude:: * , Layer , registry:: LookupSpan } ;
5
+ use tracing_subscriber:: { prelude:: * , registry:: LookupSpan , Layer } ;
6
6
7
7
pub fn setup ( ) {
8
8
global:: set_text_map_propagator ( TraceContextPropagator :: new ( ) ) ;
@@ -50,16 +50,49 @@ fn load_otlp_headers() -> tonic::metadata::MetadataMap {
50
50
tracing_metadata
51
51
}
52
52
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 > ,
56
84
{
57
85
#[ cfg( not( debug_assertions) ) ]
58
86
let tracing_endpoint = std:: env:: var ( "OTEL_EXPORTER_OTLP_ENDPOINT" ) . ok ( ) ;
59
87
60
88
#[ cfg( debug_assertions) ]
61
89
let tracing_endpoint = Some ( "https://api.honeycomb.io:443" . to_string ( ) ) ;
62
90
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
+
63
96
if let Some ( endpoint) = tracing_endpoint {
64
97
let metadata = load_otlp_headers ( ) ;
65
98
let tracer = opentelemetry_otlp:: new_pipeline ( )
@@ -70,22 +103,21 @@ for<'a> S: LookupSpan<'a>,
70
103
. with_endpoint ( endpoint)
71
104
. with_metadata ( metadata) ,
72
105
)
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
+ )
81
116
. install_batch ( opentelemetry_sdk:: runtime:: Tokio )
82
117
. unwrap ( ) ;
83
118
84
- tracing_opentelemetry:: layer ( )
85
- . with_tracer ( tracer)
86
- . boxed ( )
119
+ tracing_opentelemetry:: layer ( ) . with_tracer ( tracer) . boxed ( )
87
120
} else {
88
- tracing_subscriber:: fmt:: layer ( )
89
- . boxed ( )
121
+ tracing_subscriber:: fmt:: layer ( ) . boxed ( )
90
122
}
91
123
}
0 commit comments