Add tracing support for reqwest
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
This commit is contained in:
parent
41dd742407
commit
375717af28
8 changed files with 384 additions and 74 deletions
|
@ -7,17 +7,14 @@ pub trait PromMetric {
|
|||
fn to_metric_string(self: &Self) -> String;
|
||||
}
|
||||
|
||||
pub const USER_AGENT: &str = "osrs-prometheus-exporter";
|
||||
|
||||
#[derive(Deserialize)]
|
||||
struct GithubTag {
|
||||
name: String,
|
||||
}
|
||||
|
||||
async fn get_runelite_version() -> eyre::Result<String> {
|
||||
let resp = reqwest::Client::new()
|
||||
let resp = crate::transport::http::new()
|
||||
.get("https://api.github.com/repos/runelite/runelite/tags")
|
||||
.header("User-Agent", USER_AGENT)
|
||||
.send()
|
||||
.await?
|
||||
.json::<Vec<GithubTag>>()
|
||||
|
|
|
@ -124,9 +124,8 @@ impl World {
|
|||
pub async fn get_player_count() -> eyre::Result<Vec<World>> {
|
||||
let runelite_version = super::get_runelite_version().await?;
|
||||
let req_url = format!("https://api.runelite.net/{}/worlds.js", runelite_version);
|
||||
let resp = reqwest::Client::new()
|
||||
let resp = crate::transport::http::new()
|
||||
.get(req_url)
|
||||
.header("User-Agent", super::USER_AGENT)
|
||||
.send()
|
||||
.await?
|
||||
.json::<Worlds>()
|
||||
|
|
|
@ -68,9 +68,8 @@ const SKILLS: [&str; 25] = [
|
|||
|
||||
pub async fn get_player_stats(rsn: &str) -> eyre::Result<Vec<SkillInfo>> {
|
||||
let req_url = format!("https://oldschool.runescape.wiki/cors/m=hiscore_oldschool/index_lite.ws?player={}", rsn);
|
||||
let resp = reqwest::Client::new()
|
||||
let resp = crate::transport::http::new()
|
||||
.get(req_url)
|
||||
.header("User-Agent", super::USER_AGENT)
|
||||
.send()
|
||||
.await?;
|
||||
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
mod collectors;
|
||||
mod lifecycle;
|
||||
mod transport;
|
||||
|
||||
use axum::{Router, BoxError};
|
||||
use axum::extract::Path;
|
||||
|
|
37
src/transport/http.rs
Normal file
37
src/transport/http.rs
Normal file
|
@ -0,0 +1,37 @@
|
|||
use reqwest::{Request, Response};
|
||||
use reqwest_middleware::{ClientBuilder, ClientWithMiddleware};
|
||||
use reqwest_middleware::{Middleware, Next, Result};
|
||||
use reqwest_retry::{RetryTransientMiddleware, policies::ExponentialBackoff};
|
||||
use reqwest_tracing::TracingMiddleware;
|
||||
use async_trait::async_trait;
|
||||
|
||||
pub const USER_AGENT: &str = "osrs-prometheus-exporter";
|
||||
|
||||
pub fn new() -> ClientWithMiddleware {
|
||||
let retry_policy = ExponentialBackoff::builder().build_with_max_retries(3);
|
||||
|
||||
ClientBuilder::new(reqwest::Client::new())
|
||||
// Add default headers
|
||||
.with(DefaultHeaderMiddleware::new())
|
||||
// Trace HTTP requests. See the tracing crate to make use of these traces.
|
||||
.with(TracingMiddleware::default())
|
||||
// Retry failed requests.
|
||||
.with(RetryTransientMiddleware::new_with_policy(retry_policy))
|
||||
.build()
|
||||
}
|
||||
|
||||
struct DefaultHeaderMiddleware {}
|
||||
|
||||
impl DefaultHeaderMiddleware {
|
||||
fn new() -> Self {
|
||||
DefaultHeaderMiddleware{}
|
||||
}
|
||||
}
|
||||
|
||||
#[async_trait]
|
||||
impl Middleware for DefaultHeaderMiddleware {
|
||||
async fn handle(&self, mut req: Request, extensions: &mut task_local_extensions::Extensions, next: Next<'_>) -> Result<Response> {
|
||||
req.headers_mut().insert("User-Agent", USER_AGENT.parse().unwrap());
|
||||
next.run(req, extensions).await
|
||||
}
|
||||
}
|
1
src/transport/mod.rs
Normal file
1
src/transport/mod.rs
Normal file
|
@ -0,0 +1 @@
|
|||
pub mod http;
|
Loading…
Add table
Add a link
Reference in a new issue