From 7e97e4551236514c4bcb6a27cc3216bb817a2ab8 Mon Sep 17 00:00:00 2001 From: Nick Date: Tue, 25 Apr 2023 12:17:41 +0300 Subject: [PATCH] feat(logging): structured logging and tracing (#1582) --- Cargo.lock | 275 +++++++++++++++++++++++++++++------- crates/log-utils/Cargo.toml | 3 +- crates/log-utils/src/lib.rs | 88 ++++++------ particle-node/Cargo.toml | 9 +- particle-node/src/layers.rs | 76 ++++++++++ particle-node/src/lib.rs | 4 + particle-node/src/main.rs | 65 ++++----- 7 files changed, 386 insertions(+), 134 deletions(-) create mode 100644 particle-node/src/layers.rs diff --git a/Cargo.lock b/Cargo.lock index 3c723b3375..c8797257f5 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -264,7 +264,7 @@ dependencies = [ "fluence-libp2p", "fs-utils", "futures", - "humantime 2.1.0", + "humantime", "key-manager", "libp2p", "log", @@ -491,17 +491,6 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "065374052e7df7ee4047b1160cca5e1467a12351a40b3da123c870ba0b8eda2a" -[[package]] -name = "atty" -version = "0.2.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" -dependencies = [ - "hermit-abi 0.1.19", - "libc", - "winapi", -] - [[package]] name = "autocfg" version = "1.1.0" @@ -793,7 +782,7 @@ dependencies = [ "fs-utils", "fstrings", "futures", - "humantime 2.1.0", + "humantime", "local-vm", "log", "maplit", @@ -1164,7 +1153,7 @@ dependencies = [ "crossbeam-utils", "futures", "hdrhistogram", - "humantime 2.1.0", + "humantime", "parking_lot 0.11.2", "prost-types", "serde", @@ -1630,6 +1619,19 @@ dependencies = [ "syn 1.0.105", ] +[[package]] +name = "dashmap" +version = "5.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "907076dfda823b0b36d2a1bb5f90c96660a5bbcd7729e10727f07858f22c4edc" +dependencies = [ + "cfg-if", + "hashbrown 0.12.3", + "lock_api", + "once_cell", + "parking_lot_core 0.9.4", +] + [[package]] name = "data-encoding" version = "2.3.2" @@ -1908,26 +1910,13 @@ dependencies = [ "syn 1.0.105", ] -[[package]] -name = "env_logger" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44533bbbb3bb3c1fa17d9f2e4e38bbbaf8396ba82193c4cb1b6445d711445d36" -dependencies = [ - "atty", - "humantime 1.3.0", - "log", - "regex", - "termcolor", -] - [[package]] name = "env_logger" version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "85cdab6a89accf66733ad5a1693a4dcced6aeff64602b634530dd73c1f3ee9f0" dependencies = [ - "humantime 2.1.0", + "humantime", "is-terminal", "log", "regex", @@ -2076,10 +2065,16 @@ version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "84f2e425d9790201ba4af4630191feac6dcc98765b118d4d18e91d23c2353866" dependencies = [ - "env_logger 0.10.0", + "env_logger", "log", ] +[[package]] +name = "fixedbitset" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" + [[package]] name = "flate2" version = "1.0.25" @@ -2519,15 +2514,6 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2540771e65fc8cb83cd6e8a237f70c319bd5c29f78ed1084ba5d50eeac86f7f9" -[[package]] -name = "hermit-abi" -version = "0.1.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" -dependencies = [ - "libc", -] - [[package]] name = "hermit-abi" version = "0.2.6" @@ -2659,15 +2645,6 @@ version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c4a1e36c821dbe04574f602848a19f742f4fb3c98d40449f11bcad18d6b17421" -[[package]] -name = "humantime" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df004cfca50ef23c36850aaaa59ad52cc70d0e90243c3c7737a4dd32dc7a3c4f" -dependencies = [ - "quick-error 1.2.3", -] - [[package]] name = "humantime" version = "2.1.0" @@ -2680,7 +2657,7 @@ version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "57a3db5ea5923d99402c94e9feb261dc5ee9b4efa158b0315f788cf549cc200c" dependencies = [ - "humantime 2.1.0", + "humantime", "serde", ] @@ -3648,8 +3625,9 @@ name = "log-utils" version = "0.1.0" dependencies = [ "console-subscriber", - "env_logger 0.10.0", "log", + "tracing", + "tracing-subscriber", ] [[package]] @@ -4262,6 +4240,16 @@ dependencies = [ name = "now-millis" version = "0.1.0" +[[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.3" @@ -4345,6 +4333,92 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" +[[package]] +name = "opentelemetry" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69d6c3d7288a106c0a363e4b0e8d308058d56902adefb16f4936f417ffef086e" +dependencies = [ + "opentelemetry_api", + "opentelemetry_sdk", +] + +[[package]] +name = "opentelemetry-otlp" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1c928609d087790fc936a1067bdc310ae702bdf3b090c3f281b713622c8bbde" +dependencies = [ + "async-trait", + "futures", + "futures-util", + "http", + "opentelemetry", + "opentelemetry-proto", + "prost", + "thiserror", + "tokio", + "tonic", +] + +[[package]] +name = "opentelemetry-proto" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d61a2f56df5574508dd86aaca016c917489e589ece4141df1b5e349af8d66c28" +dependencies = [ + "futures", + "futures-util", + "opentelemetry", + "prost", + "tonic", + "tonic-build", +] + +[[package]] +name = "opentelemetry_api" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c24f96e21e7acc813c7a8394ee94978929db2bcc46cf6b5014fc612bf7760c22" +dependencies = [ + "fnv", + "futures-channel", + "futures-util", + "indexmap", + "js-sys", + "once_cell", + "pin-project-lite 0.2.9", + "thiserror", +] + +[[package]] +name = "opentelemetry_sdk" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ca41c4933371b61c2a2f214bf16931499af4ec90543604ec828f7a625c09113" +dependencies = [ + "async-trait", + "crossbeam-channel", + "dashmap", + "fnv", + "futures-channel", + "futures-executor", + "futures-util", + "once_cell", + "opentelemetry_api", + "percent-encoding", + "rand 0.8.5", + "thiserror", + "tokio", + "tokio-stream", +] + +[[package]] +name = "overload" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" + [[package]] name = "p256" version = "0.11.1" @@ -4549,7 +4623,6 @@ dependencies = [ "connection-pool", "console-subscriber", "dhat", - "env_logger 0.10.0", "eyre", "fluence-keypair", "fluence-libp2p", @@ -4568,6 +4641,8 @@ dependencies = [ "log-utils", "maplit", "multihash 0.17.0", + "opentelemetry", + "opentelemetry-otlp", "parking_lot 0.12.1", "particle-builtins", "particle-execution", @@ -4583,7 +4658,11 @@ dependencies = [ "spell-event-bus", "tokio", "tokio-stream", + "tracing", "tracing-log", + "tracing-logfmt", + "tracing-opentelemetry", + "tracing-subscriber", ] [[package]] @@ -4764,6 +4843,16 @@ version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "478c572c3d73181ff3c2539045f6eb99e5491218eae919370993b890cdbdd98e" +[[package]] +name = "petgraph" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4dd7d28ee937e54fe3080c91faa1c3a46c06de6252988a7f4592ba2310ef22a4" +dependencies = [ + "fixedbitset", + "indexmap", +] + [[package]] name = "pin-project" version = "1.0.12" @@ -4889,6 +4978,16 @@ version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" +[[package]] +name = "prettyplease" +version = "0.1.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c8646e95016a7a6c4adea95bafa8a16baab64b583356217f2c85db4a39d9a86" +dependencies = [ + "proc-macro2", + "syn 1.0.105", +] + [[package]] name = "proc-macro-crate" version = "1.1.3" @@ -5005,6 +5104,28 @@ dependencies = [ "prost-derive", ] +[[package]] +name = "prost-build" +version = "0.11.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "276470f7f281b0ed53d2ae42dd52b4a8d08853a3c70e7fe95882acbb98a6ae94" +dependencies = [ + "bytes", + "heck 0.4.0", + "itertools", + "lazy_static", + "log", + "multimap", + "petgraph", + "prettyplease", + "prost", + "prost-types", + "regex", + "syn 1.0.105", + "tempfile", + "which", +] + [[package]] name = "prost-derive" version = "0.11.9" @@ -6423,6 +6544,19 @@ dependencies = [ "tracing-futures", ] +[[package]] +name = "tonic-build" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5bf5e9b9c0f7e0a7c027dcfaba7b2c60816c7049171f679d99ee2ff65d0de8c4" +dependencies = [ + "prettyplease", + "proc-macro2", + "prost-build", + "quote", + "syn 1.0.105", +] + [[package]] name = "tower" version = "0.4.13" @@ -6537,12 +6671,37 @@ version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "78ddad33d2d10b1ed7eb9d1f518a5674713876e97e5bb9b7345a7984fbb4f922" dependencies = [ - "env_logger 0.7.1", "lazy_static", "log", "tracing-core", ] +[[package]] +name = "tracing-logfmt" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5517717fb9744e201860d29fafc7786514e50316a87c30f3e15489f40e63ca00" +dependencies = [ + "time 0.3.17", + "tracing", + "tracing-core", + "tracing-subscriber", +] + +[[package]] +name = "tracing-opentelemetry" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21ebb87a95ea13271332df069020513ab70bdb5637ca42d6e492dc3bbbad48de" +dependencies = [ + "once_cell", + "opentelemetry", + "tracing", + "tracing-core", + "tracing-log", + "tracing-subscriber", +] + [[package]] name = "tracing-subscriber" version = "0.3.16" @@ -6550,13 +6709,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a6176eae26dd70d0c919749377897b54a9276bd7061339665dd68777926b5a70" dependencies = [ "matchers", + "nu-ansi-term", "once_cell", "parking_lot 0.12.1", "regex", "sharded-slab", + "smallvec", "thread_local", "tracing", "tracing-core", + "tracing-log", ] [[package]] @@ -7529,6 +7691,17 @@ dependencies = [ "cc", ] +[[package]] +name = "which" +version = "4.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2441c784c52b289a054b7201fc93253e288f094e2f4be9058343127c4226a269" +dependencies = [ + "either", + "libc", + "once_cell", +] + [[package]] name = "widestring" version = "0.5.1" diff --git a/crates/log-utils/Cargo.toml b/crates/log-utils/Cargo.toml index 05d2ccdbd2..0a2fc15181 100644 --- a/crates/log-utils/Cargo.toml +++ b/crates/log-utils/Cargo.toml @@ -6,5 +6,6 @@ edition = "2021" [dependencies] log = { workspace = true } -env_logger = "0.10.0" +tracing = { workspace = true, features = ["async-await", "log"] } +tracing-subscriber.workspace = true console-subscriber = { version = "0.1.8", features = ["parking_lot"] } diff --git a/crates/log-utils/src/lib.rs b/crates/log-utils/src/lib.rs index 98cbfb6906..60984418f7 100644 --- a/crates/log-utils/src/lib.rs +++ b/crates/log-utils/src/lib.rs @@ -14,55 +14,55 @@ * limitations under the License. */ +use tracing_subscriber::filter::LevelFilter; + #[allow(dead_code)] // Enables logging, filtering out unnecessary details pub fn enable_logs() { - use log::LevelFilter::*; - std::env::set_var("WASM_LOG", "info"); - env_logger::Builder::from_default_env() - .format_timestamp_millis() - .filter_level(log::LevelFilter::Info) - .filter(Some("builtins_deployer"), Trace) - .filter(Some("script_storage"), Trace) - .filter(Some("run-console"), Trace) - .filter(Some("script_storage"), Trace) - .filter(Some("sorcerer"), Trace) - .filter(Some("key_manager"), Trace) - .filter(Some("spell_event_bus"), Trace) - .filter(Some("aquamarine"), Trace) - .filter(Some("network"), Trace) - .filter(Some("network_api"), Trace) - .filter(Some("aquamarine::actor"), Debug) - .filter(Some("particle_node::bootstrapper"), Info) - .filter(Some("yamux::connection::stream"), Info) - .filter(Some("tokio_threadpool"), Info) - .filter(Some("tokio_reactor"), Info) - .filter(Some("mio"), Info) - .filter(Some("tokio_io"), Info) - .filter(Some("soketto"), Info) - .filter(Some("yamux"), Info) - .filter(Some("multistream_select"), Info) - .filter(Some("libp2p_swarm"), Info) - .filter(Some("libp2p_secio"), Info) - .filter(Some("libp2p_websocket::framed"), Info) - .filter(Some("libp2p_ping"), Info) - .filter(Some("libp2p_core::upgrade::apply"), Info) - .filter(Some("libp2p_kad::kbucket"), Info) - .filter(Some("libp2p_kad"), Info) - .filter(Some("libp2p_kad::query"), Info) - .filter(Some("libp2p_kad::iterlog"), Info) - .filter(Some("libp2p_plaintext"), Info) - .filter(Some("libp2p_identify::protocol"), Info) - .filter(Some("cranelift_codegen"), Info) - .filter(Some("wasmer_wasi"), Info) - .filter(Some("wasmer_interface_types_fl"), Info) - .filter(Some("async_std"), Info) - .filter(Some("async_io"), Info) - .filter(Some("polling"), Info) - .filter(Some("cranelift_codegen"), Info) - .filter(Some("walrus"), Info) + tracing_subscriber::fmt() + .with_env_filter( + tracing_subscriber::EnvFilter::builder() + .with_default_directive(LevelFilter::INFO.into()) + .from_env_lossy() + .add_directive("builtins_deployer=trace".parse().unwrap()) + .add_directive("script_storage=trace".parse().unwrap()) + .add_directive("run-console=trace".parse().unwrap()) + .add_directive("sorcerer=trace".parse().unwrap()) + .add_directive("key_manager=trace".parse().unwrap()) + .add_directive("spell_event_bus=trace".parse().unwrap()) + .add_directive("aquamarine=trace".parse().unwrap()) + .add_directive("network=trace".parse().unwrap()) + .add_directive("network_api=trace".parse().unwrap()) + .add_directive("aquamarine::actor=debug".parse().unwrap()) + .add_directive("particle_node::bootstrapper=info".parse().unwrap()) + .add_directive("yamux::connection::stream=info".parse().unwrap()) + .add_directive("tokio_threadpool=info".parse().unwrap()) + .add_directive("tokio_reactor=info".parse().unwrap()) + .add_directive("mio=info".parse().unwrap()) + .add_directive("tokio_io=info".parse().unwrap()) + .add_directive("soketto=info".parse().unwrap()) + .add_directive("yamix=info".parse().unwrap()) + .add_directive("multistream_select=info".parse().unwrap()) + .add_directive("libp2p_swarm=info".parse().unwrap()) + .add_directive("libp2p_secio=info".parse().unwrap()) + .add_directive("libp2p_websocket::framed=info".parse().unwrap()) + .add_directive("libp2p_ping=info".parse().unwrap()) + .add_directive("libp2p_core::upgrade::apply=info".parse().unwrap()) + .add_directive("libp2p_kad::kbucket=info".parse().unwrap()) + .add_directive("libp2p_kad=info".parse().unwrap()) + .add_directive("libp2p_kad::query=info".parse().unwrap()) + .add_directive("libp2p_kad::iterlog=info".parse().unwrap()) + .add_directive("libp2p_plaintext=info".parse().unwrap()) + .add_directive("libp2p_identify::protocol=info".parse().unwrap()) + .add_directive("cranelift_codegen=info".parse().unwrap()) + .add_directive("wasmer_wasi=info".parse().unwrap()) + .add_directive("wasmer_interface_types_fl=info".parse().unwrap()) + .add_directive("polling=info".parse().unwrap()) + .add_directive("cranelift_codegen=info".parse().unwrap()) + .add_directive("walrus=info".parse().unwrap()), + ) .try_init() .ok(); } diff --git a/particle-node/Cargo.toml b/particle-node/Cargo.toml index e2ad22fe26..0506937faf 100644 --- a/particle-node/Cargo.toml +++ b/particle-node/Cargo.toml @@ -50,13 +50,18 @@ parking_lot = { workspace = true } humantime-serde = { workspace = true } log = { workspace = true } -env_logger = "0.10.0" -tracing-log = { version = "0.1.3", features = ["env_logger"] } +tracing-log = { version = "0.1.3" } console-subscriber = { version = "0.1.8", features = ["parking_lot"] } hyper = "0.14.26" itertools = { workspace = true } eyre = { workspace = true } base64 = { workspace = true } +tracing = { workspace = true, features = ["async-await", "log"] } +tracing-subscriber.workspace = true +tracing-logfmt = "0.3.1" +tracing-opentelemetry = "0.18.0" +opentelemetry = { version = "0.18.0", features = ["rt-tokio-current-thread"] } +opentelemetry-otlp = "0.11.0" [dev-dependencies] parking_lot = { workspace = true } diff --git a/particle-node/src/layers.rs b/particle-node/src/layers.rs new file mode 100644 index 0000000000..496df653de --- /dev/null +++ b/particle-node/src/layers.rs @@ -0,0 +1,76 @@ +use console_subscriber::ConsoleLayer; +use opentelemetry::sdk::Resource; +use opentelemetry::KeyValue; +use opentelemetry_otlp::WithExportConfig; +use tracing::level_filters::LevelFilter; +use tracing::Subscriber; +use tracing_subscriber::registry::LookupSpan; +use tracing_subscriber::Layer; + +const TOKIO_CONSOLE_VAR: &str = "FLUENCE_TOKIO_CONSOLE_ENABLED"; +const TRACING_TRACER_VAR: &str = "FLUENCE_TRACING_TRACER"; + +pub fn log_layer() -> impl Layer +where + S: Subscriber + for<'span> LookupSpan<'span>, +{ + let env_filter = tracing_subscriber::EnvFilter::builder() + .with_default_directive(LevelFilter::INFO.into()) + .from_env_lossy() + .add_directive("cranelift_codegen=off".parse().unwrap()) + .add_directive("walrus=off".parse().unwrap()) + .add_directive("polling=off".parse().unwrap()) + .add_directive("wasmer_wasi_fl=error".parse().unwrap()) + .add_directive("wasmer_interface_types_fl=error".parse().unwrap()) + .add_directive("wasmer_wasi=error".parse().unwrap()) + .add_directive("tokio_threadpool=error".parse().unwrap()) + .add_directive("tokio_reactor=error".parse().unwrap()) + .add_directive("mio=error".parse().unwrap()) + .add_directive("tokio_io=error".parse().unwrap()) + .add_directive("soketto=error".parse().unwrap()) + .add_directive("cranelift_codegen=error".parse().unwrap()) + .add_directive("tracing=error".parse().unwrap()) + .add_directive("avm_server::runner=error".parse().unwrap()); + + tracing_logfmt::layer().with_filter(env_filter) +} + +pub fn tokio_console_layer() -> Option> +where + S: Subscriber + for<'a> LookupSpan<'a>, +{ + std::env::var(TOKIO_CONSOLE_VAR) + .map(|_| ConsoleLayer::builder().with_default_env().spawn()) + .ok() +} + +pub fn tracing_layer() -> eyre::Result>> +where + S: Subscriber + for<'span> LookupSpan<'span>, +{ + let tracing_layer = match std::env::var(TRACING_TRACER_VAR) + .unwrap_or_default() + .trim() + .to_ascii_lowercase() + .as_str() + { + "otlp" => { + log::debug!("Setup the OTLP tracer"); + let resource = Resource::new(vec![KeyValue::new("service.name", "rust-peer")]); + + let tracer = opentelemetry_otlp::new_pipeline() + .tracing() + .with_exporter(opentelemetry_otlp::new_exporter().tonic().with_env()) + .with_trace_config(opentelemetry::sdk::trace::config().with_resource(resource)) + .install_batch(opentelemetry::runtime::TokioCurrentThread)?; + + let tracing_layer = tracing_opentelemetry::layer::().with_tracer(tracer); + Some(tracing_layer) + } + _ => { + log::debug!("No tracer selected"); + None + } + }; + Ok(tracing_layer) +} diff --git a/particle-node/src/lib.rs b/particle-node/src/lib.rs index 1070bab0a3..2dc0a70b1d 100644 --- a/particle-node/src/lib.rs +++ b/particle-node/src/lib.rs @@ -33,6 +33,7 @@ mod builtins; mod connectivity; mod dispatcher; mod effectors; +mod layers; mod metrics; mod node; mod tasks; @@ -51,3 +52,6 @@ pub use node::Node; pub use connection_pool::Command as ConnectionPoolCommand; pub use connectivity::Connectivity; pub use kademlia::Command as KademliaCommand; +pub use layers::log_layer; +pub use layers::tokio_console_layer; +pub use layers::tracing_layer; diff --git a/particle-node/src/main.rs b/particle-node/src/main.rs index c17df4add7..44d6fddf6b 100644 --- a/particle-node/src/main.rs +++ b/particle-node/src/main.rs @@ -27,17 +27,18 @@ )] use base64::{engine::general_purpose::STANDARD as base64, Engine}; -use env_logger::Env; + use eyre::WrapErr; -use log::LevelFilter; use tokio::signal; use tokio::sync::oneshot; +use tracing_subscriber::layer::SubscriberExt; +use tracing_subscriber::util::SubscriberInitExt; use air_interpreter_fs::write_default_air_interpreter; use aquamarine::{VmConfig, AVM}; use config_utils::to_peer_id; use fs_utils::to_abs_path; -use particle_node::Node; +use particle_node::{log_layer, tokio_console_layer, tracing_layer, Node}; use server_config::{load_config, ConfigData, ResolvedConfig}; const VERSION: &str = env!("CARGO_PKG_VERSION"); @@ -53,34 +54,15 @@ trait Stoppable { #[global_allocator] static ALLOC: dhat::Alloc = dhat::Alloc; -#[tokio::main] +#[tokio::main(flavor = "current_thread")] async fn main() -> eyre::Result<()> { #[cfg(feature = "dhat-heap")] let _profiler = dhat::Profiler::new_heap(); - if std::env::var("TOKIO_CONSOLE_ENABLED").is_ok() { - console_subscriber::init(); - } - - env_logger::Builder::from_env(Env::default().default_filter_or("INFO")) - .format_timestamp_micros() - // Disable most spamming modules - .filter_module("cranelift_codegen", LevelFilter::Off) - .filter_module("walrus", LevelFilter::Off) - .filter_module("polling", LevelFilter::Off) - .filter_module("wasmer_wasi_fl", LevelFilter::Error) - .filter_module("wasmer_interface_types_fl", LevelFilter::Error) - .filter_module("wasmer_wasi", LevelFilter::Error) - .filter_module("tide", LevelFilter::Error) - .filter_module("tokio_threadpool", LevelFilter::Error) - .filter_module("tokio_reactor", LevelFilter::Error) - .filter_module("mio", LevelFilter::Error) - .filter_module("tokio_io", LevelFilter::Error) - .filter_module("soketto", LevelFilter::Error) - .filter_module("cranelift_codegen", LevelFilter::Error) - .filter_module("async_io", LevelFilter::Error) - .filter_module("tracing", LevelFilter::Error) - .filter_module("avm_server::runner", LevelFilter::Error) + tracing_subscriber::registry() + .with(log_layer()) + .with(tokio_console_layer()) + .with(tracing_layer()?) .init(); log::info!( @@ -110,15 +92,26 @@ async fn main() -> eyre::Result<()> { write_default_air_interpreter(&interpreter_path)?; log::info!("AIR interpreter: {:?}", interpreter_path); - let fluence = start_fluence(config).await?; - log::info!("Fluence has been successfully started."); - - log::info!("Waiting for Ctrl-C to exit..."); - - signal::ctrl_c().await.expect("Failed to listen for event"); - - log::info!("Shutting down..."); - fluence.stop(); + //TODO: add thread count configuration based on config + tokio::task::spawn_blocking(|| { + let result: eyre::Result<()> = tokio::runtime::Builder::new_multi_thread() + .enable_all() + .build() + .expect("Could not make tokio runtime") + .block_on(async { + let fluence = start_fluence(config).await?; + log::info!("Fluence has been successfully started."); + log::info!("Waiting for Ctrl-C to exit..."); + + signal::ctrl_c().await.expect("Failed to listen for event"); + log::info!("Shutting down..."); + + fluence.stop(); + Ok(()) + }); + result + }) + .await??; Ok(()) }