diff --git a/Cargo.lock b/Cargo.lock index 9b4a54468..204fcda75 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -35,7 +35,7 @@ name = "alert_logger" version = "1.0.1" dependencies = [ "anyhow", - "axum", + "axum 0.7.4", "dotenv", "envy", "logger", @@ -126,6 +126,28 @@ dependencies = [ "syn 2.0.53", ] +[[package]] +name = "async-stream" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd56dd203fef61ac097dd65721a419ddccb106b2d2b70ba60a6b529f03961a51" +dependencies = [ + "async-stream-impl", + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "async-stream-impl" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.53", +] + [[package]] name = "async-trait" version = "0.1.79" @@ -397,7 +419,7 @@ dependencies = [ "aws-smithy-types", "bytes", "fastrand 2.0.0", - "h2 0.3.19", + "h2 0.3.26", "http 0.2.9", "http-body 0.4.5", "hyper 0.14.26", @@ -474,6 +496,34 @@ dependencies = [ "tracing", ] +[[package]] +name = "axum" +version = "0.6.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b829e4e32b91e643de6eafe82b1d90675f5874230191a4ffbc1b336dec4d6bf" +dependencies = [ + "async-trait", + "axum-core 0.3.4", + "bitflags 1.3.2", + "bytes", + "futures-util", + "http 0.2.9", + "http-body 0.4.5", + "hyper 0.14.26", + "itoa", + "matchit", + "memchr", + "mime", + "percent-encoding", + "pin-project-lite", + "rustversion", + "serde", + "sync_wrapper", + "tower", + "tower-layer", + "tower-service", +] + [[package]] name = "axum" version = "0.7.4" @@ -481,7 +531,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1236b4b292f6c4d6dc34604bb5120d85c3fe1d1aa596bd5cc52ca054d13e7b9e" dependencies = [ "async-trait", - "axum-core", + "axum-core 0.4.3", "base64 0.21.5", "bytes", "futures-util", @@ -511,6 +561,23 @@ dependencies = [ "tracing", ] +[[package]] +name = "axum-core" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "759fa577a247914fd3f7f76d62972792636412fbfd634cd452f6a385a74d2d2c" +dependencies = [ + "async-trait", + "bytes", + "futures-util", + "http 0.2.9", + "http-body 0.4.5", + "mime", + "rustversion", + "tower-layer", + "tower-service", +] + [[package]] name = "axum-core" version = "0.4.3" @@ -538,8 +605,8 @@ version = "0.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "895ff42f72016617773af68fb90da2a9677d89c62338ec09162d4909d86fdd8f" dependencies = [ - "axum", - "axum-core", + "axum 0.7.4", + "axum-core 0.4.3", "bytes", "futures-util", "headers", @@ -874,6 +941,15 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "crossbeam-channel" +version = "0.5.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab3db02a9c5b5121e1e42fbdb1aeb65f5e02624cc58c43f2884c6ccac0b82f95" +dependencies = [ + "crossbeam-utils", +] + [[package]] name = "crossbeam-deque" version = "0.8.3" @@ -900,12 +976,9 @@ dependencies = [ [[package]] name = "crossbeam-utils" -version = "0.8.15" +version = "0.8.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c063cd8cc95f5c377ed0d4b49a4b21f632396ff690e8470c29b3359b346984b" -dependencies = [ - "cfg-if", -] +checksum = "248e3bacc7dc6baa3b21e405ee045c3047101a49145e7e9eca583ab4c2ca5345" [[package]] name = "crypto-common" @@ -1348,10 +1421,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b6c80984affa11d98d1b88b66ac8853f143217b399d3c74116778ff8fdb4ed2e" [[package]] -name = "h2" -version = "0.3.19" +name = "glob" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d357c7ae988e7d2182f7d7871d0b963962420b0678b0997ce7de72001aeab782" +checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" + +[[package]] +name = "h2" +version = "0.3.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81fe527a889e1532da5c525686d96d4c2e74cdd345badf8dfef9f6b39dd5f5e8" dependencies = [ "bytes", "fnv", @@ -1359,7 +1438,7 @@ dependencies = [ "futures-sink", "futures-util", "http 0.2.9", - "indexmap 1.9.3", + "indexmap 2.2.5", "slab", "tokio", "tokio-util", @@ -1558,7 +1637,7 @@ dependencies = [ "futures-channel", "futures-core", "futures-util", - "h2 0.3.19", + "h2 0.3.26", "http 0.2.9", "http-body 0.4.5", "httparse", @@ -1624,6 +1703,18 @@ dependencies = [ "tokio-rustls", ] +[[package]] +name = "hyper-timeout" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbb958482e8c7be4bc3cf272a766a2b0bf1a6755e7a6ae777f017a31d11b13b1" +dependencies = [ + "hyper 0.14.26", + "pin-project-lite", + "tokio", + "tokio-io-timeout", +] + [[package]] name = "hyper-tls" version = "0.5.0" @@ -1807,6 +1898,15 @@ version = "2.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "12b6ee2129af8d4fb011108c73d99a1b83a85977f23b82460c0ae2e25bb4b57f" +[[package]] +name = "itertools" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" +dependencies = [ + "either", +] + [[package]] name = "itoa" version = "1.0.6" @@ -1824,9 +1924,9 @@ dependencies = [ [[package]] name = "js-sys" -version = "0.3.63" +version = "0.3.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f37a4a5928311ac501dee68b3c7613a1037d0edb30c8e5427bd832d55d1b790" +checksum = "29c15563dc2726973df627357ce0c9ddddbea194836909d655df6a75d2cf296d" dependencies = [ "wasm-bindgen", ] @@ -1891,9 +1991,13 @@ name = "logger" version = "1.0.1" dependencies = [ "anyhow", + "opentelemetry", + "opentelemetry-otlp", + "opentelemetry_sdk", "serde", "tokio", "tracing", + "tracing-opentelemetry", "tracing-subscriber", ] @@ -2129,7 +2233,7 @@ dependencies = [ "async_timing_util", "aws-config", "aws-sdk-ec2", - "axum", + "axum 0.7.4", "axum-extra", "bcrypt", "dotenv", @@ -2171,7 +2275,7 @@ dependencies = [ "anyhow", "async-trait", "async_timing_util", - "axum", + "axum 0.7.4", "axum-extra", "bollard", "clap", @@ -2363,6 +2467,89 @@ dependencies = [ "vcpkg", ] +[[package]] +name = "opentelemetry" +version = "0.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "900d57987be3f2aeb70d385fff9b27fb74c5723cc9a52d904d4f9c807a0667bf" +dependencies = [ + "futures-core", + "futures-sink", + "js-sys", + "once_cell", + "pin-project-lite", + "thiserror", + "urlencoding", +] + +[[package]] +name = "opentelemetry-otlp" +version = "0.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a016b8d9495c639af2145ac22387dcb88e44118e45320d9238fbf4e7889abcb" +dependencies = [ + "async-trait", + "futures-core", + "http 0.2.9", + "opentelemetry", + "opentelemetry-proto", + "opentelemetry-semantic-conventions", + "opentelemetry_sdk", + "prost", + "thiserror", + "tokio", + "tonic", +] + +[[package]] +name = "opentelemetry-proto" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a8fddc9b68f5b80dae9d6f510b88e02396f006ad48cac349411fbecc80caae4" +dependencies = [ + "opentelemetry", + "opentelemetry_sdk", + "prost", + "tonic", +] + +[[package]] +name = "opentelemetry-semantic-conventions" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9ab5bd6c42fb9349dcf28af2ba9a0667f697f9bdcca045d39f2cec5543e2910" + +[[package]] +name = "opentelemetry_sdk" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e90c7113be649e31e9a0f8b5ee24ed7a16923b322c3c5ab6367469c049d6b7e" +dependencies = [ + "async-trait", + "crossbeam-channel", + "futures-channel", + "futures-executor", + "futures-util", + "glob", + "once_cell", + "opentelemetry", + "ordered-float", + "percent-encoding", + "rand", + "thiserror", + "tokio", + "tokio-stream", +] + +[[package]] +name = "ordered-float" +version = "4.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a76df7075c7d4d01fdcb46c912dd17fba5b60c78ea480b475f2b6ab6f666584e" +dependencies = [ + "num-traits", +] + [[package]] name = "outref" version = "0.5.1" @@ -2506,6 +2693,29 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "prost" +version = "0.12.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0f5d036824e4761737860779c906171497f6d55681139d8312388f8fe398922" +dependencies = [ + "bytes", + "prost-derive", +] + +[[package]] +name = "prost-derive" +version = "0.12.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19de2de2a00075bf566bee3bd4db014b11587e84184d3f7a791bc17f1a8e9e48" +dependencies = [ + "anyhow", + "itertools", + "proc-macro2", + "quote", + "syn 2.0.53", +] + [[package]] name = "quick-error" version = "1.2.3" @@ -2603,7 +2813,7 @@ dependencies = [ "encoding_rs", "futures-core", "futures-util", - "h2 0.3.19", + "h2 0.3.26", "http 0.2.9", "http-body 0.4.5", "hyper 0.14.26", @@ -3046,7 +3256,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9d3df9a2b74d806ecbe70d5156f436edca357e458b8d970ce88cab324a599190" dependencies = [ "anyhow", - "axum", + "axum 0.7.4", "axum-extra", "serde", "serde_json", @@ -3513,6 +3723,16 @@ dependencies = [ "windows-sys 0.48.0", ] +[[package]] +name = "tokio-io-timeout" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30b74022ada614a1b4834de765f9bb43877f910cc8ce4be40e89042c9223a8bf" +dependencies = [ + "pin-project-lite", + "tokio", +] + [[package]] name = "tokio-macros" version = "2.2.0" @@ -3544,6 +3764,17 @@ dependencies = [ "tokio", ] +[[package]] +name = "tokio-stream" +version = "0.1.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "267ac89e0bec6e691e5813911606935d77c476ff49024f98abcea3e7b15e37af" +dependencies = [ + "futures-core", + "pin-project-lite", + "tokio", +] + [[package]] name = "tokio-tungstenite" version = "0.21.0" @@ -3605,6 +3836,33 @@ dependencies = [ "winnow", ] +[[package]] +name = "tonic" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76c4eb7a4e9ef9d4763600161f12f5070b92a578e1b634db88a6887844c91a13" +dependencies = [ + "async-stream", + "async-trait", + "axum 0.6.20", + "base64 0.21.5", + "bytes", + "h2 0.3.26", + "http 0.2.9", + "http-body 0.4.5", + "hyper 0.14.26", + "hyper-timeout", + "percent-encoding", + "pin-project", + "prost", + "tokio", + "tokio-stream", + "tower", + "tower-layer", + "tower-service", + "tracing", +] + [[package]] name = "tower" version = "0.4.13" @@ -3613,9 +3871,13 @@ checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" dependencies = [ "futures-core", "futures-util", + "indexmap 1.9.3", "pin-project", "pin-project-lite", + "rand", + "slab", "tokio", + "tokio-util", "tower-layer", "tower-service", "tracing", @@ -3702,6 +3964,24 @@ dependencies = [ "tracing-core", ] +[[package]] +name = "tracing-opentelemetry" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9be14ba1bbe4ab79e9229f7f89fab8d120b865859f10527f31c033e599d2284" +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" @@ -3980,9 +4260,9 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.86" +version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5bba0e8cb82ba49ff4e229459ff22a191bbe9a1cb3a341610c9c33efc27ddf73" +checksum = "4be2531df63900aeb2bca0daaaddec08491ee64ceecbee5076636a3b026795a8" dependencies = [ "cfg-if", "wasm-bindgen-macro", @@ -3990,9 +4270,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.86" +version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19b04bc93f9d6bdee709f6bd2118f57dd6679cf1176a1af464fca3ab0d66d8fb" +checksum = "614d787b966d3989fa7bb98a654e369c762374fd3213d212cfc0251257e747da" dependencies = [ "bumpalo", "log", @@ -4017,9 +4297,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.86" +version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14d6b024f1a526bb0234f52840389927257beb670610081360e5a03c5df9c258" +checksum = "a1f8823de937b71b9460c0c34e25f3da88250760bec0ebac694b49997550d726" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -4027,9 +4307,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.86" +version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e128beba882dd1eb6200e1dc92ae6c5dbaa4311aa7bb211ca035779e5efc39f8" +checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" dependencies = [ "proc-macro2", "quote", @@ -4040,9 +4320,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.86" +version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed9d5b4305409d1fc9482fee2d7f9bcbf24b3972bf59817ef757e23982242a93" +checksum = "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96" [[package]] name = "web-sys" @@ -4054,6 +4334,16 @@ 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.3" diff --git a/Cargo.toml b/Cargo.toml index 95a1c7db7..0e978d4da 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -59,7 +59,11 @@ anyhow = "1.0.81" thiserror = "1.0.58" # LOGGING +opentelemetry_sdk = { version = "0.22.1", features = ["rt-tokio"] } tracing-subscriber = { version = "0.3.18", features = ["json"] } +tracing-opentelemetry = "0.23.0" +opentelemetry-otlp = "0.15.0" +opentelemetry = "0.22.0" tracing = "0.1.40" # CONFIG diff --git a/bin/core/src/config.rs b/bin/core/src/config.rs index 4f3d91c02..88b91a28a 100644 --- a/bin/core/src/config.rs +++ b/bin/core/src/config.rs @@ -49,6 +49,7 @@ pub fn core_config() -> &'static CoreConfig { // logging monitor_logging_level: Option, monitor_logging_stdio: Option, + monitor_logging_otlp_endpoint: Option, monitor_local_auth: Option, @@ -121,6 +122,9 @@ pub fn core_config() -> &'static CoreConfig { env.monitor_logging_level.unwrap_or(config.logging.level); config.logging.stdio = env.monitor_logging_stdio.unwrap_or(config.logging.stdio); + config.logging.otlp_endpoint = env + .monitor_logging_otlp_endpoint + .or(config.logging.otlp_endpoint); config.local_auth = env.monitor_local_auth.unwrap_or(config.local_auth); diff --git a/lib/logger/Cargo.toml b/lib/logger/Cargo.toml index 33e312d53..6692c1139 100644 --- a/lib/logger/Cargo.toml +++ b/lib/logger/Cargo.toml @@ -12,4 +12,8 @@ tokio.workspace = true serde.workspace = true anyhow.workspace = true tracing.workspace = true +opentelemetry.workspace = true +opentelemetry_sdk.workspace = true +opentelemetry-otlp.workspace = true tracing-subscriber.workspace = true +tracing-opentelemetry.workspace = true diff --git a/lib/logger/src/lib.rs b/lib/logger/src/lib.rs index 6433da8ce..d4aba4be6 100644 --- a/lib/logger/src/lib.rs +++ b/lib/logger/src/lib.rs @@ -1,4 +1,7 @@ +use std::time::Duration; + use anyhow::Context; +use opentelemetry_otlp::WithExportConfig; use serde::{Deserialize, Serialize}; use tracing::level_filters::LevelFilter; use tracing_subscriber::{ @@ -14,6 +17,24 @@ pub struct LogConfig { /// Controls logging to stdout / stderr #[serde(default)] pub stdio: StdioLogMode, + + /// Enable opentelemetry experting + pub otlp_endpoint: Option, +} + +macro_rules! opentelemetry_layer { + ($endpoint:expr) => {{ + let tracer = opentelemetry_otlp::new_pipeline() + .tracing() + .with_exporter( + opentelemetry_otlp::new_exporter() + .tonic() + .with_endpoint($endpoint) + .with_timeout(Duration::from_secs(3)), + ) + .install_batch(opentelemetry_sdk::runtime::Tokio)?; + tracing_opentelemetry::layer().with_tracer(tracer) + }}; } pub fn init(config: &LogConfig) -> anyhow::Result<()> { @@ -22,16 +43,31 @@ pub fn init(config: &LogConfig) -> anyhow::Result<()> { let registry = tracing_subscriber::registry().with(LevelFilter::from(log_level)); - match config.stdio { - StdioLogMode::Standard => registry + match (config.stdio, &config.otlp_endpoint) { + (StdioLogMode::Standard, Some(endpoint)) => registry + .with(tracing_subscriber::fmt::layer()) + .with(opentelemetry_layer!(endpoint)) + .try_init() + .context("failed to init logger"), + (StdioLogMode::Json, Some(endpoint)) => registry + .with(tracing_subscriber::fmt::layer().json()) + .with(opentelemetry_layer!(endpoint)) + .try_init() + .context("failed to init logger"), + (StdioLogMode::None, Some(endpoint)) => registry + .with(opentelemetry_layer!(endpoint)) + .try_init() + .context("failed to init logger"), + + (StdioLogMode::Standard, None) => registry .with(tracing_subscriber::fmt::layer()) .try_init() .context("failed to init logger"), - StdioLogMode::Json => registry + (StdioLogMode::Json, None) => registry .with(tracing_subscriber::fmt::layer().json()) .try_init() .context("failed to init logger"), - StdioLogMode::None => Ok(()), + (StdioLogMode::None, None) => Ok(()), } }