Skip to main content

scouter_sql/sql/traits/
observability.rs

1use 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    // Inserts a drift record into the database
15    //
16    // # Arguments
17    //
18    // * `record` - A drift record to insert into the database
19    // * `entity_id` - entity associated with observability records
20    //
21    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(&params.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}