Serve metrics via :31755
This commit is contained in:
		
							
								
								
									
										94
									
								
								Cargo.lock
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										94
									
								
								Cargo.lock
									
									
									
										generated
									
									
									
								
							@@ -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"
 | 
			
		||||
 
 | 
			
		||||
@@ -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" }
 | 
			
		||||
 
 | 
			
		||||
@@ -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(
 | 
			
		||||
 
 | 
			
		||||
@@ -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<dyn std::error::Error + Send + Sync>> {
 | 
			
		||||
 | 
			
		||||
    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| {
 | 
			
		||||
 
 | 
			
		||||
@@ -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()
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user