Skip to main content

linkrs_metrics/manager/
transaction.rs

1//! Transaction lifecycle and resource gauges.
2use serde::{Deserialize, Serialize};
3
4use super::core::StatsManager;
5use super::metric_type::MetricType;
6
7/// Transaction snapshot for handlers.
8#[derive(Debug, Clone, Serialize, Deserialize)]
9pub struct TransactionSnapshot {
10    pub begun: u64,
11    pub committed: u64,
12    pub rolled_back: u64,
13    pub active: u64,
14    pub conflicts: u64,
15    pub timeouts: u64,
16    pub disconnects: u64,
17    pub recovery_aborts: u64,
18    pub cleanup_failures: u64,
19    pub active_statements: u64,
20    pub active_snapshots: u64,
21    pub pending_writes: u64,
22    pub frontier_lag: u64,
23    pub staged_wal_bytes: u64,
24    pub undo_bytes: u64,
25    pub checkpoint_drain_time_ms: u64,
26}
27
28/// Transaction resource metrics
29#[derive(Debug, Clone, Copy)]
30pub struct TxnResourceMetrics {
31    pub active_statements: u64,
32    pub active_snapshots: u64,
33    pub pending_writes: u64,
34    pub frontier_lag: u64,
35    pub staged_wal_bytes: u64,
36    pub undo_bytes: u64,
37    pub checkpoint_drain_time_ms: u64,
38}
39
40impl StatsManager {
41    /// Record transaction begin
42    pub fn record_txn_begin(&self) {
43        self.add_value(MetricType::TxnBeginCount);
44        self.add_value(MetricType::TxnActiveCount);
45    }
46
47    /// Record transaction commit
48    pub fn record_txn_commit(&self) {
49        self.add_value(MetricType::TxnCommitCount);
50        self.dec_value(MetricType::TxnActiveCount);
51    }
52
53    /// Record transaction rollback
54    pub fn record_txn_rollback(&self) {
55        self.add_value(MetricType::TxnRollbackCount);
56        self.dec_value(MetricType::TxnActiveCount);
57    }
58
59    /// Record transaction conflict
60    pub fn record_txn_conflict(&self) {
61        self.add_value(MetricType::TxnConflictCount);
62    }
63
64    /// Record transaction timeout.
65    pub fn record_txn_timeout(&self) {
66        self.add_value(MetricType::TxnTimeoutCount);
67    }
68
69    /// Record transaction disconnect.
70    pub fn record_txn_disconnect(&self) {
71        self.add_value(MetricType::TxnDisconnectCount);
72    }
73
74    /// Record transaction recovery abort.
75    pub fn record_txn_recovery_abort(&self) {
76        self.add_value(MetricType::TxnRecoveryAbortCount);
77    }
78
79    /// Record transaction cleanup failure.
80    pub fn record_txn_cleanup_failure(&self) {
81        self.add_value(MetricType::TxnCleanupFailureCount);
82    }
83
84    pub fn transaction_snapshot(&self) -> TransactionSnapshot {
85        let v = |m: MetricType| self.get_value(m).unwrap_or(0);
86        TransactionSnapshot {
87            begun: v(MetricType::TxnBeginCount),
88            committed: v(MetricType::TxnCommitCount),
89            rolled_back: v(MetricType::TxnRollbackCount),
90            active: v(MetricType::TxnActiveCount),
91            conflicts: v(MetricType::TxnConflictCount),
92            timeouts: v(MetricType::TxnTimeoutCount),
93            disconnects: v(MetricType::TxnDisconnectCount),
94            recovery_aborts: v(MetricType::TxnRecoveryAbortCount),
95            cleanup_failures: v(MetricType::TxnCleanupFailureCount),
96            active_statements: v(MetricType::TxnActiveStatements),
97            active_snapshots: v(MetricType::TxnActiveSnapshots),
98            pending_writes: v(MetricType::TxnPendingWrites),
99            frontier_lag: v(MetricType::TxnFrontierLag),
100            staged_wal_bytes: v(MetricType::TxnStagedWalBytes),
101            undo_bytes: v(MetricType::TxnUndoBytes),
102            checkpoint_drain_time_ms: v(MetricType::TxnCheckpointDrainTimeMs),
103        }
104    }
105
106    /// Transaction resource metrics
107    pub fn set_txn_resource_metrics(&self, metrics: TxnResourceMetrics) {
108        self.set_value(MetricType::TxnActiveStatements, metrics.active_statements);
109        self.set_value(MetricType::TxnActiveSnapshots, metrics.active_snapshots);
110        self.set_value(MetricType::TxnPendingWrites, metrics.pending_writes);
111        self.set_value(MetricType::TxnFrontierLag, metrics.frontier_lag);
112        self.set_value(MetricType::TxnStagedWalBytes, metrics.staged_wal_bytes);
113        self.set_value(MetricType::TxnUndoBytes, metrics.undo_bytes);
114        self.set_value(
115            MetricType::TxnCheckpointDrainTimeMs,
116            metrics.checkpoint_drain_time_ms,
117        );
118    }
119}