scouter_sql/sql/traits/
observability.rs1use crate::sql::query::Queries;
2use crate::sql::schema::ObservabilityResult;
3
4use crate::sql::error::SqlError;
5use scouter_types::TimeInterval;
6use scouter_types::{ObservabilityMetricRequest, ObservabilityMetrics};
7
8use sqlx::{postgres::PgQueryResult, Pool, Postgres};
9
10use async_trait::async_trait;
11
12#[async_trait]
13pub trait ObservabilitySqlLogic {
14 async fn insert_observability_record(
22 pool: &Pool<Postgres>,
23 record: &ObservabilityMetrics,
24 entity_id: &i32,
25 ) -> Result<PgQueryResult, SqlError> {
26 let query = Queries::InsertObservabilityRecord.get_query();
27 let route_metrics = serde_json::to_value(&record.route_metrics)?;
28
29 sqlx::query(query)
30 .bind(entity_id)
31 .bind(record.request_count)
32 .bind(record.error_count)
33 .bind(route_metrics)
34 .execute(pool)
35 .await
36 .map_err(SqlError::SqlxError)
37 }
38
39 async fn get_binned_observability_metrics(
40 pool: &Pool<Postgres>,
41 params: &ObservabilityMetricRequest,
42 entity_id: &i32,
43 ) -> Result<Vec<ObservabilityResult>, SqlError> {
44 let query = Queries::GetBinnedObservabilityMetrics.get_query();
45
46 let time_interval = TimeInterval::from_string(¶ms.time_interval).to_minutes();
47
48 let bin = time_interval as f64 / params.max_data_points as f64;
49
50 sqlx::query_as(query)
51 .bind(bin)
52 .bind(time_interval)
53 .bind(entity_id)
54 .fetch_all(pool)
55 .await
56 .map_err(SqlError::SqlxError)
57 }
58}