Substreams Prometheus sink module

github crates.io docs.rs GitHub Workflow Status

substreams-sink-prometheus is a tool that allows developers to pipe data extracted metrics from a blockchain into a Prometheus time series database.

📖 Documentation

https://docs.rs/substreams-sink-prometheus

Further resources

Quickstart ⚡️

  1. Install npm install -g substreams-sink-prometheus
  2. Run Sink substreams-sink-prometheus run [<manifest>] [<module_name>] [flags]
  3. Open the browser at http://localhost:9102/metrics

🛠 Feature Roadmap

Gauge Metric

Counter Metric

Histogram Metric

Summary Metric

Summaries calculate percentiles of observed values. - [ ] Observe - [ ] percentiles - [ ] maxAgeSeconds - [ ] ageBuckets - [ ] startTimer

Registry

Install

bash $ cargo add substreams-sink-prometheus

Quickstart

Cargo.toml

toml [dependencies] substreams = "0.5" substreams-sink-prometheus = "0.1"

src/lib.rs

```rust use std::collections::HashMap; use substreams::prelude::*; use substreams::errors::Error; use substreamssinkprometheus::{PrometheusOperations, Counter, Gauge};

[substreams::handlers::map]

fn prom_out( ... some stores ... ) -> Result {

// Initialize Prometheus Operations container
let mut prom_ops: PrometheusOperations = Default::default();

// Counter Metric
// ==============
// Initialize Gauge with a name & labels
let mut counter = Counter::from("counter_name");

// Increments the Counter by 1.
prom_ops.push(counter.inc());

// Adds an arbitrary value to a Counter. (Returns an error if the value is < 0.)
prom_ops.push(counter.add(123.456));

// Labels
// ======
// Create a HashMap of labels
// Labels represents a collection of label name -> value mappings. 
let labels1 = HashMap::from([("label1".to_string(), "value1".to_string())]);
let mut labels2 = HashMap::new();
labels2.insert("label2".to_string(), "value2".to_string());

// Gauge Metric
// ============
// Initialize Gauge
let mut gauge = Gauge::from("gauge_name").with(labels1);

// Sets the Gauge to an arbitrary value.
prom_ops.push(gauge.set(88.8));

// Increments the Gauge by 1.
prom_ops.push(gauge.inc());

// Decrements the Gauge by 1.
prom_ops.push(gauge.dec());

// Adds an arbitrary value to a Gauge. (The value can be negative, resulting in a   rease of the Gauge.)
prom_ops.push(gauge.add(50.0));
prom_ops.push(gauge.add(-10.0));

// Subtracts arbitrary value from the Gauge. (The value can be negative, resulting in an    rease of the Gauge.)
prom_ops.push(gauge.sub(25.0));
prom_ops.push(gauge.sub(-5.0));

// Set Gauge to the current Unix time in seconds.
prom_ops.push(gauge.set_to_current_time());

// Remove metrics for the given label values
prom_ops.push(gauge.remove(labels2));

// Reset gauge values
prom_ops.push(gauge.reset());

Ok(prom_ops)

} ```