Prometheus

55479
下载
Prometheus 是一个开源的监控和告警系统,专注于时间序列数据的采集与存储。由 SoundCloud 开发,配备高级查询语言PromQL,便于数据挖掘与分析,并无缝对接多种可视化平台。

Docker Swarm


自 Prometheus v2.20.0 版本开始,Prometheus 可以在 Docker Swarm 集群中发现 Target。本指南将演示如何使用该服务发现机制。

Docker Swarm 服务发现架构

Docker Swarm 服务发现包含三种不同的角色:节点、服务和任务。

第一个角色,节点(nodes),代表 Swarm 中的主机。它可以用于自动监控运行在 Swarm 主机上的 Docker 镜像或 Node Exporter。

第二个角色,任务(tasks),表示 Swarm 中部署的任何单个容器。每个任务都关联有服务标签。一个服务可以由一个或多个任务支持。

第三个角色,服务(services),将发现 Swarm 中部署的服务。它会发现服务暴露的端口。通常情况下,你希望使用任务角色而不是这个角色。

Prometheus 只会发现暴露端口的服务和任务。

注意:本教程假设你已运行一个 Swarm。

配置 Prometheus

在该教程中,我们需要配置 Prometheus。我们将假定 Prometheus 在 Docker Swarm 管理节点上运行,并具有访问 Docker 的套接字/var/run/docker.sock的权限。

监控 Docker 镜像

让我们深入探讨服务发现本身。

Docker 作为守护进程,暴露了可以被 Prometheus 服务器消费的指标。

你可以通过编辑/etc/docker/daemon.json并设置以下属性来启用它们:

{
"metrics-addr" : "0.0.0.0:9323",
"experimental" : true
}

0.0.0.0可以替换为 Docker Swarm 节点的 IP 地址。

需要重启守护进程以使新配置生效。

Docker 文档提供了更多关于此的信息。

然后,可以通过提供以下prometheus.yml文件来配置 Prometheus 来抓取 Docker 进程:

scrape_configs:
# 让 Prometheus 抓取自身指标。
- job_name: 'prometheus'
static_configs:
- targets: ['localhost:9090']
# 创建一个用于 Docker 进程的采集任务。
- job_name: 'docker'
dockerswarm_sd_configs:
- host: unix:///var/run/docker.sock
role: nodes
relabel_configs:
# 从端口 9323 获取指标。
- source_labels: [__meta_dockerswarm_node_address]
target_label: __address__
replacement: $1:9323
# 设置主机名为实例标签设
- source_labels: [__meta_dockerswarm_node_hostname]
target_label: instance

对于节点角色,还可以使用dockerswarm_sd_configsport参数。然而,推荐使用relabel_configs,因为它允许 Prometheus 在相同的 Docker Swarm 配置中重用相同的 API 调用。

监控容器

现在让我们在 Swarm 中部署一个服务。下面,我们将部署 cAdvisor,它将暴露容器资源指标:

Terminal window
docker service create --name cadvisor -l prometheus-job=cadvisor \
--mode=global --publish target=8080,mode=host \
--mount type=bind,src=/var/run/docker.sock,dst=/var/run/docker.sock,ro \
--mount type=bind,src=/,dst=/rootfs,ro \
--mount type=bind,src=/var/run,dst=/var/run \
--mount type=bind,src=/sys,dst=/sys,ro \
--mount type=bind,src=/var/lib/docker,dst=/var/lib/docker,ro \
google/cadvisor -docker_only

以下是监控它的最小prometheus.yml 文件:

scrape_configs:
# 让 Prometheus 自身消费指标。
- job_name: 'prometheus'
static_configs:
- targets: ['localhost:9090']
# 创建一个用于 Docker Swarm 容器的作业。
- job_name: 'dockerswarm'
dockerswarm_sd_configs:
- host: unix:///var/run/docker.sock
role: tasks
relabel_configs:
# 仅保留应运行的 Target。
- source_labels: [__meta_dockerswarm_task_desired_state]
regex: running
action: keep
# 仅保留具有 `prometheus-job` 标签的 Target。
- source_labels: [__meta_dockerswarm_service_label_prometheus_job]
regex: .+
action: keep
# 使用 Swarm 标签 `prometheus-job` 作为 Prometheus job 标签。
- source_labels: [__meta_dockerswarm_service_label_prometheus_job]
target_label: job

让我们分析 relabel 配置的各个部分。

- source_labels: [__meta_dockerswarm_task_desired_state]
regex: running
action: keep

Docker Swarm 通过 API 暴露期望的任务状态。在我们的示例中,我们只保留应该运行的 Target。这可以防止监控会被关闭的任务。

- source_labels: [__meta_dockerswarm_service_label_prometheus_job]
regex: .+
action: keep

当我们部署我们的 cAdvisor 时,我们添加了一个标签prometheus-job=cadvisor。当 Prometheus 检索 job 标签时,我们可以指示它保留具有prometheus-job标签的 Target。

- source_labels: [__meta_dockerswarm_service_label_prometheus_job]
target_label: job

最后这部分将 job 标签 prometheus-job 转换为 Target 标签,覆盖默认的来自抓取配置的dockerswarm job 标签。

被发现的标签(Discovered labels)

Prometheus 文档包含了完整的标签列表,以下是一些可能有用的其他 relabel 配置。

仅通过特定网络抓取指标

- source_labels: [__meta_dockerswarm_network_name]
regex: ingress
action: keep

仅抓取全局任务

运行在每个守护进程中的全局任务。

- source_labels: [__meta_dockerswarm_service_mode]
regex: global
action: keep
- source_labels: [__meta_dockerswarm_task_port_publish_mode]
regex: host
action: keep

向 Target 添加 docker_node 标签

- source_labels: [__meta_dockerswarm_node_hostname]
target_label: docker_node

连接到 Docker Swarm

上述dockerswarm_sd_configs入口有一个字段host

host: unix:///var/run/docker.sock

上面使用了 Docker 套接字。此外,Prometheus 提供了额外的配置选项,如果更喜欢使用 HTTP 和 HTTPS,你也可以使用这些选项连接到 Swarm。

结论

有许多被发现的标签可以用来更好地确定要监控的 Target 以及如何监控,对于采集任务,有超过 25 个可用的标签。你可以马上查看你的 Prometheus 服务器的“Service Discovery”页面(在“Status”菜单下)以查看所有被发现的标签。

服务发现不会对预先对你的 Swarm stack 提出任何预设,因此,只要给定适当的配置,本文给出的服务发现实践都是可以插入到现有的 Swarm stack 中的。

该文档基于 Prometheus 官方文档翻译而成。


observability.cn Authors 2024 | Documentation Distributed under CC-BY-4.0
Copyright © 2017-2024, Alibaba. All rights reserved. Alibaba has registered trademarks and uses trademarks.
浙ICP备2021005855号-32