dora_metrics/
lib.rs

1//! Enable system metric through opentelemetry exporter.
2//!
3//! This module fetch system information using [`sysinfo`] and
4//! export those metrics via an [`opentelemetry-rust`] exporter with default configuration.
5//! Observed metrics are:
6//! - CPU usage.
7//! - Memory and Virtual memory usage.
8//! - disk usage (read and write).
9//!
10//! [`sysinfo`]: https://github.com/GuillaumeGomez/sysinfo
11//! [`opentelemetry-rust`]: https://github.com/open-telemetry/opentelemetry-rust
12
13use eyre::Result;
14use opentelemetry::{InstrumentationScope, global};
15use opentelemetry_otlp::MetricExporter;
16use opentelemetry_sdk::metrics::SdkMeterProvider;
17use opentelemetry_system_metrics::init_process_observer;
18/// Init opentelemetry meter
19///
20/// Use the default Opentelemetry exporter with default config
21/// TODO: Make Opentelemetry configurable
22///
23pub fn init_metrics() -> SdkMeterProvider {
24    let exporter = MetricExporter::builder()
25        .with_tonic()
26        .build()
27        .expect("Failed to create metric exporter");
28
29    SdkMeterProvider::builder()
30        .with_periodic_exporter(exporter)
31        .build()
32}
33
34pub async fn run_metrics_monitor(meter_id: String) -> Result<()> {
35    let meter_provider = init_metrics();
36    global::set_meter_provider(meter_provider.clone());
37    let scope = InstrumentationScope::builder(meter_id)
38        .with_version("1.0")
39        .build();
40    let meter = global::meter_with_scope(scope);
41
42    init_process_observer(meter).await.unwrap();
43    Ok(())
44}