This is documentation for the next version of Grafana Alloy Documentation. For the latest stable release, go to the latest version.
prometheus.exporter.postgres
The prometheus.exporter.postgres component embeds the postgres_exporter to collect metrics from a PostgreSQL database.
You can specify multiple prometheus.exporter.postgres components by giving them different labels.
Usage
prometheus.exporter.postgres "<LABEL>" {
data_source_names = ["<DATA_SOURCE_NAME>"]
}Arguments
You can use the following arguments with prometheus.exporter.postgres:
Refer to the PostgreSQL documentation for more information about the format of the connection strings in data_source_names.
Refer to the examples for the custom_queries_config_path file in the postgres_exporter repository.
Note
Avoid configuring the exporter with environment variables. They affect all
prometheus.exporter.postgrescomponents, not just one. Refer to thepostgres_exporterrepository for a full list of environment variables.
The prometheus.exporter.postgres component configures the embedded postgres_exporter to run with a collection timeout of 10 seconds.
By default, the component enables the same set of metrics as the upstream postgres_exporter.
Set custom_queries_config_path to expose additional metrics from a configuration file.
Set disable_default_metrics to true to expose only the metrics from custom_queries_config_path.
That makes custom_queries_config_path required, and you can’t set enabled_collectors.
Set enabled_collectors to control a subset of the metrics collectors.
The following collectors are available for selection:
buffercache_summarydatabasedatabase_wraparoundlockslong_running_transactionspostmasterprocess_idlereplicationreplication_slotrolesstat_activity_autovacuumstat_bgwriterstat_checkpointer- Only supported in PostgreSQL 17 and laterstat_databasestat_progress_vacuumstat_statementsstat_user_tablesstat_wal_receiverstatio_user_indexesstatio_user_tableswalxlog_location
The component enables the following collectors by default:
databaselocksreplicationreplication_slotrolesstat_bgwriterstat_databasestat_progress_vacuumstat_user_tablesstatio_user_tableswal
Note
Due to a limitation of the upstream exporter,
enabled_collectorsapplies only to the first data source when you configure multipledata_source_names.
The component sets the instance label on its exported targets to a simplified form of the data source name, postgresql://<HOST>:<PORT>/<DATABASE>, with any credentials removed.
The component omits the port when the data source name specifies a host without a port.
When the data source name omits the host, the component uses localhost:5432.
When you configure more than one data source name, the component sets the instance label to the component ID.
Blocks
You can use the following blocks with prometheus.exporter.postgres:
No valid configuration blocks found.
autodiscovery
The autodiscovery block configures discovery of databases, outside of any specified in data_source_names.
You can use the following arguments with the autodiscovery block:
If you set enabled to true without an allowlist or a denylist, the exporter scrapes all databases.
If you don’t enable autodiscovery, neither database_allowlist nor database_denylist has any effect.
stat_statements
The stat_statements block configures the selection of both the query ID and the full SQL statement.
This configuration takes effect only when you enable the stat_statements collector.
You can use the following arguments with the stat_statements block:
Exported fields
The following fields are exported and can be referenced by other components.
For example, the targets can either be passed to a discovery.relabel component to rewrite the targets’ label sets or to a prometheus.scrape component that collects the exposed metrics.
The exported targets use the configured in-memory traffic address specified by the run command.
Component health
prometheus.exporter.postgres is only reported as unhealthy if given an invalid configuration.
In those cases, exported fields retain their last healthy values.
Debug information
prometheus.exporter.postgres doesn’t expose any component-specific debug information.
Debug metrics
prometheus.exporter.postgres doesn’t expose any component-specific debug metrics.
Examples
Collect metrics from a PostgreSQL server
The following example uses a prometheus.exporter.postgres component to collect metrics from a PostgreSQL server running locally with all default settings:
// Because no autodiscovery is defined, this will only scrape the <DATABASE_NAME> database, as defined
// in the DSN below.
prometheus.exporter.postgres "example" {
data_source_names = ["postgresql://<DB_USERNAME>:<DB_PASSWORD>@localhost:5432/<DATABASE_NAME>?sslmode=disable"]
}
prometheus.scrape "default" {
targets = prometheus.exporter.postgres.example.targets
forward_to = [prometheus.remote_write.demo.receiver]
}
prometheus.remote_write "demo" {
endpoint {
url = "<PROMETHEUS_REMOTE_WRITE_URL>"
basic_auth {
username = "<USERNAME>"
password = "<PASSWORD>"
}
}
}Replace the following:
<DB_USERNAME>: The username for the PostgreSQL server.<DB_PASSWORD>: The password for the PostgreSQL server.<DATABASE_NAME>: The name of the database to scrape.<PROMETHEUS_REMOTE_WRITE_URL>: The URL of the Prometheusremote_writecompatible server to send metrics to.<USERNAME>: The username to use for authentication to theremote_writeAPI.<PASSWORD>: The password to use for authentication to theremote_writeAPI.
Collect custom metrics from an allowlisted set of databases
The following example uses a prometheus.exporter.postgres component to collect custom metrics from a set of specific databases, replacing default metrics with custom metrics derived from queries in /etc/alloy/custom-postgres-metrics.yaml:
prometheus.exporter.postgres "example" {
data_source_names = ["postgresql://<DB_USERNAME>:<DB_PASSWORD>@localhost:5432/<DATABASE_NAME>?sslmode=disable"]
// This block configures autodiscovery to check for databases outside of the <DATABASE_NAME> db
// specified in the DSN above. The database_allowlist field limits autodiscovery to the
// 'frontend_app' and 'backend_app' databases. The component also scrapes <DATABASE_NAME>.
autodiscovery {
enabled = true
database_allowlist = ["frontend_app", "backend_app"]
}
disable_default_metrics = true
custom_queries_config_path = "/etc/alloy/custom-postgres-metrics.yaml"
}
prometheus.scrape "default" {
targets = prometheus.exporter.postgres.example.targets
forward_to = [prometheus.remote_write.demo.receiver]
}
prometheus.remote_write "demo" {
endpoint {
url = "<PROMETHEUS_REMOTE_WRITE_URL>"
basic_auth {
username = "<USERNAME>"
password = "<PASSWORD>"
}
}
}Replace the following:
<DB_USERNAME>: The username for the PostgreSQL server.<DB_PASSWORD>: The password for the PostgreSQL server.<DATABASE_NAME>: The name of the database to scrape.<PROMETHEUS_REMOTE_WRITE_URL>: The URL of the Prometheusremote_writecompatible server to send metrics to.<USERNAME>: The username to use for authentication to theremote_writeAPI.<PASSWORD>: The password to use for authentication to theremote_writeAPI.
Collect metrics from all databases except for a denylisted database
This example uses a prometheus.exporter.postgres component to collect custom metrics from all databases except for the secrets database.
prometheus.exporter.postgres "example" {
data_source_names = ["postgresql://<DB_USERNAME>:<DB_PASSWORD>@localhost:5432/<DATABASE_NAME>?sslmode=disable"]
// The database_denylist field will filter out those databases from the list of databases to scrape,
// meaning that all databases *except* these will be scraped.
//
// In this example it will scrape all databases except for the one named 'secrets'.
autodiscovery {
enabled = true
database_denylist = ["secrets"]
}
}
prometheus.scrape "default" {
targets = prometheus.exporter.postgres.example.targets
forward_to = [prometheus.remote_write.demo.receiver]
}
prometheus.remote_write "demo" {
endpoint {
url = "<PROMETHEUS_REMOTE_WRITE_URL>"
basic_auth {
username = "<USERNAME>"
password = "<PASSWORD>"
}
}
}Replace the following:
<DB_USERNAME>: The username for the PostgreSQL server.<DB_PASSWORD>: The password for the PostgreSQL server.<DATABASE_NAME>: The name of the database to scrape.<PROMETHEUS_REMOTE_WRITE_URL>: The URL of the Prometheusremote_writecompatible server to send metrics to.<USERNAME>: The username to use for authentication to theremote_writeAPI.<PASSWORD>: The password to use for authentication to theremote_writeAPI.
Escape special characters in a connection string
If your password contains special characters such as @, :, or /, wrap it with encoding.url_encode.
prometheus.exporter.postgres "example" {
data_source_names = [
"postgresql://<DB_USERNAME>:" + encoding.url_encode("p@ss/w:ord!") + "@localhost:5432/<DATABASE_NAME>?sslmode=disable",
]
}This keeps the connection string valid.
Replace the following:
<DB_USERNAME>: The username for the PostgreSQL server.<DATABASE_NAME>: The name of the database to scrape.
Compatible components
prometheus.exporter.postgres has exports that can be consumed by the following components:
- Components that consume Targets
Note
Connecting some components may not be sensible or components may require further configuration to make the connection work correctly. Refer to the linked documentation for more details.


