• This repository has been archived on 04/Aug/2021
  • Stars
    star
    213
  • Rank 179,238 (Top 4 %)
  • Language
    C
  • License
    Apache License 2.0
  • Created almost 7 years ago
  • Updated over 3 years ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

PostgreSQL extension for Prometheus data

SUNSET NOTICE

We'll be sunsetting this project in the coming months as we focus on a new implementation with additional functionality and better support for new TimescaleDB features (such as compression). You can find the new project at https://github.com/timescale/promscale.

More details can be found in our design document for the new project.

This project will continue only in maintenance mode.

Prometheus metrics for PostgreSQL

pg_prometheus is an extension for PostgreSQL that defines a Prometheus metric samples data type and provides several storage formats for storing Prometheus data.

Related packages to install:

Running from Docker

A PostgreSQL docker image with both pg_prometheus and TimescaleDB installed is available in Docker Hub at timescale/pg_prometheus.

Example usage:

docker run --name pg_prometheus -d -p 5432:5432 timescale/pg_prometheus:latest-pg11 postgres \
      -csynchronous_commit=off

Note that this image inherits from the official postgres image and so all options documented there are applicable to this image as well. Especially important for users that wish to persist data outside of docker volumes is the PGDATA environmental variable and accompanying volume mount.

Installation

