1
1
use std:: { ascii:: escape_default, sync:: OnceLock , time:: Duration } ;
2
2
3
3
use anyhow:: bail;
4
- use opentelemetry:: {
5
- global,
6
- logs:: { Logger , LoggerProvider } ,
7
- } ;
4
+ use opentelemetry:: logs:: { LogRecord , Logger , LoggerProvider } ;
8
5
use opentelemetry_otlp:: LogExporterBuilder ;
9
6
use opentelemetry_sdk:: {
10
- logs:: { BatchConfigBuilder , BatchLogProcessor } ,
7
+ logs:: { BatchConfigBuilder , BatchLogProcessor , Logger as SdkLogger } ,
11
8
resource:: { EnvResourceDetector , TelemetryResourceDetector } ,
12
9
Resource ,
13
10
} ;
@@ -17,6 +14,8 @@ use crate::{
17
14
env:: { self , otel_logs_enabled, OtlpProtocol } ,
18
15
} ;
19
16
17
+ static LOGGER : OnceLock < SdkLogger > = OnceLock :: new ( ) ;
18
+
20
19
/// Handle an application log. Has the potential to both forward the log to OTel and to emit it as a
21
20
/// tracing event.
22
21
pub fn handle_app_log ( buf : & [ u8 ] ) {
@@ -30,20 +29,16 @@ fn app_log_to_otel(buf: &[u8]) {
30
29
return ;
31
30
}
32
31
33
- let logger = global :: logger_provider ( ) . logger ( "spin" ) ;
32
+ let logger = LOGGER . get ( ) . unwrap ( ) ;
34
33
if let Ok ( s) = std:: str:: from_utf8 ( buf) {
35
- logger. emit (
36
- opentelemetry:: logs:: LogRecord :: builder ( )
37
- . with_body ( s. to_owned ( ) )
38
- . build ( ) ,
39
- ) ;
34
+ let mut record = logger. create_log_record ( ) ;
35
+ record. set_body ( s. to_string ( ) . into ( ) ) ;
36
+ logger. emit ( record) ;
40
37
} else {
41
- logger. emit (
42
- opentelemetry:: logs:: LogRecord :: builder ( )
43
- . with_body ( escape_non_utf8_buf ( buf) )
44
- . with_attribute ( "app_log_non_utf8" , true )
45
- . build ( ) ,
46
- ) ;
38
+ let mut record = logger. create_log_record ( ) ;
39
+ record. set_body ( escape_non_utf8_buf ( buf) . into ( ) ) ;
40
+ record. add_attribute ( "app_log_non_utf8" , true ) ;
41
+ logger. emit ( record) ;
47
42
}
48
43
}
49
44
@@ -106,7 +101,9 @@ pub(crate) fn init_otel_logging_backend(spin_version: String) -> anyhow::Result<
106
101
)
107
102
. build ( ) ;
108
103
109
- global:: set_logger_provider ( provider) ;
104
+ LOGGER
105
+ . set ( provider. logger ( "spin" ) )
106
+ . expect ( "should set logger" ) ;
110
107
111
108
Ok ( ( ) )
112
109
}
0 commit comments