LCOV - code coverage report
Current view: top level - pgxn/neon/communicator/src/worker_process - lfc_metrics.rs (source / functions) Coverage Total Hit
Test: 4be46b1c0003aa3bbac9ade362c676b419df4c20.info Lines: 0.0 % 30 0
Test Date: 2025-07-22 17:50:06 Functions: 0.0 % 6 0

            Line data    Source code
       1              : use measured::{
       2              :     FixedCardinalityLabel, Gauge, GaugeVec, LabelGroup, MetricGroup,
       3              :     label::{LabelName, LabelValue, StaticLabelSet},
       4              :     metric::{MetricEncoding, gauge::GaugeState, group::Encoding},
       5              : };
       6              : 
       7              : use super::callbacks::callback_get_lfc_metrics;
       8              : 
       9              : pub(crate) struct LfcMetricsCollector;
      10              : 
      11              : #[derive(MetricGroup)]
      12              : #[metric(new())]
      13              : struct LfcMetricsGroup {
      14              :     /// LFC cache size limit in bytes
      15              :     lfc_cache_size_limit: Gauge,
      16              :     /// LFC cache hits
      17              :     lfc_hits: Gauge,
      18              :     /// LFC cache misses
      19              :     lfc_misses: Gauge,
      20              :     /// LFC chunks used (chunk = 1MB)
      21              :     lfc_used: Gauge,
      22              :     /// LFC cache writes
      23              :     lfc_writes: Gauge,
      24              :     /// Approximate working set size in pages of 8192 bytes
      25              :     #[metric(init = GaugeVec::dense())]
      26              :     lfc_approximate_working_set_size_windows: GaugeVec<StaticLabelSet<MinuteAsSeconds>>,
      27              : }
      28              : 
      29              : impl<T: Encoding> MetricGroup<T> for LfcMetricsCollector
      30              : where
      31              :     GaugeState: MetricEncoding<T>,
      32              : {
      33            0 :     fn collect_group_into(&self, enc: &mut T) -> Result<(), <T as Encoding>::Err> {
      34            0 :         let g = LfcMetricsGroup::new();
      35              : 
      36            0 :         let lfc_metrics = callback_get_lfc_metrics();
      37              : 
      38            0 :         g.lfc_cache_size_limit.set(lfc_metrics.lfc_cache_size_limit);
      39            0 :         g.lfc_hits.set(lfc_metrics.lfc_hits);
      40            0 :         g.lfc_misses.set(lfc_metrics.lfc_misses);
      41            0 :         g.lfc_used.set(lfc_metrics.lfc_used);
      42            0 :         g.lfc_writes.set(lfc_metrics.lfc_writes);
      43              : 
      44            0 :         for i in 0..60 {
      45            0 :             let val = lfc_metrics.lfc_approximate_working_set_size_windows[i];
      46            0 :             g.lfc_approximate_working_set_size_windows
      47            0 :                 .set(MinuteAsSeconds(i), val);
      48            0 :         }
      49              : 
      50            0 :         g.collect_group_into(enc)
      51            0 :     }
      52              : }
      53              : 
      54              : /// This stores the values in range 0..60,
      55              : /// encodes them as seconds (60, 120, 180, ..., 3600)
      56              : #[derive(Clone, Copy)]
      57              : struct MinuteAsSeconds(usize);
      58              : 
      59              : impl FixedCardinalityLabel for MinuteAsSeconds {
      60            0 :     fn cardinality() -> usize {
      61            0 :         60
      62            0 :     }
      63              : 
      64            0 :     fn encode(&self) -> usize {
      65            0 :         self.0
      66            0 :     }
      67              : 
      68            0 :     fn decode(value: usize) -> Self {
      69            0 :         Self(value)
      70            0 :     }
      71              : }
      72              : 
      73              : impl LabelValue for MinuteAsSeconds {
      74            0 :     fn visit<V: measured::label::LabelVisitor>(&self, v: V) -> V::Output {
      75            0 :         v.write_int((self.0 + 1) as i64 * 60)
      76            0 :     }
      77              : }
      78              : 
      79              : impl LabelGroup for MinuteAsSeconds {
      80            0 :     fn visit_values(&self, v: &mut impl measured::label::LabelGroupVisitor) {
      81            0 :         v.write_value(LabelName::from_str("duration_seconds"), self);
      82            0 :     }
      83              : }
        

Generated by: LCOV version 2.1-beta