Heracles/src/query.rs

78 lines
2.4 KiB
Rust
Raw Normal View History

// Copyright 2021 Jeremy Wall
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
use std::collections::HashMap;
use prometheus_http_query::{Client, response::{PromqlResult, Data}};
use serde::{Serialize, Deserialize};
use tracing::debug;
2024-02-07 19:18:30 -06:00
use chrono::prelude::*;
pub struct QueryConn<'conn> {
source: &'conn str,
query: &'conn str,
}
impl<'conn> QueryConn<'conn> {
pub fn new<'a: 'conn>(source: &'a str, query: &'a str) -> Self {
Self {
source,
query,
}
}
pub async fn get_results(&self) -> anyhow::Result<PromqlResult> {
debug!("Getting results for query");
let client = Client::try_from(self.source)?;
2024-02-07 19:18:30 -06:00
let end = Utc::now().timestamp();
let start = end - (60 * 10);
let step_resolution = 10 as f64;
Ok(client.query_range(self.query, start, end, step_resolution).get().await?)
}
}
#[derive(Serialize, Deserialize)]
pub struct DataPoint {
2024-02-07 19:18:30 -06:00
timestamp: f64,
value: f64,
}
#[derive(Serialize, Deserialize)]
pub enum QueryResult {
Series(Vec<(HashMap<String, String>, Vec<DataPoint>)>),
Scalar(DataPoint),
}
pub fn to_samples(data: Data) -> QueryResult {
match data {
Data::Matrix(mut range) => {
QueryResult::Series(range.drain(0..).map(|rv| {
let (metric, mut samples) = rv.into_inner();
(metric, samples.drain(0..).map(|s| {
2024-02-07 19:18:30 -06:00
DataPoint { timestamp: s.timestamp(), value: s.value() }
}).collect())
}).collect())
}
Data::Vector(mut vector) => {
QueryResult::Series(vector.drain(0..).map(|iv| {
let (metric, sample) = iv.into_inner();
2024-02-07 19:18:30 -06:00
(metric, vec![DataPoint { timestamp: sample.timestamp(), value: sample.value() }])
}).collect())
}
Data::Scalar(sample) => {
2024-02-07 19:18:30 -06:00
QueryResult::Scalar(DataPoint { timestamp: sample.timestamp(), value: sample.value() })
}
}
}