3131//! ```
3232//!
3333
34+ use log:: { error, warn} ;
3435use log:: { info, LevelFilter , Metadata , Record } ;
35- use std:: time:: { Duration , SystemTime } ;
36-
3736use opentelemetry:: logs:: Logger ;
3837use opentelemetry:: KeyValue ;
3938use opentelemetry_appender_log:: OpenTelemetryLogBridge ;
@@ -44,8 +43,13 @@ use opentelemetry_sdk::logs::LoggerProvider;
4443use opentelemetry_sdk:: Resource ;
4544use opentelemetry_semantic_conventions:: resource:: SERVICE_NAME ;
4645use serde:: Deserialize ;
46+ use serde_json:: Value ;
47+ use std:: env;
48+
49+ use std:: time:: { Duration , SystemTime } ;
4750
4851use crate :: utilities:: constants:: { CONTEXT , CTX_SESSION_ID } ;
52+ use crate :: utilities:: decode_object;
4953
5054use super :: settings:: user_directory;
5155
@@ -171,18 +175,18 @@ pub fn setup_logging(settings: &LoggerSettings, machine_id: &str) -> Result<(),
171175 } )
172176 } else {
173177 fern:: Dispatch :: new ( ) . format ( move |out, message, record| {
178+ let log_json = serde_json:: json!( {
179+ "timestamp" : chrono:: Utc :: now( ) . to_rfc3339( ) ,
180+ "severity" : record. level( ) . to_string( ) ,
181+ "session_id" : & session_id,
182+ "target" : record. target( ) ,
183+ "message" : message,
184+ } ) ;
185+
174186 out. finish ( format_args ! (
175187 "{}" ,
176- serde_json:: to_string( & serde_json:: json!(
177- {
178- "timestamp" : chrono:: Utc :: now( ) . to_rfc3339( ) ,
179- "severity" : record. level( ) ,
180- "session_id" : & session_id,
181- "target" : record. target( ) ,
182- "message" : message,
183- }
184- ) )
185- . expect( "formatting `serde_json::Value` with string keys never fails" )
188+ serde_json:: to_string( & log_json)
189+ . expect( "formatting `serde_json::Value` with string keys never fails" )
186190 ) )
187191 } )
188192 } ;
@@ -215,12 +219,30 @@ pub fn setup_logging(settings: &LoggerSettings, machine_id: &str) -> Result<(),
215219 . build_log_exporter ( )
216220 . unwrap ( ) ;
217221
222+ let mut resource_attributes = vec ! [
223+ KeyValue :: new( SERVICE_NAME , "moose-cli" ) ,
224+ KeyValue :: new( "session_id" , session_id. as_str( ) ) ,
225+ KeyValue :: new( "machine_id" , String :: from( machine_id) ) ,
226+ ] ;
227+ let metric_labels = decode_object:: decode_base64_to_json (
228+ // We are reading from the environment variables because we metrics and logs are sharing
229+ // the same fields to append to the JSON
230+ env:: var ( "MOOSE_METRIC__LABELS" ) . unwrap ( ) . as_str ( ) ,
231+ ) ;
232+ match metric_labels {
233+ Ok ( Value :: Object ( labels) ) => {
234+ for ( key, value) in labels {
235+ if let Some ( value_str) = value. as_str ( ) {
236+ resource_attributes. push ( KeyValue :: new ( key, value_str. to_string ( ) ) ) ;
237+ }
238+ }
239+ }
240+ Err ( e) => error ! ( "Error decoding MOOSE_METRIC_LABELS: {}" , e) ,
241+ _ => warn ! ( "Unexpected value for MOOSE_METRIC_LABELS" ) ,
242+ }
243+
218244 let logger_provider = LoggerProvider :: builder ( )
219- . with_config ( Config :: default ( ) . with_resource ( Resource :: new ( vec ! [
220- KeyValue :: new( SERVICE_NAME , "moose-cli" ) ,
221- KeyValue :: new( "session_id" , session_id. as_str( ) ) ,
222- KeyValue :: new( "machine_id" , String :: from( machine_id) ) ,
223- ] ) ) )
245+ . with_config ( Config :: default ( ) . with_resource ( Resource :: new ( resource_attributes) ) )
224246 . with_batch_exporter ( otel_exporter, opentelemetry_sdk:: runtime:: Tokio )
225247 . build ( ) ;
226248
0 commit comments