Serve metrics via :31755

This commit is contained in:
jude 2023-10-21 23:45:42 +01:00
parent 6615e05196
commit cee578eaf1
5 changed files with 141 additions and 4 deletions

94
Cargo.lock generated
View File

@ -139,6 +139,55 @@ version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" 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]] [[package]]
name = "backtrace" name = "backtrace"
version = "0.3.68" version = "0.3.68"
@ -1080,6 +1129,12 @@ dependencies = [
"regex-automata 0.1.10", "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]] [[package]]
name = "memchr" name = "memchr"
version = "2.5.0" version = "2.5.0"
@ -1967,6 +2022,16 @@ dependencies = [
"serde", "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]] [[package]]
name = "serde_repr" name = "serde_repr"
version = "0.1.14" version = "0.1.14"
@ -2152,6 +2217,7 @@ dependencies = [
name = "soundfx-rs" name = "soundfx-rs"
version = "1.5.11" version = "1.5.11"
dependencies = [ dependencies = [
"axum",
"dashmap", "dashmap",
"dotenv", "dotenv",
"env_logger", "env_logger",
@ -2359,6 +2425,12 @@ dependencies = [
"unicode-ident", "unicode-ident",
] ]
[[package]]
name = "sync_wrapper"
version = "0.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160"
[[package]] [[package]]
name = "tempfile" name = "tempfile"
version = "3.6.0" version = "3.6.0"
@ -2551,6 +2623,28 @@ dependencies = [
"tracing", "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]] [[package]]
name = "tower-service" name = "tower-service"
version = "0.3.2" version = "0.3.2"

View File

@ -21,6 +21,10 @@ dashmap = "5.3"
serde = "1.0" serde = "1.0"
dotenv = "0.15.0" dotenv = "0.15.0"
prometheus = { version = "0.13.3", optional = true } 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"] [patch."https://github.com/serenity-rs/serenity"]
serenity = { version = "0.11.6" } serenity = { version = "0.11.6" }

View File

@ -5,7 +5,7 @@ use poise::serenity_prelude::{
ReactionType, ReactionType,
}; };
#[cfg(feature = "prometheus")] #[cfg(feature = "metrics")]
use crate::metrics::PLAY_COUNTER; use crate::metrics::PLAY_COUNTER;
use crate::{ use crate::{
cmds::autocomplete_sound, cmds::autocomplete_sound,
@ -29,7 +29,7 @@ pub async fn play(
let guild = ctx.guild().unwrap(); let guild = ctx.guild().unwrap();
#[cfg(feature = "prometheus")] #[cfg(feature = "metrics")]
PLAY_COUNTER.inc(); PLAY_COUNTER.inc();
ctx.say( ctx.say(

View File

@ -5,7 +5,7 @@ mod cmds;
mod consts; mod consts;
mod error; mod error;
mod event_handlers; mod event_handlers;
#[cfg(feature = "prometheus")] #[cfg(feature = "metrics")]
mod metrics; mod metrics;
mod models; mod models;
mod utils; mod utils;
@ -144,6 +144,12 @@ async fn main() -> Result<(), Box<dyn std::error::Error + Send + Sync>> {
sqlx::migrate!().run(&database).await?; sqlx::migrate!().run(&database).await?;
#[cfg(feature = "metrics")]
{
metrics::init_metrics();
tokio::spawn(async { metrics::serve().await });
}
poise::Framework::builder() poise::Framework::builder()
.token(discord_token) .token(discord_token)
.setup(move |ctx, _bot, framework| { .setup(move |ctx, _bot, framework| {

View File

@ -1,7 +1,40 @@
use std::net::SocketAddr;
use axum::{routing::get, Router};
use lazy_static; use lazy_static;
use prometheus::{register_int_counter, IntCounter}; use log::warn;
use prometheus::{register_int_counter, IntCounter, Registry};
lazy_static! { lazy_static! {
static ref REGISTRY: Registry = Registry::new();
pub static ref PLAY_COUNTER: IntCounter = pub static ref PLAY_COUNTER: IntCounter =
register_int_counter!("play", "Number of calls to /play").unwrap(); 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(&REGISTRY.gather());
match res_custom {
Ok(s) => s,
Err(e) => {
warn!("Error encoding metrics: {:?}", e);
String::new()
}
}
}