From 5f70beb1bbc84a1f2c3cf3d28c5cb53e920a6750 Mon Sep 17 00:00:00 2001 From: Alexey Velikiy Date: Mon, 25 Oct 2021 20:47:41 +0300 Subject: [PATCH] qurieng continue --- client/.env.development | 2 +- client/.env.production | 2 +- server/src/api.rs | 3 +- server/src/api/metric.rs | 46 +++++++++++++++++++++++---- server/src/services/metric_service.rs | 10 ++++-- 5 files changed, 51 insertions(+), 12 deletions(-) diff --git a/client/.env.development b/client/.env.development index aabc50a..a6eeceb 100644 --- a/client/.env.development +++ b/client/.env.development @@ -1 +1 @@ -VUE_APP_API_URL="http://localhost:8000/api/" \ No newline at end of file +VUE_APP_API_URL="http://localhost:8000/api/" diff --git a/client/.env.production b/client/.env.production index 0f2952d..102d581 100644 --- a/client/.env.production +++ b/client/.env.production @@ -1 +1 @@ -VUE_APP_API_URL="/api/" \ No newline at end of file +VUE_APP_API_URL="/api/" diff --git a/server/src/api.rs b/server/src/api.rs index 892d64b..ef3df7f 100644 --- a/server/src/api.rs +++ b/server/src/api.rs @@ -66,12 +66,13 @@ impl API<'_> { message: "ok".to_owned(), }) }); + let metrics = metric::get_route(self.metric_service.clone()); let login = auth::get_route(self.user_service.clone()); let public = warp::fs::dir("public"); println!("Start server on 8000 port"); // TODO: move it to "server" - let routes = login.or(options).or(public).or(not_found); + let routes = login.or(metrics).or(options).or(public).or(not_found); warp::serve(routes).run(([127, 0, 0, 1], 8000)).await; } } diff --git a/server/src/api/metric.rs b/server/src/api/metric.rs index 896c819..d144961 100644 --- a/server/src/api/metric.rs +++ b/server/src/api/metric.rs @@ -1,10 +1,13 @@ use hastic::services::{metric_service, user_service}; +use subbeat::metric::Metric; use warp::filters::method::get; use warp::http::HeaderValue; +use warp::hyper::server::conn::Http; use warp::hyper::{Body, StatusCode}; +use warp::reject::Reject; use warp::{http::Response, Filter}; -use warp::{Rejection, Reply}; +use warp::{reject, Rejection, Reply}; use serde::Serialize; @@ -12,19 +15,48 @@ use crate::api::{self, API}; use parking_lot::RwLock; use std::collections::HashMap; +use std::convert::Infallible; +use std::fmt::Debug; use std::sync::Arc; #[derive(Serialize)] -struct QueryResponse {} +struct QueryResponse { + message: String, +} + +#[derive(Debug)] +struct BadQuery; + +impl Reject for BadQuery {} + +async fn query( + p: HashMap, + ms: Arc>, +) -> Result { + if !p.contains_key("from") || !p.contains_key("to") || !p.contains_key("step") { + return Err(warp::reject::custom(BadQuery)); + } + let from = p.get("from").unwrap().parse::().unwrap(); + let to = p.get("to").unwrap().parse::().unwrap(); + let step = p.get("step").unwrap().parse::().unwrap(); + + let prom = ms.read().get_prom(); + drop(ms); + let res = prom.query(from, to, step).await; + // let pm = subbeat::datasources::prometheus::Prometheus::new(&"http://".to_owned(), &"asd".to_owned()); + // let r = pm.query(from, to, step).await; + + Ok(API::json(&QueryResponse { + message: "hello".to_string(), + })) +} pub fn get_route( - metric_service: Arc>, + metric_service: Arc>, ) -> impl Filter + Clone { return warp::path!("api" / "metric") .and(get()) .and(warp::query::>()) - .map(move |p: HashMap| { - let qr = QueryResponse {}; - return api::API::json(&qr); - }); + .and(warp::any().map(move || metric_service.clone())) + .and_then(query); } diff --git a/server/src/services/metric_service.rs b/server/src/services/metric_service.rs index 1a79536..701fd92 100644 --- a/server/src/services/metric_service.rs +++ b/server/src/services/metric_service.rs @@ -1,13 +1,19 @@ use subbeat::datasources::prometheus::Prometheus; pub struct MetricService { - prom: Prometheus, + url: String, + query: String, } impl MetricService { pub fn new(url: &str, query: &str) -> MetricService { MetricService { - prom: Prometheus::new(&url.to_string(), &query.to_string()), + url: url.to_string(), + query: url.to_string(), } } + + pub fn get_prom(&self) -> Prometheus { + Prometheus::new(&self.url.to_string(), &self.query.to_string()) + } }