General availability (GA) Open source Grafana Cloud
Last reviewed: October 14, 2026

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

Alloy
prometheus.exporter.postgres "<LABEL>" {
  data_source_names = ["<DATA_SOURCE_NAME>"]
}

Arguments

You can use the following arguments with prometheus.exporter.postgres:

NameTypeDescriptionDefaultRequired
data_source_nameslist(secret)Specifies the PostgreSQL servers to connect to.yes
custom_queries_config_pathstringPath to YAML file containing custom queries to expose as metrics.""no
disable_default_metricsboolWhen true, only exposes metrics supplied from custom_queries_config_path.falseno
disable_settings_metricsboolDisables collection of metrics from pg_settings.falseno
enabled_collectorslist(string)List of collectors to enable. Refer to the information below for more detail.[]no

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.postgres components, not just one. Refer to the postgres_exporter repository 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_summary
  • database
  • database_wraparound
  • locks
  • long_running_transactions
  • postmaster
  • process_idle
  • replication
  • replication_slot
  • roles
  • stat_activity_autovacuum
  • stat_bgwriter
  • stat_checkpointer - Only supported in PostgreSQL 17 and later
  • stat_database
  • stat_progress_vacuum
  • stat_statements
  • stat_user_tables
  • stat_wal_receiver
  • statio_user_indexes
  • statio_user_tables
  • wal
  • xlog_location

The component enables the following collectors by default:

  • database
  • locks
  • replication
  • replication_slot
  • roles
  • stat_bgwriter
  • stat_database
  • stat_progress_vacuum
  • stat_user_tables
  • statio_user_tables
  • wal

Note

Due to a limitation of the upstream exporter, enabled_collectors applies only to the first data source when you configure multiple data_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:

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:

NameTypeDescriptionDefaultRequired
database_allowlistlist(string)Scrape only these databases.no
database_denylistlist(string)Scrape all databases except these.no
enabledboolWhether to automatically discover other databases.falseno

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:

NameTypeDescriptionDefaultRequired
exclude_databaseslist(string)Comma-separated list of database names to exclude.[]no
exclude_userslist(string)Comma-separated list of user names to exclude.[]no
include_queryboolEnable the selection of query ID and SQL statement.falseno
limitnumberMaximum number of statements to fetch.100no
query_lengthnumberMaximum length of the statement query text.120no

Exported fields

The following fields are exported and can be referenced by other components.

NameTypeDescription
targetslist(map(string))The targets that can be used to collect exporter metrics.

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:

Alloy
// 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 Prometheus remote_write compatible server to send metrics to.
  • <USERNAME>: The username to use for authentication to the remote_write API.
  • <PASSWORD>: The password to use for authentication to the remote_write API.

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:

Alloy
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 Prometheus remote_write compatible server to send metrics to.
  • <USERNAME>: The username to use for authentication to the remote_write API.
  • <PASSWORD>: The password to use for authentication to the remote_write API.

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.

Alloy
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 Prometheus remote_write compatible server to send metrics to.
  • <USERNAME>: The username to use for authentication to the remote_write API.
  • <PASSWORD>: The password to use for authentication to the remote_write API.

Escape special characters in a connection string

If your password contains special characters such as @, :, or /, wrap it with encoding.url_encode.

Alloy
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:

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.