]> Untitled Git - lemmy.git/blob - src/lib.rs
Add console-subscriber (#2003)
[lemmy.git] / src / lib.rs
1 #![recursion_limit = "512"]
2 pub mod api_routes;
3 pub mod code_migrations;
4 pub mod root_span_builder;
5 pub mod scheduled_tasks;
6
7 use console_subscriber::ConsoleLayer;
8 use lemmy_utils::LemmyError;
9 use opentelemetry::{
10   sdk::{propagation::TraceContextPropagator, Resource},
11   KeyValue,
12 };
13 use opentelemetry_otlp::WithExportConfig;
14 use tracing::subscriber::set_global_default;
15 use tracing_error::ErrorLayer;
16 use tracing_log::LogTracer;
17 use tracing_subscriber::{filter::Targets, layer::SubscriberExt, Layer, Registry};
18
19 pub fn init_tracing(opentelemetry_url: Option<&str>) -> Result<(), LemmyError> {
20   LogTracer::init()?;
21
22   opentelemetry::global::set_text_map_propagator(TraceContextPropagator::new());
23
24   let log_description = std::env::var("RUST_LOG").unwrap_or_else(|_| "info".into());
25
26   let targets = log_description
27     .trim()
28     .trim_matches('"')
29     .parse::<Targets>()?;
30
31   let format_layer = tracing_subscriber::fmt::layer().with_filter(targets.clone());
32
33   let console_layer = ConsoleLayer::builder()
34     .with_default_env()
35     .server_addr(([0, 0, 0, 0], 6669))
36     .event_buffer_capacity(1024 * 1024)
37     .spawn();
38
39   let subscriber = Registry::default()
40     .with(format_layer)
41     .with(ErrorLayer::default())
42     .with(console_layer);
43
44   if let Some(url) = opentelemetry_url {
45     let tracer = opentelemetry_otlp::new_pipeline()
46       .tracing()
47       .with_trace_config(
48         opentelemetry::sdk::trace::config()
49           .with_resource(Resource::new(vec![KeyValue::new("service.name", "lemmy")])),
50       )
51       .with_exporter(
52         opentelemetry_otlp::new_exporter()
53           .tonic()
54           .with_endpoint(url),
55       )
56       .install_batch(opentelemetry::runtime::Tokio)?;
57
58     let otel_layer = tracing_opentelemetry::layer()
59       .with_tracer(tracer)
60       .with_filter(targets);
61
62     let subscriber = subscriber.with(otel_layer);
63
64     set_global_default(subscriber)?;
65   } else {
66     set_global_default(subscriber)?;
67   }
68
69   Ok(())
70 }