trait-net 0.7.1

A collection of traits for client libraries for reducing boilerplate
Documentation
use super::{Elapsed, IntConstant, StartedCount};
use crate::metrics::ObservedFutureExt;
use prometheus::{core::Collector, opts};
use std::time::Duration;
use tokio::time::sleep;

#[test]
fn constant() {
    let constant = IntConstant::new(opts!("alive", "Total uptime"), 1).unwrap();
    assert_eq!(
        constant.collect()[0].get_metric()[0]
            .get_counter()
            .get_value(),
        1.0
    );
}

#[tokio::test]
async fn uptime() {
    let uptime = Elapsed::new(opts!("alive", "Total uptime")).unwrap();
    assert!((0.0..0.1).contains(&uptime.collect()[0].get_metric()[0].get_gauge().get_value()));
    sleep(Duration::from_millis(100)).await;
    assert!((0.1..0.2).contains(&uptime.collect()[0].get_metric()[0].get_gauge().get_value()));
    sleep(Duration::from_millis(200)).await;
    assert!((0.3..0.4).contains(&uptime.collect()[0].get_metric()[0].get_gauge().get_value()));
}

#[tokio::test]
async fn rate() {
    let rate = StartedCount::new(opts!("rate", "Request rate"), &[]).unwrap();
    let o = rate.make_observer(&[]);
    assert_eq!(
        rate.collect()[0].get_metric()[0].get_counter().get_value(),
        0.0
    );
    assert_eq!(
        rate.collect()[1].get_metric()[0].get_counter().get_value(),
        0.0
    );
    tokio::spawn({
        let rate = rate.clone();
        async move {
            assert_eq!(
                rate.collect()[0].get_metric()[0].get_counter().get_value(),
                1.0
            );
            assert_eq!(
                rate.collect()[1].get_metric()[0].get_counter().get_value(),
                0.0
            );
            sleep(Duration::from_millis(100)).await;
        }
        .observe(o)
    })
    .await
    .unwrap();
    assert_eq!(
        rate.collect()[0].get_metric()[0].get_counter().get_value(),
        1.0
    );
    assert_eq!(
        rate.collect()[1].get_metric()[0].get_counter().get_value(),
        1.0
    );
}