feat: Replace Jaeger with OTLP

This commit is contained in:
Jade Ellis 2025-09-06 16:05:13 +01:00
commit c0e3829fed
No known key found for this signature in database
GPG key ID: 8705A2A3EBF77BD2
6 changed files with 125 additions and 145 deletions

164
Cargo.lock generated
View file

@ -922,9 +922,10 @@ dependencies = [
"ctor", "ctor",
"hardened_malloc-rs", "hardened_malloc-rs",
"log", "log",
"opentelemetry 0.30.0", "opentelemetry",
"opentelemetry-jaeger", "opentelemetry-jaeger-propagator",
"opentelemetry_sdk 0.30.0", "opentelemetry-otlp",
"opentelemetry_sdk",
"sentry", "sentry",
"sentry-tower", "sentry-tower",
"sentry-tracing", "sentry-tracing",
@ -1187,7 +1188,7 @@ dependencies = [
"futures-core", "futures-core",
"prost", "prost",
"prost-types", "prost-types",
"tonic", "tonic 0.12.3",
"tracing-core", "tracing-core",
] ]
@ -1211,7 +1212,7 @@ dependencies = [
"thread_local", "thread_local",
"tokio", "tokio",
"tokio-stream", "tokio-stream",
"tonic", "tonic 0.12.3",
"tracing", "tracing",
"tracing-core", "tracing-core",
"tracing-subscriber", "tracing-subscriber",
@ -2551,12 +2552,6 @@ version = "0.1.15"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c8fae54786f62fb2918dcfae3d568594e50eb9b5c25bf04371af6fe7516452fb" checksum = "c8fae54786f62fb2918dcfae3d568594e50eb9b5c25bf04371af6fe7516452fb"
[[package]]
name = "integer-encoding"
version = "3.0.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8bb03732005da905c88227371639bf1ad885cc712789c011c31c5fb3ab3ccf02"
[[package]] [[package]]
name = "interpolate_name" name = "interpolate_name"
version = "0.2.4" version = "0.2.4"
@ -3283,20 +3278,6 @@ version = "0.1.6"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e"
[[package]]
name = "opentelemetry"
version = "0.23.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1b69a91d4893e713e06f724597ad630f1fa76057a5e1026c0ca67054a9032a76"
dependencies = [
"futures-core",
"futures-sink",
"js-sys",
"once_cell",
"pin-project-lite",
"thiserror 1.0.69",
]
[[package]] [[package]]
name = "opentelemetry" name = "opentelemetry"
version = "0.30.0" version = "0.30.0"
@ -3312,46 +3293,54 @@ dependencies = [
] ]
[[package]] [[package]]
name = "opentelemetry-jaeger" name = "opentelemetry-http"
version = "0.22.0" version = "0.30.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "501b471b67b746d9a07d4c29f8be00f952d1a2eca356922ede0098cbaddff19f" checksum = "50f6639e842a97dbea8886e3439710ae463120091e2e064518ba8e716e6ac36d"
dependencies = [ dependencies = [
"async-trait", "async-trait",
"futures-core", "bytes",
"futures-util", "http",
"opentelemetry 0.23.0", "opentelemetry",
"opentelemetry-semantic-conventions", "reqwest",
"opentelemetry_sdk 0.23.0",
"thrift",
"tokio",
] ]
[[package]] [[package]]
name = "opentelemetry-semantic-conventions" name = "opentelemetry-jaeger-propagator"
version = "0.15.0" version = "0.30.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1869fb4bb9b35c5ba8a1e40c9b128a7b4c010d07091e864a29da19e4fe2ca4d7" checksum = "090b8ec07bb2e304b529581aa1fe530d7861298c9ef549ebbf44a4a56472c539"
dependencies = [
"opentelemetry",
]
[[package]] [[package]]
name = "opentelemetry_sdk" name = "opentelemetry-otlp"
version = "0.23.0" version = "0.30.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ae312d58eaa90a82d2e627fd86e075cf5230b3f11794e2ed74199ebbe572d4fd" checksum = "dbee664a43e07615731afc539ca60c6d9f1a9425e25ca09c57bc36c87c55852b"
dependencies = [ dependencies = [
"async-trait", "http",
"futures-channel", "opentelemetry",
"futures-executor", "opentelemetry-http",
"futures-util", "opentelemetry-proto",
"lazy_static", "opentelemetry_sdk",
"once_cell", "prost",
"opentelemetry 0.23.0", "reqwest",
"ordered-float 4.6.0", "thiserror 2.0.16",
"percent-encoding", "tracing",
"rand 0.8.5", ]
"thiserror 1.0.69",
"tokio", [[package]]
"tokio-stream", name = "opentelemetry-proto"
version = "0.30.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2e046fd7660710fe5a05e8748e70d9058dc15c94ba914e7c4faa7c728f0e8ddc"
dependencies = [
"opentelemetry",
"opentelemetry_sdk",
"prost",
"tonic 0.13.1",
] ]
[[package]] [[package]]
@ -3363,7 +3352,7 @@ dependencies = [
"futures-channel", "futures-channel",
"futures-executor", "futures-executor",
"futures-util", "futures-util",
"opentelemetry 0.30.0", "opentelemetry",
"percent-encoding", "percent-encoding",
"rand 0.9.2", "rand 0.9.2",
"serde_json", "serde_json",
@ -3372,24 +3361,6 @@ dependencies = [
"tokio-stream", "tokio-stream",
] ]
[[package]]
name = "ordered-float"
version = "2.10.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "68f19d67e5a2795c94e73e0bb1cc1a7edeb2e28efd39e2e1c9b7a40c1108b11c"
dependencies = [
"num-traits",
]
[[package]]
name = "ordered-float"
version = "4.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7bb71e1b3fa6ca1c61f383464aaf2bb0e2f8e772a1f01d486832464de363b951"
dependencies = [
"num-traits",
]
[[package]] [[package]]
name = "os_info" name = "os_info"
version = "3.12.0" version = "3.12.0"
@ -5272,28 +5243,6 @@ dependencies = [
"cfg-if", "cfg-if",
] ]
[[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 2.10.1",
"threadpool",
]
[[package]] [[package]]
name = "tiff" name = "tiff"
version = "0.9.1" version = "0.9.1"
@ -5598,6 +5547,27 @@ dependencies = [
"tracing", "tracing",
] ]
[[package]]
name = "tonic"
version = "0.13.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7e581ba15a835f4d9ea06c55ab1bd4dce26fc53752c69a04aac00703bfb49ba9"
dependencies = [
"async-trait",
"base64 0.22.1",
"bytes",
"http",
"http-body",
"http-body-util",
"percent-encoding",
"pin-project",
"prost",
"tokio-stream",
"tower-layer",
"tower-service",
"tracing",
]
[[package]] [[package]]
name = "tower" name = "tower"
version = "0.4.13" version = "0.4.13"
@ -5737,8 +5707,8 @@ checksum = "ddcf5959f39507d0d04d6413119c04f33b623f4f951ebcbdddddfad2d0623a9c"
dependencies = [ dependencies = [
"js-sys", "js-sys",
"once_cell", "once_cell",
"opentelemetry 0.30.0", "opentelemetry",
"opentelemetry_sdk 0.30.0", "opentelemetry_sdk",
"smallvec", "smallvec",
"tracing", "tracing",
"tracing-core", "tracing-core",

View file

@ -423,9 +423,12 @@ version = "0.31.0"
version = "0.30.0" version = "0.30.0"
features = ["rt-tokio"] features = ["rt-tokio"]
[workspace.dependencies.opentelemetry-jaeger] [workspace.dependencies.opentelemetry-otlp]
version = "0.22.0" version = "0.30.0"
features = ["rt-tokio"] features = ["http", "trace", "logs", "metrics"]
[workspace.dependencies.opentelemetry-jaeger-propagator]
version = "0.30.0"
# optional sentry metrics for crash/panic reporting # optional sentry metrics for crash/panic reporting
[workspace.dependencies.sentry] [workspace.dependencies.sentry]
@ -764,25 +767,6 @@ incremental = true
[profile.dev.package.conduwuit_core] [profile.dev.package.conduwuit_core]
inherits = "dev" inherits = "dev"
#rustflags = [
# '--cfg', 'conduwuit_mods',
# '-Ztime-passes',
# '-Zmir-opt-level=0',
# '-Ztls-model=initial-exec',
# '-Cprefer-dynamic=true',
# '-Zstaticlib-prefer-dynamic=true',
# '-Zstaticlib-allow-rdylib-deps=true',
# '-Zpacked-bundled-libs=false',
# '-Zplt=true',
# '-Clink-arg=-Wl,--as-needed',
# '-Clink-arg=-Wl,--allow-shlib-undefined',
# '-Clink-arg=-Wl,-z,lazy',
# '-Clink-arg=-Wl,-z,unique',
# '-Clink-arg=-Wl,-z,nodlopen',
# '-Clink-arg=-Wl,-z,nodelete',
#]
[profile.dev.package.xtask-generate-commands]
inherits = "dev"
[profile.dev.package.conduwuit] [profile.dev.package.conduwuit]
inherits = "dev" inherits = "dev"
#rustflags = [ #rustflags = [

View file

@ -591,13 +591,19 @@
# #
#default_room_version = 11 #default_room_version = 11
# This item is undocumented. Please contribute documentation for it. # Enable OpenTelemetry OTLP tracing export. This replaces the deprecated
# Jaeger exporter. Traces will be sent via OTLP to a collector (such as
# Jaeger) that supports the OpenTelemetry Protocol.
# #
#allow_jaeger = false # Configure your OTLP endpoint using the OTEL_EXPORTER_OTLP_ENDPOINT
# environment variable (defaults to http://localhost:4318).
#
#allow_otlp = false
# This item is undocumented. Please contribute documentation for it. # Filter for OTLP tracing spans. This controls which spans are exported
# to the OTLP collector.
# #
#jaeger_filter = "info" #otlp_filter = "info"
# If the 'perf_measurements' compile-time feature is enabled, enables # If the 'perf_measurements' compile-time feature is enabled, enables
# collecting folded stack trace profile of tracing spans using # collecting folded stack trace profile of tracing spans using

View file

@ -714,12 +714,21 @@ pub struct Config {
#[serde(default)] #[serde(default)]
pub well_known: WellKnownConfig, pub well_known: WellKnownConfig,
#[serde(default)] /// Enable OpenTelemetry OTLP tracing export. This replaces the deprecated
pub allow_jaeger: bool, /// Jaeger exporter. Traces will be sent via OTLP to a collector (such as
/// Jaeger) that supports the OpenTelemetry Protocol.
///
/// Configure your OTLP endpoint using the OTEL_EXPORTER_OTLP_ENDPOINT
/// environment variable (defaults to http://localhost:4318).
#[serde(default, alias = "allow_jaeger")]
pub allow_otlp: bool,
/// Filter for OTLP tracing spans. This controls which spans are exported
/// to the OTLP collector.
///
/// default: "info" /// default: "info"
#[serde(default = "default_jaeger_filter")] #[serde(default = "default_otlp_filter", alias = "jaeger_filter")]
pub jaeger_filter: String, pub otlp_filter: String,
/// If the 'perf_measurements' compile-time feature is enabled, enables /// If the 'perf_measurements' compile-time feature is enabled, enables
/// collecting folded stack trace profile of tracing spans using /// collecting folded stack trace profile of tracing spans using
@ -2367,7 +2376,7 @@ fn default_tracing_flame_filter() -> String {
.to_owned() .to_owned()
} }
fn default_jaeger_filter() -> String { fn default_otlp_filter() -> String {
cfg!(debug_assertions) cfg!(debug_assertions)
.then_some("trace,h2=off") .then_some("trace,h2=off")
.unwrap_or("info") .unwrap_or("info")

View file

@ -126,7 +126,8 @@ perf_measurements = [
"dep:tracing-flame", "dep:tracing-flame",
"dep:tracing-opentelemetry", "dep:tracing-opentelemetry",
"dep:opentelemetry_sdk", "dep:opentelemetry_sdk",
"dep:opentelemetry-jaeger", "dep:opentelemetry-otlp",
"dep:opentelemetry-jaeger-propagator",
"conduwuit-core/perf_measurements", "conduwuit-core/perf_measurements",
"conduwuit-core/sentry_telemetry", "conduwuit-core/sentry_telemetry",
] ]
@ -204,10 +205,12 @@ console-subscriber.workspace = true
const-str.workspace = true const-str.workspace = true
ctor.workspace = true ctor.workspace = true
log.workspace = true log.workspace = true
opentelemetry-jaeger.optional = true
opentelemetry-jaeger.workspace = true
opentelemetry.optional = true opentelemetry.optional = true
opentelemetry.workspace = true opentelemetry.workspace = true
opentelemetry-otlp.optional = true
opentelemetry-otlp.workspace = true
opentelemetry-jaeger-propagator.optional = true
opentelemetry-jaeger-propagator.workspace = true
opentelemetry_sdk.optional = true opentelemetry_sdk.optional = true
opentelemetry_sdk.workspace = true opentelemetry_sdk.workspace = true
sentry-tower.optional = true sentry-tower.optional = true
@ -227,6 +230,7 @@ tracing-subscriber.workspace = true
tracing.workspace = true tracing.workspace = true
tracing-journald = { workspace = true, optional = true } tracing-journald = { workspace = true, optional = true }
[target.'cfg(all(not(target_env = "msvc"), target_os = "linux"))'.dependencies] [target.'cfg(all(not(target_env = "msvc"), target_os = "linux"))'.dependencies]
hardened_malloc-rs.workspace = true hardened_malloc-rs.workspace = true
hardened_malloc-rs.optional = true hardened_malloc-rs.optional = true

View file

@ -7,6 +7,8 @@ use conduwuit_core::{
log::{ConsoleFormat, ConsoleWriter, LogLevelReloadHandles, capture, fmt_span}, log::{ConsoleFormat, ConsoleWriter, LogLevelReloadHandles, capture, fmt_span},
result::UnwrapOrErr, result::UnwrapOrErr,
}; };
#[cfg(feature = "perf_measurements")]
use opentelemetry::trace::TracerProvider;
use tracing_subscriber::{EnvFilter, Layer, Registry, fmt, layer::SubscriberExt, reload}; use tracing_subscriber::{EnvFilter, Layer, Registry, fmt, layer::SubscriberExt, reload};
#[cfg(feature = "perf_measurements")] #[cfg(feature = "perf_measurements")]
@ -87,30 +89,35 @@ pub(crate) fn init(
(None, None) (None, None)
}; };
let jaeger_filter = EnvFilter::try_new(&config.jaeger_filter) let otlp_filter = EnvFilter::try_new(&config.otlp_filter)
.map_err(|e| err!(Config("jaeger_filter", "{e}.")))?; .map_err(|e| err!(Config("otlp_filter", "{e}.")))?;
let jaeger_layer = config.allow_jaeger.then(|| { let otlp_layer = config.allow_otlp.then(|| {
opentelemetry::global::set_text_map_propagator( opentelemetry::global::set_text_map_propagator(
opentelemetry_jaeger::Propagator::new(), opentelemetry_jaeger_propagator::Propagator::new(),
); );
let tracer = opentelemetry_jaeger::new_agent_pipeline() let exporter = opentelemetry_otlp::SpanExporter::builder()
.with_auto_split_batch(true) .with_http()
.with_service_name(conduwuit_core::name()) .build()
.install_batch(opentelemetry_sdk::runtime::Tokio) .expect("Failed to create OTLP exporter");
.expect("jaeger agent pipeline");
let provider = opentelemetry_sdk::trace::SdkTracerProvider::builder()
.with_batch_exporter(exporter)
.build();
let tracer = provider.tracer(conduwuit_core::name());
let telemetry = tracing_opentelemetry::layer().with_tracer(tracer); let telemetry = tracing_opentelemetry::layer().with_tracer(tracer);
let (jaeger_reload_filter, jaeger_reload_handle) = let (otlp_reload_filter, otlp_reload_handle) =
reload::Layer::new(jaeger_filter.clone()); reload::Layer::new(otlp_filter.clone());
reload_handles.add("jaeger", Box::new(jaeger_reload_handle)); reload_handles.add("otlp", Box::new(otlp_reload_handle));
Some(telemetry.with_filter(jaeger_reload_filter)) Some(telemetry.with_filter(otlp_reload_filter))
}); });
let subscriber = subscriber.with(flame_layer).with(jaeger_layer); let subscriber = subscriber.with(flame_layer).with(otlp_layer);
(subscriber, flame_guard) (subscriber, flame_guard)
}; };