use salvo::prelude::*;
use serde::Serialize;
#[handler]
pub async fn metrics(_req: &mut Request, _depot: &mut Depot, res: &mut Response) {
let snapshot = MetricsResponse {
messages_bridge_total: 0,
messages_bridge_teams_to_matrix: 0,
messages_bridge_matrix_to_teams: 0,
errors_total: 0,
uptime_seconds: 0,
};
res.render(Text::Plain(prometheus_format(&snapshot)));
}
#[derive(Serialize)]
struct MetricsResponse {
messages_bridge_total: u64,
messages_bridge_teams_to_matrix: u64,
messages_bridge_matrix_to_teams: u64,
errors_total: u64,
uptime_seconds: u64,
}
fn prometheus_format(snapshot: &MetricsResponse) -> String {
format!(
r#"# HELP messages_bridge_total Total number of messages bridged
# TYPE messages_bridge_total counter
messages_bridge_total {}
# HELP messages_bridge_teams_to_matrix Number of messages bridged from Teams to Matrix
# TYPE messages_bridge_teams_to_matrix counter
messages_bridge_teams_to_matrix {}
# HELP messages_bridge_matrix_to_teams Number of messages bridged from Matrix to Teams
# TYPE messages_bridge_matrix_to_teams counter
messages_bridge_matrix_to_teams {}
# HELP errors_total Total number of errors
# TYPE errors_total counter
errors_total {}
# HELP uptime_seconds Bridge uptime in seconds
# TYPE uptime_seconds gauge
uptime_seconds {}
"#,
snapshot.messages_bridge_total,
snapshot.messages_bridge_teams_to_matrix,
snapshot.messages_bridge_matrix_to_teams,
snapshot.errors_total,
snapshot.uptime_seconds
)
}