iota_core/execution_cache/
metrics.rs

1// Copyright (c) Mysten Labs, Inc.
2// Modifications Copyright (c) 2024 IOTA Stiftung
3// SPDX-License-Identifier: Apache-2.0
4
5use prometheus::{
6    IntCounterVec, IntGauge, Registry, register_int_counter_vec_with_registry,
7    register_int_gauge_with_registry,
8};
9use tracing::trace;
10
11pub struct ExecutionCacheMetrics {
12    pub(crate) pending_notify_read: IntGauge,
13    pub(crate) cache_requests: IntCounterVec,
14    pub(crate) cache_hits: IntCounterVec,
15    pub(crate) cache_negative_hits: IntCounterVec,
16    pub(crate) cache_misses: IntCounterVec,
17    pub(crate) cache_writes: IntCounterVec,
18}
19
20impl ExecutionCacheMetrics {
21    pub fn new(registry: &Registry) -> Self {
22        Self {
23            pending_notify_read: register_int_gauge_with_registry!(
24                "pending_notify_read",
25                "Pending notify read requests",
26                registry,
27            )
28            .unwrap(),
29            // `request_type` is "object_by_version", "object_latest", "transaction", etc
30            // level in these metrics may be "uncommitted", "committed", "package_cache" or "db"
31            cache_requests: register_int_counter_vec_with_registry!(
32                "execution_cache_requests",
33                "Execution cache requests",
34                &["request_type", "level"],
35                registry,
36            )
37            .unwrap(),
38            cache_hits: register_int_counter_vec_with_registry!(
39                "execution_cache_hits",
40                "Execution cache hits",
41                &["request_type", "level"],
42                registry,
43            )
44            .unwrap(),
45            cache_negative_hits: register_int_counter_vec_with_registry!(
46                "execution_cache_negative_hits",
47                "Execution cache negative hits",
48                &["request_type", "level"],
49                registry,
50            )
51            .unwrap(),
52            cache_misses: register_int_counter_vec_with_registry!(
53                "execution_cache_misses",
54                "Execution cache misses",
55                &["request_type", "level"],
56                registry,
57            )
58            .unwrap(),
59
60            // `collection` should be "object", "marker", "transaction_effects", etc
61            cache_writes: register_int_counter_vec_with_registry!(
62                "execution_cache_writes",
63                "Execution cache writes",
64                &["collection"],
65                registry,
66            )
67            .unwrap(),
68        }
69    }
70
71    pub(crate) fn record_cache_request(&self, request_type: &'static str, level: &'static str) {
72        trace!(target: "cache_metrics", "Cache request: {} {}", request_type, level);
73        self.cache_requests
74            .with_label_values(&[request_type, level])
75            .inc();
76    }
77
78    pub(crate) fn record_cache_multi_request(
79        &self,
80        request_type: &'static str,
81        level: &'static str,
82        count: usize,
83    ) {
84        trace!(
85            target: "cache_metrics",
86            "Cache multi request: {} {} count: {}",
87            request_type,
88            level,
89            count
90        );
91        self.cache_requests
92            .with_label_values(&[request_type, level])
93            .inc_by(count as u64);
94    }
95
96    pub(crate) fn record_cache_hit(&self, request_type: &'static str, level: &'static str) {
97        trace!(target: "cache_metrics", "Cache hit: {} {}", request_type, level);
98        self.cache_hits
99            .with_label_values(&[request_type, level])
100            .inc();
101    }
102
103    pub(crate) fn record_cache_miss(&self, request_type: &'static str, level: &'static str) {
104        trace!(target: "cache_metrics", "Cache miss: {} {}", request_type, level);
105        self.cache_misses
106            .with_label_values(&[request_type, level])
107            .inc();
108    }
109
110    pub(crate) fn record_cache_negative_hit(
111        &self,
112        request_type: &'static str,
113        level: &'static str,
114    ) {
115        trace!(target: "cache_metrics", "Cache negative hit: {} {}", request_type, level);
116        self.cache_negative_hits
117            .with_label_values(&[request_type, level])
118            .inc();
119    }
120
121    pub(crate) fn record_cache_write(&self, collection: &'static str) {
122        self.cache_writes.with_label_values(&[collection]).inc();
123    }
124}