From e8bd777b260712848797980c9616c00d1c88fd6d Mon Sep 17 00:00:00 2001 From: ocean <47253870+banocean@users.noreply.github.com> Date: Wed, 18 Jun 2025 11:27:18 +0200 Subject: [PATCH 01/16] tracing setup --- Cargo.toml | 10 ++++++ src/main.rs | 5 +++ src/tracing_init.rs | 79 +++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 94 insertions(+) create mode 100644 src/tracing_init.rs diff --git a/Cargo.toml b/Cargo.toml index 5d7dc94..1e81fc7 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -19,6 +19,16 @@ futures-util = "0.3" tokio = "1.43" tokio-stream = "0.1" +tracing = { version = "0.1", features = ["std"] } +tracing-subscriber = { version = "0.3", features = ["env-filter","registry", "std", "fmt"] } +opentelemetry_sdk = "0.30" +opentelemetry-stdout = "0.30" +opentelemetry-appender-tracing = "0.30" +tracing-opentelemetry = "0.31" +opentelemetry = { version = "0.30", features = ["trace"] } +tonic = "0.13" +opentelemetry-otlp = { version = "0.30", features = ["http-proto", "grpc-tonic"] } + mongodb = "3.2" redis = { version = "0.29", features = ["aio", "tokio-comp"] } diff --git a/src/main.rs b/src/main.rs index 829d0d0..2d15a64 100644 --- a/src/main.rs +++ b/src/main.rs @@ -2,6 +2,7 @@ use std::sync::Arc; use crate::context::Context; use dotenv::dotenv; use tokio::task::JoinHandle; +use tracing::info; use twilight_http::Client; all_macro!( @@ -24,11 +25,15 @@ mod database; mod models; pub mod utils; mod server; +mod tracing_init; #[tokio::main] async fn main() { dotenv().ok(); + tracing_init::init(); + info!("Starting app"); + let context = Arc::new(Context::new().await); let cloned_context = context.clone(); diff --git a/src/tracing_init.rs b/src/tracing_init.rs new file mode 100644 index 0000000..cecc89f --- /dev/null +++ b/src/tracing_init.rs @@ -0,0 +1,79 @@ +use opentelemetry_otlp::WithExportConfig; +use tracing_subscriber::prelude::__tracing_subscriber_SubscriberExt; +use std::time::Duration; +use opentelemetry::global::ObjectSafeTracer; +use opentelemetry::KeyValue; +use opentelemetry::logs::LoggerProvider; +use opentelemetry::trace::TracerProvider; +use opentelemetry_sdk::Resource; +use tonic::metadata::{MetadataMap, MetadataValue}; +use tonic::service::LayerExt; +use tracing::{warn, Level}; + +pub fn init() { + let endpoint = std::env::var("OTEL_ENDPOINT"); + + let fmt_layer = tracing_subscriber::fmt::layer(); + let subscriber = tracing_subscriber::Registry::default() + .with( + tracing_subscriber::filter::Targets::new() + .with_targets(vec![ + ("tower", Level::WARN), + ("hyper_util", Level::WARN), + ("opentelemetry-otlp", Level::WARN), + ("opentelemetry_sdk", Level::WARN), + ("tonic", Level::WARN), + ("h2", Level::WARN), + ]) + .with_default(Level::DEBUG) + ) + .with(tracing_subscriber::filter::LevelFilter::from_level( + Level::DEBUG, + )) + .with(fmt_layer); + + if let Ok(endpoint) = endpoint { + let span_exporter = opentelemetry_otlp::SpanExporter::builder() + .with_tonic() + .with_endpoint(endpoint.to_owned()) + .with_timeout(Duration::from_secs(3)) + .build() + .unwrap(); + let log_exporter = opentelemetry_otlp::LogExporter::builder() + .with_tonic() + .with_endpoint(endpoint) + .with_timeout(Duration::from_secs(3)) + .build() + .unwrap(); + + let resource = Resource::builder() + .with_attribute(KeyValue::new("service.name", "custom")) + .build(); + + let tracer_provider = opentelemetry_sdk::trace::SdkTracerProvider::builder() + .with_batch_exporter(span_exporter) + .with_resource(resource.to_owned()) + .build(); + let logs_provider = opentelemetry_sdk::logs::SdkLoggerProvider::builder() + .with_batch_exporter(log_exporter) + .with_resource(resource) + .build(); + + let tracer = tracer_provider.tracer("custom"); + + let otel_span_layer = tracing_opentelemetry::layer() + .with_tracer(tracer); + let otel_logs_layer = opentelemetry_appender_tracing::layer::OpenTelemetryTracingBridge::new(&logs_provider); + + let subscriber = subscriber + .with(otel_span_layer) + .with(otel_logs_layer); + + + tracing::subscriber::set_global_default(subscriber).unwrap(); + } else { + tracing::subscriber::set_global_default(subscriber).unwrap(); + warn!("There is no OTEL_ENDPOINT environment variable, running with OpenTelemetry disabled"); + }; + +} \ No newline at end of file From 5368970182ca1359a07a447fe227433a5bc56cf0 Mon Sep 17 00:00:00 2001 From: ocean <47253870+banocean@users.noreply.github.com> Date: Wed, 18 Jun 2025 11:27:40 +0200 Subject: [PATCH 02/16] add warp tracing --- src/server/routes/mod.rs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/server/routes/mod.rs b/src/server/routes/mod.rs index 42ba34c..0b7d827 100644 --- a/src/server/routes/mod.rs +++ b/src/server/routes/mod.rs @@ -41,12 +41,15 @@ pub fn get_all_routes( ) }; + let tracing = warp::trace::request(); + #[cfg(feature = "api")] let filter = filter .or(login::login(authenticator.to_owned(), sessions.to_owned())) .or(users::me::run(authenticator.to_owned(), sessions.to_owned())) .or(guilds::_id::run(context.to_owned(), authenticator.to_owned(), sessions.to_owned())) - .or(guilds::list(context, authenticator, sessions)); + .or(guilds::list(context, authenticator, sessions)) + .with(tracing); filter } \ No newline at end of file From 2159da1bfc60a204399e523e13307c504e18be9b Mon Sep 17 00:00:00 2001 From: ocean <47253870+banocean@users.noreply.github.com> Date: Wed, 18 Jun 2025 11:37:42 +0200 Subject: [PATCH 03/16] tracing commands --- src/server/interaction.rs | 35 ++++++++++++++++++++++++++++++++--- 1 file changed, 32 insertions(+), 3 deletions(-) diff --git a/src/server/interaction.rs b/src/server/interaction.rs index e70368a..5292079 100644 --- a/src/server/interaction.rs +++ b/src/server/interaction.rs @@ -1,4 +1,5 @@ use std::sync::Arc; +use tracing::{debug_span, debug, Instrument}; use twilight_model::application::interaction::{Interaction, InteractionType}; use twilight_http::Client; use twilight_model::channel::message::MessageFlags; @@ -34,11 +35,28 @@ async fn handle_command( let execute_as_slower = interaction_ctx.orginal.target_id().is_none() && context.application.is_slower(&command.name).await; + let span = debug_span!( + "command_execution", + module = command.module, + command_name = command.name, + guild_id = guild_id.to_string(), + interaction = ?interaction_ctx.orginal, + config = ?config, + execute_as_slower, + ); + if execute_as_slower { tokio::spawn(async move { - let response = (command.run)( + let response = (command.run)( interaction_ctx, context, discord_http.to_owned(), config - ).await; + ).instrument(span).await; + + debug!( + command.name, + module = command.module, + ?response, + "finished command execution" + ); let response_data = response.map(|(v, _)| v).unwrap_or_else(|e| e.to_interaction_data_response()); @@ -63,7 +81,18 @@ async fn handle_command( }, Some(InteractionResponseType::DeferredChannelMessageWithSource))) } else { - (command.run)(interaction_ctx, context, discord_http, config).await + let response = (command.run)(interaction_ctx, context, discord_http, config) + .instrument(span) + .await; + + debug!( + command.name, + module = command.module, + ?response, + "finished command execution" + ); + + response } } From 51a58c3577f86c908bc8d0dbee22148bbd2f9b42 Mon Sep 17 00:00:00 2001 From: ocean <47253870+banocean@users.noreply.github.com> Date: Wed, 18 Jun 2025 11:38:08 +0200 Subject: [PATCH 04/16] remove unused imports --- src/tracing_init.rs | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/tracing_init.rs b/src/tracing_init.rs index cecc89f..a820832 100644 --- a/src/tracing_init.rs +++ b/src/tracing_init.rs @@ -1,13 +1,9 @@ use opentelemetry_otlp::WithExportConfig; use tracing_subscriber::prelude::__tracing_subscriber_SubscriberExt; use std::time::Duration; -use opentelemetry::global::ObjectSafeTracer; use opentelemetry::KeyValue; -use opentelemetry::logs::LoggerProvider; use opentelemetry::trace::TracerProvider; use opentelemetry_sdk::Resource; -use tonic::metadata::{MetadataMap, MetadataValue}; -use tonic::service::LayerExt; use tracing::{warn, Level}; pub fn init() { From 31aa50c5baa4ae96a2d90c77dc8e6a0748cb6979 Mon Sep 17 00:00:00 2001 From: ocean <47253870+banocean@users.noreply.github.com> Date: Wed, 18 Jun 2025 11:48:53 +0200 Subject: [PATCH 05/16] replace prints with logs from tracing --- src/database/mongodb.rs | 11 +++++++++-- src/database/redis.rs | 10 ++++++++-- src/gateway/shard.rs | 15 ++++++++++++--- 3 files changed, 29 insertions(+), 7 deletions(-) diff --git a/src/database/mongodb.rs b/src/database/mongodb.rs index 3866eac..cabed5f 100644 --- a/src/database/mongodb.rs +++ b/src/database/mongodb.rs @@ -5,6 +5,7 @@ use mongodb::{Client, Collection, Database}; use mongodb::bson::doc; #[cfg(feature = "tasks")] use mongodb::bson::DateTime; +use tracing::info; use twilight_model::channel::message::Embed; use twilight_model::id::Id; use twilight_model::id::marker::{ChannelMarker, GuildMarker, UserMarker}; @@ -32,6 +33,7 @@ impl MongoDBConnection { pub async fn connect(uri: String) -> Result { let client = Client::with_uri_str(uri).await?; + info!("connected to MongoDB"); let db = client.database("custom"); let configs = db.collection::("configs"); let cases = db.collection("cases"); @@ -52,7 +54,6 @@ impl MongoDBConnection { } pub async fn get_config(&self, guild_id: Id) -> Result { - match self.configs_cache.get(&guild_id){ Some(config) => { Ok(config.to_owned()) @@ -62,9 +63,15 @@ impl MongoDBConnection { doc! { "guild_id": guild_id.to_string() } - ).await?.unwrap_or_else(|| GuildConfig::new(guild_id)); + ).await?.unwrap_or_else(|| GuildConfig::new(guild_id.to_owned())); self.configs_cache.insert(guild_id, config.to_owned()); + info!( + name: "cached_config", + cache_size = self.configs_cache.len(), + guild_id = %guild_id, + "Cached guild config" + ); Ok(config) } diff --git a/src/database/redis.rs b/src/database/redis.rs index b99b8ad..7d6ca19 100644 --- a/src/database/redis.rs +++ b/src/database/redis.rs @@ -10,6 +10,7 @@ use crate::utils::errors::Error; use redis::AsyncCommands; use tokio::sync::mpsc::UnboundedSender; use tokio::sync::mpsc::error::SendError; +use tracing::info; use crate::database::mongodb::MongoDBConnection; #[derive(Serialize, Deserialize, Debug)] @@ -127,7 +128,6 @@ impl RedisConnection { &self, mongodb: &MongoDBConnection ) -> Result<(), RedisError> { - let mut pubsub = self.client.get_async_pubsub().await?; pubsub.subscribe("configs").await?; @@ -135,8 +135,14 @@ impl RedisConnection { const ERROR: &str = "Received invalid payload instead of guild id"; let id: String = message.get_payload().expect(ERROR); let id: Id = Id::from_str(id.as_str()).expect(ERROR); - println!("There is a guild config update id={id}"); mongodb.configs_cache.remove(&id); + + info!( + name: "config_update", + cache_size = mongodb.configs_cache.len(), + guild_id = %id, + "There is a guild config update" + ); } Ok(()) diff --git a/src/gateway/shard.rs b/src/gateway/shard.rs index 3214ed8..d0f83a2 100644 --- a/src/gateway/shard.rs +++ b/src/gateway/shard.rs @@ -1,4 +1,5 @@ use std::sync::Arc; +use tracing::error; use twilight_gateway::{EventTypeFlags, Shard, StreamExt}; use twilight_model::gateway::{Intents, ShardId}; use crate::context::Context; @@ -10,7 +11,13 @@ pub async fn connect_shards( context: Arc ) { let token = if let Some(token) = http.token() { token.to_string() } - else { eprintln!("Cannot get token of client {id}"); return }; + else { + error!( + name: "cannot get token of client", + client_id = %id + ); + return + }; let intents = Intents::MESSAGE_CONTENT | Intents::GUILD_MESSAGES | Intents::GUILDS | Intents::GUILD_MODERATION | Intents::GUILD_MEMBERS; @@ -20,8 +27,10 @@ pub async fn connect_shards( let event = match event { Ok(event) => event, Err(err) => { - eprintln!( - "error while receiving events on shard {shard} with {id} client\n{err}", + error!( + name: "error while receiving events", + error = %err, + client_id = %id, shard = shard.id().number() ); continue; From 9c665f53f4cebc6b512e2cbd65b0235f75120bf8 Mon Sep 17 00:00:00 2001 From: ocean <47253870+banocean@users.noreply.github.com> Date: Wed, 18 Jun 2025 11:49:20 +0200 Subject: [PATCH 06/16] derive display on context --- src/commands/context.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/commands/context.rs b/src/commands/context.rs index bc23034..34a50a1 100644 --- a/src/commands/context.rs +++ b/src/commands/context.rs @@ -24,6 +24,7 @@ macro_rules! extract { }; } +#[derive(Debug, Clone)] pub struct InteractionContext { pub command_vec: Vec, pub command_text: String, From caa048cd084f801a202216e2e81309157941bae0 Mon Sep 17 00:00:00 2001 From: ocean <47253870+banocean@users.noreply.github.com> Date: Wed, 18 Jun 2025 12:26:27 +0200 Subject: [PATCH 07/16] login logs --- src/server/routes/login.rs | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/server/routes/login.rs b/src/server/routes/login.rs index 9240535..6fd4832 100644 --- a/src/server/routes/login.rs +++ b/src/server/routes/login.rs @@ -1,6 +1,7 @@ use std::sync::Arc; use std::time::{SystemTime, UNIX_EPOCH}; use serde::{Deserialize, Serialize}; +use tracing::info; use twilight_http::Client; use twilight_model::user::CurrentUser; use twilight_model::util::Timestamp; @@ -117,6 +118,12 @@ async fn run( .model().await.map_rejection()?; let token = authenticator.generate_token(user.id).map_rejection()?; + info!( + name: "user logged in", + user_id = %user.id, + username = %user.name + ); + let reply = warp::reply::json(&Response { user: &user, token: &token @@ -134,6 +141,5 @@ async fn run( http, })).await; - - return Ok(Box::new(reply)) + Ok(Box::new(reply)) } \ No newline at end of file From d0ffbcdd3503dbbde397b6fa934192389b45b1ed Mon Sep 17 00:00:00 2001 From: ocean <47253870+banocean@users.noreply.github.com> Date: Wed, 18 Jun 2025 12:26:42 +0200 Subject: [PATCH 08/16] config change applied log --- src/server/guild/ws.rs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/server/guild/ws.rs b/src/server/guild/ws.rs index 70f0741..5b2543f 100644 --- a/src/server/guild/ws.rs +++ b/src/server/guild/ws.rs @@ -6,6 +6,7 @@ use serde::{Deserialize, Serialize}; use serde_json::Value; use tokio::sync::mpsc::UnboundedSender; use tokio_stream::wrappers::UnboundedReceiverStream; +use tracing::info; use twilight_model::id::Id; use twilight_model::id::marker::UserMarker; use twilight_model::user::CurrentUserGuild; @@ -186,6 +187,11 @@ async fn on_message( let _ = guilds_editing.broadcast_changes(&context, guild.id).await; } InboundMessage::ApplyChanges => { + info!( + name: "applying config changes", + author_id = %info.user.id, + guild_id = %guild.id + ); guilds_editing.apply_changes(&context, guild.id).await; let _ = guilds_editing.broadcast_changes(&context, guild.id).await; let _ = context.redis.announce_config_update(guild.id).await From c43241db8a5a823130966873b4d15a064d0c3d37 Mon Sep 17 00:00:00 2001 From: ocean <47253870+banocean@users.noreply.github.com> Date: Wed, 18 Jun 2025 12:30:40 +0200 Subject: [PATCH 09/16] log automod violations --- src/events/automod/mod.rs | 14 +++++++++++--- src/events/mod.rs | 6 +++--- src/models/config/automod/mod.rs | 6 +++--- 3 files changed, 17 insertions(+), 9 deletions(-) diff --git a/src/events/automod/mod.rs b/src/events/automod/mod.rs index 75fbc47..a38bd89 100644 --- a/src/events/automod/mod.rs +++ b/src/events/automod/mod.rs @@ -3,11 +3,12 @@ mod checks; mod filters; use std::sync::Arc; +use tracing::info; use twilight_http::Client; use twilight_model::channel::Message; use crate::context::Context; use crate::events::automod::actions::run_action; -use crate::models::config::automod::TrigerEvent; +use crate::models::config::automod::TriggerEvent; use crate::models::config::automod::ignore::{Ignore, IgnoreMode}; fn is_ignored(message: &Message, ignore_rule: &Option) -> bool { @@ -37,7 +38,7 @@ pub async fn run( message: Message, discord_http: Arc, context: Arc, - triger: TrigerEvent + trigger: TriggerEvent ) -> Result<(), ()> { let guild_id = message.guild_id.ok_or(())?; let guild_config = Arc::new(context.mongodb.get_config(guild_id).await.map_err(|_| ())?); @@ -52,7 +53,7 @@ pub async fn run( let message = Arc::new(message); for automod_rule in &automod_config.rules { - if triger == TrigerEvent::MessageUpdate && !automod_rule.check_on_edit { continue } + if trigger == TriggerEvent::MessageUpdate && !automod_rule.check_on_edit { continue } if is_ignored(&message, &automod_rule.ignore) { continue } for filter_meta in &automod_rule.filters { @@ -64,6 +65,13 @@ pub async fn run( if !is_allowed { return Ok(()) } } + info!( + name: "automod rule violated", + message = ?message, + automod_rule = ?automod_rule, + trigger = ?trigger, + ); + for action in &automod_rule.actions { let run = run_action( action.action.to_owned(), diff --git a/src/events/mod.rs b/src/events/mod.rs index 34f0a99..5cf2c23 100644 --- a/src/events/mod.rs +++ b/src/events/mod.rs @@ -3,7 +3,7 @@ use twilight_http::Client; use twilight_model::gateway::event::Event; use twilight_model::gateway::payload::incoming::GuildCreate; use crate::context::Context; -use crate::models::config::automod::TrigerEvent; +use crate::models::config::automod::TriggerEvent; pub mod automod; mod case; @@ -27,11 +27,11 @@ pub async fn on_event( } Event::MessageCreate(event) => { let message = event.as_ref().0.to_owned(); - self::automod::run(message.to_owned(), discord_http, context.to_owned(), TrigerEvent::MessageCreate).await.ok(); + self::automod::run(message.to_owned(), discord_http, context.to_owned(), TriggerEvent::MessageCreate).await.ok(); self::top::run(message, context).await.ok(); } Event::MessageUpdate(event) => { - self::automod::run(event.0, discord_http, context, TrigerEvent::MessageCreate).await.ok(); + self::automod::run(event.0, discord_http, context, TriggerEvent::MessageCreate).await.ok(); } Event::GuildCreate(event) => { let guild = if let GuildCreate::Available(guild) = *event { guild } else { return Ok(()) }; diff --git a/src/models/config/automod/mod.rs b/src/models/config/automod/mod.rs index 6f6a18c..ac76329 100644 --- a/src/models/config/automod/mod.rs +++ b/src/models/config/automod/mod.rs @@ -41,8 +41,8 @@ pub struct AutoModerationRule { pub name: String, } -#[derive(PartialEq)] -pub enum TrigerEvent { +#[derive(PartialEq, Debug)] +pub enum TriggerEvent { MessageCreate, MessageUpdate -} \ No newline at end of file +} From 7b69ff513112200a6f3aa1e04f8770ddb869bc0c Mon Sep 17 00:00:00 2001 From: ocean <47253870+banocean@users.noreply.github.com> Date: Wed, 18 Jun 2025 12:30:59 +0200 Subject: [PATCH 10/16] log new guilds --- src/events/setup.rs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/events/setup.rs b/src/events/setup.rs index adaf04c..6298d91 100644 --- a/src/events/setup.rs +++ b/src/events/setup.rs @@ -1,4 +1,5 @@ use std::sync::Arc; +use tracing::info; use twilight_http::Client; use twilight_model::id::Id; use twilight_model::id::marker::GuildMarker; @@ -16,6 +17,11 @@ pub async fn run( } } else { return Ok(()); }; + info!( + name: "registering setup command", + guild_id = %guild_id + ); + let application_id = twilight_http.current_user() .await.map_err(Error::from)?.model().await.map_err(Error::from)?.id; twilight_http From 9ae3da99b9a6411f27a460099d0e3e549509ec91 Mon Sep 17 00:00:00 2001 From: ocean <47253870+banocean@users.noreply.github.com> Date: Wed, 18 Jun 2025 12:31:33 +0200 Subject: [PATCH 11/16] remove redundant println --- src/server/error.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/server/error.rs b/src/server/error.rs index 9d2d2b4..3de9f65 100644 --- a/src/server/error.rs +++ b/src/server/error.rs @@ -63,7 +63,6 @@ impl> MapErrorIntoInternalRejection for Result Result { - println!("{:?}", rejection); Ok(if let Some(rejection) = rejection.find::() { warp::reply::with_status(rejection.to_string(), match rejection { #[cfg(feature = "http-interactions")] From d7b36516da64f7d1f51ade55154fc5f792adc392 Mon Sep 17 00:00:00 2001 From: ocean <47253870+banocean@users.noreply.github.com> Date: Wed, 18 Jun 2025 13:05:11 +0200 Subject: [PATCH 12/16] replace remaining println with tracing log macros --- src/server/guild/editing.rs | 15 ++++++++------- src/server/guild/ws.rs | 8 +++++--- src/tasks.rs | 3 ++- src/utils/errors.rs | 1 - 4 files changed, 15 insertions(+), 12 deletions(-) diff --git a/src/server/guild/editing.rs b/src/server/guild/editing.rs index 3d60595..6a57911 100644 --- a/src/server/guild/editing.rs +++ b/src/server/guild/editing.rs @@ -4,6 +4,7 @@ use mongodb::bson::doc; use mongodb::bson::oid::ObjectId; use serde_json::{Map, Value}; use tokio::sync::{Mutex, RwLock}; +use tracing::{error, warn}; use twilight_model::id::Id; use twilight_model::id::marker::{GuildMarker, UserMarker}; use crate::context::Context; @@ -78,7 +79,7 @@ impl GuildsEditing { let config = context.mongodb .get_config(guild_id) .await - .inspect_err(|error| println!("{error:?}")) + .inspect_err(|error| error!(name: "mongodb error", ?error)) .ok()?; let guild = self.get_guild(guild_id).await?; @@ -100,7 +101,7 @@ impl GuildsEditing { pub async fn apply_changes(&self, context: &Arc, guild_id: Id) -> Option<()> { let config = context.mongodb.get_config(guild_id).await - .inspect_err(|error| println!("{error:?}")) + .inspect_err(|error| error!(name: "mongodb error", ?error)) .ok()?; let is_guild_premium = config.premium; @@ -109,20 +110,20 @@ impl GuildsEditing { let mut guild_lock = guild.lock().await; let mut new_config = serde_json::to_value(config) - .inspect_err(|error| println!("{error:?}")) + .inspect_err(|error| error!(name: "cannot convert guild config to value", ?error)) .ok()?; json_patch::merge(&mut new_config, &guild_lock.changes); let new_config: GuildConfig = serde_json::from_value(new_config) - .inspect_err(|error| println!("{error:?}")) + .inspect_err(|error| error!(name: "cannot marge edits with guild config", ?error)) .ok()?; if new_config.guild_id != guild_id { - println!("Someone tried changing guild_id in config id={guild_id}"); + warn!(name: "someone tried changing guild_id in guild config", guild_id=%guild_id); return None } if new_config.premium != is_guild_premium { - println!("Someone tried changing premium in config id={guild_id}"); + warn!(name: "someone tried changing premium in guild config", guild_id=%guild_id); return None } @@ -133,7 +134,7 @@ impl GuildsEditing { ) .upsert(true) .await - .inspect_err(|error| println!("{error:?}")) + .inspect_err(|error| error!(name: "mongodb error", ?error)) .ok()?; context.mongodb.configs_cache.remove(&guild_id); diff --git a/src/server/guild/ws.rs b/src/server/guild/ws.rs index 5b2543f..267be3c 100644 --- a/src/server/guild/ws.rs +++ b/src/server/guild/ws.rs @@ -6,7 +6,7 @@ use serde::{Deserialize, Serialize}; use serde_json::Value; use tokio::sync::mpsc::UnboundedSender; use tokio_stream::wrappers::UnboundedReceiverStream; -use tracing::info; +use tracing::{error, info}; use twilight_model::id::Id; use twilight_model::id::marker::UserMarker; use twilight_model::user::CurrentUserGuild; @@ -122,7 +122,7 @@ pub async fn handle_connection( let message = match result { Ok(message) => message, Err(error) => { - println!("{error:?}"); + error!(name: "error while receiving message on ws_rx channel", ?error); break } }; @@ -195,7 +195,9 @@ async fn on_message( guilds_editing.apply_changes(&context, guild.id).await; let _ = guilds_editing.broadcast_changes(&context, guild.id).await; let _ = context.redis.announce_config_update(guild.id).await - .inspect_err(|error| println!("{error}")); + .inspect_err(|error| { + error!(name: "error sending guild_id to redis update announcer", ?error, %guild.id) + }); } } } diff --git a/src/tasks.rs b/src/tasks.rs index 1039fc8..a60b9e2 100644 --- a/src/tasks.rs +++ b/src/tasks.rs @@ -3,6 +3,7 @@ use std::time::Duration; use mongodb::bson::DateTime; use tokio::task::JoinHandle; use tokio::time::Instant; +use tracing::info; use twilight_http::Client; use twilight_model::id::Id; use twilight_model::id::marker::RoleMarker; @@ -30,7 +31,7 @@ pub async fn interval( if let Ok(tasks) = tasks { if !tasks.is_empty() { - println!("Loaded {} tasks", tasks.len()) + info!(name: "loaded tasks", count = tasks.len()) }; for task in tasks { diff --git a/src/utils/errors.rs b/src/utils/errors.rs index e32488f..94e572d 100644 --- a/src/utils/errors.rs +++ b/src/utils/errors.rs @@ -94,7 +94,6 @@ impl Error { match self { Error::Debug(errors) => { - println!("{errors:?}"); let description = format!("```{}```", errors.join("``` ```")); EmbedBuilder::new() .title("Internal Server Error".to_string()) From d547031040abc42fc6161ecf33dc53a9153fb6f9 Mon Sep 17 00:00:00 2001 From: ocean <47253870+banocean@users.noreply.github.com> Date: Wed, 18 Jun 2025 13:15:34 +0200 Subject: [PATCH 13/16] remove unused crates from Cargo.toml --- Cargo.toml | 2 -- 1 file changed, 2 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 1e81fc7..de3d032 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -22,11 +22,9 @@ tokio-stream = "0.1" tracing = { version = "0.1", features = ["std"] } tracing-subscriber = { version = "0.3", features = ["env-filter","registry", "std", "fmt"] } opentelemetry_sdk = "0.30" -opentelemetry-stdout = "0.30" opentelemetry-appender-tracing = "0.30" tracing-opentelemetry = "0.31" opentelemetry = { version = "0.30", features = ["trace"] } -tonic = "0.13" opentelemetry-otlp = { version = "0.30", features = ["http-proto", "grpc-tonic"] } mongodb = "3.2" From 5984b26acf47769cb609b38f26bd01827d71bd05 Mon Sep 17 00:00:00 2001 From: ocean <47253870+banocean@users.noreply.github.com> Date: Wed, 18 Jun 2025 13:15:59 +0200 Subject: [PATCH 14/16] format tracing_init.rs --- src/tracing_init.rs | 28 +++++++++++++--------------- 1 file changed, 13 insertions(+), 15 deletions(-) diff --git a/src/tracing_init.rs b/src/tracing_init.rs index a820832..10bbd9c 100644 --- a/src/tracing_init.rs +++ b/src/tracing_init.rs @@ -1,10 +1,10 @@ -use opentelemetry_otlp::WithExportConfig; -use tracing_subscriber::prelude::__tracing_subscriber_SubscriberExt; -use std::time::Duration; use opentelemetry::KeyValue; use opentelemetry::trace::TracerProvider; +use opentelemetry_otlp::WithExportConfig; use opentelemetry_sdk::Resource; -use tracing::{warn, Level}; +use std::time::Duration; +use tracing::{Level, warn}; +use tracing_subscriber::prelude::__tracing_subscriber_SubscriberExt; pub fn init() { let endpoint = std::env::var("OTEL_ENDPOINT"); @@ -21,7 +21,7 @@ pub fn init() { ("tonic", Level::WARN), ("h2", Level::WARN), ]) - .with_default(Level::DEBUG) + .with_default(Level::DEBUG), ) .with(tracing_subscriber::filter::LevelFilter::from_level( Level::DEBUG, @@ -57,19 +57,17 @@ pub fn init() { let tracer = tracer_provider.tracer("custom"); - let otel_span_layer = tracing_opentelemetry::layer() - .with_tracer(tracer); - let otel_logs_layer = opentelemetry_appender_tracing::layer::OpenTelemetryTracingBridge::new(&logs_provider); - - let subscriber = subscriber - .with(otel_span_layer) - .with(otel_logs_layer); + let otel_span_layer = tracing_opentelemetry::layer().with_tracer(tracer); + let otel_logs_layer = + opentelemetry_appender_tracing::layer::OpenTelemetryTracingBridge::new(&logs_provider); + let subscriber = subscriber.with(otel_span_layer).with(otel_logs_layer); tracing::subscriber::set_global_default(subscriber).unwrap(); } else { tracing::subscriber::set_global_default(subscriber).unwrap(); - warn!("There is no OTEL_ENDPOINT environment variable, running with OpenTelemetry disabled"); + warn!( + "There is no OTEL_ENDPOINT environment variable, running with OpenTelemetry disabled" + ); }; - -} \ No newline at end of file +} From 0d2ee1326c899b16cff04dd139ac2ac2cdd0dd68 Mon Sep 17 00:00:00 2001 From: ocean <47253870+banocean@users.noreply.github.com> Date: Wed, 18 Jun 2025 13:20:11 +0200 Subject: [PATCH 15/16] add guild_id to command logs --- src/database/mongodb.rs | 2 +- src/events/setup.rs | 2 +- src/server/interaction.rs | 6 ++++-- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/database/mongodb.rs b/src/database/mongodb.rs index cabed5f..978f7c1 100644 --- a/src/database/mongodb.rs +++ b/src/database/mongodb.rs @@ -69,7 +69,7 @@ impl MongoDBConnection { info!( name: "cached_config", cache_size = self.configs_cache.len(), - guild_id = %guild_id, + %guild_id, "Cached guild config" ); diff --git a/src/events/setup.rs b/src/events/setup.rs index 6298d91..7a01dfc 100644 --- a/src/events/setup.rs +++ b/src/events/setup.rs @@ -19,7 +19,7 @@ pub async fn run( info!( name: "registering setup command", - guild_id = %guild_id + %guild_id ); let application_id = twilight_http.current_user() diff --git a/src/server/interaction.rs b/src/server/interaction.rs index 5292079..ac97e16 100644 --- a/src/server/interaction.rs +++ b/src/server/interaction.rs @@ -39,9 +39,9 @@ async fn handle_command( "command_execution", module = command.module, command_name = command.name, - guild_id = guild_id.to_string(), + %guild_id, interaction = ?interaction_ctx.orginal, - config = ?config, + ?config, execute_as_slower, ); @@ -55,6 +55,7 @@ async fn handle_command( command.name, module = command.module, ?response, + %guild_id, "finished command execution" ); @@ -89,6 +90,7 @@ async fn handle_command( command.name, module = command.module, ?response, + %guild_id, "finished command execution" ); From b3e49cdeef4885276924abbde025887057347a3d Mon Sep 17 00:00:00 2001 From: ocean <47253870+banocean@users.noreply.github.com> Date: Wed, 18 Jun 2025 13:30:18 +0200 Subject: [PATCH 16/16] simplify logs --- src/database/mongodb.rs | 3 +-- src/database/redis.rs | 3 +-- src/events/automod/mod.rs | 7 +------ src/main.rs | 2 +- src/server/guild/editing.rs | 4 ++-- 5 files changed, 6 insertions(+), 13 deletions(-) diff --git a/src/database/mongodb.rs b/src/database/mongodb.rs index 978f7c1..c4c392d 100644 --- a/src/database/mongodb.rs +++ b/src/database/mongodb.rs @@ -67,10 +67,9 @@ impl MongoDBConnection { self.configs_cache.insert(guild_id, config.to_owned()); info!( - name: "cached_config", + name: "cached guild config", cache_size = self.configs_cache.len(), %guild_id, - "Cached guild config" ); Ok(config) diff --git a/src/database/redis.rs b/src/database/redis.rs index 7d6ca19..66b82f9 100644 --- a/src/database/redis.rs +++ b/src/database/redis.rs @@ -138,10 +138,9 @@ impl RedisConnection { mongodb.configs_cache.remove(&id); info!( - name: "config_update", + name: "removed config from cache due to update", cache_size = mongodb.configs_cache.len(), guild_id = %id, - "There is a guild config update" ); } diff --git a/src/events/automod/mod.rs b/src/events/automod/mod.rs index a38bd89..d545e65 100644 --- a/src/events/automod/mod.rs +++ b/src/events/automod/mod.rs @@ -65,12 +65,7 @@ pub async fn run( if !is_allowed { return Ok(()) } } - info!( - name: "automod rule violated", - message = ?message, - automod_rule = ?automod_rule, - trigger = ?trigger, - ); + info!(name: "automod rule violated", ?message, ?automod_rule, ?trigger); for action in &automod_rule.actions { let run = run_action( diff --git a/src/main.rs b/src/main.rs index 2d15a64..f47f040 100644 --- a/src/main.rs +++ b/src/main.rs @@ -32,7 +32,7 @@ async fn main() { dotenv().ok(); tracing_init::init(); - info!("Starting app"); + info!("starting app"); let context = Arc::new(Context::new().await); diff --git a/src/server/guild/editing.rs b/src/server/guild/editing.rs index 6a57911..07dcd0a 100644 --- a/src/server/guild/editing.rs +++ b/src/server/guild/editing.rs @@ -118,12 +118,12 @@ impl GuildsEditing { .ok()?; if new_config.guild_id != guild_id { - warn!(name: "someone tried changing guild_id in guild config", guild_id=%guild_id); + warn!(name: "someone tried changing guild_id in guild config", %guild_id); return None } if new_config.premium != is_guild_premium { - warn!(name: "someone tried changing premium in guild config", guild_id=%guild_id); + warn!(name: "someone tried changing premium in guild config", %guild_id); return None }