Skip to main content

nodedb_types/config/tuning/
promql.rs

1// SPDX-License-Identifier: Apache-2.0
2
3//! PromQL tuning — limits and defaults for the `/obsv/api/v1/*` read
4//! endpoints.
5
6use serde::{Deserialize, Serialize};
7
8fn default_max_samples() -> usize {
9    5_000_000
10}
11
12fn default_lookback_delta_ms() -> i64 {
13    // Prometheus' default lookback delta: 5 minutes.
14    300_000
15}
16
17fn default_max_points_per_series() -> usize {
18    // Prometheus' range-query resolution cap.
19    11_000
20}
21
22/// Tuning knobs for PromQL reads over stored timeseries data.
23#[derive(Debug, Clone, Serialize, Deserialize)]
24pub struct PromqlTuning {
25    /// Stored rows one PromQL request can load. A request that needs more
26    /// fails with an error. It never returns a truncated result.
27    #[serde(default = "default_max_samples")]
28    pub max_samples: usize,
29    /// How far back an instant selector looks for a sample, in milliseconds.
30    #[serde(default = "default_lookback_delta_ms")]
31    pub lookback_delta_ms: i64,
32    /// Points one series of a range query can hold. A finer step fails.
33    #[serde(default = "default_max_points_per_series")]
34    pub max_points_per_series: usize,
35}
36
37impl Default for PromqlTuning {
38    fn default() -> Self {
39        Self {
40            max_samples: default_max_samples(),
41            lookback_delta_ms: default_lookback_delta_ms(),
42            max_points_per_series: default_max_points_per_series(),
43        }
44    }
45}
46
47#[cfg(test)]
48mod tests {
49    use super::*;
50
51    #[test]
52    fn defaults_match_prometheus_where_it_has_one() {
53        let t = PromqlTuning::default();
54        assert_eq!(t.max_samples, 5_000_000);
55        assert_eq!(t.lookback_delta_ms, 300_000);
56        assert_eq!(t.max_points_per_series, 11_000);
57    }
58
59    #[test]
60    fn override_max_samples() {
61        let t: PromqlTuning = toml::from_str("max_samples = 2").unwrap();
62        assert_eq!(t.max_samples, 2);
63        assert_eq!(t.lookback_delta_ms, 300_000);
64    }
65}