use std::collections::HashMap;
use axum::Router;
use axum::routing::get;
use prometheus::TextEncoder;
use tokio::net::TcpListener;
use twitch_irc::TwitchIRCClient;
use twitch_irc::login::StaticLoginCredentials;
use twitch_irc::{ClientConfig, MetricsConfig, SecureTCPTransport};
const WEBSERVER_LISTEN_ADDR: &str = "127.0.0.1:3000";
#[tokio::main]
pub async fn main() {
tracing_subscriber::fmt::init();
let config = ClientConfig {
metrics_config: MetricsConfig::Enabled {
constant_labels: {
let mut labels = HashMap::new();
labels.insert("app".to_owned(), "metrics-example".to_owned());
labels.insert("version".to_owned(), env!("CARGO_PKG_VERSION").to_owned());
labels
},
metrics_registry: None,
},
..ClientConfig::default()
};
let (mut incoming_messages, client) =
TwitchIRCClient::<SecureTCPTransport, StaticLoginCredentials>::new(config);
let message_handler = tokio::spawn(async move {
while let Some(message) = incoming_messages.recv().await {
tracing::info!("Received message: {:?}", message);
}
});
client.join("sodapoppin".to_owned()).unwrap();
let web_app = Router::new().route("/metrics", get(get_metrics));
let listener = TcpListener::bind(WEBSERVER_LISTEN_ADDR).await.unwrap();
tracing::info!("Listening for requests at {WEBSERVER_LISTEN_ADDR}");
axum::serve(listener, web_app).await.unwrap();
message_handler.await.unwrap();
}
pub async fn get_metrics() -> String {
TextEncoder.encode_to_string(&prometheus::gather()).unwrap()
}