update + cleanup

This commit is contained in:
Robin Appelman 2024-02-12 19:42:04 +01:00
commit a6e23761a9
3 changed files with 24 additions and 21 deletions

View file

@ -8,15 +8,15 @@ license = "MIT OR Apache-2.0"
repository = "https://github.com/icewind1991/prometheus-edge-detector" repository = "https://github.com/icewind1991/prometheus-edge-detector"
[dependencies] [dependencies]
tokio = { version = "1.0", features = ["time"] } tokio = { version = "1.36", features = ["time"] }
err-derive = "0.3.0" thiserror = "1.0.57"
futures-util = "0.3.8" futures-util = "0.3.30"
reqwest = { version = "0.11.0", default-features = false, features = ["json"]} reqwest = { version = "0.11.24", default-features = false, features = ["json"]}
serde = { version = "1.0", features = ["derive"] } serde = { version = "1.0", features = ["derive"] }
[dev-dependencies] [dev-dependencies]
tokio = { version = "1.0", features = ["macros"] } tokio = { version = "1.36", features = ["macros", "rt-multi-thread"] }
main_error = "0.1.0" main_error = "0.1.2"
[features] [features]
default = ["default-tls"] default = ["default-tls"]

View file

@ -17,7 +17,7 @@
}; };
in rec { in rec {
devShells.default = pkgs.mkShell { devShells.default = pkgs.mkShell {
nativeBuildInputs = with pkgs; [cargo rustc clippy bacon cargo-edit cargo-msrv]; nativeBuildInputs = with pkgs; [cargo rustc clippy bacon cargo-edit cargo-msrv pkg-config openssl];
}; };
}); });
} }

View file

@ -1,19 +1,20 @@
use err_derive::Error; use thiserror::Error;
use reqwest::Client; use reqwest::Client;
use serde::Deserialize; use serde::Deserialize;
use std::cmp::{max, min}; use std::cmp::{max, min};
use std::collections::HashMap;
use std::time::SystemTime; use std::time::SystemTime;
use tokio::time::Duration; use tokio::time::Duration;
#[derive(Debug, Error)] #[derive(Debug, Error)]
pub enum Error { pub enum Error {
#[error(display = "Network error: {}", _0)] #[error("Network error: {0}")]
Network(reqwest::Error), Network(reqwest::Error),
#[error(display = "Malformed json response: {}", _0)] #[error("Malformed json response: {0}")]
MalformedResponse(reqwest::Error), MalformedResponse(reqwest::Error),
#[error(display = "Data point is not an interger: {}", _0)] #[error("Data point is not an integer: {0}")]
NonNumericDataPoint(String), NonNumericDataPoint(String),
#[error("Prometheus returned an error for the query")]
PrometheusError
} }
#[derive(Debug, Clone, Deserialize)] #[derive(Debug, Clone, Deserialize)]
@ -38,13 +39,11 @@ enum QueryResultDataType {
#[derive(Debug, Clone, Deserialize)] #[derive(Debug, Clone, Deserialize)]
#[serde(rename_all = "camelCase")] #[serde(rename_all = "camelCase")]
struct QueryResultData { struct QueryResultData {
result_type: QueryResultDataType,
result: Vec<QueryResultDataResult>, result: Vec<QueryResultDataResult>,
} }
#[derive(Debug, Clone, Deserialize)] #[derive(Debug, Clone, Deserialize)]
struct QueryResultDataResult { struct QueryResultDataResult {
metric: HashMap<String, String>,
values: Vec<QueryResultDataResultValue>, values: Vec<QueryResultDataResultValue>,
} }
@ -58,8 +57,8 @@ async fn query_prometheus(
start: u64, start: u64,
end: u64, end: u64,
step: usize, step: usize,
) -> Result<QueryResult, Error> { ) -> Result<QueryResultData, Error> {
client let result = client
.get(base_url) .get(base_url)
.query(&[ .query(&[
("query", query), ("query", query),
@ -69,10 +68,15 @@ async fn query_prometheus(
]) ])
.send() .send()
.await .await
.map_err(|err| Error::Network(err))? .map_err(Error::Network)?
.json() .json::<QueryResult>()
.await .await
.map_err(|err| Error::MalformedResponse(err)) .map_err(Error::MalformedResponse)?;
match result.status {
QueryResultStatus::Success => Ok(result.data),
QueryResultStatus::Error => Err(Error::PrometheusError),
}
} }
#[derive(Debug, Clone)] #[derive(Debug, Clone)]
@ -134,7 +138,6 @@ impl EdgeDetector {
), ),
) )
.await? .await?
.data
.result; .result;
let first_data = match data.into_iter().next() { let first_data = match data.into_iter().next() {