micromegas_telemetry_sink/
local_event_sink.rs

1use micromegas_tracing::{
2    event::EventSink,
3    logs::{LogBlock, LogMetadata, LogStream},
4    metrics::{MetricsBlock, MetricsStream},
5    prelude::*,
6    property_set::{Property, property_get},
7    spans::{ThreadBlock, ThreadStream},
8};
9use std::{fmt, sync::Arc};
10
11use colored::Colorize;
12
13/// Prints log entries to the console
14pub struct LocalEventSink {}
15
16impl LocalEventSink {
17    pub fn new() -> Self {
18        Self {}
19    }
20}
21
22impl EventSink for LocalEventSink {
23    fn on_startup(&self, _proc_info: Arc<ProcessInfo>) {}
24    fn on_shutdown(&self) {}
25
26    fn on_log_enabled(&self, _metadata: &LogMetadata) -> bool {
27        // reaching here we accept everything
28        true
29    }
30
31    fn on_log(
32        &self,
33        metadata: &LogMetadata,
34        properties: &[Property],
35        _time: i64,
36        args: fmt::Arguments<'_>,
37    ) {
38        let level_string = match metadata.level {
39            Level::Fatal => metadata.level.to_string().red().to_string(),
40            Level::Error => metadata.level.to_string().red().to_string(),
41            Level::Warn => metadata.level.to_string().yellow().to_string(),
42            Level::Info => metadata.level.to_string().cyan().to_string(),
43            Level::Debug => metadata.level.to_string().purple().to_string(),
44            Level::Trace => metadata.level.to_string().normal().to_string(),
45        };
46
47        let mut target = if !metadata.target.is_empty() {
48            metadata.target
49        } else {
50            metadata.module_path
51        };
52
53        if let Some(t) = property_get(properties, "target") {
54            target = t;
55        }
56
57        let timestamp = format!("{} ", chrono::Utc::now().to_rfc3339());
58
59        let message = format!("{timestamp}{level_string:<5} [{target}] {args}");
60
61        println!("{message}");
62    }
63
64    fn on_init_log_stream(&self, _: &LogStream) {}
65    fn on_process_log_block(&self, _: Arc<LogBlock>) {}
66
67    fn on_init_metrics_stream(&self, _: &MetricsStream) {}
68    fn on_process_metrics_block(&self, _: Arc<MetricsBlock>) {}
69
70    fn on_init_thread_stream(&self, _thread_stream: &ThreadStream) {}
71
72    #[allow(clippy::cast_precision_loss)]
73    fn on_process_thread_block(&self, _block: Arc<ThreadBlock>) {}
74
75    fn is_busy(&self) -> bool {
76        false
77    }
78}