Skip to main content

execgo_runtime/
metrics.rs

1use 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}