Postgres Exporter
在本页
简介
以下快速入门提供了 Postgres Exporter 的设置说明,以及预配置的仪表盘和报警规则。在完成本快速入门中的步骤后,您将拥有以下内容:
设置并配置 Postgres Exporter 以收集 Postgres 指标,例如每秒查询数 (QPS) 和每秒获取/返回/插入/更新/删除的行数。Postgres Exporter 将这些指标作为 Prometheus 风格的指标公开。
配置 Prometheus 以抓取 Postgres Exporter 指标,并将其可选地发送到 Grafana Cloud。
导入 Grafana 仪表盘以可视化您的指标数据。
设置 Prometheus 报警规则以针对您的指标数据进行报警。
指标用法
默认情况下,此导出器发布大约 450 个 Prometheus 时间序列。要查看此导出器默认提供的指标列表,请下载示例指标抓取 此处。
请注意,根据其配置,Postgres Exporter 可能收集和发布的指标远多于此默认集。要了解有关配置 Postgres Exporter 和切换其收集器的更多信息,请参阅 Postgres Exporter GitHub 存储库。
除了切换 Postgres Exporter 的设置之外,您还可以通过删除不需要存储在 Prometheus 或 Grafana Cloud 中的时间序列来减少指标使用量。要了解如何执行此操作,请参阅 Grafana Cloud 文档中的 使用重新标记来减少 Prometheus 指标使用量。
Grafana Cloud 的 Postgres Exporter 集成
如果您使用的是 Grafana Cloud,您可以通过安装 Postgres Exporter 集成来跳过本指南中的所有步骤。Postgres Exporter 集成旨在帮助您使用几条命令和几次点击完成设置。 免费注册。
要了解如何使用 Postgres Exporter 集成设置 Postgres Exporter,请参阅 Grafana Cloud 文档中的 Postgres Exporter 集成。
在本页
Postgres Exporter 快速入门
在本指南中,您将学习如何设置和配置 Postgres Exporter 以收集 Postgres 指标,例如每秒查询数 (QPS),数据库死锁和冲突,并将它们作为 Prometheus 风格的指标公开。然后,您将配置 Prometheus 以抓取 Postgres 指标,并将其可选地发送到 Grafana Cloud。最后,您将设置一组预配置和精选的 Grafana 仪表盘 和 报警规则。在本指南结束时,您将拥有可用于可视化 Postgres 指标的仪表盘,以及一组预配置的报警。
如果您使用的是 Grafana Cloud,Postgres 集成可以帮助您快速入门。Postgres 集成将 Postgres Exporter 嵌入到 Grafana Cloud Agent 中,并自动配置警报规则和仪表板,因此您无需执行本指南中的步骤。要了解如何使用 Postgres 集成设置 Postgres Exporter,请参阅 Grafana Cloud 文档中的 Postgres 集成。
先决条件
在您开始之前,您应该具备以下条件:
- 一台与 Postgres Exporter 版本兼容的机器。要查看可用版本的列表,请参阅 版本。
- 在您的机器上运行的 Postgres。要详细了解 Postgres 的安装和运行,请参阅 Postgres 安装指南。
- 在您的环境或机器上直接运行的 Prometheus。要了解如何安装 Prometheus,请参阅 Prometheus 文档中的 安装。
- 在您的环境或机器上直接运行的 Grafana。要了解如何安装 Grafana,请参阅 Grafana 文档中的 安装 Grafana。
- (可选) 一个 Grafana Cloud 帐户。Grafana Cloud 托管 Grafana 和一个基于 Mimir 的 Prometheus 指标端点。您仍然需要使用您环境中安装的 Prometheus 或 Grafana Cloud Agent 抓取指标。要详细了解 Grafana Cloud,请参阅 Grafana Cloud。
步骤 1:设置 Postgres Exporter
在此步骤中,您将在机器上设置 Postgres Exporter 以收集和公开 Prometheus 格式的 Postgres 指标。本指南使用带有 Postgres 13.2 的 Ubuntu 20.04 系统。步骤可能会因您的操作系统和 Postgres 版本而略有不同。
首先,登录到您的机器并下载相关的 Postgres Exporter 二进制文件。本指南使用 linux-amd64
二进制文件,但您应该选择与您的系统操作系统和体系结构相对应的二进制文件。
wget https://github.com/prometheus-community/postgres_exporter/releases/download/v0.9.0/postgres_exporter-0.9.0.linux-amd64.tar.gz
将 v0.9.0
替换为您要安装的版本。本指南可能会过时,因此最好查看 Postgres Exporter 版本 页面以获取最新的稳定版本。
解压缩 tarball 并 cd
到该目录中。
tar xvfz postgres_exporter-*.linux-amd64.tar.gz
cd postgres_exporter-*.linux-amd64
我们将以 postgres
用户身份运行 Postgres Exporter 以获取数据库指标。要以非超级用户身份获取指标,您可以按照 Postgres Exporter Github 仓库 中的说明进行操作。
我们需要告知 Exporter 如何访问 Postgres 服务器。我们通过设置以下环境变量来做到这一点。
export DATA_SOURCE_NAME='postgresql://postgres:enter_password_here@postgres_hostname:5432/postgres?sslmode=disable'
请务必将 postgres
替换为您将用于从 Postgres 获取指标的用户,将 enter_password_here
替换为用户的密码,并将 postgres_hostname
替换为 Postgres 实例的主机名(如果您在同一台机器上,则为 localhost)。
最后,运行 Exporter。
./postgres_exporter
INFO[0000] Starting Server: :9187 source="postgres_exporter.go:1850"
如果您看到以上输出,则表示您已成功运行 Postgres Exporter。
Postgres Exporter 在端口 9187
上以 Prometheus 格式发布 Postgres 指标。您可以使用 curl
测试这一点。您需要打开一个新的 SSH 会话或将 Postgres Exporter 进程置于后台以使用 curl
。
curl https://127.0.0.1:9187/metrics
# TYPE pg_exporter_scrapes_total counter
pg_exporter_scrapes_total 1
# HELP pg_locks_count Number of locks
# TYPE pg_locks_count gauge
pg_locks_count{datname="postgres",mode="accessexclusivelock",server="localhost:5432"} 0
pg_locks_count{datname="postgres",mode="accesssharelock",server="localhost:5432"} 1
pg_locks_count{datname="postgres",mode="exclusivelock",server="localhost:5432"} 0
pg_locks_count{datname="postgres",mode="rowexclusivelock",server="localhost:5432"} 0
pg_locks_count{datname="postgres",mode="rowsharelock",server="localhost:5432"} 0
pg_locks_count{datname="postgres",mode="sharelock",server="localhost:5432"} 0
pg_locks_count{datname="postgres",mode="sharerowexclusivelock",server="localhost:5432"} 0
pg_locks_count{datname="postgres",mode="shareupdateexclusivelock",server="localhost:5432"} 0
pg_locks_count{datname="postgres",mode="sireadlock",server="localhost:5432"} 0
如果您看到以上输出,则表示您已准备好使用 Prometheus 开始抓取 Postgres 指标。
为了避免从命令行运行和管理 Postgres Exporter,您可以创建一个 systemd
服务。要了解如何执行此操作,请参阅 创建系统服务以管理代理。将代理二进制文件的路径替换为 Postgres Exporter 的路径。
您可以将 --extend.query-path
标志指定到您的 queries.yaml
文件的路径,您可以在其中指定自定义查询。要详细了解这些功能,请参阅 Postgres Exporter Github 仓库。
步骤 2:使用 Prometheus 抓取 Postgres Exporter
现在 Postgres Exporter 已在您的机器上启动并运行,您可以配置一个 Prometheus 抓取作业来收集和存储 Postgres Exporter 指标。
将以下抓取作业配置添加到您的 prometheus.yml
配置文件中的 scrape_configs
部分。
- job_name: postgres
static_configs:
- targets: ['postgres_exporter_machine_IP_address:9187']
将 postgres_exporter_machine_IP_address
替换为运行 Postgres Exporter 的机器的 IP 地址。如果您在同一台机器上运行 Prometheus,则它将是 localhost
。要详细了解如何配置 Prometheus,请参阅 Prometheus 文档中的 配置。
如果您没有 prometheus.yml
配置文件,请使用您喜欢的文本编辑器创建一个简单的配置文件。打开您喜欢的文本编辑器并将以下 Prometheus 配置粘贴进去。
global:
scrape_interval: 15s
scrape_configs:
- job_name: postgres
static_configs:
- targets: ['postgres_exporter_machine_IP_address:9187']
此配置告诉 Prometheus 每 15 秒抓取所有作业。唯一配置的抓取作业称为 postgres
,并定义了一个 postgres_exporter_machine_IP_address:9187
目标。默认情况下,Prometheus 将使用 HTTP 抓取 /metrics
端点。
保存并关闭文件。然后,您可以使用以下命令运行包含该文件的 Prometheus。
./prometheus --config.file=./prometheus.yml
将指标发送到 Grafana Cloud
要将 Postgres Exporter 指标从 Prometheus 发送到 Grafana Cloud,请在您的 prometheus.yml
配置文件中配置 remote_write
参数。要详细了解,请参阅 Grafana Cloud 文档中的 指标 - Prometheus。要详细了解 remote_write
参数,请参阅 Prometheus 文档中的 remote_write
。
步骤 3:配置仪表盘
此快速入门包括一个仪表板。
- Postgres 概述
要了解如何将这些仪表板导入 Grafana,请参阅 Grafana 文档中的 导入仪表板。
您可以从 这里 获取仪表板。
步骤 4:配置报警
使用 Prometheus 警报规则,您可以定义当 PromQL 表达式超过某个阈值或在一段时间内满足指定条件时触发的警报。例如,您可以定义一个 HighRequestLatency
警报,当请求延迟指标在一段时间内大于某个阈值时触发。一旦警报条件触发,警报就会进入 Pending
状态。在满足条件持续一段时间后,警报将进入 Firing
状态。您可以使用诸如 Alertmanager 之类的工具配置触发警报的路由和通知。Alertmanager 也内置在 Grafana Cloud 中。
您可以从 这里 获取警报规则 YAML 文件。
将报警规则加载到 Prometheus 中
要在 Prometheus 中加载警报规则,请将以下内容添加到您的 prometheus.yml
配置文件中。
rule_files:
- "postgres_exporter_alerting_rules.yml"
请务必将 postgres_exporter_alerting_rules.yml
替换为您的 Postgres 警报规则 YAML 文件的路径。
将报警规则加载到 Grafana Cloud 中
要了解如何将警报规则加载到 Grafana Cloud 中,请参阅 使用 cortextool 的 Prometheus 和 Loki 规则。
结论
在此快速入门中,您在 Linux 机器上安装并运行了 Postgres Exporter。然后,您配置 Prometheus 抓取数据库和 Postgres Exporter 公开的 Postgres 指标。您将警报规则加载到 Prometheus 中,最后导入 Grafana 仪表板以可视化您的 Postgres 指标。
如果您使用的是 Grafana Cloud,您可以通过使用 Grafana Cloud Agent 安装 Postgres 集成来跳过本指南中的所有步骤。此集成将预配置的 Postgres Exporter 嵌入到代理中,并自动配置 Grafana 仪表板和 Prometheus 警报以及记录规则,因此您无需手动导入它们。要了解如何设置 Postgres 集成,请参阅 Grafana Cloud 集成。
仪表板、记录规则和警报规则是使用 Postgres Exporter Mixin 生成的。Mixin 是由主题专家策划和设计的仪表板、记录规则和警报的可重用模板。要详细了解,请参阅 Postgres Mixin 仓库。
在本页
Postgres 概述仪表板
此仪表板包含以下指标的面板。
- 当前 QPS
- 获取、返回、插入、更新、删除行
- 数据库死锁和冲突
- 缓存命中率
- 活动连接数
- 缓冲区
您可以使用以下仪表板 ID 直接导入仪表板:14114
。
您可以从 这里 获取仪表板 JSON。
此仪表板是使用 Postgres Exporter mixin 生成的。
在本页
此快速入门包括以下警报规则。
PostgreSQLMaxConnectionsReached
Postgres 耗尽可用连接
PostgreSQLHighConnections
Postgres 超过了当前配置的 Postgres 最大连接限制的 80%
PostgreSQLDown
Postgres 无法处理查询
PostgreSQLSlowQueries
Postgres 的慢查询数量很高
PostgreSQLQPS
Postgres 的每秒查询数很高
PostgreSQLCacheHitRatio
Postgres 的缓存命中率很低
下载以下警报规则 YAML 文件。groups:
- name: PostgreSQL
rules:
- alert: PostgreSQLMaxConnectionsReached
expr: sum(pg_stat_activity_count) by (instance) >= sum(pg_settings_max_connections) by (instance) - sum(pg_settings_superuser_reserved_connections) by (instance)
for: 1m
labels:
severity: email
annotations:
summary: "{{ $labels.instance }} has maxed out Postgres connections."
description: "{{ $labels.instance }} is exceeding the currently configured maximum Postgres connection limit (current value: {{ $value }}s). Services may be degraded - please take immediate action (you probably need to increase max_connections in the Docker image and re-deploy."
- alert: PostgreSQLHighConnections
expr: sum(pg_stat_activity_count) by (instance) > (sum(pg_settings_max_connections) by (instance) - sum(pg_settings_superuser_reserved_connections) by (instance)) * 0.8
for: 10m
labels:
severity: email
annotations:
summary: "{{ $labels.instance }} is over 80% of max Postgres connections."
description: "{{ $labels.instance }} is exceeding 80% of the currently configured maximum Postgres connection limit (current value: {{ $value }}s). Please check utilization graphs and confirm if this is normal service growth, abuse or an otherwise temporary condition or if new resources need to be provisioned (or the limits increased, which is mostly likely)."
- alert: PostgreSQLDown
expr: pg_up != 1
for: 1m
labels:
severity: email
annotations:
summary: "PostgreSQL is not processing queries: {{ $labels.instance }}"
description: "{{ $labels.instance }} is rejecting query requests from the exporter, and thus probably not allowing DNS requests to work either. User services should not be effected provided at least 1 node is still alive."
- alert: PostgreSQLSlowQueries
expr: avg(rate(pg_stat_activity_max_tx_duration{datname!~"template.*"}[2m])) by (datname) > 2 * 60
for: 2m
labels:
severity: email
annotations:
summary: "PostgreSQL high number of slow on {{ $labels.cluster }} for database {{ $labels.datname }} "
description: "PostgreSQL high number of slow queries {{ $labels.cluster }} for database {{ $labels.datname }} with a value of {{ $value }} "
- alert: PostgreSQLQPS
expr: avg(irate(pg_stat_database_xact_commit{datname!~"template.*"}[5m]) + irate(pg_stat_database_xact_rollback{datname!~"template.*"}[5m])) by (datname) > 10000
for: 5m
labels:
severity: email
annotations:
summary: "PostgreSQL high number of queries per second {{ $labels.cluster }} for database {{ $labels.datname }}"
description: "PostgreSQL high number of queries per second on {{ $labels.cluster }} for database {{ $labels.datname }} with a value of {{ $value }}"
- alert: PostgreSQLCacheHitRatio
expr: avg(rate(pg_stat_database_blks_hit{datname!~"template.*"}[5m]) / (rate(pg_stat_database_blks_hit{datname!~"template.*"}[5m]) + rate(pg_stat_database_blks_read{datname!~"template.*"}[5m]))) by (datname) < 0.98
for: 5m
labels:
severity: email
annotations:
summary: "PostgreSQL low cache hit rate on {{ $labels.cluster }} for database {{ $labels.datname }}"
description: "PostgreSQL low on cache hit rate on {{ $labels.cluster }} for database {{ $labels.datname }} with a value of {{ $value }}"
此警报规则 YAML 文件是使用 Postgres Exporter mixin 生成的。
在本页
Grafana Cloud 带有一套不断扩展的集成,可以在几分钟内快速启动可观察性堆栈。Postgres 集成内置于 Grafana Cloud Agent 中,它公开并抓取基本的 Postgres 指标,并将它们推送到 Grafana Cloud。代理将使用嵌入式 Postgres Exporter 抓取指标,Grafana Cloud 将自动配置定制的 Grafana 仪表板和警报,以可视化和处理这些数据。
要详细了解,请查看 Grafana Cloud 文档。
工作原理
配置、安装、连接和维护 Prometheus 监控组件通常需要大量的领域知识。从设置到仪表板和警报可能需要相当长的时间。作为 Grafana 的创建者 - 以及 Prometheus 和 Cortex 的核心贡献者 - 我们构建了简单的集成以抽象掉部分工作,以便快速入门。工作原理
- 注册(或登录)免费的 Grafana Cloud 帐户。
- 选择您要观察的目标(不断扩展的目录)。
- 运行一行命令来安装 Grafana Agent。代理嵌入并预先配置了 Exporter 以公开默认指标,并将它们推送到 Grafana Cloud 指标后端。
- 瞧!您将看到定制的 Grafana 仪表板,并将从合理的默认警报中获益。
正在寻找不同的 Exporter 或集成?查看我们不断增长的 针对流行组件的集成库,例如 MySQL、Postgres、Redis、Memcached 等。