aboutsummaryrefslogtreecommitdiff
path: root/src/table/metrics.rs
blob: 7bb0959ae3768f83750e25c1c5add5999b0b3229 (plain) (blame)
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
use opentelemetry::{global, metrics::*, KeyValue};

use garage_db as db;

/// TableMetrics reference all counter used for metrics
pub struct TableMetrics {
	pub(crate) _table_size: ValueObserver<u64>,
	pub(crate) _merkle_tree_size: ValueObserver<u64>,
	pub(crate) _merkle_todo_len: ValueObserver<u64>,
	pub(crate) _gc_todo_len: ValueObserver<u64>,

	pub(crate) get_request_counter: BoundCounter<u64>,
	pub(crate) get_request_duration: BoundValueRecorder<f64>,
	pub(crate) put_request_counter: BoundCounter<u64>,
	pub(crate) put_request_duration: BoundValueRecorder<f64>,

	pub(crate) internal_update_counter: BoundCounter<u64>,
	pub(crate) internal_delete_counter: BoundCounter<u64>,

	pub(crate) sync_items_sent: Counter<u64>,
	pub(crate) sync_items_received: Counter<u64>,
}
impl TableMetrics {
	pub fn new(
		table_name: &'static str,
		store: db::Tree,
		merkle_tree: db::Tree,
		merkle_todo: db::Tree,
		gc_todo: db::Tree,
	) -> Self {
		let meter = global::meter(table_name);
		TableMetrics {
			_table_size: meter
				.u64_value_observer(
					"table.size",
					move |observer| {
						if let Ok(value) = store.len() {
							observer.observe(
								value as u64,
								&[KeyValue::new("table_name", table_name)],
							);
						}
					},
				)
				.with_description("Number of items in table")
				.init(),
			_merkle_tree_size: meter
				.u64_value_observer(
					"table.merkle_tree_size",
					move |observer| {
						if let Ok(value) = merkle_tree.len() {
							observer.observe(
								value as u64,
								&[KeyValue::new("table_name", table_name)],
							);
						}
					},
				)
				.with_description("Number of nodes in table's Merkle tree")
				.init(),
			_merkle_todo_len: meter
				.u64_value_observer(
					"table.merkle_updater_todo_queue_length",
					move |observer| {
						if let Ok(v) = merkle_todo.len() {
							observer.observe(
								v as u64,
								&[KeyValue::new("table_name", table_name)],
							);
						}
					},
				)
				.with_description("Merkle tree updater TODO queue length")
				.init(),
			_gc_todo_len: meter
				.u64_value_observer(
					"table.gc_todo_queue_length",
					move |observer| {
                        if let Ok(value) = gc_todo.len() {
                            observer.observe(
                                value as u64,
                                &[KeyValue::new("table_name", table_name)],
                            );
                        }
					},
				)
				.with_description("Table garbage collector TODO queue length")
				.init(),

			get_request_counter: meter
				.u64_counter("table.get_request_counter")
				.with_description("Number of get/get_range requests internally made on this table")
				.init()
				.bind(&[KeyValue::new("table_name", table_name)]),
			get_request_duration: meter
				.f64_value_recorder("table.get_request_duration")
				.with_description("Duration of get/get_range requests internally made on this table, in seconds")
				.init()
				.bind(&[KeyValue::new("table_name", table_name)]),
			put_request_counter: meter
				.u64_counter("table.put_request_counter")
				.with_description("Number of insert/insert_many requests internally made on this table")
				.init()
				.bind(&[KeyValue::new("table_name", table_name)]),
			put_request_duration: meter
				.f64_value_recorder("table.put_request_duration")
				.with_description("Duration of insert/insert_many requests internally made on this table, in seconds")
				.init()
				.bind(&[KeyValue::new("table_name", table_name)]),

			internal_update_counter: meter
				.u64_counter("table.internal_update_counter")
				.with_description("Number of value updates where the value actually changes (includes creation of new key and update of existing key)")
				.init()
				.bind(&[KeyValue::new("table_name", table_name)]),
			internal_delete_counter: meter
				.u64_counter("table.internal_delete_counter")
				.with_description("Number of value deletions in the tree (due to GC or repartitioning)")
				.init()
				.bind(&[KeyValue::new("table_name", table_name)]),

			sync_items_sent: meter
				.u64_counter("table.sync_items_sent")
				.with_description("Number of data items sent to other nodes during resync procedures")
				.init(),
			sync_items_received: meter
				.u64_counter("table.sync_items_received")
				.with_description("Number of data items received from other nodes during resync procedures")
				.init(),
		}
	}
}