From cee578eaf14f508774913c218ee1fd6fc5993bce Mon Sep 17 00:00:00 2001 From: jude Date: Sat, 21 Oct 2023 23:45:42 +0100 Subject: [PATCH] Serve metrics via :31755 --- Cargo.lock | 94 ++++++++++++++++++++++++++++++++++++++++++++++++ Cargo.toml | 4 +++ src/cmds/play.rs | 4 +-- src/main.rs | 8 ++++- src/metrics.rs | 35 +++++++++++++++++- 5 files changed, 141 insertions(+), 4 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index bd6e93b..39abc2d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -139,6 +139,55 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" +[[package]] +name = "axum" +version = "0.6.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b829e4e32b91e643de6eafe82b1d90675f5874230191a4ffbc1b336dec4d6bf" +dependencies = [ + "async-trait", + "axum-core", + "bitflags 1.3.2", + "bytes", + "futures-util", + "http", + "http-body", + "hyper", + "itoa", + "matchit", + "memchr", + "mime", + "percent-encoding", + "pin-project-lite", + "rustversion", + "serde", + "serde_json", + "serde_path_to_error", + "serde_urlencoded", + "sync_wrapper", + "tokio", + "tower", + "tower-layer", + "tower-service", +] + +[[package]] +name = "axum-core" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "759fa577a247914fd3f7f76d62972792636412fbfd634cd452f6a385a74d2d2c" +dependencies = [ + "async-trait", + "bytes", + "futures-util", + "http", + "http-body", + "mime", + "rustversion", + "tower-layer", + "tower-service", +] + [[package]] name = "backtrace" version = "0.3.68" @@ -1080,6 +1129,12 @@ dependencies = [ "regex-automata 0.1.10", ] +[[package]] +name = "matchit" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e7465ac9959cc2b1404e8e2367b43684a6d13790fe23056cc8c6c5a6b7bcb94" + [[package]] name = "memchr" version = "2.5.0" @@ -1967,6 +2022,16 @@ dependencies = [ "serde", ] +[[package]] +name = "serde_path_to_error" +version = "0.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4beec8bce849d58d06238cb50db2e1c417cfeafa4c63f692b15c82b7c80f8335" +dependencies = [ + "itoa", + "serde", +] + [[package]] name = "serde_repr" version = "0.1.14" @@ -2152,6 +2217,7 @@ dependencies = [ name = "soundfx-rs" version = "1.5.11" dependencies = [ + "axum", "dashmap", "dotenv", "env_logger", @@ -2359,6 +2425,12 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "sync_wrapper" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" + [[package]] name = "tempfile" version = "3.6.0" @@ -2551,6 +2623,28 @@ dependencies = [ "tracing", ] +[[package]] +name = "tower" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" +dependencies = [ + "futures-core", + "futures-util", + "pin-project", + "pin-project-lite", + "tokio", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "tower-layer" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c20c8dbed6283a09604c3e69b4b7eeb54e298b8a600d4d5ecb5ad39de609f1d0" + [[package]] name = "tower-service" version = "0.3.2" diff --git a/Cargo.toml b/Cargo.toml index 36ec5a9..168dde3 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -21,6 +21,10 @@ dashmap = "5.3" serde = "1.0" dotenv = "0.15.0" prometheus = { version = "0.13.3", optional = true } +axum = { version = "0.6.20", optional = true } + +[features] +metrics = ["dep:prometheus", "dep:axum"] [patch."https://github.com/serenity-rs/serenity"] serenity = { version = "0.11.6" } diff --git a/src/cmds/play.rs b/src/cmds/play.rs index ad3afc8..e441fc9 100644 --- a/src/cmds/play.rs +++ b/src/cmds/play.rs @@ -5,7 +5,7 @@ use poise::serenity_prelude::{ ReactionType, }; -#[cfg(feature = "prometheus")] +#[cfg(feature = "metrics")] use crate::metrics::PLAY_COUNTER; use crate::{ cmds::autocomplete_sound, @@ -29,7 +29,7 @@ pub async fn play( let guild = ctx.guild().unwrap(); - #[cfg(feature = "prometheus")] + #[cfg(feature = "metrics")] PLAY_COUNTER.inc(); ctx.say( diff --git a/src/main.rs b/src/main.rs index 2b15666..cda9923 100644 --- a/src/main.rs +++ b/src/main.rs @@ -5,7 +5,7 @@ mod cmds; mod consts; mod error; mod event_handlers; -#[cfg(feature = "prometheus")] +#[cfg(feature = "metrics")] mod metrics; mod models; mod utils; @@ -144,6 +144,12 @@ async fn main() -> Result<(), Box> { sqlx::migrate!().run(&database).await?; + #[cfg(feature = "metrics")] + { + metrics::init_metrics(); + tokio::spawn(async { metrics::serve().await }); + } + poise::Framework::builder() .token(discord_token) .setup(move |ctx, _bot, framework| { diff --git a/src/metrics.rs b/src/metrics.rs index 96929d9..e85a774 100644 --- a/src/metrics.rs +++ b/src/metrics.rs @@ -1,7 +1,40 @@ +use std::net::SocketAddr; + +use axum::{routing::get, Router}; use lazy_static; -use prometheus::{register_int_counter, IntCounter}; +use log::warn; +use prometheus::{register_int_counter, IntCounter, Registry}; lazy_static! { + static ref REGISTRY: Registry = Registry::new(); pub static ref PLAY_COUNTER: IntCounter = register_int_counter!("play", "Number of calls to /play").unwrap(); } + +pub fn init_metrics() { + REGISTRY.register(Box::new(PLAY_COUNTER.clone())).unwrap(); +} + +pub async fn serve() { + let app = Router::new().route("/", get(metrics)); + let addr = SocketAddr::from(([127, 0, 0, 1], 31755)); + + axum::Server::bind(&addr) + .serve(app.into_make_service()) + .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() + } + } +}