15
15
use std:: collections:: BTreeMap ;
16
16
use std:: fmt;
17
17
use std:: io:: BufWriter ;
18
+ use std:: sync:: Arc ;
18
19
use std:: time:: Duration ;
19
20
use std:: time:: SystemTime ;
20
21
21
22
use fern:: FormatCallback ;
22
23
use opentelemetry:: logs:: AnyValue ;
23
- use opentelemetry:: logs:: Logger ;
24
- use opentelemetry:: logs:: LoggerProvider ;
25
24
use opentelemetry:: logs:: Severity ;
25
+ use opentelemetry:: InstrumentationLibrary ;
26
26
use opentelemetry_otlp:: WithExportConfig ;
27
27
use serde_json:: Map ;
28
28
use tracing_appender:: non_blocking:: NonBlocking ;
@@ -81,9 +81,9 @@ impl log::Log for MinitraceLogger {
81
81
fn flush ( & self ) { }
82
82
}
83
83
84
+ #[ derive( Debug ) ]
84
85
pub ( crate ) struct OpenTelemetryLogger {
85
- logger : opentelemetry_sdk:: logs:: Logger ,
86
- // keep provider alive
86
+ library : Arc < InstrumentationLibrary > ,
87
87
provider : opentelemetry_sdk:: logs:: LoggerProvider ,
88
88
}
89
89
@@ -111,14 +111,23 @@ impl OpenTelemetryLogger {
111
111
. build_log_exporter ( )
112
112
. expect ( "build log exporter" ) ;
113
113
let provider = opentelemetry_sdk:: logs:: LoggerProvider :: builder ( )
114
- . with_batch_exporter ( exporter, opentelemetry_sdk :: runtime :: Tokio )
114
+ . with_simple_exporter ( exporter)
115
115
. with_config (
116
116
opentelemetry_sdk:: logs:: Config :: default ( )
117
117
. with_resource ( opentelemetry_sdk:: Resource :: new ( kvs) ) ,
118
118
)
119
119
. build ( ) ;
120
- let logger = provider. versioned_logger ( name. to_string ( ) , None , None , None ) ;
121
- Self { logger, provider }
120
+ let library = Arc :: new ( InstrumentationLibrary :: new (
121
+ name. to_string ( ) ,
122
+ None :: < & str > ,
123
+ None :: < & str > ,
124
+ None ,
125
+ ) ) ;
126
+ Self { library, provider }
127
+ }
128
+
129
+ pub fn instrumentation_library ( & self ) -> & InstrumentationLibrary {
130
+ & self . library
122
131
}
123
132
}
124
133
@@ -128,13 +137,24 @@ impl log::Log for OpenTelemetryLogger {
128
137
true
129
138
}
130
139
131
- fn log ( & self , record : & log:: Record < ' _ > ) {
140
+ fn log ( & self , log_record : & log:: Record < ' _ > ) {
141
+ let provider = self . provider . clone ( ) ;
142
+ let config = provider. config ( ) ;
132
143
let builder = opentelemetry:: logs:: LogRecord :: builder ( )
133
144
. with_observed_timestamp ( SystemTime :: now ( ) )
134
- . with_severity_number ( map_severity_to_otel_severity ( record. level ( ) ) )
135
- . with_severity_text ( record. level ( ) . as_str ( ) )
136
- . with_body ( AnyValue :: from ( record. args ( ) . to_string ( ) ) ) ;
137
- self . logger . emit ( builder. build ( ) )
145
+ . with_severity_number ( map_severity_to_otel_severity ( log_record. level ( ) ) )
146
+ . with_severity_text ( log_record. level ( ) . as_str ( ) )
147
+ . with_body ( AnyValue :: from ( log_record. args ( ) . to_string ( ) ) ) ;
148
+ let record = builder. build ( ) ;
149
+ for processor in provider. log_processors ( ) {
150
+ let record = record. clone ( ) ;
151
+ let data = opentelemetry_sdk:: export:: logs:: LogData {
152
+ record,
153
+ resource : config. resource . clone ( ) ,
154
+ instrumentation : self . instrumentation_library ( ) . clone ( ) ,
155
+ } ;
156
+ processor. emit ( data) ;
157
+ }
138
158
}
139
159
140
160
fn flush ( & self ) {
0 commit comments