From 70a5cc48a44ebdd74aabee7f7ab9802db13c7f70 Mon Sep 17 00:00:00 2001 From: James Kay Date: Mon, 3 Nov 2025 16:48:17 +0000 Subject: [PATCH] `linera_base::tracing`: move into `linera-service` and `linera-web` respectively --- .github/workflows/rust.yml | 2 +- Cargo.lock | 17 ++- docker/Dockerfile | 2 +- examples/Cargo.lock | 142 +----------------- linera-base/Cargo.toml | 8 - linera-base/src/lib.rs | 4 - linera-base/src/tracing_web.rs | 26 ---- linera-sdk/tests/fixtures/Cargo.lock | 139 ----------------- linera-service/Cargo.toml | 7 + linera-service/src/benchmark.rs | 2 +- linera-service/src/cli/main.rs | 8 +- linera-service/src/exporter/main.rs | 2 +- linera-service/src/lib.rs | 1 + linera-service/src/proxy/main.rs | 2 +- linera-service/src/server.rs | 2 +- linera-service/src/tracing/chrome.rs | 52 +++++++ .../src/tracing/mod.rs | 8 +- .../src/tracing/opentelemetry.rs | 94 ++---------- .../tests/opentelemetry.rs | 12 +- linera-summary/Cargo.toml | 2 +- linera-summary/src/main.rs | 8 +- web/@linera/client/Cargo.toml | 5 + web/@linera/client/src/lib.rs | 18 ++- 23 files changed, 130 insertions(+), 433 deletions(-) delete mode 100644 linera-base/src/tracing_web.rs create mode 100644 linera-service/src/tracing/chrome.rs rename linera-base/src/tracing.rs => linera-service/src/tracing/mod.rs (97%) rename linera-base/src/tracing_opentelemetry.rs => linera-service/src/tracing/opentelemetry.rs (61%) rename linera-base/tests/opentelemetry_tests.rs => linera-service/tests/opentelemetry.rs (85%) diff --git a/.github/workflows/rust.yml b/.github/workflows/rust.yml index 7fd1c2134ae..455d5a74f75 100644 --- a/.github/workflows/rust.yml +++ b/.github/workflows/rust.yml @@ -170,7 +170,7 @@ jobs: - uses: actions-rust-lang/setup-rust-toolchain@v1 - name: Run metrics tests run: | - cargo test --locked -p linera-base --features metrics,opentelemetry + cargo test --locked -p linera-base --features metrics wasm-application-test: needs: changed-files diff --git a/Cargo.lock b/Cargo.lock index 4986908b339..007bbeb6df2 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -5097,14 +5097,10 @@ dependencies = [ "futures", "getrandom 0.2.16", "hex", - "is-terminal", "k256", "linera-base", "linera-kywasmtime", "linera-witty", - "opentelemetry", - "opentelemetry-otlp", - "opentelemetry_sdk", "port-selector", "prometheus", "proptest", @@ -5124,9 +5120,6 @@ dependencies = [ "tokio-stream", "tokio-util", "tracing", - "tracing-chrome", - "tracing-opentelemetry", - "tracing-subscriber 0.3.19", "tracing-web", "trait-variant", "wasm-bindgen", @@ -5707,6 +5700,7 @@ dependencies = [ "heck 0.4.1", "http 1.3.1", "insta", + "is-terminal", "k8s-openapi", "kube", "linera-base", @@ -5730,6 +5724,9 @@ dependencies = [ "mini-moka", "native-fungible", "non-fungible", + "opentelemetry", + "opentelemetry-otlp", + "opentelemetry_sdk", "papaya", "pathdiff", "port-selector", @@ -5763,6 +5760,8 @@ dependencies = [ "tower 0.4.13", "tower-http 0.6.6", "tracing", + "tracing-chrome", + "tracing-opentelemetry", "tracing-subscriber 0.3.19", ] @@ -5855,12 +5854,12 @@ dependencies = [ "clap", "git2", "humantime", - "linera-base", "linera-version", "octocrab", "serde", "tokio", "tracing", + "tracing-subscriber 0.3.19", ] [[package]] @@ -6104,6 +6103,8 @@ dependencies = [ "serde-wasm-bindgen 0.6.5", "tokio-util", "tracing", + "tracing-subscriber 0.3.19", + "tracing-web", "wasm-bindgen", "wasm-bindgen-futures", "web-sys", diff --git a/docker/Dockerfile b/docker/Dockerfile index 556b1ba5214..f0fec8a77de 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -25,7 +25,7 @@ ARG binaries= ARG copy=${binaries:+_copy} ARG build_flag=--release ARG build_folder=release -ARG build_features=scylladb,metrics,memory-profiling,opentelemetry +ARG build_features=scylladb,metrics,memory-profiling ARG rustflags="-C force-frame-pointers=yes" FROM rust:1.74-slim-bookworm AS builder diff --git a/examples/Cargo.lock b/examples/Cargo.lock index 0a51cb035df..c56fa421adc 100644 --- a/examples/Cargo.lock +++ b/examples/Cargo.lock @@ -2987,12 +2987,6 @@ version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" -[[package]] -name = "hermit-abi" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbf6a919d6cf397374f7dfeeea91d974c7c0a7221d0d0f4f20d859d329e53fcc" - [[package]] name = "hex" version = "0.4.3" @@ -3452,17 +3446,6 @@ dependencies = [ "serde", ] -[[package]] -name = "is-terminal" -version = "0.4.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "261f68e344040fbd0edea105bef17c66edf46f984ddb1115b775ce31be948f4b" -dependencies = [ - "hermit-abi 0.4.0", - "libc", - "windows-sys 0.52.0", -] - [[package]] name = "is_terminal_polyfill" version = "1.70.1" @@ -3605,11 +3588,8 @@ dependencies = [ "ed25519-dalek", "futures", "hex", - "is-terminal", "k256", "linera-witty", - "opentelemetry", - "opentelemetry_sdk", "port-selector", "prometheus", "proptest", @@ -3627,9 +3607,6 @@ dependencies = [ "tokio-stream", "tokio-util", "tracing", - "tracing-chrome", - "tracing-opentelemetry", - "tracing-subscriber", "trait-variant", "zstd", ] @@ -4284,7 +4261,7 @@ version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "80e04d1dcff3aae0704555fe5fee3bcfaf3d1fdf8a7e521d5b9d2b42acb52cec" dependencies = [ - "hermit-abi 0.3.9", + "hermit-abi", "libc", "wasi 0.11.0+wasi-snapshot-preview1", "windows-sys 0.52.0", @@ -4386,16 +4363,6 @@ dependencies = [ "winapi", ] -[[package]] -name = "nu-ansi-term" -version = "0.46.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" -dependencies = [ - "overload", - "winapi", -] - [[package]] name = "num-bigint" version = "0.4.6" @@ -4447,7 +4414,7 @@ version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" dependencies = [ - "hermit-abi 0.3.9", + "hermit-abi", "libc", ] @@ -4505,44 +4472,6 @@ version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e296cf87e61c9cfc1a61c3c63a0f7f286ed4554e0e22be84e8a38e1d264a2a29" -[[package]] -name = "opentelemetry" -version = "0.30.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aaf416e4cb72756655126f7dd7bb0af49c674f4c1b9903e80c009e0c37e552e6" -dependencies = [ - "futures-core", - "futures-sink", - "js-sys", - "pin-project-lite", - "thiserror 2.0.9", - "tracing", -] - -[[package]] -name = "opentelemetry_sdk" -version = "0.30.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11f644aa9e5e31d11896e024305d7e3c98a88884d9f8919dbf37a9991bc47a4b" -dependencies = [ - "futures-channel", - "futures-executor", - "futures-util", - "opentelemetry", - "percent-encoding", - "rand 0.9.0", - "serde_json", - "thiserror 2.0.9", - "tokio", - "tokio-stream", -] - -[[package]] -name = "overload" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" - [[package]] name = "papaya" version = "0.1.9" @@ -6630,17 +6559,6 @@ dependencies = [ "syn 2.0.100", ] -[[package]] -name = "tracing-chrome" -version = "0.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf0a738ed5d6450a9fb96e86a23ad808de2b727fd1394585da5cdd6788ffe724" -dependencies = [ - "serde_json", - "tracing-core", - "tracing-subscriber", -] - [[package]] name = "tracing-core" version = "0.1.32" @@ -6648,7 +6566,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" dependencies = [ "once_cell", - "valuable", ] [[package]] @@ -6663,45 +6580,6 @@ dependencies = [ "tracing", ] -[[package]] -name = "tracing-log" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" -dependencies = [ - "log", - "once_cell", - "tracing-core", -] - -[[package]] -name = "tracing-opentelemetry" -version = "0.31.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ddcf5959f39507d0d04d6413119c04f33b623f4f951ebcbdddddfad2d0623a9c" -dependencies = [ - "js-sys", - "once_cell", - "opentelemetry", - "opentelemetry_sdk", - "smallvec", - "tracing", - "tracing-core", - "tracing-log", - "tracing-subscriber", - "web-time", -] - -[[package]] -name = "tracing-serde" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc6b213177105856957181934e4920de57730fc69bf42c37ee5bb664d406d9e1" -dependencies = [ - "serde", - "tracing-core", -] - [[package]] name = "tracing-subscriber" version = "0.3.18" @@ -6709,18 +6587,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ad0f048c97dbd9faa9b7df56362b8ebcaa52adb06b498c050d2f4e32f90a7a8b" dependencies = [ "matchers", - "nu-ansi-term", "once_cell", "regex", - "serde", - "serde_json", "sharded-slab", - "smallvec", "thread_local", "tracing", "tracing-core", - "tracing-log", - "tracing-serde", ] [[package]] @@ -7104,16 +6976,6 @@ dependencies = [ "wasm-bindgen", ] -[[package]] -name = "web-time" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb" -dependencies = [ - "js-sys", - "wasm-bindgen", -] - [[package]] name = "webpki-roots" version = "0.25.4" diff --git a/linera-base/Cargo.toml b/linera-base/Cargo.toml index 00bb6bb9e5e..957ab27b707 100644 --- a/linera-base/Cargo.toml +++ b/linera-base/Cargo.toml @@ -18,7 +18,6 @@ workspace = true metrics = ["prometheus"] reqwest = ["dep:reqwest"] revm = [] -opentelemetry = ["opentelemetry-otlp"] test = ["test-strategy", "proptest"] web = [ "getrandom/js", @@ -49,7 +48,6 @@ ed25519-dalek.workspace = true futures.workspace = true getrandom = { workspace = true, optional = true } hex.workspace = true -is-terminal.workspace = true k256.workspace = true linera-kywasmtime = { workspace = true, optional = true } linera-witty = { workspace = true, features = ["macros"] } @@ -67,7 +65,6 @@ thiserror.workspace = true tokio = { workspace = true, features = ["time"] } tokio-stream.workspace = true tracing.workspace = true -tracing-subscriber = { workspace = true, features = ["json", "fmt", "ansi"] } trait-variant.workspace = true wasm-bindgen = { workspace = true, optional = true } wasm-bindgen-futures = { workspace = true, optional = true } @@ -81,11 +78,6 @@ tracing-web = { optional = true, workspace = true } [target.'cfg(not(target_arch = "wasm32"))'.dependencies] chrono.workspace = true -opentelemetry.workspace = true -opentelemetry-otlp = { workspace = true, optional = true } -opentelemetry_sdk = { workspace = true, features = ["testing"] } -tracing-chrome.workspace = true -tracing-opentelemetry.workspace = true rand = { workspace = true, features = ["getrandom", "std", "std_rng"] } tokio = { workspace = true, features = [ "process", diff --git a/linera-base/src/lib.rs b/linera-base/src/lib.rs index 39546ba23df..6e889eafada 100644 --- a/linera-base/src/lib.rs +++ b/linera-base/src/lib.rs @@ -38,10 +38,6 @@ pub mod vm; #[cfg(not(chain))] pub use task::Blocking; pub mod time; -#[cfg_attr(web, path = "tracing_web.rs")] -pub mod tracing; -#[cfg(not(target_arch = "wasm32"))] -pub mod tracing_opentelemetry; #[cfg(test)] mod unit_tests; diff --git a/linera-base/src/tracing_web.rs b/linera-base/src/tracing_web.rs deleted file mode 100644 index a0f5dc6729a..00000000000 --- a/linera-base/src/tracing_web.rs +++ /dev/null @@ -1,26 +0,0 @@ -// Copyright (c) Zefchain Labs, Inc. -// SPDX-License-Identifier: Apache-2.0 - -//! This module provides unified handling for tracing subscribers within Linera binaries. - -use tracing_subscriber::{ - prelude::__tracing_subscriber_SubscriberExt as _, util::SubscriberInitExt as _, -}; - -/// Initializes tracing for the browser, sending messages to the developer console and -/// span events to the [Performance -/// API](https://developer.mozilla.org/en-US/docs/Web/API/Performance). -pub fn init() { - tracing_subscriber::registry() - .with( - tracing_subscriber::fmt::layer() - .with_ansi(false) - .without_time() - .with_writer(tracing_web::MakeWebConsoleWriter::new()), - ) - .with( - tracing_web::performance_layer() - .with_details_from_fields(tracing_subscriber::fmt::format::Pretty::default()), - ) - .init(); -} diff --git a/linera-sdk/tests/fixtures/Cargo.lock b/linera-sdk/tests/fixtures/Cargo.lock index beba55492c7..21f8638a028 100644 --- a/linera-sdk/tests/fixtures/Cargo.lock +++ b/linera-sdk/tests/fixtures/Cargo.lock @@ -1682,12 +1682,6 @@ version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" -[[package]] -name = "hermit-abi" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c" - [[package]] name = "hex" version = "0.4.3" @@ -2033,17 +2027,6 @@ version = "2.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" -[[package]] -name = "is-terminal" -version = "0.4.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e04d7f318608d35d4b61ddd75cbdaee86b023ebe2bd5a66ee0915f0bf93095a9" -dependencies = [ - "hermit-abi", - "libc", - "windows-sys 0.59.0", -] - [[package]] name = "is_terminal_polyfill" version = "1.70.1" @@ -2149,11 +2132,8 @@ dependencies = [ "ed25519-dalek", "futures", "hex", - "is-terminal", "k256", "linera-witty", - "opentelemetry", - "opentelemetry_sdk", "port-selector", "prometheus", "proptest", @@ -2171,9 +2151,6 @@ dependencies = [ "tokio-stream", "tokio-util", "tracing", - "tracing-chrome", - "tracing-opentelemetry", - "tracing-subscriber", "trait-variant", "zstd", ] @@ -2780,16 +2757,6 @@ dependencies = [ "winapi", ] -[[package]] -name = "nu-ansi-term" -version = "0.46.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" -dependencies = [ - "overload", - "winapi", -] - [[package]] name = "num-conv" version = "0.1.0" @@ -2833,44 +2800,6 @@ version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b4ce411919553d3f9fa53a0880544cda985a112117a0444d5ff1e870a893d6ea" -[[package]] -name = "opentelemetry" -version = "0.30.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aaf416e4cb72756655126f7dd7bb0af49c674f4c1b9903e80c009e0c37e552e6" -dependencies = [ - "futures-core", - "futures-sink", - "js-sys", - "pin-project-lite", - "thiserror 2.0.16", - "tracing", -] - -[[package]] -name = "opentelemetry_sdk" -version = "0.30.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11f644aa9e5e31d11896e024305d7e3c98a88884d9f8919dbf37a9991bc47a4b" -dependencies = [ - "futures-channel", - "futures-executor", - "futures-util", - "opentelemetry", - "percent-encoding", - "rand 0.9.2", - "serde_json", - "thiserror 2.0.16", - "tokio", - "tokio-stream", -] - -[[package]] -name = "overload" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" - [[package]] name = "papaya" version = "0.1.9" @@ -3283,7 +3212,6 @@ version = "0.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" dependencies = [ - "rand_chacha 0.9.0", "rand_core 0.9.3", "serde", ] @@ -4550,17 +4478,6 @@ dependencies = [ "syn 2.0.106", ] -[[package]] -name = "tracing-chrome" -version = "0.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf0a738ed5d6450a9fb96e86a23ad808de2b727fd1394585da5cdd6788ffe724" -dependencies = [ - "serde_json", - "tracing-core", - "tracing-subscriber", -] - [[package]] name = "tracing-core" version = "0.1.34" @@ -4568,46 +4485,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b9d12581f227e93f094d3af2ae690a574abb8a2b9b7a96e7cfe9647b2b617678" dependencies = [ "once_cell", - "valuable", -] - -[[package]] -name = "tracing-log" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" -dependencies = [ - "log", - "once_cell", - "tracing-core", -] - -[[package]] -name = "tracing-opentelemetry" -version = "0.31.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ddcf5959f39507d0d04d6413119c04f33b623f4f951ebcbdddddfad2d0623a9c" -dependencies = [ - "js-sys", - "once_cell", - "opentelemetry", - "opentelemetry_sdk", - "smallvec", - "tracing", - "tracing-core", - "tracing-log", - "tracing-subscriber", - "web-time", -] - -[[package]] -name = "tracing-serde" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "704b1aeb7be0d0a84fc9828cae51dab5970fee5088f83d1dd7ee6f6246fc6ff1" -dependencies = [ - "serde", - "tracing-core", ] [[package]] @@ -4617,18 +4494,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e8189decb5ac0fa7bc8b96b7cb9b2701d60d48805aca84a238004d665fcc4008" dependencies = [ "matchers", - "nu-ansi-term", "once_cell", "regex", - "serde", - "serde_json", "sharded-slab", - "smallvec", "thread_local", "tracing", "tracing-core", - "tracing-log", - "tracing-serde", ] [[package]] @@ -4962,16 +4833,6 @@ dependencies = [ "wasm-bindgen", ] -[[package]] -name = "web-time" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb" -dependencies = [ - "js-sys", - "wasm-bindgen", -] - [[package]] name = "webpki-roots" version = "0.25.4" diff --git a/linera-service/Cargo.toml b/linera-service/Cargo.toml index a0fa0c397e5..4e016bf0102 100644 --- a/linera-service/Cargo.toml +++ b/linera-service/Cargo.toml @@ -90,6 +90,7 @@ futures.workspace = true heck.workspace = true http.workspace = true insta.workspace = true +is-terminal.workspace = true k8s-openapi = { workspace = true, optional = true } kube = { workspace = true, optional = true } linera-base.workspace = true @@ -112,6 +113,9 @@ linera-storage-service = { workspace = true, optional = true } linera-version.workspace = true linera-views.workspace = true mini-moka.workspace = true +opentelemetry.workspace = true +opentelemetry-otlp.workspace = true +opentelemetry_sdk = { workspace = true, features = ["testing"] } papaya.workspace = true pathdiff = { workspace = true, optional = true } port-selector.workspace = true @@ -147,6 +151,9 @@ tonic-web.workspace = true tower.workspace = true tower-http = { workspace = true, features = ["cors"] } tracing.workspace = true +tracing-chrome.workspace = true +tracing-opentelemetry.workspace = true +tracing-subscriber = { workspace = true, features = ["json", "fmt", "ansi"] } [build-dependencies] cfg_aliases.workspace = true diff --git a/linera-service/src/benchmark.rs b/linera-service/src/benchmark.rs index 6684a363d87..f984d52db1c 100644 --- a/linera-service/src/benchmark.rs +++ b/linera-service/src/benchmark.rs @@ -55,7 +55,7 @@ enum Args { #[tokio::main] async fn main() -> Result<()> { - linera_base::tracing::init("benchmark"); + linera_service::tracing::init("benchmark"); let args = Args::parse(); match args { diff --git a/linera-service/src/cli/main.rs b/linera-service/src/cli/main.rs index 534ac12b946..a48f8341a4e 100644 --- a/linera-service/src/cli/main.rs +++ b/linera-service/src/cli/main.rs @@ -2137,9 +2137,9 @@ async fn kill_all_processes(pids: &[u32]) { #[cfg(not(target_arch = "wasm32"))] fn init_tracing( options: &ClientOptions, -) -> anyhow::Result> { +) -> anyhow::Result> { if matches!(&options.command, ClientCommand::Faucet { .. }) { - linera_base::tracing::init_with_opentelemetry( + linera_service::tracing::opentelemetry::init( &options.command.log_file_name(), options.context_options.otlp_exporter_endpoint.as_deref(), ); @@ -2154,12 +2154,12 @@ fn init_tracing( |s| s.to_string(), ); let writer = std::fs::File::create(&trace_file_path)?; - Ok(Some(linera_base::tracing::init_with_chrome_trace_exporter( + Ok(Some(linera_service::tracing::chrome::init( &options.command.log_file_name(), writer, ))) } else { - linera_base::tracing::init(&options.command.log_file_name()); + linera_service::tracing::init(&options.command.log_file_name()); Ok(None) } } diff --git a/linera-service/src/exporter/main.rs b/linera-service/src/exporter/main.rs index e0ff4006d96..ef373e2fd24 100644 --- a/linera-service/src/exporter/main.rs +++ b/linera-service/src/exporter/main.rs @@ -133,7 +133,7 @@ impl ExporterContext { } fn main() -> Result<()> { - linera_base::tracing::init("linera-exporter"); + linera_service::tracing::init("linera-exporter"); let options = ::parse(); options.run() } diff --git a/linera-service/src/lib.rs b/linera-service/src/lib.rs index 7997da7679f..6b8481eb505 100644 --- a/linera-service/src/lib.rs +++ b/linera-service/src/lib.rs @@ -10,5 +10,6 @@ pub mod config; pub mod node_service; pub mod project; pub mod storage; +pub mod tracing; pub mod util; pub mod wallet; diff --git a/linera-service/src/proxy/main.rs b/linera-service/src/proxy/main.rs index 1e136775923..24e7059ab28 100644 --- a/linera-service/src/proxy/main.rs +++ b/linera-service/src/proxy/main.rs @@ -498,7 +498,7 @@ impl ProxyOptions { let server_config: ValidatorServerConfig = util::read_json(&self.config_path).expect("Fail to read server config"); let public_key = &server_config.validator.public_key; - linera_base::tracing::init_with_opentelemetry( + linera_service::tracing::opentelemetry::init( &format!("validator-{public_key}-proxy"), self.otlp_exporter_endpoint.as_deref(), ); diff --git a/linera-service/src/server.rs b/linera-service/src/server.rs index 871a79336d0..a872b70b524 100644 --- a/linera-service/src/server.rs +++ b/linera-service/src/server.rs @@ -522,7 +522,7 @@ fn log_file_name_for(command: &ServerCommand) -> Cow<'static, str> { } async fn run(options: ServerOptions) { - linera_base::tracing::init_with_opentelemetry( + linera_service::tracing::opentelemetry::init( &log_file_name_for(&options.command), otlp_exporter_endpoint_for(&options.command), ); diff --git a/linera-service/src/tracing/chrome.rs b/linera-service/src/tracing/chrome.rs new file mode 100644 index 00000000000..ee87463b3c0 --- /dev/null +++ b/linera-service/src/tracing/chrome.rs @@ -0,0 +1,52 @@ +// Copyright (c) Zefchain Labs, Inc. +// SPDX-License-Identifier: Apache-2.0 + +use tracing_subscriber::{layer::SubscriberExt as _, util::SubscriberInitExt as _}; + +/// Guard that flushes Chrome trace file when dropped. +/// +/// Store this guard in a variable that lives for the duration of your program. +/// When it's dropped, the trace file will be completed and closed. +pub type ChromeTraceGuard = tracing_chrome::FlushGuard; + +/// Builds a Chrome trace layer and guard. +/// +/// Returns a subscriber and guard. The subscriber should be used with `with_default` +/// to avoid global state conflicts. +pub fn build( + log_name: &str, + writer: impl std::io::Write + Send + 'static, +) -> (impl tracing::Subscriber + Send + Sync, ChromeTraceGuard) { + let (chrome_layer, guard) = tracing_chrome::ChromeLayerBuilder::new() + .writer(writer) + .build(); + + let config = crate::tracing::get_env_config(log_name); + let maybe_log_file_layer = config.maybe_log_file_layer(); + let stderr_layer = config.stderr_layer(); + + let subscriber = tracing_subscriber::registry() + .with(chrome_layer) + .with(config.env_filter) + .with(maybe_log_file_layer) + .with(stderr_layer); + + (subscriber, guard) +} + +/// Initializes tracing with Chrome Trace JSON exporter. +/// +/// Returns a guard that must be kept alive for the duration of the program. +/// When the guard is dropped, the trace data is flushed and completed. +/// +/// Exports traces to Chrome Trace JSON format which can be visualized in: +/// - Chrome: `chrome://tracing` +/// - Perfetto UI: +/// +/// Note: Uses `try_init()` to avoid panicking if a global subscriber is already set. +/// In that case, tracing may not work as expected. +pub fn init(log_name: &str, writer: impl std::io::Write + Send + 'static) -> ChromeTraceGuard { + let (subscriber, guard) = build(log_name, writer); + let _ = subscriber.try_init(); + guard +} diff --git a/linera-base/src/tracing.rs b/linera-service/src/tracing/mod.rs similarity index 97% rename from linera-base/src/tracing.rs rename to linera-service/src/tracing/mod.rs index 5d965f9fb64..bba0ba1f204 100644 --- a/linera-base/src/tracing.rs +++ b/linera-service/src/tracing/mod.rs @@ -3,6 +3,9 @@ //! This module provides unified handling for tracing subscribers within Linera binaries. +pub mod chrome; +pub mod opentelemetry; + use std::{ env, fs::{File, OpenOptions}, @@ -25,11 +28,6 @@ use tracing_subscriber::{ EnvFilter, }; -#[cfg(not(target_arch = "wasm32"))] -pub use crate::tracing_opentelemetry::{ - init_with_chrome_trace_exporter, init_with_opentelemetry, ChromeTraceGuard, -}; - pub(crate) struct EnvConfig { pub(crate) env_filter: EnvFilter, span_events: FmtSpan, diff --git a/linera-base/src/tracing_opentelemetry.rs b/linera-service/src/tracing/opentelemetry.rs similarity index 61% rename from linera-base/src/tracing_opentelemetry.rs rename to linera-service/src/tracing/opentelemetry.rs index 848723ac552..c6cb4090d98 100644 --- a/linera-base/src/tracing_opentelemetry.rs +++ b/linera-service/src/tracing/opentelemetry.rs @@ -3,21 +3,17 @@ //! OpenTelemetry integration for tracing with OTLP export and Chrome trace export. -use tracing_chrome::ChromeLayerBuilder; -use tracing_subscriber::{layer::SubscriberExt as _, util::SubscriberInitExt as _}; -#[cfg(feature = "opentelemetry")] -use { - opentelemetry::{global, trace::TracerProvider}, - opentelemetry_otlp::{SpanExporter, WithExportConfig}, - opentelemetry_sdk::{ - trace::{InMemorySpanExporter, SdkTracerProvider}, - Resource, - }, - tracing_opentelemetry::OpenTelemetryLayer, - tracing_subscriber::{ - filter::{filter_fn, FilterFn}, - layer::Layer, - }, +use opentelemetry::{global, trace::TracerProvider}; +use opentelemetry_otlp::{SpanExporter, WithExportConfig}; +#[cfg(with_testing)] +use opentelemetry_sdk::trace::InMemorySpanExporter; +use opentelemetry_sdk::{trace::SdkTracerProvider, Resource}; +use tracing_opentelemetry::OpenTelemetryLayer; +use tracing_subscriber::{ + filter::{filter_fn, FilterFn}, + layer::Layer, + prelude::__tracing_subscriber_SubscriberExt as _, + util::SubscriberInitExt, }; /// Creates a filter that excludes spans with the `opentelemetry.skip` field. @@ -39,7 +35,6 @@ use { /// // created with knowledge that it might be skipped /// } /// ``` -#[cfg(feature = "opentelemetry")] fn opentelemetry_skip_filter() -> FilterFn) -> bool> { filter_fn(|metadata| { if !metadata.is_span() { @@ -52,7 +47,6 @@ fn opentelemetry_skip_filter() -> FilterFn) -> bo /// Initializes tracing with a custom OpenTelemetry tracer provider. /// /// This is an internal function used by both production and test code. -#[cfg(feature = "opentelemetry")] fn init_with_tracer_provider(log_name: &str, tracer_provider: SdkTracerProvider) { global::set_tracer_provider(tracer_provider.clone()); let tracer = tracer_provider.tracer("linera"); @@ -76,7 +70,7 @@ fn init_with_tracer_provider(log_name: &str, tracer_provider: SdkTracerProvider) /// /// This is used for testing to avoid setting the global subscriber. /// Returns the layer, exporter, and tracer provider (which must be kept alive and shutdown). -#[cfg(all(with_testing, feature = "opentelemetry"))] +#[cfg(with_testing)] pub fn build_opentelemetry_layer_with_test_exporter( log_name: &str, ) -> ( @@ -111,8 +105,7 @@ pub fn build_opentelemetry_layer_with_test_exporter( /// Requires the `opentelemetry` feature. /// Only enables OpenTelemetry if LINERA_OTLP_EXPORTER_ENDPOINT env var is set. /// This prevents DNS errors in environments where OpenTelemetry is not deployed. -#[cfg(feature = "opentelemetry")] -pub fn init_with_opentelemetry(log_name: &str, otlp_endpoint: Option<&str>) { +pub fn init(log_name: &str, otlp_endpoint: Option<&str>) { // Check if OpenTelemetry endpoint is configured via parameter or env var let endpoint = match otlp_endpoint { Some(ep) if !ep.is_empty() => ep.to_string(), @@ -147,64 +140,3 @@ pub fn init_with_opentelemetry(log_name: &str, otlp_endpoint: Option<&str>) { init_with_tracer_provider(log_name, tracer_provider); } - -/// Fallback when opentelemetry feature is not enabled. -#[cfg(not(feature = "opentelemetry"))] -pub fn init_with_opentelemetry(log_name: &str, _otlp_endpoint: Option<&str>) { - eprintln!( - "OTLP export requires the 'opentelemetry' feature to be enabled! Falling back to default tracing initialization." - ); - crate::tracing::init(log_name); -} - -/// Guard that flushes Chrome trace file when dropped. -/// -/// Store this guard in a variable that lives for the duration of your program. -/// When it's dropped, the trace file will be completed and closed. -pub type ChromeTraceGuard = tracing_chrome::FlushGuard; - -/// Builds a Chrome trace layer and guard. -/// -/// Returns a subscriber and guard. The subscriber should be used with `with_default` -/// to avoid global state conflicts. -pub fn build_chrome_trace_layer_with_exporter( - log_name: &str, - writer: W, -) -> (impl tracing::Subscriber + Send + Sync, ChromeTraceGuard) -where - W: std::io::Write + Send + 'static, -{ - let (chrome_layer, guard) = ChromeLayerBuilder::new().writer(writer).build(); - - let config = crate::tracing::get_env_config(log_name); - let maybe_log_file_layer = config.maybe_log_file_layer(); - let stderr_layer = config.stderr_layer(); - - let subscriber = tracing_subscriber::registry() - .with(chrome_layer) - .with(config.env_filter) - .with(maybe_log_file_layer) - .with(stderr_layer); - - (subscriber, guard) -} - -/// Initializes tracing with Chrome Trace JSON exporter. -/// -/// Returns a guard that must be kept alive for the duration of the program. -/// When the guard is dropped, the trace data is flushed and completed. -/// -/// Exports traces to Chrome Trace JSON format which can be visualized in: -/// - Chrome: `chrome://tracing` -/// - Perfetto UI: -/// -/// Note: Uses `try_init()` to avoid panicking if a global subscriber is already set. -/// In that case, tracing may not work as expected. -pub fn init_with_chrome_trace_exporter(log_name: &str, writer: W) -> ChromeTraceGuard -where - W: std::io::Write + Send + 'static, -{ - let (subscriber, guard) = build_chrome_trace_layer_with_exporter(log_name, writer); - let _ = subscriber.try_init(); - guard -} diff --git a/linera-base/tests/opentelemetry_tests.rs b/linera-service/tests/opentelemetry.rs similarity index 85% rename from linera-base/tests/opentelemetry_tests.rs rename to linera-service/tests/opentelemetry.rs index 9ba88623c66..11b47767b7d 100644 --- a/linera-base/tests/opentelemetry_tests.rs +++ b/linera-service/tests/opentelemetry.rs @@ -1,29 +1,23 @@ // Copyright (c) Zefchain Labs, Inc. // SPDX-License-Identifier: Apache-2.0 -#[cfg(feature = "opentelemetry")] -use { - tracing::{info_span, instrument}, - tracing_subscriber::{layer::SubscriberExt as _, registry::Registry}, -}; +use tracing::{info_span, instrument}; +use tracing_subscriber::{layer::SubscriberExt as _, registry::Registry}; -#[cfg(feature = "opentelemetry")] #[instrument] fn span_with_export() { tracing::info!("This span should be exported"); } -#[cfg(feature = "opentelemetry")] #[instrument(skip_all, fields(opentelemetry.skip = true))] fn span_without_export() { tracing::info!("This span should NOT be exported"); } -#[cfg(feature = "opentelemetry")] #[test] fn test_opentelemetry_filters_skip() { let (opentelemetry_layer, exporter, tracer_provider) = - linera_base::tracing_opentelemetry::build_opentelemetry_layer_with_test_exporter( + linera_service::tracing::opentelemetry::build_opentelemetry_layer_with_test_exporter( "test_opentelemetry", ); diff --git a/linera-summary/Cargo.toml b/linera-summary/Cargo.toml index e5e5aab7316..3da717c66dc 100644 --- a/linera-summary/Cargo.toml +++ b/linera-summary/Cargo.toml @@ -19,12 +19,12 @@ anyhow.workspace = true clap.workspace = true git2.workspace = true humantime.workspace = true -linera-base.workspace = true linera-version.workspace = true octocrab.workspace = true serde.workspace = true tokio.workspace = true tracing.workspace = true +tracing-subscriber.workspace = true [[bin]] name = "linera-summary" diff --git a/linera-summary/src/main.rs b/linera-summary/src/main.rs index 319a54386ae..4def44ba1f2 100644 --- a/linera-summary/src/main.rs +++ b/linera-summary/src/main.rs @@ -8,6 +8,9 @@ use linera_summary::{ github::Github, performance_summary::PerformanceSummary, summary_options::SummaryOptions, }; use tracing::{error, Instrument}; +use tracing_subscriber::{ + prelude::__tracing_subscriber_SubscriberExt as _, util::SubscriberInitExt as _, +}; async fn run(options: SummaryOptions) -> Result<()> { let tracked_workflows = options.workflows(); @@ -20,7 +23,10 @@ async fn run(options: SummaryOptions) -> Result<()> { fn main() -> anyhow::Result<()> { let options = SummaryOptions::init(); - linera_base::tracing::init("summary"); + tracing_subscriber::registry() + .with(tracing_subscriber::fmt::layer()) + .with(tracing_subscriber::EnvFilter::from_default_env()) + .init(); let mut runtime = tokio::runtime::Builder::new_multi_thread(); diff --git a/web/@linera/client/Cargo.toml b/web/@linera/client/Cargo.toml index 5bf0b29b664..0712a062eea 100644 --- a/web/@linera/client/Cargo.toml +++ b/web/@linera/client/Cargo.toml @@ -24,9 +24,14 @@ serde.workspace = true serde-wasm-bindgen.workspace = true tokio-util.workspace = true tracing.workspace = true +tracing-web.workspace = true wasm-bindgen.workspace = true wasm-bindgen-futures.workspace = true +[dependencies.tracing-subscriber] +features = ["ansi", "fmt", "std"] +workspace = true + [dependencies.linera-base] features = ["web"] workspace = true diff --git a/web/@linera/client/src/lib.rs b/web/@linera/client/src/lib.rs index 77ad42d826e..159b23c708d 100644 --- a/web/@linera/client/src/lib.rs +++ b/web/@linera/client/src/lib.rs @@ -504,6 +504,22 @@ impl Application { #[wasm_bindgen(start)] pub fn main() { + use tracing_subscriber::{ + prelude::__tracing_subscriber_SubscriberExt as _, util::SubscriberInitExt as _, + }; + std::panic::set_hook(Box::new(console_error_panic_hook::hook)); - linera_base::tracing::init(); + + tracing_subscriber::registry() + .with( + tracing_subscriber::fmt::layer() + .with_ansi(false) + .without_time() + .with_writer(tracing_web::MakeWebConsoleWriter::new()), + ) + .with( + tracing_web::performance_layer() + .with_details_from_fields(tracing_subscriber::fmt::format::Pretty::default()), + ) + .init(); }