Compare commits

..

No commits in common. "72fc8fb5889c7e37dad307a454330f43599af935" and "49e8db169c74ae7238b9eeba2a51b277dad9a1bf" have entirely different histories.

View File

@ -1,5 +1,4 @@
use axum::{ use axum::{
extract::State,
routing::get, routing::get,
Router, Router,
}; };
@ -11,8 +10,6 @@ use serde::{
Serialize, Serialize,
}; };
use std::collections::HashMap;
#[derive(Serialize, Deserialize)] #[derive(Serialize, Deserialize)]
struct TrafficDataThresholds { struct TrafficDataThresholds {
level: i64, level: i64,
@ -32,7 +29,12 @@ struct TrafficDataItem {
thresholds: Vec<TrafficDataThresholds>, thresholds: Vec<TrafficDataThresholds>,
} }
async fn get_baeder_names() -> Result<HashMap<String, String>, String> { struct BaederNames {
id: String,
name: String,
}
async fn get_baeder_names() -> Result<Vec<BaederNames>, String> {
let client = reqwest::Client::new(); let client = reqwest::Client::new();
let baedernames_req = client.get(String::from("https://www.berlinerbaeder.de/baeder/sommerbaeder-auslastung/")) let baedernames_req = client.get(String::from("https://www.berlinerbaeder.de/baeder/sommerbaeder-auslastung/"))
@ -49,23 +51,19 @@ async fn get_baeder_names() -> Result<HashMap<String, String>, String> {
let r = Regex::new(r#"<tr data-bath="(.+)" data-name="(.+)" data-address="#) let r = Regex::new(r#"<tr data-bath="(.+)" data-name="(.+)" data-address="#)
.map_err(|_err| String::from("Cannot parse regex"))?; .map_err(|_err| String::from("Cannot parse regex"))?;
let mut baedernames= HashMap::new(); let mut baedernames: Vec<BaederNames> = vec!{};
for c in r.captures_iter(baedernames_body.as_str()) { for c in r.captures_iter(baedernames_body.as_str()) {
baedernames.insert( baedernames.push(BaederNames {
c.get(1).unwrap().as_str().to_string(), // id id: c.get(1).unwrap().as_str().to_string(),
c.get(2).unwrap().as_str().to_string(), // name name: c.get(2).unwrap().as_str().to_string(),
); })
} }
return Ok(baedernames); return Ok(baedernames);
} }
#[derive(Clone)]
struct AppState {
baedernames: HashMap<String, String>,
}
#[tokio::main] #[tokio::main]
async fn main() { async fn main() {
@ -93,24 +91,11 @@ async fn main() {
} }
} }
// If baedernames cannot be fetched, ignore them let baedernames = get_baeder_names().await;
let baedernames = get_baeder_names().await.unwrap_or(HashMap::new());
println!("Baedernames:");
for (id, name) in &baedernames {
println!("{id}: {name}");
}
println!("");
let state = AppState {
baedernames,
};
let app = Router::new() let app = Router::new()
.route("/", get(route_index)) .route("/", get(route_index))
.route("/metrics", get(route_metrics)) .route("/metrics", get(route_metrics));
.with_state(state);
let listener = tokio::net::TcpListener::bind(listen).await.unwrap(); let listener = tokio::net::TcpListener::bind(listen).await.unwrap();
println!("Server listening on: http://{}", listener.local_addr().unwrap()); println!("Server listening on: http://{}", listener.local_addr().unwrap());
@ -122,9 +107,7 @@ async fn route_index() -> String {
return String::from("Prometheus exporter for Berlinerbaeder occupancy"); return String::from("Prometheus exporter for Berlinerbaeder occupancy");
} }
async fn route_metrics( async fn route_metrics() -> Result<String, String> {
State(state): State<AppState>,
) -> Result<String, String> {
let client = reqwest::Client::new(); let client = reqwest::Client::new();
let trafficdata_req = client.get(String::from("https://www.berlinerbaeder.de/traffic/trafficdata.json")) let trafficdata_req = client.get(String::from("https://www.berlinerbaeder.de/traffic/trafficdata.json"))
.send().await .send().await
@ -143,7 +126,7 @@ async fn route_metrics(
let mut out = String::new(); let mut out = String::new();
for bad in trafficdata { for bad in trafficdata {
out.push_str(&format!("berlinerbaeder_occupation{{bad=\"{}\" badname=\"{}\"}} {}\n", bad.id, state.baedernames.get(&bad.id).unwrap_or(&String::new()), bad.counter.unwrap_or(-1))); out.push_str(&format!("berlinerbaeder_occupation{{bad=\"{}\"}} {}\n", bad.id, bad.counter.unwrap_or(-1)));
} }
return Ok(out); return Ok(out);