Rename metrics and player_count to osrs_world_players
This commit is contained in:
parent
dccd2ca20c
commit
58f6d57571
3 changed files with 48 additions and 22 deletions
9
src/collectors/mod.rs
Normal file
9
src/collectors/mod.rs
Normal file
|
@ -0,0 +1,9 @@
|
|||
pub mod player_count;
|
||||
// pub mod stats;
|
||||
|
||||
pub trait PromMetric {
|
||||
fn to_metric_string(self: &Self) -> String;
|
||||
}
|
||||
|
||||
pub const USER_AGENT: &str = "osrs-prometheus-exporter";
|
||||
pub const RUNELITE_API_VERSION: &str = "runelite-1.9.13";
|
|
@ -1,6 +1,7 @@
|
|||
use serde::{Deserialize, Deserializer};
|
||||
use std::fmt::{Display, Formatter};
|
||||
use std::str;
|
||||
use super::PromMetric;
|
||||
|
||||
#[derive(Deserialize, Debug)]
|
||||
pub struct Worlds {
|
||||
|
@ -18,8 +19,8 @@ pub enum WorldLocation {
|
|||
|
||||
impl<'de> Deserialize<'de> for WorldLocation {
|
||||
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
|
||||
where
|
||||
D: Deserializer<'de>,
|
||||
where
|
||||
D: Deserializer<'de>,
|
||||
{
|
||||
let field = i16::deserialize(deserializer)?;
|
||||
let world = match field {
|
||||
|
@ -66,8 +67,8 @@ pub enum WorldType {
|
|||
|
||||
impl<'de> Deserialize<'de> for WorldType {
|
||||
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
|
||||
where
|
||||
D: Deserializer<'de>,
|
||||
where
|
||||
D: Deserializer<'de>,
|
||||
{
|
||||
let field = String::deserialize(deserializer)?;
|
||||
let res = match field.as_str() {
|
||||
|
@ -101,15 +102,11 @@ pub struct World {
|
|||
pub types: Vec<WorldType>,
|
||||
}
|
||||
|
||||
pub trait PromMetric {
|
||||
fn to_metric_string(self: &Self) -> String;
|
||||
}
|
||||
|
||||
impl PromMetric for World {
|
||||
fn to_metric_string(&self) -> String {
|
||||
//"player_count{id=\"301\",location=\"Germany\,"isMembers=\"true\"} 123"
|
||||
format!(
|
||||
"player_count{{id=\"{}\",location=\"{}\",isMembers=\"{:?}\"}} {}",
|
||||
"osrs_world_players{{id=\"{}\",location=\"{}\",isMembers=\"{:?}\"}} {}",
|
||||
self.id,
|
||||
self.location,
|
||||
self.is_members(),
|
||||
|
@ -123,3 +120,16 @@ impl World {
|
|||
self.types.contains(&WorldType::Members)
|
||||
}
|
||||
}
|
||||
|
||||
pub async fn get_player_count() -> eyre::Result<Vec<World>> {
|
||||
let req_url = format!("https://api.runelite.net/{}/worlds.js", super::RUNELITE_API_VERSION);
|
||||
let resp = reqwest::Client::new()
|
||||
.get(req_url)
|
||||
.header("User-Agent", super::USER_AGENT)
|
||||
.send()
|
||||
.await?
|
||||
.json::<Worlds>()
|
||||
.await?;
|
||||
|
||||
Ok(resp.worlds)
|
||||
}
|
33
src/main.rs
33
src/main.rs
|
@ -2,27 +2,34 @@ mod collector;
|
|||
|
||||
use axum::routing::get;
|
||||
use axum::Router;
|
||||
use collector::{PromMetric, Worlds};
|
||||
use axum::extract::Path;
|
||||
use axum::http::StatusCode;
|
||||
use axum::response::IntoResponse;
|
||||
use collectors::PromMetric;
|
||||
|
||||
async fn metrics() -> String {
|
||||
let resp = reqwest::get("https://api.runelite.net/runelite-1.9.13/worlds.js")
|
||||
.await
|
||||
.unwrap()
|
||||
.json::<Worlds>()
|
||||
.await
|
||||
.unwrap();
|
||||
|
||||
let metric_strings: Vec<String> = resp
|
||||
.worlds
|
||||
fn convert_into_metrics(data: Vec<impl PromMetric>) -> String {
|
||||
let metrics: Vec<String> = data
|
||||
.into_iter()
|
||||
.map(|w| w.to_metric_string())
|
||||
.collect();
|
||||
metric_strings.join("\n")
|
||||
|
||||
metrics.join("\n")
|
||||
}
|
||||
|
||||
async fn worlds() -> impl IntoResponse {
|
||||
let resp = match collectors::player_count::get_player_count().await {
|
||||
Ok(r) => r,
|
||||
Err(_) => return (StatusCode::INTERNAL_SERVER_ERROR, "Nope".to_string())
|
||||
};
|
||||
|
||||
(StatusCode::OK, convert_into_metrics(resp))
|
||||
}
|
||||
|
||||
#[tokio::main]
|
||||
async fn main() {
|
||||
let app = Router::new().route("/metrics", get(metrics));
|
||||
let app = Router::new()
|
||||
.route("/worlds", get(worlds));
|
||||
// .route("/stats/:rsn", get(stats));
|
||||
|
||||
println!("Starting...");
|
||||
|
||||
|
|
Loading…
Reference in a new issue