mirror of
https://codeberg.org/icewind/prometheus-edge-detector.git
synced 2026-06-03 17:34:06 +02:00
update + cleanup
This commit is contained in:
parent
cb685ded3e
commit
a6e23761a9
3 changed files with 24 additions and 21 deletions
14
Cargo.toml
14
Cargo.toml
|
|
@ -8,17 +8,17 @@ 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"]
|
||||||
default-tls = ["reqwest/default-tls"]
|
default-tls = ["reqwest/default-tls"]
|
||||||
rustls-tls = ["reqwest/rustls-tls"]
|
rustls-tls = ["reqwest/rustls-tls"]
|
||||||
|
|
|
||||||
|
|
@ -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];
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
|
||||||
29
src/lib.rs
29
src/lib.rs
|
|
@ -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() {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue