pub type LabeledFamily<S, M, const N: usize = 1> = Family<S, M, [&'static str; N]>;Expand description
Family with separately specified label names.
Separately specifying labels allows to not define newtype wrappers for labels. Instead, labels
(the first type param of LabeledFamily) can be specified as values (e.g., &'static str
or u8), and the label names are provided separately using the labels = [..] attribute
with the Metrics derive macro.
- If there’s a single label, its value type must be specified directly:
&'static str. - If there are several labels, they must be specified as a tuple:
(&'static str, u16). - The number of labels must match the number of label names and the constant param of
LabeledFamily(which is set to 1 by default). E.g., for two labels you should useLabeledFamily<_, _, 2>.
§Examples
§Family with single label
use vise::{Counter, LabeledFamily, Metrics};
#[derive(Debug, Metrics)]
struct TestMetrics {
#[metrics(labels = ["method"])]
counters: LabeledFamily<&'static str, Counter>,
}
// `counters` are keyed by a `&str`:
let metrics = TestMetrics::default();
metrics.counters[&"test"].inc();
metrics.counters[&"another_test"].inc_by(3);
// In the encoded metrics, these entries will be mentioned as follows:
let entries = [
r#"counters_total{method="test"} 1"#,
r#"counters_total{method="another_test"} 3"#,
];§Family with multiple labels
const LABELS: [&str; 2] = ["method", "code"];
type Labels = (&'static str, u16);
#[derive(Debug, Metrics)]
struct TestMetrics {
#[metrics(labels = LABELS, buckets = Buckets::LATENCIES)]
latencies: LabeledFamily<Labels, Histogram<Duration>, 2>,
// ^ note that label names and type can be extracted elsewhere
}
let metrics = TestMetrics::default();
metrics.latencies[&("call", 200)].observe(Duration::from_millis(25));
metrics.latencies[&("send", 502)].observe(Duration::from_secs(1));
// In the encoded metrics, these entries will be mentioned as follows:
let entries = [
r#"latencies_sum{method="call",code="200"} 0.025"#,
r#"latencies_sum{method="send",code="502"} 1.0"#,
];Aliased Type§
pub struct LabeledFamily<S, M, const N: usize = 1> { /* private fields */ }