Skip to content

mr-karan/store-exporter

master
Switch branches/tags
Code

Latest commit

 

Git stats

Files

Permalink
Failed to load latest commit information.
Type
Name
Latest commit message
Commit time
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

store-exporter

Utility to extract metrics from arbitary data stores in Prometheus format

Overview

Export your custom app metrics from external data stores like PostgreSQL, MySQL, Redis(coming soon!)

Features

  • Extract column names from results and expose them as custom metric labels.
  • Ability to register multiple jobs with different stores.

Table of Contents

Motivation

store-exporter loads SQL query file and fetches the data from DB and transforms the result in Prometheus text format. A lot of times, it is undesirable to add instrumentation right in your app for the following reasons:

  • Your app doesn't have any HTTP server, but to just extract metrics you've to invoke HTTP server.
  • Your app cares about being fast in which case adding any external library penalises performance.
  • You don't want to mix the app logic with the metric collection/exposition logic.

In all the above cases, it is more suitable to take a Sidecar approach, where you query for metrics from an external persistent store your app maintains. This utility just makes it easier for anyone to write custom SQL queries and expose metrics without having to worry about Prometheus format/exposition logic. You can run a single binary anywhere in your cluster environment which has access to the external store which exposes the metrics on an HTTP server confirming to Prometheus metric format.

Installation

There are multiple ways of installing store-exporter.

Running as docker container

mrkaran/store-exporter

docker run -p 9609:9609 -v /etc/store-exporter/config.toml:/etc/store-exporter/config.toml mrkaran/store-exporter:latest

Precompiled binaries

Precompiled binaries for released versions are available in the Releases section.

Compiling the binary

You can checkout the source code and build manually:

git clone https://github.com/mr-karan/store-exporter.git
cd store-exporter
make build
cp config.sample.toml config.toml
./store-exporter

Quickstart

mkdir store-exporter && cd store-exporter/ # copy the binary and config.sample in this folder
cp config.toml.sample config.toml # change the settings like server address, job metadata, db credentials etc.
./store-exporter # this command starts a web server and is ready to collect metrics.

Testing a sample scrape request

You can send a GET request to /metrics and see the following metrics in Prometheus format:

# HELP job_name_basicname this is such a great help text
# TYPE job_name_basicname gauge
job_name_basicname{job="myjob",pg_db_blks_hit="74400",pg_db_tup_inserted="120"} 13713
# HELP job_name_verybasic_name this is such a great help text again
# TYPE job_name_verybasic_name gauge
job_name_verybasic_name{job="myjob",pg_db_conflicts="0",pg_db_temp_bytes="0"} 40
# HELP version Version of store-exporter
# TYPE version gauge
version{build="846771f (2019-08-28 10:28:07 +0530)"} 1

Advanced Section

Configuration Options

  • [server]

    • address: Port which the server listens to. Default is 9608
    • name: Optional, human identifier for the server.
    • read_timeout: Duration (in milliseconds) for the request body to be fully read) Read this blog for more info.
    • write_timeout: Duration (in milliseconds) for the response body to be written.
  • [app]

    • log_level: "production" for all INFO level logs. If you want to enable verbose logging use "debug".
    • jobs
      • name: Unique identifier for the job. -- store: Config options for the store
        • db: Type of SQL DB. Supported values: [postgres, mysql].
        • dsn: Connection URL to the DB.
        • query: Path to SQL file.
        • max_open_connections: Max open connections to the DB.
        • max_idle_connections: Max idle connections maintained in the connection pool.
      • metrics:
        • namespace: Unique identifier for the metric, prepended in each metric name.
        • help: Helptext for the metric
        • query: Name of the query mapped in sql file, used to query the db for this metric.
        • labels: List of additional column names fetched from the DB, to be used in metric as key/value pairs.
        • columns: Each column name creates a separate Prometheus metric and the corresponding value fetched from the store is used as the metric value.

NOTE: You can use --config flag to supply a custom config file path while running store-exporter.

Setting up Prometheus

You can add the following config under scrape_configs in Prometheus' configuration.

  - job_name: 'store-exporter'
    metrics_path: '/metrics'
    static_configs:
    - targets: ['localhost:9610']
      labels:
        service: my-app-metrics

Validate your setup by querying version to check if store-exporter is discovered by Prometheus:

`version{build="846771f (2019-08-28 10:28:07 +0530)"} 1`

Contribution

PRs on Feature Requests, Bug fixes are welcome. Feel free to open an issue and have a discussion first. Contributions on more external stores are also welcome and encouraged.

Read CONTRIBUTING.md for more details.

License

MIT