diff --git a/crates/ruff_metrics/src/json.rs b/crates/ruff_metrics/src/json.rs index 2bf589240b..cb6eee4b8e 100644 --- a/crates/ruff_metrics/src/json.rs +++ b/crates/ruff_metrics/src/json.rs @@ -43,7 +43,12 @@ impl JsonRecorder { .to_str() .unwrap() .to_string(); - let storage = PrerenderedAtomicStorage { dest, executable }; + let start = SystemTime::now(); + let storage = PrerenderedAtomicStorage { + dest, + executable, + start, + }; let registry = Registry::new(storage); JsonRecorder { registry } } @@ -74,6 +79,7 @@ impl Recorder for JsonRecorder { struct PrerenderedAtomicStorage { dest: Arc>, executable: String, + start: SystemTime, } impl Storage for PrerenderedAtomicStorage { @@ -82,15 +88,30 @@ impl Storage for PrerenderedAtomicStorage { type Histogram = Arc; fn counter(&self, key: &Key) -> Self::Counter { - Arc::new(Metric::new(self.executable.clone(), key, self.dest.clone())) + Arc::new(Metric::new( + self.executable.clone(), + self.start, + key, + self.dest.clone(), + )) } fn gauge(&self, key: &Key) -> Self::Gauge { - Arc::new(Metric::new(self.executable.clone(), key, self.dest.clone())) + Arc::new(Metric::new( + self.executable.clone(), + self.start, + key, + self.dest.clone(), + )) } fn histogram(&self, key: &Key) -> Self::Histogram { - Arc::new(Metric::new(self.executable.clone(), key, self.dest.clone())) + Arc::new(Metric::new( + self.executable.clone(), + self.start, + key, + self.dest.clone(), + )) } } @@ -100,11 +121,17 @@ struct Metric { /// having to re-render the information about the metrics key.) name_and_labels: String, dest: Arc>, + start: SystemTime, value: AtomicU64, } impl Metric { - fn new(executable: String, key: &Key, dest: Arc>) -> Metric { + fn new( + executable: String, + start: SystemTime, + key: &Key, + dest: Arc>, + ) -> Metric { let mut json = Map::default(); json.insert("executable".to_string(), executable.into()); json.insert("key".to_string(), key.name().into()); @@ -118,6 +145,7 @@ impl Metric { Metric { name_and_labels, dest, + start, value: AtomicU64::default(), } } @@ -138,6 +166,14 @@ impl Metric { if let Ok(timestamp) = SystemTime::now().duration_since(UNIX_EPOCH) { write!(&mut buffer, ",\"timestamp\":{}", timestamp.as_secs_f64()).unwrap(); } + if let Ok(since_start) = SystemTime::now().duration_since(self.start) { + write!( + &mut buffer, + ",\"since_start\":{}", + since_start.as_secs_f64() + ) + .unwrap(); + } f(&mut buffer); buffer.push_str("}\n"); let _ = self.dest.lock().unwrap().write(buffer.as_bytes());