aboutsummaryrefslogtreecommitdiff
path: root/src/rpc/metrics.rs
blob: c900518cdb51f2ffd5b92dbfe2ce5affbf7ab7ce (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
use std::sync::Arc;

use opentelemetry::{global, metrics::*};
use tokio::sync::Semaphore;

/// TableMetrics reference all counter used for metrics
pub struct RpcMetrics {
	pub(crate) _rpc_available_permits: ValueObserver<u64>,

	pub(crate) rpc_counter: Counter<u64>,
	pub(crate) rpc_timeout_counter: Counter<u64>,
	pub(crate) rpc_netapp_error_counter: Counter<u64>,
	pub(crate) rpc_garage_error_counter: Counter<u64>,

	pub(crate) rpc_duration: ValueRecorder<f64>,
	pub(crate) rpc_queueing_time: ValueRecorder<f64>,
}
impl RpcMetrics {
	pub fn new(sem: Arc<Semaphore>) -> Self {
		let meter = global::meter("garage_rpc");
		RpcMetrics {
			_rpc_available_permits: meter
				.u64_value_observer("rpc.available_permits", move |observer| {
					observer.observe(sem.available_permits() as u64, &[])
				})
				.with_description("Number of available RPC permits")
				.init(),

			rpc_counter: meter
				.u64_counter("rpc.request_counter")
				.with_description("Number of RPC requests emitted")
				.init(),
			rpc_timeout_counter: meter
				.u64_counter("rpc.timeout_counter")
				.with_description("Number of RPC timeouts")
				.init(),
			rpc_netapp_error_counter: meter
				.u64_counter("rpc.netapp_error_counter")
				.with_description("Number of communication errors (errors in the Netapp library)")
				.init(),
			rpc_garage_error_counter: meter
				.u64_counter("rpc.garage_error_counter")
				.with_description("Number of RPC errors (errors happening when handling the RPC)")
				.init(),
			rpc_duration: meter
				.f64_value_recorder("rpc.duration")
				.with_description("Duration of RPCs")
				.init(),
			rpc_queueing_time: meter
				.f64_value_recorder("rpc.queueing_time")
				.with_description("Time RPC requests were queued for before being sent")
				.init(),
		}
	}
}