Requirements

  • Install PostgreSQL libraries and headers for C language backend development (https://www.postgresql.org/download/)
  • Make sure you have PostgreSQL bin in your PATH and the postgresql-devel package for your version of PostgreSQL before compiling from source

To install from source, do:

make
make install # Might require super user permissions

Edit postgresql.conf to include the pg_prometheus extension:

shared_preload_libraries = 'pg_prometheus'

Start PostgreSQL and install the extension as a superuser using the psql CLI:

CREATE EXTENSION pg_prometheus;

Optionally grant permissions to the database user (prometheus) that will own the Prometheus data:

-- Create the role
CREATE ROLE prometheus WITH LOGIN PASSWORD 'secret';

-- Grant access to the schema
GRANT ALL ON SCHEMA prometheus TO prometheus;

This also requires superuser privileges.

Integrating with Prometheus

For quickly connecting Prometheus to pg_prometheus simply connect the Prometheus PostgreSQL adapter to a database that has pg_prometheus installed.

For more technical details, or to use pg_prometheus without Prometheus, read below.

Creating the Prometheus tables.

To create the appropriate Prometheus tables use:

SELECT create_prometheus_table('metrics');

This will create a metrics table for inserting data in the Prometheus exposition format using the Prometheus data type. It will also create a metrics_view to easily query data.

Other supporting tables may also be created depending on the storage format (see below).

Inserting data

With either storage format, data can be inserted in Prometheus format into the main table (e.g. metrics in our running example). Data should be formatted according to the Prometheus exposition format.

INSERT INTO metrics VALUES ('cpu_usage{service="nginx",host="machine1"} 34.6 1494595898000');

Since metrics is a view, and PostgreSQL does not allow COPY to views, we create a specialized table to be the target of copy commands for normalized tables (raw tables could write directly to the underlying _sample table). By default, copy tables have a _copy suffix.

One interesting usage is to scrape a Prometheus endpoint (e.g. http://localhost:8080/metrics) directly (without using Prometheus):

curl http://localhost:8080/metrics | grep -v "^#" | psql -h localhost -U postgres -p 5432 -c "COPY metrics_copy FROM STDIN"

Querying data

The metrics view has the following schema:

  Column |           Type           | Modifiers
 --------+--------------------------+-----------
  time   | timestamp with time zone |
  name   | text                     |
  value  | double precision         |
  labels | jsonb                    |

An example query would be

SELECT time, value
FROM metrics
WHERE time > NOW() - interval '10 min' AND
      name = 'cpu_usage' AND
      labels @> '{ "service": "nginx"}';

Storage formats

Pg_prometheus allows two main ways of storing Prometheus metrics: raw and normalized (the default). With raw, a table simply stores all the Prometheus samples in a single column of type prom_sample. The normalized storage format separates out the labels into a separate table. The advantage of the normalized format is disk space savings when labels are long and repetitive.

Note that the metrics view can be used to query and insert data regardless of the storage format and serves to hide the underlying storage from the user.

Raw format

In raw format, data is stored in a table with one column of type prom_sample. To define a raw table use pass normalized_tables=>false to create_prometheus_table. This will also create appropriate indexes on the raw table. The schema is:

  Column   |           Type           | Modifiers
-----------+--------------------------+-----------
 sample    | prom_sampe               |

Normalized format

In the normalized format, data is stored in two tables. The values table holds the data values with a foreign key to the labels. It has the following schema:

  Column   |           Type           | Modifiers
-----------+--------------------------+-----------
 time      | timestamp with time zone |
 value     | double precision         |
 labels_id | integer                  |

Labels are stored in a companion table called labels (note that metric_name is in its own column since it is always present):

   Column    |  Type   |                          Modifiers
-------------+---------+-------------------------------------------------------------
 id          | integer | not null default nextval('metrics_labels_id_seq'::regclass)
 metric_name | text    | not null
 labels      | jsonb   |

Use with TimescaleDB

TimescaleDB scales PostgreSQL for time-series data workloads (of which metrics is one example). If TimescaleDB is installed, pg_prometheus will use it by default. To install TimescaleDB, follow the instruction here. You can explicitly control whether or not to use TimescaleDB with the use_timescaledb parameter to create_prometheus_table.

For example, the following will force pg_prometheus to use Timescale (and will error out if it isn't installed):

SELECT create_prometheus_table('metrics',use_timescaledb=>true);

Contributing

We welcome contributions to this extension, which like TimescaleDB is released under the Apache2 Open Source License. The same Contributors Agreement applies; please sign the Contributor License Agreement (CLA) if you're a new contributor.

More Repositories

1

timescaledb

An open-source time-series SQL database optimized for fast ingest and complex queries. Packaged as a PostgreSQL extension.
C
16,259
star
2

promscale

[DEPRECATED] Promscale is a unified metric and trace observability backend for Prometheus, Jaeger and OpenTelemetry built on PostgreSQL and TimescaleDB.
Go
1,330
star
3

tsbs

Time Series Benchmark Suite, a tool for comparing and evaluating databases for time series data
Go
1,196
star
4

tobs

tobs - The Observability Stack for Kubernetes. Easy install of a full observability stack into a k8s cluster with Helm charts.
Shell
549
star
5

timescaledb-tune

A tool for tuning TimescaleDB for better performance by adjusting settings to match your system's CPU and memory resources.
Go
397
star
6

timescaledb-parallel-copy

A binary for parallel copying of CSV data into a TimescaleDB hypertable
Go
345
star
7

prometheus-postgresql-adapter

Use PostgreSQL as a remote storage database for Prometheus
Go
335
star
8

timescaledb-toolkit

Extension for more hyperfunctions, fully compatible with TimescaleDB and PostgreSQL ๐Ÿ“ˆ
Rust
324
star
9

timescaledb-docker

Release Docker builds of TimescaleDB
Dockerfile
279
star
10

helm-charts

Configuration and Documentation to run TimescaleDB in your Kubernetes cluster
Shell
260
star
11

timescaledb-docker-ha

Create Docker images containing TimescaleDB, Patroni to be used by developers and Kubernetes.
Python
134
star
12

examples

Collection of example applications and tools to help you get familiar with TimescaleDB
JavaScript
119
star
13

nft-starter-kit

Timescale NFT Starter Kit
Python
110
star
14

outflux

Export data from InfluxDB to TimescaleDB
Go
83
star
15

vector-cookbook

Timescale Vector Cookbook. A collection of recipes to build applications with LLMs using PostgreSQL and Timescale Vector.
Jupyter Notebook
77
star
16

opentelemetry-demo

A demo system for exploring the tracing features of Promscale
Python
61
star
17

streaming-replication-docker

TimescaleDB Streaming Replication in Docker
Shell
56
star
18

docs

Timescale product documentation ๐Ÿ“–
JavaScript
46
star
19

timescaledb-extras

Helper functions and procedures for timescale
PLpgSQL
39
star
20

benchmark-postgres

Tools for benchmarking TimescaleDB vs PostgreSQL
Go
37
star
21

promscale_extension

[DEPRECATED] Tables, types and functions supporting Promscale
PLpgSQL
37
star
22

docs.timescale.com-content

Content pages for TimescaleDB documentation
JavaScript
35
star
23

timescaledb-backup

Go
33
star
24

pgspot

Spot vulnerabilities in postgres SQL scripts
Python
28
star
25

timescaledb-wale

Dockerized WAL-E with an HTTP API
Python
21
star
26

terraform-provider-timescale

Timescale Cloud Terraform Provider
Go
17
star
27

homebrew-tap

TimescaleDB Homebrew tap, containing formulas for the database, tools, etc.
Ruby
17
star
28

pg_influx

InfluxDB Line Protocol Listener for PostgreSQL
C
16
star
29

python-vector

Jupyter Notebook
16
star
30

tsv-timemachine

Sample application for time aware RAG with Streamlit, LlamaIndex and Timescale Vector. Learn more at https://www.timescale.com/ai
Python
8
star
31

promscale-benchmark

Makefile
8
star
32

templates

Templates to get started with Timescale on Finance or Sensors (IoT)
PLpgSQL
7
star
33

timescale-extension-utils-rs

Rust
5
star
34

doctor

Rule-based recommendations about your timeseries database.
Python
4
star
35

web-developer-assignment

HTML
3
star
36

wikistream-docker

A Docker environment for https://github.com/timescale/wikistream
Shell
3
star
37

mta-timescale

Demo: Load MTA bus feeds into TimescaleDB
3
star
38

cloud-actions

Cloud public actions
Shell
3
star
39

aws-lambda-example

A sample serverless AWS Lambda time-series application.
Python
2
star
40

frontend-developer-assignment

HTML
2
star
41

pg_traceam

Simple table access method that just prints out what functions in the access methods and related functions that are called.
C
2
star
42

state_of_postgres

2019
SCSS
1
star
43

build-actions

GitHub actions for release pipelines (building, publishing, checking, etc.)
Shell
1
star
44

pgschema

1
star
45

docs-htmltojsx

A fork of react-magic html-to-jsx specifically modified to parse timescale docs
JavaScript
1
star
46

postgres_cheat_sheet

1
star
47

promscale_specs

Formal specifications for Promscale components
TLA
1
star
48

wal-g

Archival and Restoration for Postgres
Go
1
star