From ff8646da0822b29e1befa4b8f8e4fe05b671f8c5 Mon Sep 17 00:00:00 2001 From: Caleb Schoepp Date: Fri, 13 Sep 2024 13:28:00 -0600 Subject: [PATCH] Upgrade to OTel v0.23.0 This required re-working how the spin-telemetry logging layer works. Signed-off-by: Caleb Schoepp --- Cargo.lock | 38 ++++++++++++++++++------------------ Cargo.toml | 6 +++--- crates/telemetry/Cargo.toml | 5 +++-- crates/telemetry/src/logs.rs | 37 ++++++++++++++++------------------- 4 files changed, 42 insertions(+), 44 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index a6ba4882d9..971654c26f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1189,12 +1189,13 @@ dependencies = [ [[package]] name = "cc" -version = "1.0.90" +version = "1.1.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8cd6604a82acf3039f1144f54b8eb34e91ffba622051189e71b781822d5ee1f5" +checksum = "b62ac837cdb5cb22e10a256099b4fc502b1dfe560cb282963a974d7abd80e476" dependencies = [ "jobserver", "libc", + "shlex", ] [[package]] @@ -3728,9 +3729,9 @@ dependencies = [ [[package]] name = "jobserver" -version = "0.1.28" +version = "0.1.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab46a6e9526ddef3ae7f787c06f0f2600639ba80ea3eade3d8e670a2230f51d6" +checksum = "48d1dbcbbeb6a7fec7e059840aa538bd62aaccf972c7346c4d9d2059312853d0" dependencies = [ "libc", ] @@ -5011,9 +5012,9 @@ dependencies = [ [[package]] name = "opentelemetry" -version = "0.22.0" +version = "0.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "900d57987be3f2aeb70d385fff9b27fb74c5723cc9a52d904d4f9c807a0667bf" +checksum = "1b69a91d4893e713e06f724597ad630f1fa76057a5e1026c0ca67054a9032a76" dependencies = [ "futures-core", "futures-sink", @@ -5021,14 +5022,13 @@ dependencies = [ "once_cell", "pin-project-lite", "thiserror", - "urlencoding", ] [[package]] name = "opentelemetry-http" -version = "0.11.1" +version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7690dc77bf776713848c4faa6501157469017eaf332baccd4eb1cea928743d94" +checksum = "b0ba633e55c5ea6f431875ba55e71664f2fa5d3a90bd34ec9302eecc41c865dd" dependencies = [ "async-trait", "bytes", @@ -5039,9 +5039,9 @@ dependencies = [ [[package]] name = "opentelemetry-otlp" -version = "0.15.0" +version = "0.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a016b8d9495c639af2145ac22387dcb88e44118e45320d9238fbf4e7889abcb" +checksum = "a94c69209c05319cdf7460c6d4c055ed102be242a0a6245835d7bc42c6ec7f54" dependencies = [ "async-trait", "futures-core", @@ -5049,7 +5049,6 @@ dependencies = [ "opentelemetry", "opentelemetry-http", "opentelemetry-proto", - "opentelemetry-semantic-conventions", "opentelemetry_sdk", "prost", "reqwest 0.11.27", @@ -5060,9 +5059,9 @@ dependencies = [ [[package]] name = "opentelemetry-proto" -version = "0.5.0" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a8fddc9b68f5b80dae9d6f510b88e02396f006ad48cac349411fbecc80caae4" +checksum = "984806e6cf27f2b49282e2a05e288f30594f3dbc74eb7a6e99422bc48ed78162" dependencies = [ "opentelemetry", "opentelemetry_sdk", @@ -5078,16 +5077,16 @@ checksum = "f9ab5bd6c42fb9349dcf28af2ba9a0667f697f9bdcca045d39f2cec5543e2910" [[package]] name = "opentelemetry_sdk" -version = "0.22.1" +version = "0.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e90c7113be649e31e9a0f8b5ee24ed7a16923b322c3c5ab6367469c049d6b7e" +checksum = "ae312d58eaa90a82d2e627fd86e075cf5230b3f11794e2ed74199ebbe572d4fd" dependencies = [ "async-trait", - "crossbeam-channel", "futures-channel", "futures-executor", "futures-util", "glob", + "lazy_static 1.4.0", "once_cell", "opentelemetry", "ordered-float 4.2.0", @@ -7878,6 +7877,7 @@ dependencies = [ "anyhow", "http 0.2.12", "http 1.1.0", + "once_cell", "opentelemetry", "opentelemetry-otlp", "opentelemetry-semantic-conventions", @@ -8844,9 +8844,9 @@ dependencies = [ [[package]] name = "tracing-opentelemetry" -version = "0.23.0" +version = "0.24.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9be14ba1bbe4ab79e9229f7f89fab8d120b865859f10527f31c033e599d2284" +checksum = "f68803492bf28ab40aeccaecc7021096bd256baf7ca77c3d425d89b35a7be4e4" dependencies = [ "js-sys", "once_cell", diff --git a/Cargo.toml b/Cargo.toml index e830f629cf..e2a6e6c351 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -127,15 +127,15 @@ anyhow = "1.0.75" conformance-tests = { git = "https://github.com/fermyon/conformance-tests", rev = "387b7f375df59e6254a7c29cf4a53507a9f46d32" } http-body-util = "0.1.0" hyper = { version = "1.0.0", features = ["full"] } -opentelemetry = { version = "0.22.0", features = ["metrics", "trace", "logs"] } -opentelemetry_sdk = { version = "0.22.1", features = ["rt-tokio", "logs_level_enabled", "metrics"] } +opentelemetry = { version = "0.23.0", features = ["metrics", "trace", "logs"] } +opentelemetry_sdk = { version = "0.23.0", features = ["rt-tokio", "logs_level_enabled", "metrics"] } reqwest = { version = "0.12", features = ["stream", "blocking"] } # In `rustls` turn off the `aws_lc_rs` default feature and turn on `ring`. # If both `aws_lc_rs` and `ring` are enabled, a panic at runtime will occur. rustls = { version = "0.23", default-features = false, features = ["ring", "std", "logging", "tls12"] } test-environment = { git = "https://github.com/fermyon/conformance-tests", rev = "387b7f375df59e6254a7c29cf4a53507a9f46d32" } tracing = { version = "0.1", features = ["log"] } -tracing-opentelemetry = { version = "0.23.0", default-features = false, features = ["metrics"] } +tracing-opentelemetry = { version = "0.24.0", default-features = false, features = ["metrics"] } wasi-common-preview1 = { version = "22.0.0", package = "wasi-common", features = [ "tokio", diff --git a/crates/telemetry/Cargo.toml b/crates/telemetry/Cargo.toml index aab52780a9..7c5225a3d7 100644 --- a/crates/telemetry/Cargo.toml +++ b/crates/telemetry/Cargo.toml @@ -8,10 +8,11 @@ edition = { workspace = true } anyhow = { workspace = true } http0 = { version = "0.2.9", package = "http" } http1 = { version = "1.0.0", package = "http" } +once_cell = "1.19.0" opentelemetry = { workspace = true } -opentelemetry-otlp = { version = "0.15.0", default-features = false, features = ["http-proto", "trace", "http", "reqwest-client", "metrics", "grpc-tonic", "logs"] } -opentelemetry-semantic-conventions = "0.14.0" opentelemetry_sdk = { workspace = true } +opentelemetry-otlp = { version = "0.16.0", default-features = false, features = ["http-proto", "trace", "http", "reqwest-client", "metrics", "grpc-tonic", "logs"] } +opentelemetry-semantic-conventions = "0.14.0" terminal = { path = "../terminal" } tracing = { version = "0.1.37", features = ["log"] } tracing-appender = "0.2.2" diff --git a/crates/telemetry/src/logs.rs b/crates/telemetry/src/logs.rs index b1f623c531..cba2438cbb 100644 --- a/crates/telemetry/src/logs.rs +++ b/crates/telemetry/src/logs.rs @@ -1,13 +1,10 @@ use std::{ascii::escape_default, sync::OnceLock, time::Duration}; use anyhow::bail; -use opentelemetry::{ - global, - logs::{Logger, LoggerProvider}, -}; +use opentelemetry::logs::{LogRecord, Logger, LoggerProvider}; use opentelemetry_otlp::LogExporterBuilder; use opentelemetry_sdk::{ - logs::{BatchConfigBuilder, BatchLogProcessor}, + logs::{BatchConfigBuilder, BatchLogProcessor, Logger as SdkLogger}, resource::{EnvResourceDetector, TelemetryResourceDetector}, Resource, }; @@ -17,6 +14,8 @@ use crate::{ env::{self, otel_logs_enabled, OtlpProtocol}, }; +static LOGGER: OnceLock = OnceLock::new(); + /// Handle an application log. Has the potential to both forward the log to OTel and to emit it as a /// tracing event. pub fn handle_app_log(buf: &[u8]) { @@ -30,20 +29,19 @@ fn app_log_to_otel(buf: &[u8]) { return; } - let logger = global::logger_provider().logger("spin"); - if let Ok(s) = std::str::from_utf8(buf) { - logger.emit( - opentelemetry::logs::LogRecord::builder() - .with_body(s.to_owned()) - .build(), - ); + if let Some(logger) = LOGGER.get() { + if let Ok(s) = std::str::from_utf8(buf) { + let mut record = logger.create_log_record(); + record.set_body(s.to_string().into()); + logger.emit(record); + } else { + let mut record = logger.create_log_record(); + record.set_body(escape_non_utf8_buf(buf).into()); + record.add_attribute("app_log_non_utf8", true); + logger.emit(record); + } } else { - logger.emit( - opentelemetry::logs::LogRecord::builder() - .with_body(escape_non_utf8_buf(buf)) - .with_attribute("app_log_non_utf8", true) - .build(), - ); + tracing::trace!("OTel logger not initialized, failed to log"); } } @@ -106,7 +104,6 @@ pub(crate) fn init_otel_logging_backend(spin_version: String) -> anyhow::Result< ) .build(); - global::set_logger_provider(provider); - + let _ = LOGGER.set(provider.logger("spin")); Ok(()) }