Compare commits

...

4 commits

Author SHA1 Message Date
Jade Ellis
cd238b05de
fix: Remove bad colon in workflow 2025-09-06 16:21:21 +01:00
Jade Ellis
c0e3829fed
feat: Replace Jaeger with OTLP 2025-09-06 16:19:56 +01:00
Jade Ellis
1d7dda6cf5
chore: Upgrade ctor, cbor 2025-09-06 16:19:56 +01:00
Jade Ellis
6f19931c5b
chore(deps): Upgrade minor incompatible dependencies 2025-09-06 16:19:56 +01:00
19 changed files with 610 additions and 483 deletions

View file

@ -15,7 +15,7 @@ on:
- "docs/**" - "docs/**"
push: push:
branches: branches:
- main: - main
paths-ignore: paths-ignore:
- "*.md" - "*.md"
- "**/*.md" - "**/*.md"

940
Cargo.lock generated

File diff suppressed because it is too large Load diff

View file

@ -48,15 +48,15 @@ features = ["ffi", "std", "union"]
version = "0.6.2" version = "0.6.2"
[workspace.dependencies.ctor] [workspace.dependencies.ctor]
version = "0.2.9" version = "0.5.0"
[workspace.dependencies.cargo_toml] [workspace.dependencies.cargo_toml]
version = "0.21" version = "0.22"
default-features = false default-features = false
features = ["features"] features = ["features"]
[workspace.dependencies.toml] [workspace.dependencies.toml]
version = "0.8.14" version = "0.9.5"
default-features = false default-features = false
features = ["parse"] features = ["parse"]
@ -411,25 +411,28 @@ default-features = false
# optional opentelemetry, performance measurements, flamegraphs, etc for performance measurements and monitoring # optional opentelemetry, performance measurements, flamegraphs, etc for performance measurements and monitoring
[workspace.dependencies.opentelemetry] [workspace.dependencies.opentelemetry]
version = "0.21.0" version = "0.30.0"
[workspace.dependencies.tracing-flame] [workspace.dependencies.tracing-flame]
version = "0.2.0" version = "0.2.0"
[workspace.dependencies.tracing-opentelemetry] [workspace.dependencies.tracing-opentelemetry]
version = "0.22.0" version = "0.31.0"
[workspace.dependencies.opentelemetry_sdk] [workspace.dependencies.opentelemetry_sdk]
version = "0.21.2" version = "0.30.0"
features = ["rt-tokio"] features = ["rt-tokio"]
[workspace.dependencies.opentelemetry-jaeger] [workspace.dependencies.opentelemetry-otlp]
version = "0.20.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]
version = "0.37.0" version = "0.42.0"
default-features = false default-features = false
features = [ features = [
"backtrace", "backtrace",
@ -445,9 +448,9 @@ features = [
] ]
[workspace.dependencies.sentry-tracing] [workspace.dependencies.sentry-tracing]
version = "0.37.0" version = "0.42.0"
[workspace.dependencies.sentry-tower] [workspace.dependencies.sentry-tower]
version = "0.37.0" version = "0.42.0"
# jemalloc usage # jemalloc usage
[workspace.dependencies.tikv-jemalloc-sys] [workspace.dependencies.tikv-jemalloc-sys]
@ -476,7 +479,7 @@ features = ["use_std"]
version = "0.4" version = "0.4"
[workspace.dependencies.nix] [workspace.dependencies.nix]
version = "0.29.0" version = "0.30.1"
default-features = false default-features = false
features = ["resource"] features = ["resource"]
@ -498,7 +501,7 @@ version = "0.4.3"
default-features = false default-features = false
[workspace.dependencies.termimad] [workspace.dependencies.termimad]
version = "0.31.2" version = "0.34.0"
default-features = false default-features = false
[workspace.dependencies.checked_ops] [workspace.dependencies.checked_ops]
@ -536,11 +539,11 @@ version = "0.2"
version = "0.2" version = "0.2"
[workspace.dependencies.minicbor] [workspace.dependencies.minicbor]
version = "0.26.3" version = "2.1.1"
features = ["std"] features = ["std"]
[workspace.dependencies.minicbor-serde] [workspace.dependencies.minicbor-serde]
version = "0.4.1" version = "0.6.0"
features = ["std"] features = ["std"]
[workspace.dependencies.maplit] [workspace.dependencies.maplit]
@ -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

@ -89,6 +89,7 @@ serde_yaml.workspace = true
tokio.workspace = true tokio.workspace = true
tracing-subscriber.workspace = true tracing-subscriber.workspace = true
tracing.workspace = true tracing.workspace = true
ctor.workspace = true
[lints] [lints]
workspace = true workspace = true

View file

@ -29,6 +29,8 @@ pub(crate) use crate::{context::Context, utils::get_room_info};
pub(crate) const PAGE_SIZE: usize = 100; pub(crate) const PAGE_SIZE: usize = 100;
use ctor::{ctor, dtor};
conduwuit::mod_ctor! {} conduwuit::mod_ctor! {}
conduwuit::mod_dtor! {} conduwuit::mod_dtor! {}
conduwuit::rustc_flags_capture! {} conduwuit::rustc_flags_capture! {}

View file

@ -93,6 +93,7 @@ serde.workspace = true
sha1.workspace = true sha1.workspace = true
tokio.workspace = true tokio.workspace = true
tracing.workspace = true tracing.workspace = true
ctor.workspace = true
[lints] [lints]
workspace = true workspace = true

View file

@ -321,7 +321,7 @@ pub(crate) fn event_filter(item: PdusIterItem, filter: &RoomEventFilter) -> Opti
filter.matches(pdu).then_some(item) filter.matches(pdu).then_some(item)
} }
#[cfg_attr(debug_assertions, conduwuit::ctor)] #[cfg_attr(debug_assertions, ctor::ctor)]
fn _is_sorted() { fn _is_sorted() {
debug_assert!( debug_assert!(
IGNORED_MESSAGE_TYPES.is_sorted(), IGNORED_MESSAGE_TYPES.is_sorted(),

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

@ -66,6 +66,7 @@ serde.workspace = true
serde_json.workspace = true serde_json.workspace = true
tokio.workspace = true tokio.workspace = true
tracing.workspace = true tracing.workspace = true
ctor.workspace = true
[lints] [lints]
workspace = true workspace = true

View file

@ -3,6 +3,8 @@
extern crate conduwuit_core as conduwuit; extern crate conduwuit_core as conduwuit;
extern crate rust_rocksdb as rocksdb; extern crate rust_rocksdb as rocksdb;
use ctor::{ctor, dtor};
conduwuit::mod_ctor! {} conduwuit::mod_ctor! {}
conduwuit::mod_dtor! {} conduwuit::mod_dtor! {}
conduwuit::rustc_flags_capture! {} conduwuit::rustc_flags_capture! {}

View file

@ -13,13 +13,13 @@ pub(super) fn flags_capture(args: TokenStream) -> TokenStream {
let ret = quote! { let ret = quote! {
pub static RUSTC_FLAGS: [&str; #flag_len] = [#( #flag ),*]; pub static RUSTC_FLAGS: [&str; #flag_len] = [#( #flag ),*];
#[conduwuit_core::ctor] #[ctor]
fn _set_rustc_flags() { fn _set_rustc_flags() {
conduwuit_core::info::rustc::FLAGS.lock().insert(#crate_name, &RUSTC_FLAGS); conduwuit_core::info::rustc::FLAGS.lock().insert(#crate_name, &RUSTC_FLAGS);
} }
// static strings have to be yanked on module unload // static strings have to be yanked on module unload
#[conduwuit_core::dtor] #[dtor]
fn _unset_rustc_flags() { fn _unset_rustc_flags() {
conduwuit_core::info::rustc::FLAGS.lock().remove(#crate_name); conduwuit_core::info::rustc::FLAGS.lock().remove(#crate_name);
} }

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",
] ]
@ -202,11 +203,14 @@ clap.workspace = true
console-subscriber.optional = true console-subscriber.optional = true
console-subscriber.workspace = true console-subscriber.workspace = true
const-str.workspace = true const-str.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
@ -226,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)
}; };

View file

@ -13,6 +13,7 @@ mod sentry;
mod server; mod server;
mod signal; mod signal;
use ctor::{ctor, dtor};
use server::Server; use server::Server;
rustc_flags_capture! {} rustc_flags_capture! {}

View file

@ -125,6 +125,7 @@ tokio.workspace = true
tower.workspace = true tower.workspace = true
tower-http.workspace = true tower-http.workspace = true
tracing.workspace = true tracing.workspace = true
ctor.workspace = true
[target.'cfg(all(unix, target_os = "linux"))'.dependencies] [target.'cfg(all(unix, target_os = "linux"))'.dependencies]
sd-notify.workspace = true sd-notify.workspace = true

View file

@ -12,6 +12,7 @@ use std::{panic::AssertUnwindSafe, pin::Pin, sync::Arc};
use conduwuit::{Error, Result, Server}; use conduwuit::{Error, Result, Server};
use conduwuit_service::Services; use conduwuit_service::Services;
use ctor::{ctor, dtor};
use futures::{Future, FutureExt, TryFutureExt}; use futures::{Future, FutureExt, TryFutureExt};
conduwuit::mod_ctor! {} conduwuit::mod_ctor! {}

View file

@ -117,6 +117,7 @@ webpage.optional = true
blurhash.workspace = true blurhash.workspace = true
blurhash.optional = true blurhash.optional = true
recaptcha-verify = { version = "0.1.5", default-features = false } recaptcha-verify = { version = "0.1.5", default-features = false }
ctor.workspace = true
[lints] [lints]
workspace = true workspace = true

View file

@ -33,6 +33,7 @@ pub mod users;
extern crate conduwuit_core as conduwuit; extern crate conduwuit_core as conduwuit;
extern crate conduwuit_database as database; extern crate conduwuit_database as database;
use ctor::{ctor, dtor};
pub(crate) use service::{Args, Dep, Service}; pub(crate) use service::{Args, Dep, Service};
pub use crate::services::Services; pub use crate::services::Services;