fraiseql_server/config/
metrics.rs1use serde::Deserialize;
4
5#[derive(Debug, Clone, Deserialize)]
7pub struct MetricsConfig {
8 #[serde(default = "default_enabled")]
10 pub enabled: bool,
11
12 #[serde(default = "default_path")]
14 pub path: String,
15
16 #[serde(default = "default_format")]
19 pub format: String,
20
21 #[serde(default)]
23 pub slos: SloConfig,
24}
25
26impl Default for MetricsConfig {
27 fn default() -> Self {
28 Self {
29 enabled: default_enabled(),
30 path: default_path(),
31 format: default_format(),
32 slos: SloConfig::default(),
33 }
34 }
35}
36
37const fn default_enabled() -> bool {
38 true
39}
40fn default_path() -> String {
41 "/metrics".to_string()
42}
43fn default_format() -> String {
44 "prometheus".to_string()
45}
46
47#[derive(Debug, Clone, Deserialize, Default)]
49pub struct SloConfig {
50 #[serde(default = "default_latency_percentiles")]
52 pub latency_percentiles: Vec<f64>,
53
54 #[serde(default)]
56 pub latency_targets: LatencyTargets,
57
58 #[serde(default = "default_availability_target")]
60 pub availability_target: f64,
61
62 #[serde(default = "default_error_rate_target")]
64 pub error_rate_target: f64,
65}
66
67fn default_latency_percentiles() -> Vec<f64> {
68 vec![0.5, 0.9, 0.95, 0.99]
69}
70const fn default_availability_target() -> f64 {
71 0.999
72}
73const fn default_error_rate_target() -> f64 {
74 0.01
75}
76
77#[derive(Debug, Clone, Deserialize, Default)]
79pub struct LatencyTargets {
80 #[serde(default = "default_graphql_latency")]
82 pub graphql_p99_ms: u64,
83
84 #[serde(default = "default_webhook_latency")]
86 pub webhook_p99_ms: u64,
87
88 #[serde(default = "default_auth_latency")]
90 pub auth_p99_ms: u64,
91
92 #[serde(default = "default_file_upload_latency")]
94 pub file_upload_p99_ms: u64,
95}
96
97const fn default_graphql_latency() -> u64 {
98 100
99}
100const fn default_webhook_latency() -> u64 {
101 500
102}
103const fn default_auth_latency() -> u64 {
104 10
105}
106const fn default_file_upload_latency() -> u64 {
107 2000
108}