From bc5198768e7c4e40310b9fe23f8f77cb1754a05b Mon Sep 17 00:00:00 2001 From: Drazen Urch Date: Wed, 7 Jun 2023 17:32:26 +0200 Subject: [PATCH] Push traces to jaeger (#3522) * Push traces to jaeger * Remove default feature * Update toolchain --- Cargo.lock | 259 +++++++++++++++++++++++++-- common/bin-common/Cargo.toml | 16 +- common/bin-common/src/logging/mod.rs | 42 +++-- common/mixnode-common/src/lib.rs | 28 +-- mixnode/src/main.rs | 5 +- 5 files changed, 301 insertions(+), 49 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index a5de81f633..cb73f1c662 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -204,6 +204,17 @@ version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8da52d66c7071e2e3fa2a1e5c6d088fec47b593032b254f5e980de8ea54454d6" +[[package]] +name = "async-channel" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf46fee83e5ccffc220104713af3292ff9bc7c64c7de289f66dae8e38d826833" +dependencies = [ + "concurrent-queue", + "event-listener", + "futures-core", +] + [[package]] name = "async-file-watcher" version = "0.1.0" @@ -561,6 +572,12 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" +[[package]] +name = "castaway" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2698f953def977c68f935bb0dfa959375ad4638570e969e2f1e9f433cbf1af6" + [[package]] name = "cc" version = "1.0.79" @@ -810,6 +827,15 @@ dependencies = [ "unicode-width", ] +[[package]] +name = "concurrent-queue" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62ec6771ecfa0762d24683ee5a32ad78487a3d3afdc0fb8cae19d2c5deb50b7c" +dependencies = [ + "crossbeam-utils", +] + [[package]] name = "console-api" version = "0.5.0" @@ -1229,6 +1255,36 @@ dependencies = [ "rustc_version 0.2.3", ] +[[package]] +name = "curl" +version = "0.4.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "509bd11746c7ac09ebd19f0b17782eae80aadee26237658a6b4808afb5c11a22" +dependencies = [ + "curl-sys", + "libc", + "openssl-probe", + "openssl-sys", + "schannel", + "socket2", + "winapi", +] + +[[package]] +name = "curl-sys" +version = "0.4.63+curl-8.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aeb0fef7046022a1e2ad67a004978f0e3cacb9e3123dc62ce768f92197b771dc" +dependencies = [ + "cc", + "libc", + "libz-sys", + "openssl-sys", + "pkg-config", + "vcpkg", + "winapi", +] + [[package]] name = "curve25519-dalek" version = "3.2.0" @@ -1920,6 +1976,21 @@ version = "0.3.28" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4fff74096e71ed47f8e023204cfd0aa1289cd54ae5430a9523be060cdb849964" +[[package]] +name = "futures-lite" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49a9d51ce47660b1e808d3c990b4709f2f415d928835a17dfd16991515c46bce" +dependencies = [ + "fastrand", + "futures-core", + "futures-io", + "memchr", + "parking", + "pin-project-lite", + "waker-fn", +] + [[package]] name = "futures-macro" version = "0.3.28" @@ -2623,6 +2694,12 @@ dependencies = [ "web-sys", ] +[[package]] +name = "integer-encoding" +version = "3.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8bb03732005da905c88227371639bf1ad885cc712789c011c31c5fb3ab3ccf02" + [[package]] name = "inventory" version = "0.1.11" @@ -2692,6 +2769,31 @@ dependencies = [ "windows-sys 0.48.0", ] +[[package]] +name = "isahc" +version = "1.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "334e04b4d781f436dc315cb1e7515bd96826426345d498149e4bde36b67f8ee9" +dependencies = [ + "async-channel", + "castaway", + "crossbeam-utils", + "curl", + "curl-sys", + "event-listener", + "futures-lite", + "http", + "log", + "once_cell", + "polling", + "slab", + "sluice", + "tracing", + "tracing-futures", + "url", + "waker-fn", +] + [[package]] name = "isocountry" version = "0.3.2" @@ -3297,11 +3399,13 @@ dependencies = [ "clap_complete", "clap_complete_fig", "log", + "opentelemetry", + "opentelemetry-jaeger", "pretty_env_logger", "semver 0.11.0", "serde", "serde_json", - "tracing-appender", + "tracing-opentelemetry", "tracing-subscriber", "tracing-tree", "vergen", @@ -4633,12 +4737,55 @@ dependencies = [ "opentelemetry_sdk", ] +[[package]] +name = "opentelemetry-http" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a819b71d6530c4297b49b3cae2939ab3a8cc1b9f382826a1bc29dd0ca3864906" +dependencies = [ + "async-trait", + "bytes", + "http", + "isahc", + "opentelemetry_api", +] + +[[package]] +name = "opentelemetry-jaeger" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08e028dc9f4f304e9320ce38c80e7cf74067415b1ad5a8750a38bae54a4d450d" +dependencies = [ + "async-trait", + "futures", + "futures-executor", + "http", + "isahc", + "once_cell", + "opentelemetry", + "opentelemetry-http", + "opentelemetry-semantic-conventions", + "thiserror", + "thrift", + "tokio", +] + +[[package]] +name = "opentelemetry-semantic-conventions" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24e33428e6bf08c6f7fcea4ddb8e358fab0fe48ab877a87c70c6ebe20f673ce5" +dependencies = [ + "opentelemetry", +] + [[package]] name = "opentelemetry_api" version = "0.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed41783a5bf567688eb38372f2b7a8530f5a607a4b49d38dd7573236c23ca7e2" dependencies = [ + "fnv", "futures-channel", "futures-util", "indexmap", @@ -4656,6 +4803,8 @@ checksum = "8b3a2a91fdbfdd4d212c0dcc2ab540de2c2bcbbd90be17de7a7daf8822d010c1" dependencies = [ "async-trait", "crossbeam-channel", + "dashmap 5.4.0", + "fnv", "futures-channel", "futures-executor", "futures-util", @@ -4664,6 +4813,17 @@ dependencies = [ "percent-encoding", "rand 0.8.5", "thiserror", + "tokio", + "tokio-stream", +] + +[[package]] +name = "ordered-float" +version = "2.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7940cf2ca942593318d07fcf2596cdca60a85c9e7fab408a5e21a4f9dcd40d87" +dependencies = [ + "num-traits", ] [[package]] @@ -4696,6 +4856,12 @@ dependencies = [ "group 0.11.0", ] +[[package]] +name = "parking" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "14f2252c834a40ed9bb5422029649578e63aa341ac401f74e719dd1afda8394e" + [[package]] name = "parking_lot" version = "0.11.2" @@ -4958,6 +5124,22 @@ dependencies = [ "plotters-backend", ] +[[package]] +name = "polling" +version = "2.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b2d323e8ca7996b3e23126511a523f7e62924d93ecd5ae73b333815b0eb3dce" +dependencies = [ + "autocfg 1.1.0", + "bitflags", + "cfg-if", + "concurrent-queue", + "libc", + "log", + "pin-project-lite", + "windows-sys 0.48.0", +] + [[package]] name = "poly1305" version = "0.8.0" @@ -6180,6 +6362,17 @@ dependencies = [ "autocfg 1.1.0", ] +[[package]] +name = "sluice" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d7400c0eff44aa2fcb5e31a5f24ba9716ed90138769e4977a2ba6014ae63eb5" +dependencies = [ + "async-channel", + "futures-core", + "futures-io", +] + [[package]] name = "smallvec" version = "1.10.0" @@ -6767,6 +6960,28 @@ dependencies = [ "once_cell", ] +[[package]] +name = "threadpool" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d050e60b33d41c19108b32cea32164033a9013fe3b46cbd4457559bfbf77afaa" +dependencies = [ + "num_cpus", +] + +[[package]] +name = "thrift" +version = "0.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e54bc85fc7faa8bc175c4bab5b92ba8d9a3ce893d0e9f42cc455c8ab16a9e09" +dependencies = [ + "byteorder", + "integer-encoding", + "log", + "ordered-float", + "threadpool", +] + [[package]] name = "time" version = "0.1.45" @@ -7057,22 +7272,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8" dependencies = [ "cfg-if", + "log", "pin-project-lite", "tracing-attributes", "tracing-core", ] -[[package]] -name = "tracing-appender" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09d48f71a791638519505cefafe162606f706c25592e4bde4d97600c0195312e" -dependencies = [ - "crossbeam-channel", - "time 0.3.21", - "tracing-subscriber", -] - [[package]] name = "tracing-attributes" version = "0.1.24" @@ -7094,6 +7299,16 @@ dependencies = [ "valuable", ] +[[package]] +name = "tracing-futures" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97d095ae15e245a057c8e8451bab9b3ee1e1f68e9ba2b4fbc18d0ac5237835f2" +dependencies = [ + "pin-project", + "tracing", +] + [[package]] name = "tracing-log" version = "0.1.3" @@ -7105,6 +7320,20 @@ dependencies = [ "tracing-core", ] +[[package]] +name = "tracing-opentelemetry" +version = "0.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00a39dcf9bfc1742fa4d6215253b33a6e474be78275884c216fc2a06267b3600" +dependencies = [ + "once_cell", + "opentelemetry", + "tracing", + "tracing-core", + "tracing-log", + "tracing-subscriber", +] + [[package]] name = "tracing-subscriber" version = "0.3.17" @@ -7438,6 +7667,12 @@ version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" +[[package]] +name = "waker-fn" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d5b2c62b4012a3e1eca5a7e077d13b3bf498c4073e33ccd58626607748ceeca" + [[package]] name = "walkdir" version = "2.3.3" diff --git a/common/bin-common/Cargo.toml b/common/bin-common/Cargo.toml index 093524ae83..a08ae8c77f 100644 --- a/common/bin-common/Cargo.toml +++ b/common/bin-common/Cargo.toml @@ -19,11 +19,17 @@ serde = { workspace = true, features = ["derive"], optional = true } serde_json = { workspace = true, optional = true } ## tracing -tracing-appender = { version = "0.2.2", optional = true } tracing-subscriber = { version = "0.3.16", features = [ "env-filter", ], optional = true } tracing-tree = { version = "0.2.2", optional = true } +opentelemetry-jaeger = { version = "0.18.0", optional = true, features = [ + "rt-tokio", + "collector_client", + "isahc_collector_client", +] } +tracing-opentelemetry = { version = "0.19.0", optional = true } +opentelemetry = { version = "0.19.0", optional = true, features = ["rt-tokio"] } [build-dependencies] @@ -37,4 +43,10 @@ vergen = { version = "=7.4.3", default-features = false, features = [ [features] default = [] output_format = ["serde", "serde_json"] -tracing = ["tracing-appender", "tracing-subscriber", "tracing-tree"] +tracing = [ + "tracing-subscriber", + "tracing-tree", + "opentelemetry-jaeger", + "tracing-opentelemetry", + "opentelemetry", +] diff --git a/common/bin-common/src/logging/mod.rs b/common/bin-common/src/logging/mod.rs index 3698f1210f..256063602c 100644 --- a/common/bin-common/src/logging/mod.rs +++ b/common/bin-common/src/logging/mod.rs @@ -1,12 +1,12 @@ // Copyright 2022 - Nym Technologies SA // SPDX-License-Identifier: Apache-2.0 -// use tracing_subscriber::{ -// fmt::Layer, layer::SubscriberExt, util::SubscriberInitExt, EnvFilter, Registry, -// }; -// use tracing_tree::HierarchicalLayer; #[cfg(feature = "tracing")] -pub use tracing_appender; +pub use opentelemetry; +#[cfg(feature = "tracing")] +pub use opentelemetry_jaeger; +#[cfg(feature = "tracing")] +pub use tracing_opentelemetry; #[cfg(feature = "tracing")] pub use tracing_subscriber; #[cfg(feature = "tracing")] @@ -39,27 +39,35 @@ pub fn setup_logging() { #[cfg(feature = "tracing")] #[macro_export] macro_rules! setup_tracing { - ($file_name: expr) => { + ($service_name: expr) => { use nym_bin_common::logging::tracing_subscriber::layer::SubscriberExt; use nym_bin_common::logging::tracing_subscriber::util::SubscriberInitExt; - let file_appender = - nym_bin_common::logging::tracing_appender::rolling::hourly($file_name, "log"); - let (non_blocking, _guard) = - nym_bin_common::logging::tracing_appender::non_blocking(file_appender); - let appender_layer = nym_bin_common::logging::tracing_subscriber::fmt::Layer::new() - .with_ansi(false) - .with_writer(non_blocking); - - nym_bin_common::logging::tracing_subscriber::Registry::default() + let registry = nym_bin_common::logging::tracing_subscriber::Registry::default() .with(nym_bin_common::logging::tracing_subscriber::EnvFilter::from_default_env()) - .with(appender_layer) .with( nym_bin_common::logging::tracing_tree::HierarchicalLayer::new(4) .with_targets(true) .with_bracketed_fields(true), + ); + + let tracer = nym_bin_common::logging::opentelemetry_jaeger::new_collector_pipeline() + .with_endpoint("http://44.199.230.10:14268/api/traces") + .with_service_name($service_name) + .with_isahc() + .with_trace_config( + nym_bin_common::logging::opentelemetry::sdk::trace::config().with_sampler( + nym_bin_common::logging::opentelemetry::sdk::trace::Sampler::TraceIdRatioBased( + 0.1, + ), + ), ) - .init(); + .install_batch(nym_bin_common::logging::opentelemetry::runtime::Tokio) + .expect("Could not init tracer"); + + let telemetry = nym_bin_common::logging::tracing_opentelemetry::layer().with_tracer(tracer); + + registry.with(telemetry).init(); }; } diff --git a/common/mixnode-common/src/lib.rs b/common/mixnode-common/src/lib.rs index d4488ba44a..9689b157a5 100644 --- a/common/mixnode-common/src/lib.rs +++ b/common/mixnode-common/src/lib.rs @@ -19,20 +19,20 @@ macro_rules! measure { cfg_if::cfg_if! { if #[cfg(feature = "cpucycles")] { let start_cycles = $crate::cpu_cycles(); - // if the block needs to return something, we can return it - let r = $x; - let end_cycles = $crate::cpu_cycles(); - let name = if let Some(meta) = tracing::Span::current().metadata() { - meta.name() - } else { - "measure" - }; - match (start_cycles, end_cycles) { - (Ok(start), Ok(end)) => info!("{} cpucycles: {}", name, end - start), - (Err(e), _) => error!("{e}"), - (_, Err(e)) => error!("{e}"), - } - r + // if the block needs to return something, we can return it + let r = $x; + let end_cycles = $crate::cpu_cycles(); + let name = if let Some(meta) = tracing::Span::current().metadata() { + meta.name() + } else { + "measure" + }; + match (start_cycles, end_cycles) { + (Ok(start), Ok(end)) => log::trace!("{} cpucycles: {}", name, end - start), + (Err(e), _) => error!("{e}"), + (_, Err(e)) => error!("{e}"), + } + r } else { $x } diff --git a/mixnode/src/main.rs b/mixnode/src/main.rs index b0cb340634..7d4228a063 100644 --- a/mixnode/src/main.rs +++ b/mixnode/src/main.rs @@ -51,10 +51,7 @@ fn test_function() { async fn main() { cfg_if::cfg_if! { if #[cfg(feature = "cpucycles")] { - let home_dir = dirs::home_dir().expect("Could not get $HOME"); - let logs_dir = home_dir.join(".nym").join("logs"); - let logs_dir_str = logs_dir.to_str().expect("Could not construct logs path"); - setup_tracing!(logs_dir_str); + setup_tracing!("mixnode"); info!("CPU cycles measurement is ON") } else { setup_logging();