From ecd75d6f551eaa151d46feea7101c6c0c3401d68 Mon Sep 17 00:00:00 2001 From: jude Date: Sun, 24 Mar 2024 20:37:29 +0000 Subject: [PATCH] Add metrics --- src/event_handlers.rs | 11 ++++++++--- src/metrics.rs | 25 +++++++++++++++++-------- src/postman/metrics.rs | 40 ---------------------------------------- src/postman/sender.rs | 7 +++++-- 4 files changed, 30 insertions(+), 53 deletions(-) delete mode 100644 src/postman/metrics.rs diff --git a/src/event_handlers.rs b/src/event_handlers.rs index ab46441..fb255a1 100644 --- a/src/event_handlers.rs +++ b/src/event_handlers.rs @@ -1,10 +1,11 @@ -use poise::serenity_prelude::ActivityData; use poise::{ serenity_prelude as serenity, - serenity_prelude::{CreateEmbed, CreateMessage, FullEvent}, + serenity_prelude::{ActivityData, CreateEmbed, CreateMessage, FullEvent}, }; -use crate::{component_models::ComponentDataModel, Data, Error, THEME_COLOR}; +use crate::{ + component_models::ComponentDataModel, metrics::COMMAND_COUNTER, Data, Error, THEME_COLOR, +}; pub async fn listener( ctx: &serenity::Context, @@ -67,6 +68,10 @@ To stay up to date on the latest features and fixes, join our [Discord](https:// component_model.act(ctx, data, &component).await; } + + if let Some(command) = interaction.clone().command() { + COMMAND_COUNTER.with_label_values(&[command.data.name.as_str()]).inc(); + } } _ => {} } diff --git a/src/metrics.rs b/src/metrics.rs index 83bef0e..5818c8a 100644 --- a/src/metrics.rs +++ b/src/metrics.rs @@ -6,12 +6,24 @@ use prometheus::{IntCounterVec, Opts, Registry}; lazy_static! { pub static ref REGISTRY: Registry = Registry::new(); pub static ref REQUEST_COUNTER: IntCounterVec = - IntCounterVec::new(Opts::new("requests", "Requests"), &["method", "status", "route"]) + IntCounterVec::new(Opts::new("requests", "Web requests"), &["method", "status", "route"]) .unwrap(); + pub static ref REMINDER_COUNTER: IntCounterVec = + IntCounterVec::new(Opts::new("reminders_sent", "Reminders sent"), &["channel"]).unwrap(); + pub static ref REMINDER_FAIL_COUNTER: IntCounterVec = IntCounterVec::new( + Opts::new("reminders_failed", "Reminders failed"), + &["channel", "error"] + ) + .unwrap(); + pub static ref COMMAND_COUNTER: IntCounterVec = + IntCounterVec::new(Opts::new("commands", "Commands used"), &["command"]).unwrap(); } pub fn init_metrics() { REGISTRY.register(Box::new(REQUEST_COUNTER.clone())).unwrap(); + REGISTRY.register(Box::new(REMINDER_COUNTER.clone())).unwrap(); + REGISTRY.register(Box::new(REMINDER_FAIL_COUNTER.clone())).unwrap(); + REGISTRY.register(Box::new(COMMAND_COUNTER.clone())).unwrap(); } pub async fn serve() { @@ -25,12 +37,9 @@ async fn metrics() -> String { let encoder = prometheus::TextEncoder::new(); let res_custom = encoder.encode_to_string(®ISTRY.gather()); - match res_custom { - Ok(s) => s, - Err(e) => { - warn!("Error encoding metrics: {:?}", e); + res_custom.unwrap_or_else(|e| { + warn!("Error encoding metrics: {:?}", e); - String::new() - } - } + String::new() + }) } diff --git a/src/postman/metrics.rs b/src/postman/metrics.rs deleted file mode 100644 index 42a58b9..0000000 --- a/src/postman/metrics.rs +++ /dev/null @@ -1,40 +0,0 @@ -use axum::{routing::get, Router}; -use lazy_static; -use log::warn; -use prometheus::{register_int_counter, IntCounter, Registry}; - -lazy_static! { - static ref REGISTRY: Registry = Registry::new(); - pub static ref REMINDERS_SENT: IntCounter = - register_int_counter!("reminders_sent", "Number of reminders sent").unwrap(); - pub static ref REMINDERS_FAILED: IntCounter = - register_int_counter!("reminders_failed", "Number of reminders failed").unwrap(); -} - -pub fn init_metrics() { - REGISTRY.register(Box::new(REMINDERS_SENT.clone())).unwrap(); - REGISTRY.register(Box::new(REMINDERS_FAILED.clone())).unwrap(); -} - -pub async fn serve() { - let app = Router::new().route("/metrics", get(metrics)); - - let metrics_port = std::env("PROMETHEUS_PORT").unwrap(); - let listener = - tokio::net::TcpListener::bind(format!("localhost:{}", metrics_port)).await.unwrap(); - axum::serve(listener, app).await.unwrap(); -} - -async fn metrics() -> String { - let encoder = prometheus::TextEncoder::new(); - let res_custom = encoder.encode_to_string(®ISTRY.gather()); - - match res_custom { - Ok(s) => s, - Err(e) => { - warn!("Error encoding metrics: {:?}", e); - - String::new() - } - } -} diff --git a/src/postman/sender.rs b/src/postman/sender.rs index 5353a5f..1ef8045 100644 --- a/src/postman/sender.rs +++ b/src/postman/sender.rs @@ -26,7 +26,7 @@ use sqlx::{ Executor, }; -use crate::Database; +use crate::{metrics::REMINDER_COUNTER, Database}; lazy_static! { pub static ref TIMEFROM_REGEX: Regex = @@ -442,10 +442,13 @@ impl Reminder { None => error.to_string(), }; + REMINDER_COUNTER.with_label_values(&[self.channel_id.to_string().as_str(), &message]).inc(); error!("[Reminder {}] {}", self.id, message); } - async fn log_success(&self) {} + async fn log_success(&self) { + REMINDER_COUNTER.with_label_values(&[self.channel_id.to_string().as_str()]).inc() + } async fn set_sent(&self, pool: impl Executor<'_, Database = Database> + Copy) { sqlx::query!("UPDATE reminders SET `status` = 'sent' WHERE `id` = ?", self.id)