From ffed5d8c8967d0082579ead71220e4b60394919b Mon Sep 17 00:00:00 2001 From: krabat-l Date: Sat, 14 Feb 2026 15:45:59 +0800 Subject: [PATCH] feat: add cpu_time_seconds Prometheus metric Record CPU time from timing middleware as a Prometheus histogram so it can be scraped alongside the existing x-execution-time-ns header. --- bin/debug-trace-server/src/metrics.rs | 23 +++++++++++++++++++++++ bin/debug-trace-server/src/timing.rs | 4 ++++ 2 files changed, 27 insertions(+) diff --git a/bin/debug-trace-server/src/metrics.rs b/bin/debug-trace-server/src/metrics.rs index db8d1bc..348b6d5 100644 --- a/bin/debug-trace-server/src/metrics.rs +++ b/bin/debug-trace-server/src/metrics.rs @@ -163,6 +163,26 @@ impl ResponseSizeMetrics { } } +/// CPU execution time per request (global, no method label). +#[derive(Clone, Metrics)] +#[metrics(scope = "debug_trace")] +pub struct CpuTimeMetrics { + /// CPU execution time per request in seconds + cpu_time_seconds: Histogram, +} + +impl CpuTimeMetrics { + /// Creates global CPU time metrics. + pub fn create() -> Self { + Self::new_with_labels(&[] as &[(&str, &str)]) + } + + /// Records a CPU time measurement. + pub fn record(&self, seconds: f64) { + self.cpu_time_seconds.record(seconds); + } +} + // --------------------------------------------------------------------------- // ── Cache Layer ──────────────────────────────── // --------------------------------------------------------------------------- @@ -427,6 +447,9 @@ fn pre_register_all_metrics() { let _ = ResponseSizeMetrics::new_for_method(METHOD_TRACE_BLOCK); let _ = ResponseSizeMetrics::new_for_method(METHOD_TRACE_TRANSACTION); + // Request Layer: CPU time (global) + let _ = CpuTimeMetrics::create(); + // Cache Layer let _ = CacheMetrics::new_for_cache(CACHE_TYPE_DEBUG_TRACE); let _ = CacheMetrics::new_for_cache(CACHE_TYPE_TRACE); diff --git a/bin/debug-trace-server/src/timing.rs b/bin/debug-trace-server/src/timing.rs index 8cdf00a..956e86b 100644 --- a/bin/debug-trace-server/src/timing.rs +++ b/bin/debug-trace-server/src/timing.rs @@ -17,6 +17,8 @@ use http::{HeaderName, HeaderValue}; use pin_project_lite::pin_project; use tower::{Layer, Service}; +use crate::metrics::CpuTimeMetrics; + /// Header name for execution time in nanoseconds. pub const TIMING_HEADER_NAME: &str = "x-execution-time-ns"; @@ -111,6 +113,8 @@ where response.headers_mut().insert(header_name, header_value); } } + // Record as Prometheus metric + CpuTimeMetrics::create().record(Duration::from_nanos(cpu_ns).as_secs_f64()); Poll::Ready(Ok(response)) } Poll::Ready(Err(e)) => Poll::Ready(Err(e)),