Expose binary data in metrics
This enables slicing and aggregating metrics based on zebrad version:
@@ -19,6 +19,28 @@ impl MetricsEndpoint {
match endpoint_result {
Ok(()) => {
info!("Opened metrics endpoint at {}", addr);
+
+ // Expose binary metadata to metrics, using a single time series with
+ // value 1:
+ // https://www.robustperception.io/exposing-the-software-version-to-prometheus
+ //
+ // We manually expand the metrics::increment!() macro because it only
+ // supports string literals for metrics names, preventing us from
+ // using concat!() to build the name.
+ static METRIC_NAME: [metrics::SharedString; 2] = [
+ metrics::SharedString::const_str(env!("CARGO_PKG_NAME")),
+ metrics::SharedString::const_str("build.info"),
+ ];
+ static METRIC_LABELS: [metrics::Label; 1] =
+ [metrics::Label::from_static_parts(
+ "version",
+ env!("CARGO_PKG_VERSION"),
+ )];
+ static METRIC_KEY: metrics::KeyData =
+ metrics::KeyData::from_static_parts(&METRIC_NAME, &METRIC_LABELS);
+ if let Some(recorder) = metrics::try_recorder() {
+ recorder.increment_counter(metrics::Key::Borrowed(&METRIC_KEY), 1);
+ }
}
Err(e) => panic!(
"Opening metrics endpoint listener {:?} failed: {:?}. \
