Skip to main content

mcpr_integrations/store/query/
slow.rs

1//! Query: `mcpr proxy slow` — slowest requests above a threshold.
2
3use rusqlite::params;
4
5use super::QueryEngine;
6use super::logs::{LOG_COLUMNS, LogRow, map_log_row};
7
8/// Filter parameters for the slow query.
9pub struct SlowParams {
10    /// Proxy name to filter by (None = all proxies).
11    pub proxy: Option<String>,
12    /// Minimum latency in microseconds to include.
13    pub threshold_us: i64,
14    /// Only rows newer than this unix ms timestamp.
15    pub since_ts: i64,
16    /// Filter to a specific tool name.
17    pub tool: Option<String>,
18    /// Maximum number of rows to return.
19    pub limit: i64,
20}
21
22impl QueryEngine {
23    /// Fetch the slowest requests above a latency threshold, slowest first.
24    pub fn slow(&self, params: &SlowParams) -> Result<Vec<LogRow>, rusqlite::Error> {
25        let sql = format!(
26            "SELECT {LOG_COLUMNS}
27            FROM requests
28            WHERE (?1 IS NULL OR proxy = ?1)
29              AND latency_us >= ?2
30              AND (?3 IS NULL OR tool = ?3)
31              AND ts >= ?4
32            ORDER BY latency_us DESC
33            LIMIT ?5"
34        );
35
36        let mut stmt = self.conn().prepare(&sql)?;
37        let rows = stmt.query_map(
38            params![
39                params.proxy,
40                params.threshold_us,
41                params.tool,
42                params.since_ts,
43                params.limit,
44            ],
45            map_log_row,
46        )?;
47
48        rows.collect()
49    }
50
51    /// Fetch slow calls newer than a given timestamp (for `--tail` live stream).
52    pub fn slow_since(
53        &self,
54        params: &SlowParams,
55        after_ts: i64,
56    ) -> Result<Vec<LogRow>, rusqlite::Error> {
57        let sql = format!(
58            "SELECT {LOG_COLUMNS}
59            FROM requests
60            WHERE (?1 IS NULL OR proxy = ?1)
61              AND latency_us >= ?2
62              AND (?3 IS NULL OR tool = ?3)
63              AND ts > ?4
64            ORDER BY ts ASC"
65        );
66
67        let mut stmt = self.conn().prepare(&sql)?;
68        let rows = stmt.query_map(
69            params![params.proxy, params.threshold_us, params.tool, after_ts],
70            map_log_row,
71        )?;
72
73        rows.collect()
74    }
75}