JSPM

  • Created
  • Published
  • Downloads 2
  • Score
    100M100P100Q81692F
  • License MIT OR Apache-2.0

Substreams Prometheus sink module

Package Exports

    This package does not declare an exports field, so the exports above have been automatically detected and optimized by JSPM instead. If any package subpath is missing, it is recommended to post an issue to the original package (substreams-sink-prometheus) to support the "exports" field. If that is not possible, create a JSPM override to customize the exports field for this package.

    Readme

    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

    CLI

    Use pre-built binaries

    • MacOS
    • Linux
    • Windows

    Install globally via npm

    $ npm install -g substreams-sink-prometheus

    Run

    $ substreams-sink-prometheus run [options] <spkg>
    1. Install npm install -g substreams-sink-prometheus
    2. Run Sink substreams-sink-prometheus run [<manifest>] [<module_name>] [flags]

      Open the browser at http://localhost:9102/metrics

    🛠 Feature Roadmap

    Gauge Metric

    • Set
    • Inc
    • Dec
    • Add
    • Sub
    • SetToCurrentTime
    • Remove
    • Reset

    Counter Metric

    • Inc
    • Add
    • Remove
    • Reset

    Histogram Metric

    • Observe
    • buckets
    • zero

    Summary Metric

    Summaries calculate percentiles of observed values.

    • Observe
    • percentiles
    • maxAgeSeconds
    • ageBuckets
    • startTimer

    Registry

    • Clear
    • SetDefaultLabels
    • RemoveSingleMetric

    Install

    $ cargo add substreams-sink-prometheus

    Quickstart

    Cargo.toml

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

    src/lib.rs

    use std::collections::HashMap;
    use substreams::prelude::*;
    use substreams::errors::Error;
    use substreams_sink_prometheus::{PrometheusOperations, Counter, Gauge};
    
    #[substreams::handlers::map]
    fn prom_out(
        ... some stores ...
    ) -> Result<PrometheusOperations, Error> {
    
        // 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)
    }