execgo_runtime/
metrics.rs1use crate::repo::MetricsSnapshot;
2
3const BUCKETS_MS: &[u64] = &[100, 250, 500, 1_000, 5_000, 10_000, 30_000, 60_000, 300_000];
4
5pub fn render_prometheus(snapshot: &MetricsSnapshot) -> String {
6 let mut out = String::new();
7 out.push_str(
8 "# HELP execgo_runtime_tasks_total Total tasks by terminal and in-flight status\n",
9 );
10 out.push_str("# TYPE execgo_runtime_tasks_total counter\n");
11 for (status, count) in &snapshot.by_status {
12 out.push_str(&format!(
13 "execgo_runtime_tasks_total{{status=\"{}\"}} {}\n",
14 status, count
15 ));
16 }
17
18 let running = snapshot
19 .by_status
20 .get("running")
21 .copied()
22 .unwrap_or_default();
23 out.push_str("# HELP execgo_runtime_tasks_running Tasks currently running\n");
24 out.push_str("# TYPE execgo_runtime_tasks_running gauge\n");
25 out.push_str(&format!("execgo_runtime_tasks_running {}\n", running));
26
27 out.push_str("# HELP execgo_runtime_task_errors_total Total tasks by error code\n");
28 out.push_str("# TYPE execgo_runtime_task_errors_total counter\n");
29 for (code, count) in &snapshot.by_error_code {
30 out.push_str(&format!(
31 "execgo_runtime_task_errors_total{{code=\"{}\"}} {}\n",
32 code, count
33 ));
34 }
35
36 out.push_str(
37 "# HELP execgo_runtime_task_duration_ms Task duration histogram in milliseconds\n",
38 );
39 out.push_str("# TYPE execgo_runtime_task_duration_ms histogram\n");
40 let mut sorted = snapshot.finished_durations_ms.clone();
41 sorted.sort_unstable();
42 let mut sum = 0u64;
43 for duration in &sorted {
44 sum = sum.saturating_add(*duration);
45 }
46 for bucket in BUCKETS_MS {
47 let count = sorted
48 .iter()
49 .filter(|duration| **duration <= *bucket)
50 .count() as u64;
51 out.push_str(&format!(
52 "execgo_runtime_task_duration_ms_bucket{{le=\"{}\"}} {}\n",
53 bucket, count
54 ));
55 }
56 out.push_str(&format!(
57 "execgo_runtime_task_duration_ms_bucket{{le=\"+Inf\"}} {}\n",
58 sorted.len()
59 ));
60 out.push_str(&format!("execgo_runtime_task_duration_ms_sum {}\n", sum));
61 out.push_str(&format!(
62 "execgo_runtime_task_duration_ms_count {}\n",
63 sorted.len()
64 ));
65 out
66}