PushGateway
Pushgateway 是一个独立服务,它在 HTTP REST API 上接收 Prometheus 指标。Pushgateway 位于发送指标的应用程序和 Prometheus 服务器之间。Pushgateway 接收指标,然后作为目标被抓取,以将指标提供给 Prometheus 服务器。你可以将其视为代理服务,或者说与黑盒 exporter 的行为相反:它接收指标而不是探测指标。
# 使用场景
Pushgateway 本质上是一种用于监控 Prometheus 服务器无法抓取的资源的解决方案。网关(gateway)不是一个完美的解决方案,只能用作有限的解决方案使用,特别是用于监控其他无法访问的资源。
与功能齐全的推送监控工具相比,网关更接近于代理,因此,使用它将丢失 Prometheus 服务器提供的很多有用功能,这包括通过 up 指标和指标过期进行实例状态监控。默认情况下,它是静态代理,会记住发送给它的每个指标并暴露它们,只要它正在运行(并且指标不会保留)或者直到它们被删除。这意味着不再存在的实例的指标可能仍保存在网关中。
应该将网关的重点放在监控短生命周期的资源(如作业),或者无法访问的资源的短期监控上,然后安装 Prometheus 服务器以长期监控可访问的资源。
# 安装(略)
# 配置
Pushgateway 不需要任何的配置,开箱即用,可以通过在运行 pushgateway 二进制文件时于命令行上设置参数来对它进行配置。网关默认在端口 9091 上运行,可以使用--web.listen-address 参数来覆盖地址和端口。
pushgateway --web.listen-address="0.0.0.0:9091"
默认情况下,网关将所有指标存储在内存中。这意味着如果网关停止或重新启动,那么你将丢失内存中的所有指标。可以通过指定--persistence.file 参数将指标持久存储于磁盘路径。
pushgateway --web.listen-address="0.0.0.0:9091" --persistence.file="/tmp/pushgateway"
默认情况下,文件每五分钟持久化写入一次,但你可以使用--persistence.interval 参数覆盖它.
pushgateway --web.listen-address="0.0.0.0:9091" --persistence.file="/tmp/pushgateway" --persistence.interval="10m"
# 向 pushgateway 发送指标
一旦 Pushgateway 运行,你就可以开始发送指标。大多数 Prometheus 客户端库都支持向 Pushgateway 发送指标,以及暴露它们以进行抓取。
比如:
echo 'batchjob_user_counter 2' | curl --data-binary @- http://localhost:9091/metrics/job/batchjob
我们将指标推送到路径/metrics。URL 使用标签组成,这里是/metrics/job/<jobname>
,其中 batchjob1 是我们的作业标签。带有标签的完整指标路径如下:
/metrics/job/<jobname>{/<label>/<label>}
<jobname>
将用作 job 标签的值,然后是其他指定的标签。路径中指定的标签将覆盖指标本身指定的标签。
我们还可以在 URL 中为指标添加一个 instance 标签:
echo 'batchjob_user_counter 2' | curl --data-binary @- http://localhost:9091/metrics/job/batchjob/instance/gateway_server
说明:你不能将/作为标签值或作业名称的一部分使用,即使是转义
在上面的示例中,我们通过 echo 将指标 batchjob_user_counter 2 从作业 batchjob 发送到网关。这将为作业 batchjob 创建一个新的指标组,其 instance 标签为 gateway_server。指标组是指标的集合,你可以在分组中添加和删除指标,甚至可以删除整个组。由于网关是缓存而不是聚合器,因此指标组将保持运行,直到网关停止或删除它们为止。
我们还可以通过将标签括在{}中来为推送的指标添加标签:
echo 'batchjob_user_counter{id="123456"} 2' | curl --data-binary @- http://localhost:9091/metrics/job/batchjob/instance/gateway_server
目前,该指标上传后没有类型,网关不知道它是计数型、计量型还是任何其他指标类型。你可以通过在推送中传递 TYPE 和 HELP 语句来向指标添加类型。
cat <<EOF | curl --data-binary @- http://localhost:9091/metrics/job/batchjob/instance/gateway_server
# TYPE batchjob_user_counter counter
# HELP batchjob_user_counter A metrics from batchjob
batchjob_user_counter{id="123456"} 2
EOF
2
3
4
5
当然还可以添加更多的标签。
# 在 pushgateway 查看指标
们可以通过在/metrics 路径上使用 curl(或通过浏览 http://localhost:9091
上的 Pushgateway 仪表板)来查看推送到网关的指标。
# 删除 Pushgateway 中的指标
指标保存在网关中(假设未设置持久性),直到网关重启或者指标被删除。我们可以使用 Pushgateway API 删除指标,这里再次使用 curl 作为示例。
curl -x DELETE localhost:9091/metrics/job/batchjob
这将删除作业 batchjob1 的所有指标。你可以使用更精细的路径来进一步限制选择,例如,仅删除特定实例中的那些指标。
curl -x DELETE localhost:9091/metrics/job/batchjob/instance/gateway_server
# Prometheus 中抓取 Gateway
在 prometheus 的配置文件中配置如下:
scrape_configs:
- job_name: pushgateway
honor_labels: true
static_configs:
- targets: ["localhost:9091"]
2
3
4
5
如果 honorlabels 设置为 true,那么 Prometheus 将使用 Pushgateway 上的 job 和 instance 标签。如果设置为 false,那么它将重命名这些值,在它们前面加上 exported前缀,并在服务器上为这些标签附加新值。