feat: add telemetry

This commit is contained in:
2025-06-21 13:05:57 +03:00
parent f29d13b571
commit c4d25790a4
6 changed files with 226 additions and 21 deletions

View File

@@ -12,7 +12,11 @@ leptos_axum.workspace = true
axum.workspace = true
simple_logger.workspace = true
tokio.workspace = true
tokio = { workspace = true, features = ["tracing"] }
tower.workspace = true
tower-http.workspace = true
log.workspace = true
tracing-bunyan-formatter = { version = "0.3", default-features = false }
tracing = { version = "0.1", features = ["log"] }
tracing-log = "0.2.0"
tracing-subscriber = { version = "0.3", features = ["registry", "env-filter"] }

View File

@@ -22,7 +22,7 @@ pub async fn file_and_error_handler(
res.into_response()
} else {
let handler =
leptos_axum::render_app_to_stream(options.to_owned(), move || view! { <App/> });
leptos_axum::render_app_to_stream(options.to_owned(), move || view! { <App /> });
handler(req).await.into_response()
}
}

View File

@@ -1,12 +1,13 @@
use axum::Router;
use leptos::prelude::*;
use leptos_axum::{generate_route_list, LeptosRoutes};
mod telemetry;
use app::*;
use axum::Router;
use leptos::logging::log;
use leptos::prelude::*;
use leptos_axum::{LeptosRoutes, generate_route_list};
#[tokio::main]
async fn main() {
let conf = get_configuration(None).unwrap();
let addr = conf.leptos_options.site_addr;
let leptos_options = conf.leptos_options;

37
server/src/telemetry.rs Normal file
View File

@@ -0,0 +1,37 @@
use tracing::{Subscriber, subscriber::set_global_default};
use tracing_bunyan_formatter::{BunyanFormattingLayer, JsonStorageLayer};
use tracing_log::LogTracer;
use tracing_subscriber::{EnvFilter, Registry, fmt::MakeWriter, layer::SubscriberExt};
/// Creates a `tracing` subscriber with Bunyan-style JSON formatting.
///
/// - `name`: The name of the application (used in logs).
/// - `env_filter`: The log level filter (e.g., "info", "debug").
/// - `sink`: The log sink (e.g., stdout, file).
///
/// Returns a `Subscriber` that can be used for structured logging.
pub fn get_subscriber<Sink, Name, Filter>(
name: Name,
env_filter: Filter,
sink: Sink,
) -> impl Subscriber + Send + Sync
where
Sink: for<'a> MakeWriter<'a> + Send + Sync + 'static,
Name: AsRef<str>,
Filter: AsRef<str>,
{
let env_filter = EnvFilter::try_from_default_env().unwrap_or_else(|_| env_filter.into());
let formatting_layer = BunyanFormattingLayer::new(name.as_ref().to_string(), sink);
Registry::default()
.with(env_filter)
.with(JsonStorageLayer)
.with(formatting_layer)
}
/// Initializes the global tracing subscriber.
///
/// - `subscriber`: The subscriber to set as the global default.
pub fn init_subscriber(subscriber: impl Subscriber + Send + Sync) {
LogTracer::init().expect("Failed to set logger");
set_global_default(subscriber).expect("Failed to set subscriber.");
}