plugin_name: go.d.plugin
modules:
  - meta:
      id: collector-go.d.plugin-postgres
      plugin_name: go.d.plugin
      module_name: postgres
      monitored_instance:
        name: PostgreSQL
        link: https://www.postgresql.org/
        categories:
          - data-collection.database-servers
        icon_filename: postgres.svg
      related_resources:
        integrations:
          list:
            - plugin_name: apps.plugin
              module_name: apps
            - plugin_name: cgroups.plugin
              module_name: cgroups
      alternative_monitored_instances: []
      info_provided_to_referring_integrations:
        description: ""
      keywords:
        - db
        - database
        - postgres
        - postgresql
        - sql
      most_popular: true
    overview:
      multi_instance: true
      data_collection:
        metrics_description: |
          This collector monitors the activity and performance of Postgres servers, collects replication statistics, metrics for each database, table and index, and more.
        method_description: |
          It establishes a connection to the Postgres instance via a TCP or UNIX socket.
          To collect metrics for database tables and indexes, it establishes an additional connection for each discovered database.
      default_behavior:
        auto_detection:
          description: |
            By default, it detects instances running on localhost by trying to connect as root and netdata using known PostgreSQL TCP and UNIX sockets:
            
            - 127.0.0.1:5432
            - /var/run/postgresql/
        limits:
          description: |
            Table and index metrics are not collected for databases with more than 50 tables or 250 indexes.
            These limits can be changed in the configuration file.
        performance_impact:
          description: ""
      additional_permissions:
        description: ""
      supported_platforms:
        include: []
        exclude: []
    setup:
      prerequisites:
        list:
          - title: Create netdata user
            description: |
              Create a user with granted `pg_monitor`
              or `pg_read_all_stat` [built-in role](https://www.postgresql.org/docs/current/predefined-roles.html).
              
              To create the `netdata` user with these permissions, execute the following in the psql session, as a user with CREATEROLE privileges:
              
              ```postgresql
              CREATE USER netdata;
              GRANT pg_monitor TO netdata;
              ```
              
              After creating the new user, restart the Netdata Agent with `sudo systemctl restart netdata`, or
              the [appropriate method](/docs/netdata-agent/start-stop-restart.md) for your
              system.
      configuration:
        file:
          name: go.d/postgres.conf
        options:
          description: |
            The following options can be defined globally: update_every, autodetection_retry.
          folding:
            title: Config options
            enabled: true
          list:
            - name: update_every
              description: Data collection frequency.
              default_value: 5
              required: false
            - name: autodetection_retry
              description: Recheck interval in seconds. Zero means no recheck will be scheduled.
              default_value: 0
              required: false
            - name: dsn
              description: Postgres server DSN (Data Source Name). See [DSN syntax](https://www.postgresql.org/docs/current/libpq-connect.html#LIBPQ-CONNSTRING).
              default_value: postgres://postgres:postgres@127.0.0.1:5432/postgres
              required: true
            - name: timeout
              description: Query timeout in seconds.
              default_value: 2
              required: false
            - name: collect_databases_matching
              description: Databases selector. Determines which database metrics will be collected. Syntax is [simple patterns](https://github.com/netdata/netdata/tree/master/src/go/pkg/matcher#simple-patterns-matcher).
              default_value: ""
              required: false
            - name: max_db_tables
              description: Maximum number of tables in the database. Table metrics will not be collected for databases that have more tables than max_db_tables. 0 means no limit.
              default_value: 50
              required: false
            - name: max_db_indexes
              description: Maximum number of indexes in the database. Index metrics will not be collected for databases that have more indexes than max_db_indexes. 0 means no limit.
              default_value: 250
              required: false
        examples:
          folding:
            title: Config
            enabled: true
          list:
            - name: TCP socket
              description: An example configuration.
              folding:
                enabled: false
              config: |
                jobs:
                  - name: local
                    dsn: 'postgresql://netdata@127.0.0.1:5432/postgres'
            - name: Unix socket
              description: An example configuration.
              config: |
                jobs:
                  - name: local
                    dsn: 'host=/var/run/postgresql dbname=postgres user=netdata'
            - name: Unix socket (custom port)
              description: Connect to PostgreSQL using a Unix socket with a non-default port (5433).
              config: |
                jobs:
                  - name: local
                    dsn: 'host=/var/run/postgresql port=5433 dbname=postgres user=netdata'
            - name: Multi-instance
              description: |
                > **Note**: When you define multiple jobs, their names must be unique.
                
                Local and remote instances.
              config: |
                jobs:
                  - name: local
                    dsn: 'postgresql://netdata@127.0.0.1:5432/postgres'
                
                  - name: remote
                    dsn: 'postgresql://netdata@203.0.113.0:5432/postgres'
    troubleshooting:
      problems:
        list: []
    alerts:
      - name: postgres_total_connection_utilization
        metric: postgres.connections_utilization
        info: average total connection utilization over the last minute
        link: https://github.com/netdata/netdata/blob/master/src/health/health.d/postgres.conf
      - name: postgres_acquired_locks_utilization
        metric: postgres.locks_utilization
        info: average acquired locks utilization over the last minute
        link: https://github.com/netdata/netdata/blob/master/src/health/health.d/postgres.conf
      - name: postgres_txid_exhaustion_perc
        metric: postgres.txid_exhaustion_perc
        info: percent towards TXID wraparound
        link: https://github.com/netdata/netdata/blob/master/src/health/health.d/postgres.conf
      - name: postgres_db_cache_io_ratio
        metric: postgres.db_cache_io_ratio
        info: average cache hit ratio in db ${label:database} over the last minute
        link: https://github.com/netdata/netdata/blob/master/src/health/health.d/postgres.conf
      - name: postgres_db_transactions_rollback_ratio
        metric: postgres.db_cache_io_ratio
        info: average aborted transactions percentage in db ${label:database} over the last five minutes
        link: https://github.com/netdata/netdata/blob/master/src/health/health.d/postgres.conf
      - name: postgres_db_deadlocks_rate
        metric: postgres.db_deadlocks_rate
        info: number of deadlocks detected in db ${label:database} in the last minute
        link: https://github.com/netdata/netdata/blob/master/src/health/health.d/postgres.conf
      - name: postgres_table_cache_io_ratio
        metric: postgres.table_cache_io_ratio
        info: average cache hit ratio in db ${label:database} table ${label:table} over the last minute
        link: https://github.com/netdata/netdata/blob/master/src/health/health.d/postgres.conf
      - name: postgres_table_index_cache_io_ratio
        metric: postgres.table_index_cache_io_ratio
        info: average index cache hit ratio in db ${label:database} table ${label:table} over the last minute
        link: https://github.com/netdata/netdata/blob/master/src/health/health.d/postgres.conf
      - name: postgres_table_toast_cache_io_ratio
        metric: postgres.table_toast_cache_io_ratio
        info: average TOAST hit ratio in db ${label:database} table ${label:table} over the last minute
        link: https://github.com/netdata/netdata/blob/master/src/health/health.d/postgres.conf
      - name: postgres_table_toast_index_cache_io_ratio
        metric: postgres.table_toast_index_cache_io_ratio
        info: average index TOAST hit ratio in db ${label:database} table ${label:table} over the last minute
        link: https://github.com/netdata/netdata/blob/master/src/health/health.d/postgres.conf
      - name: postgres_table_bloat_size_perc
        metric: postgres.table_bloat_size_perc
        info: bloat size percentage in db ${label:database} table ${label:table}
        link: https://github.com/netdata/netdata/blob/master/src/health/health.d/postgres.conf
      - name: postgres_table_last_autovacuum_time
        metric: postgres.table_autovacuum_since_time
        info: time elapsed since db ${label:database} table ${label:table} was vacuumed by the autovacuum daemon
        link: https://github.com/netdata/netdata/blob/master/src/health/health.d/postgres.conf
      - name: postgres_table_last_autoanalyze_time
        metric: postgres.table_autoanalyze_since_time
        info: time elapsed since db ${label:database} table ${label:table} was analyzed by the autovacuum daemon
        link: https://github.com/netdata/netdata/blob/master/src/health/health.d/postgres.conf
      - name: postgres_index_bloat_size_perc
        metric: postgres.index_bloat_size_perc
        info: bloat size percentage in db ${label:database} table ${label:table} index ${label:index}
        link: https://github.com/netdata/netdata/blob/master/src/health/health.d/postgres.conf
    metrics:
      folding:
        title: Metrics
        enabled: false
      description: ""
      availability: []
      scopes:
        - name: global
          description: These metrics refer to the entire monitored application.
          labels: []
          metrics:
            - name: postgres.connections_utilization
              description: Connections utilization
              unit: percentage
              chart_type: line
              dimensions:
                - name: used
            - name: postgres.connections_usage
              description: Connections usage
              unit: connections
              chart_type: stacked
              dimensions:
                - name: available
                - name: used
            - name: postgres.connections_state_count
              description: Connections in each state
              unit: connections
              chart_type: stacked
              dimensions:
                - name: active
                - name: idle
                - name: idle_in_transaction
                - name: idle_in_transaction_aborted
                - name: disabled
            - name: postgres.transactions_duration
              description: Observed transactions time
              unit: transactions/s
              chart_type: stacked
              dimensions:
                - name: a dimension per bucket
            - name: postgres.queries_duration
              description: Observed active queries time
              unit: queries/s
              chart_type: stacked
              dimensions:
                - name: a dimension per bucket
            - name: postgres.locks_utilization
              description: Acquired locks utilization
              unit: percentage
              chart_type: line
              dimensions:
                - name: used
            - name: postgres.checkpoints_rate
              description: Checkpoints
              unit: checkpoints/s
              chart_type: stacked
              dimensions:
                - name: scheduled
                - name: requested
            - name: postgres.checkpoints_time
              description: Checkpoint time
              unit: milliseconds
              chart_type: stacked
              dimensions:
                - name: write
                - name: sync
            - name: postgres.bgwriter_halts_rate
              description: Background writer scan halts
              unit: events/s
              chart_type: line
              dimensions:
                - name: maxwritten
            - name: postgres.buffers_io_rate
              description: Buffers written rate
              unit: B/s
              chart_type: area
              dimensions:
                - name: checkpoint
                - name: backend
                - name: bgwriter
            - name: postgres.buffers_backend_fsync_rate
              description: Backend fsync calls
              unit: calls/s
              chart_type: line
              dimensions:
                - name: fsync
            - name: postgres.buffers_allocated_rate
              description: Buffers allocated
              unit: B/s
              chart_type: line
              dimensions:
                - name: allocated
            - name: postgres.wal_io_rate
              description: Write-Ahead Log writes
              unit: B/s
              chart_type: line
              dimensions:
                - name: write
            - name: postgres.wal_files_count
              description: Write-Ahead Log files
              unit: files
              chart_type: stacked
              dimensions:
                - name: written
                - name: recycled
            - name: postgres.wal_archiving_files_count
              description: Write-Ahead Log archived files
              unit: files/s
              chart_type: stacked
              dimensions:
                - name: ready
                - name: done
            - name: postgres.autovacuum_workers_count
              description: Autovacuum workers
              unit: workers
              chart_type: line
              dimensions:
                - name: analyze
                - name: vacuum_analyze
                - name: vacuum
                - name: vacuum_freeze
                - name: brin_summarize
            - name: postgres.txid_exhaustion_towards_autovacuum_perc
              description: Percent towards emergency autovacuum
              unit: percentage
              chart_type: line
              dimensions:
                - name: emergency_autovacuum
            - name: postgres.txid_exhaustion_perc
              description: Percent towards transaction ID wraparound
              unit: percentage
              chart_type: line
              dimensions:
                - name: txid_exhaustion
            - name: postgres.txid_exhaustion_oldest_txid_num
              description: Oldest transaction XID
              chart_type: line
              unit: xid
              dimensions:
                - name: xid
            - name: postgres.catalog_relations_count
              description: Relation count
              unit: relations
              chart_type: stacked
              dimensions:
                - name: ordinary_table
                - name: index
                - name: sequence
                - name: toast_table
                - name: view
                - name: materialized_view
                - name: composite_type
                - name: foreign_table
                - name: partitioned_table
                - name: partitioned_index
            - name: postgres.catalog_relations_size
              description: Relation size
              unit: B
              chart_type: stacked
              dimensions:
                - name: ordinary_table
                - name: index
                - name: sequence
                - name: toast_table
                - name: view
                - name: materialized_view
                - name: composite_type
                - name: foreign_table
                - name: partitioned_table
                - name: partitioned_index
            - name: postgres.uptime
              description: Uptime
              unit: seconds
              chart_type: line
              dimensions:
                - name: uptime
            - name: postgres.databases_count
              description: Number of databases
              unit: databases
              chart_type: line
              dimensions:
                - name: databases
        - name: repl application
          description: These metrics refer to the replication application.
          labels:
            - name: application
              description: application name
          metrics:
            - name: postgres.replication_app_wal_lag_size
              description: Standby application WAL lag size
              unit: B
              chart_type: line
              dimensions:
                - name: sent_lag
                - name: write_lag
                - name: flush_lag
                - name: replay_lag
            - name: postgres.replication_app_wal_lag_time
              description: Standby application WAL lag time
              unit: seconds
              chart_type: line
              dimensions:
                - name: write_lag
                - name: flush_lag
                - name: replay_lag
        - name: repl slot
          description: These metrics refer to the replication slot.
          labels:
            - name: slot
              description: replication slot name
          metrics:
            - name: postgres.replication_slot_files_count
              description: Replication slot files
              unit: files
              chart_type: line
              dimensions:
                - name: wal_keep
                - name: pg_replslot_files
        - name: database
          description: These metrics refer to the database.
          labels:
            - name: database
              description: database name
          metrics:
            - name: postgres.db_transactions_ratio
              description: Database transactions ratio
              unit: percentage
              chart_type: line
              dimensions:
                - name: committed
                - name: rollback
            - name: postgres.db_transactions_rate
              description: Database transactions
              unit: transactions/s
              chart_type: line
              dimensions:
                - name: committed
                - name: rollback
            - name: postgres.db_connections_utilization
              description: Database connections utilization
              unit: percentage
              chart_type: line
              dimensions:
                - name: used
            - name: postgres.db_connections_count
              description: Database connections
              unit: connections
              chart_type: line
              dimensions:
                - name: connections
            - name: postgres.db_cache_io_ratio
              description: Database buffer cache miss ratio
              unit: percentage
              chart_type: line
              dimensions:
                - name: miss
            - name: postgres.db_io_rate
              description: Database reads
              unit: B/s
              chart_type: line
              dimensions:
                - name: memory
                - name: disk
            - name: postgres.db_ops_fetched_rows_ratio
              description: Database rows fetched ratio
              unit: percentage
              chart_type: line
              dimensions:
                - name: fetched
            - name: postgres.db_ops_read_rows_rate
              description: Database rows read
              unit: rows/s
              chart_type: line
              dimensions:
                - name: returned
                - name: fetched
            - name: postgres.db_ops_write_rows_rate
              description: Database rows written
              unit: rows/s
              chart_type: line
              dimensions:
                - name: inserted
                - name: deleted
                - name: updated
            - name: postgres.db_conflicts_rate
              description: Database canceled queries
              unit: queries/s
              chart_type: line
              dimensions:
                - name: conflicts
            - name: postgres.db_conflicts_reason_rate
              description: Database canceled queries by reason
              unit: queries/s
              chart_type: line
              dimensions:
                - name: tablespace
                - name: lock
                - name: snapshot
                - name: bufferpin
                - name: deadlock
            - name: postgres.db_deadlocks_rate
              description: Database deadlocks
              unit: deadlocks/s
              chart_type: line
              dimensions:
                - name: deadlocks
            - name: postgres.db_locks_held_count
              description: Database locks held
              unit: locks
              chart_type: stacked
              dimensions:
                - name: access_share
                - name: row_share
                - name: row_exclusive
                - name: share_update
                - name: share
                - name: share_row_exclusive
                - name: exclusive
                - name: access_exclusive
            - name: postgres.db_locks_awaited_count
              description: Database locks awaited
              unit: locks
              chart_type: stacked
              dimensions:
                - name: access_share
                - name: row_share
                - name: row_exclusive
                - name: share_update
                - name: share
                - name: share_row_exclusive
                - name: exclusive
                - name: access_exclusive
            - name: postgres.db_temp_files_created_rate
              description: Database created temporary files
              unit: files/s
              chart_type: line
              dimensions:
                - name: created
            - name: postgres.db_temp_files_io_rate
              description: Database temporary files data written to disk
              unit: B/s
              chart_type: line
              dimensions:
                - name: written
            - name: postgres.db_size
              description: Database size
              unit: B
              chart_type: line
              dimensions:
                - name: size
        - name: table
          description: These metrics refer to the database table.
          labels:
            - name: database
              description: database name
            - name: schema
              description: schema name
            - name: table
              description: table name
            - name: parent_table
              description: parent table name
          metrics:
            - name: postgres.table_rows_dead_ratio
              description: Table dead rows
              unit: percentage
              chart_type: line
              dimensions:
                - name: dead
            - name: postgres.table_rows_count
              description: Table total rows
              unit: rows
              chart_type: line
              dimensions:
                - name: live
                - name: dead
            - name: postgres.table_ops_rows_rate
              description: Table throughput
              unit: rows/s
              chart_type: line
              dimensions:
                - name: inserted
                - name: deleted
                - name: updated
            - name: postgres.table_ops_rows_hot_ratio
              description: Table HOT updates ratio
              unit: percentage
              chart_type: line
              dimensions:
                - name: hot
            - name: postgres.table_ops_rows_hot_rate
              description: Table HOT updates
              unit: rows/s
              chart_type: line
              dimensions:
                - name: hot
            - name: postgres.table_cache_io_ratio
              description: Table I/O cache miss ratio
              unit: percentage
              chart_type: line
              dimensions:
                - name: miss
            - name: postgres.table_io_rate
              description: Table I/O
              unit: B/s
              chart_type: line
              dimensions:
                - name: memory
                - name: disk
            - name: postgres.table_index_cache_io_ratio
              description: Table index I/O cache miss ratio
              unit: percentage
              chart_type: line
              dimensions:
                - name: miss
            - name: postgres.table_index_io_rate
              description: Table index I/O
              unit: B/s
              chart_type: line
              dimensions:
                - name: memory
                - name: disk
            - name: postgres.table_toast_cache_io_ratio
              description: Table TOAST I/O cache miss ratio
              unit: percentage
              chart_type: line
              dimensions:
                - name: miss
            - name: postgres.table_toast_io_rate
              description: Table TOAST I/O
              unit: B/s
              chart_type: line
              dimensions:
                - name: memory
                - name: disk
            - name: postgres.table_toast_index_cache_io_ratio
              description: Table TOAST index I/O cache miss ratio
              unit: percentage
              chart_type: line
              dimensions:
                - name: miss
            - name: postgres.table_toast_index_io_rate
              description: Table TOAST index I/O
              unit: B/s
              chart_type: line
              dimensions:
                - name: memory
                - name: disk
            - name: postgres.table_scans_rate
              description: Table scans
              unit: scans/s
              chart_type: line
              dimensions:
                - name: index
                - name: sequential
            - name: postgres.table_scans_rows_rate
              description: Table live rows fetched by scans
              unit: rows/s
              chart_type: line
              dimensions:
                - name: index
                - name: sequential
            - name: postgres.table_autovacuum_since_time
              description: Table time since last auto VACUUM
              unit: seconds
              chart_type: line
              dimensions:
                - name: time
            - name: postgres.table_vacuum_since_time
              description: Table time since last manual VACUUM
              unit: seconds
              chart_type: line
              dimensions:
                - name: time
            - name: postgres.table_autoanalyze_since_time
              description: Table time since last auto ANALYZE
              unit: seconds
              chart_type: line
              dimensions:
                - name: time
            - name: postgres.table_analyze_since_time
              description: Table time since last manual ANALYZE
              unit: seconds
              chart_type: line
              dimensions:
                - name: time
            - name: postgres.table_null_columns
              description: Table null columns
              unit: columns
              chart_type: line
              dimensions:
                - name: "null"
            - name: postgres.table_size
              description: Table total size
              unit: B
              chart_type: line
              dimensions:
                - name: size
            - name: postgres.table_bloat_size_perc
              description: Table bloat size percentage
              unit: percentage
              chart_type: line
              dimensions:
                - name: bloat
            - name: postgres.table_bloat_size
              description: Table bloat size
              unit: B
              chart_type: line
              dimensions:
                - name: bloat
        - name: index
          description: These metrics refer to the table index.
          labels:
            - name: database
              description: database name
            - name: schema
              description: schema name
            - name: table
              description: table name
            - name: parent_table
              description: parent table name
            - name: index
              description: index name
          metrics:
            - name: postgres.index_size
              description: Index size
              unit: B
              chart_type: line
              dimensions:
                - name: size
            - name: postgres.index_bloat_size_perc
              description: Index bloat size percentage
              unit: percentage
              chart_type: line
              dimensions:
                - name: bloat
            - name: postgres.index_bloat_size
              description: Index bloat size
              unit: B
              chart_type: line
              dimensions:
                - name: bloat
            - name: postgres.index_usage_status
              description: Index usage status
              unit: status
              chart_type: line
              dimensions:
                - name: used
                - name: unused
