2016-05-28 04:35:17 +00:00
|
|
|
[![Build Status](https://travis-ci.org/wrouesnel/postgres_exporter.svg?branch=master)](https://travis-ci.org/wrouesnel/postgres_exporter)
|
2017-02-24 13:19:07 +00:00
|
|
|
[![Coverage Status](https://coveralls.io/repos/github/wrouesnel/postgres_exporter/badge.svg?branch=master)](https://coveralls.io/github/wrouesnel/postgres_exporter?branch=master)
|
|
|
|
[![Go Report Card](https://goreportcard.com/badge/github.com/wrouesnel/postgres_exporter)](https://goreportcard.com/report/github.com/wrouesnel/postgres_exporter)
|
2016-05-28 04:35:17 +00:00
|
|
|
|
2017-02-21 10:32:05 +00:00
|
|
|
# PostgresSQL Server Exporter
|
2015-08-24 17:27:14 +00:00
|
|
|
|
2017-02-21 10:32:05 +00:00
|
|
|
Prometheus exporter for PostgresSQL server metrics.
|
|
|
|
Supported Postgres versions: 9.1 and up.
|
2015-08-24 17:27:14 +00:00
|
|
|
|
2016-03-12 10:07:31 +00:00
|
|
|
## Quick Start
|
|
|
|
This package is available for Docker:
|
|
|
|
```
|
2016-05-20 09:04:31 +00:00
|
|
|
# Start an example database
|
|
|
|
docker run --net=host -it --rm -e POSTGRES_PASSWORD=password postgres
|
|
|
|
# Connect to it
|
2016-11-21 08:50:15 +00:00
|
|
|
docker run -e DATA_SOURCE_NAME="postgresql://postgres:password@localhost:5432/?sslmode=disable" -p 9187:9187 wrouesnel/postgres_exporter
|
2016-03-12 10:07:31 +00:00
|
|
|
```
|
|
|
|
|
2015-08-24 17:27:14 +00:00
|
|
|
## Building and running
|
2016-03-12 10:07:31 +00:00
|
|
|
The default make file behavior is to build the binary:
|
|
|
|
```
|
|
|
|
make
|
2016-05-20 09:04:31 +00:00
|
|
|
export DATA_SOURCE_NAME="postgresql://login:password@hostname:port/dbname"
|
2016-03-12 10:07:31 +00:00
|
|
|
./postgres_exporter <flags>
|
|
|
|
```
|
2015-08-24 17:27:14 +00:00
|
|
|
|
2016-03-12 10:07:31 +00:00
|
|
|
To build the dockerfile, run `make docker`.
|
2015-08-24 17:27:14 +00:00
|
|
|
|
2016-03-12 10:07:31 +00:00
|
|
|
This will build the docker image as `wrouesnel/postgres_exporter:latest`. This
|
|
|
|
is a minimal docker image containing *just* postgres_exporter. By default no SSL
|
|
|
|
certificates are included, if you need to use SSL you should either bind-mount
|
|
|
|
`/etc/ssl/certs/ca-certificates.crt` or derive a new image containing them.
|
2015-08-24 17:27:14 +00:00
|
|
|
|
2016-03-12 10:07:31 +00:00
|
|
|
### Vendoring
|
|
|
|
Package vendoring is handled with [`govendor`](https://github.com/kardianos/govendor)
|
2015-08-27 21:05:30 +00:00
|
|
|
|
2015-08-24 17:27:14 +00:00
|
|
|
### Flags
|
|
|
|
|
2016-11-17 11:14:13 +00:00
|
|
|
* `web.listen-address`
|
|
|
|
Address to listen on for web interface and telemetry.
|
|
|
|
|
|
|
|
* `web.telemetry-path`
|
|
|
|
Path under which to expose metrics.
|
|
|
|
|
2017-02-21 10:32:05 +00:00
|
|
|
### Setting the Postgres server's data source name
|
2015-08-24 17:27:14 +00:00
|
|
|
|
2017-02-21 10:32:05 +00:00
|
|
|
The PostgresSQL server's [data source name](http://en.wikipedia.org/wiki/Data_source_name)
|
2015-08-24 17:27:14 +00:00
|
|
|
must be set via the `DATA_SOURCE_NAME` environment variable.
|
|
|
|
|
2015-09-07 05:25:10 +00:00
|
|
|
For running it locally on a default Debian/Ubuntu install, this will work (transpose to init script as appropriate):
|
|
|
|
|
|
|
|
sudo -u postgres DATA_SOURCE_NAME="user=postgres host=/var/run/postgresql/ sslmode=disable" postgres_exporter
|
|
|
|
|
2016-03-12 10:18:05 +00:00
|
|
|
See the [github.com/lib/pq](http://github.com/lib/pq) module for other ways to format the connection string.
|
2015-08-24 17:27:14 +00:00
|
|
|
|
|
|
|
### Adding new metrics
|
|
|
|
|
|
|
|
The exporter will attempt to dynamically export additional metrics if they are added in the
|
|
|
|
future, but they will be marked as "untyped". Additional metric maps can be easily created
|
2017-02-21 10:32:05 +00:00
|
|
|
from Postgres documentation by copying the tables and using the following Python snippet:
|
2015-08-24 17:27:14 +00:00
|
|
|
|
|
|
|
```python
|
|
|
|
x = """tab separated raw text of a documentation table"""
|
|
|
|
for l in StringIO(x):
|
|
|
|
column, ctype, description = l.split('\t')
|
|
|
|
print """"{0}" : {{ prometheus.CounterValue, prometheus.NewDesc("pg_stat_database_{0}", "{2}", nil, nil) }}, """.format(column.strip(), ctype, description.strip())
|
|
|
|
```
|
|
|
|
Adjust the value of the resultant prometheus value type appropriately. This helps build
|
2015-08-27 21:05:30 +00:00
|
|
|
rich self-documenting metrics for the exporter.
|
2016-01-06 19:19:41 +00:00
|
|
|
|
2016-09-07 19:15:52 +00:00
|
|
|
### Adding new metrics via a config file
|
|
|
|
|
|
|
|
The -extend.query-path command-line argument specifies a YAML file containing additional queries to run.
|
|
|
|
Some examples are provided in [queries.yaml](queries.yaml).
|
2016-01-06 19:19:41 +00:00
|
|
|
|
|
|
|
### Running as non-superuser
|
|
|
|
|
|
|
|
To be able to collect metrics from pg_stat_activity and pg_stat_replication as non-superuser you have to create functions and views to do so.
|
|
|
|
|
|
|
|
```sql
|
|
|
|
CREATE USER postgres_exporter PASSWORD 'password';
|
|
|
|
ALTER USER postgres_exporter SET SEARCH_PATH TO postgres_exporter,pg_catalog;
|
|
|
|
|
|
|
|
CREATE SCHEMA postgres_exporter AUTHORIZATION postgres_exporter;
|
|
|
|
|
|
|
|
CREATE FUNCTION postgres_exporter.f_select_pg_stat_activity()
|
|
|
|
RETURNS setof pg_catalog.pg_stat_activity
|
|
|
|
LANGUAGE sql
|
|
|
|
SECURITY DEFINER
|
|
|
|
AS $$
|
|
|
|
SELECT * from pg_catalog.pg_stat_activity;
|
|
|
|
$$;
|
|
|
|
|
|
|
|
CREATE FUNCTION postgres_exporter.f_select_pg_stat_replication()
|
|
|
|
RETURNS setof pg_catalog.pg_stat_replication
|
|
|
|
LANGUAGE sql
|
|
|
|
SECURITY DEFINER
|
|
|
|
AS $$
|
|
|
|
SELECT * from pg_catalog.pg_stat_replication;
|
|
|
|
$$;
|
|
|
|
|
|
|
|
CREATE VIEW postgres_exporter.pg_stat_replication
|
|
|
|
AS
|
|
|
|
SELECT * FROM postgres_exporter.f_select_pg_stat_replication();
|
|
|
|
|
|
|
|
CREATE VIEW postgres_exporter.pg_stat_activity
|
|
|
|
AS
|
|
|
|
SELECT * FROM postgres_exporter.f_select_pg_stat_activity();
|
|
|
|
|
|
|
|
GRANT SELECT ON postgres_exporter.pg_stat_replication TO postgres_exporter;
|
|
|
|
GRANT SELECT ON postgres_exporter.pg_stat_activity TO postgres_exporter;
|
|
|
|
```
|
2017-02-21 10:32:05 +00:00
|
|
|
|
|
|
|
> **NOTE**
|
|
|
|
> <br />Remember to use `postgres` database name in the connection string:
|
|
|
|
> ```
|
|
|
|
> DATA_SOURCE_NAME=postgresql://postgres_exporter:password@localhost:5432/postgres?sslmode=disable
|
|
|
|
> ```
|