1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
//! # Metrics Trait Hierarchy
//!
//! This module mirrors the cache trait design by separating *recording*,
//! *snapshotting*, and *export* responsibilities into small, composable traits.
//! It enables production monitoring and bench/testing without coupling those
//! concerns to cache policy logic.
//!
//! ## Architecture
//!
//! ```text
//! ┌─────────────────────────────┐
//! │ CoreMetricsRecorder │
//! │ get_hit/get_miss/insert │
//! │ evict/clear │
//! └──────────────┬──────────────┘
//! │
//! ┌──────────────┬───────────────┬───────────────┼───────────────┬───────────────┐
//! │ │ │ │ │ │
//! ▼ ▼ ▼ ▼ ▼ ▼
//! ┌────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────────┐
//! │ Fifo │ │ Lru │ │ Lfu │ │ Arc │ │ Clock │ │ S3Fifo/ │
//! │Recorder│ │ Recorder │ │ Recorder │ │ Recorder │ │ Recorder │ │ Car/Slru/ │
//! └────────┘ └────┬─────┘ └──────────┘ └──────────┘ └──────────┘ │ TwoQ/Mfu/ │
//! │ │ NRU/ClkPro │
//! ▼ └──────────────┘
//! ┌──────────┐
//! │ LruK │
//! │ Recorder │
//! └──────────┘
//!
//! Consumption (decoupled from recording):
//! ┌──────────────────────────────┐ ┌──────────────────────────────┐
//! │ MetricsSnapshotProvider<S> │ │ MetricsExporter<S> │
//! │ (bench/test) │ │ (production monitoring) │
//! └──────────────────────────────┘ └──────────────────────────────┘
//! ```
//!
//! ## Design Goals
//! - **Single responsibility**: recorders only write counters; providers only
//! read/snapshot; exporters only publish to monitoring systems.
//! - **Shared hierarchy**: policy metrics extend the core recorder to reuse
//! shared counters while adding policy-specific signals.
//! - **Environment split**:
//! - Production: use lightweight recorders + exporters.
//! - Bench/Test: use snapshot providers + resettable metrics.
//!
//! ## Example
//!
//! ```
//! use cachekit::metrics::traits::{CoreMetricsRecorder, MetricsSnapshotProvider};
//!
//! fn run_workload<M: CoreMetricsRecorder>(m: &mut M) {
//! m.record_get_hit();
//! m.record_get_miss();
//! m.record_insert_call();
//! m.record_insert_new();
//! }
//! ```
/// Common counters for any cache policy.
///
/// Every policy-specific recorder (e.g. [`FifoMetricsRecorder`],
/// [`LruMetricsRecorder`]) extends this trait so shared hit/miss/insert/evict
/// counters are always available.
/// Metrics for FIFO behavior (insertion order).
///
/// See also [`FifoMetricsReadRecorder`] for read-only (`&self`) counters.
/// Read-only FIFO metrics for `&self` methods (uses interior mutability).
///
/// Use this for cache operations that only take `&self` (e.g., `peek_oldest`,
/// `age_rank`) where a mutable recorder is not available.
///
/// See also [`FifoMetricsRecorder`] for the mutable counterpart.
/// Metrics for LRU behavior (recency order).
///
/// See also [`LruMetricsReadRecorder`] for read-only (`&self`) counters.
/// Read-only LRU metrics for `&self` methods (uses interior mutability).
///
/// See also [`LruMetricsRecorder`] for the mutable counterpart.
/// Metrics for LFU behavior (frequency order).
///
/// See also [`LfuMetricsReadRecorder`] for read-only (`&self`) counters.
/// Read-only LFU metrics for `&self` methods (uses interior mutability).
///
/// See also [`LfuMetricsRecorder`] for the mutable counterpart.
/// Metrics for LRU-K behavior (K-distance order).
///
/// Extends [`LruMetricsRecorder`] with backward K-distance counters.
/// See also [`LruKMetricsReadRecorder`] for read-only (`&self`) counters.
/// Read-only LRU-K metrics for `&self` methods (uses interior mutability).
///
/// See also [`LruKMetricsRecorder`] for the mutable counterpart.
/// Metrics for ARC behavior (adaptive replacement with ghost lists).
/// Metrics for CAR behavior (clock with adaptive replacement).
/// Metrics for Clock behavior (clock hand sweep).
/// Metrics for Clock-PRO behavior (hot/cold/test states).
/// Metrics for MFU behavior (most frequently used eviction).
///
/// See also [`MfuMetricsReadRecorder`] for read-only (`&self`) counters.
/// Read-only MFU metrics for `&self` methods (uses interior mutability).
///
/// See also [`MfuMetricsRecorder`] for the mutable counterpart.
/// Metrics for NRU behavior (not recently used, clock sweep).
/// Metrics for SLRU behavior (segmented LRU).
/// Metrics for Two-Q behavior (A1in/A1out/Am queues).
/// Metrics for S3-FIFO behavior (small/main/ghost queues).
/// Snapshot provider for bench/testing.
///
/// Returns a point-in-time copy of all counters as a snapshot struct `S`.
/// Pair with [`MetricsReset`] to clear counters between iterations, or
/// with [`MetricsExporter`] to publish snapshots to a monitoring backend.
/// Reset metrics between tests or benchmark iterations.
///
/// Typically used alongside [`MetricsSnapshotProvider`] to isolate
/// measurements across successive runs.
/// Export/publish metrics to production monitoring backends.
///
/// Consumes a snapshot produced by [`MetricsSnapshotProvider::snapshot`]
/// and writes it to an external system (e.g. Prometheus, StatsD).