@@ -2,14 +2,22 @@ use anyhow::{anyhow, Result};
2
2
use opentelemetry:: trace:: TracerProvider ;
3
3
use opentelemetry_otlp:: WithTonicConfig ;
4
4
5
+ use opentelemetry_sdk:: Resource ;
5
6
use tracing_subscriber:: prelude:: * ;
6
7
use tracing_subscriber:: { fmt, EnvFilter } ;
7
8
8
9
use crate :: config:: { self , build_client_tls_config_from_env} ;
9
10
10
11
// Setup the tracing system. This MUST be done inside of a tokio Runtime
11
12
// because some collectors rely on it and would panic otherwise.
12
- pub fn setup_tracing ( log_level : & str , log_fmt : & str , log_no_color : bool ) -> Result < ( ) > {
13
+ //
14
+ // The function returns an optional tracer provider that must be used to
15
+ // shut down the tracing system.
16
+ pub fn setup_tracing (
17
+ log_level : & str ,
18
+ log_fmt : & str ,
19
+ log_no_color : bool ,
20
+ ) -> Result < Option < opentelemetry_sdk:: trace:: SdkTracerProvider > > {
13
21
// setup logging
14
22
let filter_layer = EnvFilter :: new ( log_level)
15
23
// some of our dependencies generate trace events too, but we don't care about them ->
@@ -23,18 +31,22 @@ pub fn setup_tracing(log_level: &str, log_fmt: &str, log_no_color: bool) -> Resu
23
31
. add_directive ( "wasmtime_cranelift=off" . parse ( ) . unwrap ( ) )
24
32
. add_directive ( "wasmtime_jit=off" . parse ( ) . unwrap ( ) ) ;
25
33
26
- match log_fmt {
27
- "json" => tracing_subscriber:: registry ( )
28
- . with ( filter_layer)
29
- . with ( fmt:: layer ( ) . json ( ) )
30
- . init ( ) ,
34
+ let tracer = match log_fmt {
35
+ "json" => {
36
+ tracing_subscriber:: registry ( )
37
+ . with ( filter_layer)
38
+ . with ( fmt:: layer ( ) . json ( ) )
39
+ . init ( ) ;
40
+ None
41
+ }
31
42
"text" => {
32
43
let fmt_layer = fmt:: layer ( ) . with_ansi ( log_no_color) ;
33
44
34
45
tracing_subscriber:: registry ( )
35
46
. with ( filter_layer)
36
47
. with ( fmt_layer)
37
- . init ( )
48
+ . init ( ) ;
49
+ None
38
50
}
39
51
"otlp" => {
40
52
// Create a new OpenTelemetry pipeline sending events to a
@@ -47,26 +59,30 @@ pub fn setup_tracing(log_level: &str, log_fmt: &str, log_no_color: bool) -> Resu
47
59
. with_tls_config ( build_client_tls_config_from_env ( "OTLP" ) ?)
48
60
. build ( ) ?;
49
61
50
- let tracer_provider = opentelemetry_sdk:: trace:: TracerProvider :: builder ( )
51
- . with_resource ( opentelemetry_sdk:: Resource :: new ( vec ! [
52
- opentelemetry:: KeyValue :: new( "service.name" , config:: SERVICE_NAME ) ,
53
- ] ) )
54
- . with_batch_exporter ( otlp_exporter, opentelemetry_sdk:: runtime:: Tokio )
62
+ let tracer_provider = opentelemetry_sdk:: trace:: SdkTracerProvider :: builder ( )
63
+ . with_resource (
64
+ Resource :: builder ( )
65
+ . with_service_name ( config:: SERVICE_NAME )
66
+ . build ( ) ,
67
+ )
68
+ . with_batch_exporter ( otlp_exporter)
55
69
. build ( ) ;
56
70
57
71
let tracer = tracer_provider. tracer ( config:: SERVICE_NAME ) ;
58
72
59
73
// Create a tracing layer with the configured tracer
60
74
let telemetry = tracing_opentelemetry:: layer ( ) . with_tracer ( tracer) ;
75
+
61
76
tracing_subscriber:: registry ( )
62
77
. with ( filter_layer)
63
78
. with ( telemetry)
64
79
. with ( fmt:: layer ( ) )
65
- . init ( )
80
+ . init ( ) ;
81
+ Some ( tracer_provider)
66
82
}
67
83
68
84
_ => return Err ( anyhow ! ( "Unknown log message format" ) ) ,
69
85
} ;
70
86
71
- Ok ( ( ) )
87
+ Ok ( tracer )
72
88
}
0 commit comments