Prometheus 生态中的各类数据导出器与集成方案
在 Prometheus 生态中,除了第一方导出器能很好地覆盖基础指标收集外,还有各种各样的第三方导出器可用于收集其他类型的数据。本文将介绍一些实用的导出器,包括操作系统指标收集、容器监控、日志转指标等内容。
测试环境搭建
为了更好地测试这些导出器,我们将使用两种测试环境:基于虚拟机(VM)的传统静态基础设施环境和基于 Kubernetes 的现代工作流环境。
静态基础设施测试环境
此方法可通过几个命令抽象出所有部署和配置细节,快速搭建一个完全配置好的测试环境。具体操作步骤如下:
1. 进入相关路径:
cd ./chapter06/
- 确保没有其他测试环境正在运行,并启动当前环境:
vagrant global-status
vagrant up
- 验证测试环境是否成功部署:
vagrant status
成功部署后会输出类似如下信息:
Current machine states:
prometheus running (virtualbox)
target01 running (virtualbox)
若要连接到 target01 实例,可运行:
vagrant ssh target01
若要连接到 Prometheus 实例,可使用:
vagrant ssh prometheus
当使用完该环境后,进入相应路径并销毁环境:
cd ./chapter06/
vagrant destroy -f
Kubernetes 测试环境
启动 Kubernetes 测试环境前,需确保没有正在运行的 minikube 实例:
minikube status
minikube delete
然后启动一个新的 minikube 实例:
minikube start \
--cpus=2 \
--memory=3072 \
--kubernetes-version="v1.14.0" \
--vm-driver=virtualbox
启动完成后,基于之前的经验,使用 Prometheus Operator 部署所需组件:
1. 进入相关路径:
cd ./chapter06/
- 部署 Prometheus Operator 并验证部署是否成功:
kubectl apply -f ./provision/kubernetes/operator/bootstrap/
kubectl rollout status deployment/prometheus-operator -n monitoring
- 使用 Prometheus Operator 部署 Prometheus 并确保部署成功:
kubectl apply -f ./provision/kubernetes/operator/deploy/
kubectl rollout status statefulset/prometheus-k8s -n monitoring
- 添加 ServiceMonitors 配置 Prometheus 作业:
kubectl apply -f ./provision/kubernetes/operator/monitor/
kubectl get servicemonitors --all-namespaces
之后,可通过以下命令获取 Prometheus 的 Web 界面:
minikube service prometheus-service -n monitoring
还可通过以下命令验证 Prometheus 的 Kubernetes StatefulSet 并打开 Kubernetes 仪表盘:
minikube dashboard
操作系统导出器
在监控基础设施时,通常从操作系统层面开始收集指标。Prometheus 项目提供了支持类 Unix 系统的 Node Exporter,社区也维护了适用于 Microsoft Windows 系统的 WMI 导出器。
Node Exporter
Node Exporter 是最知名的 Prometheus 导出器,它提供了 40 多个用于收集操作系统不同方面指标的收集器,还能暴露定时任务的本地指标和主机的静态信息。该导出器默认配置合理,能自动识别可收集的指标。
不过,由于它需要访问内核和进程统计信息,而在容器内运行时通常无法获取这些信息,因此建议尽可能直接在主机上作为系统守护进程运行。
Node Exporter 的收集器可能会根据运行的系统不同而收集不同的指标,不同操作系统内核暴露内部状态的方式和提供的细节有所差异。例如,macOS 上的 node_exporter 暴露的指标与 Linux 上的会有很大不同。
此外,Node Exporter 在 0.16.0 版本中由于 Prometheus 项目的标准化工作,指标名称发生了变化,这是一个重大变更,早期版本的仪表盘和教程可能无法直接使用,可参考 升级指南 。
其源代码和安装文件可在 这里 获取。
Node Exporter 配置
Node Exporter 与其他导出器不同,它通过单个收集器架构提供了灵活的指标收集方式,可根据需求开启或关闭收集器。开启默认关闭的收集器可使用 --collector.<name> 标志,关闭已开启的收集器可使用 --no-collector.<name> 标志。
其中, textfile 收集器较为特殊,它通过监控一个包含 .prom 扩展名文件的目录,以 Prometheus 暴露格式暴露自定义指标。默认情况下, --collector.textfile.directory 标志为空,需要设置为一个目录路径才能正常工作。可通过该方法导出特定于实例的指标,例如:
- 本地定时任务通过指标报告其退出状态。
- 提供如 VM 类型、大小或分配角色等信息性指标。
- 报告待进行的软件包升级数量以及是否需要重启等。
Node Exporter 部署
静态基础设施测试环境中, node_exporter 应已通过自动配置启动并运行。可连接到 target01 VM 进行检查:
cd ./chapter06/
vagrant ssh target01
查看提供的 systemd 单元文件配置:
vagrant@target01:~$ systemctl cat node-exporter
可以看到类似如下配置,设置了 textfile 收集器目录:
...
ExecStart=/usr/bin/node_exporter --collector.textfile.directory=/var/lib/node_exporter
...
接下来尝试创建一个自定义指标:
vagrant@target01:~$ echo test_metric 1 | sudo tee /var/lib/node_exporter/test.prom
在实际场景中,需确保文件以原子方式写入,避免 node_exporter 读取到半写(损坏)的文件。可将文件先写入临时文件,然后移动到指定位置(注意不要跨越挂载点边界),或者使用 sponge 实用工具(通常在 moreutils 包中)。
之后可请求 /metrics 端点并搜索自定义指标:
vagrant@target01:~$ curl -qs 0:9100/metrics | grep test_metric
输出类似如下:
# HELP test_metric Metric read from /var/lib/node_exporter/test.prom
# TYPE test_metric untyped
test_metric 1
Node Exporter 根据启用的收集器不同,会产生大量指标,以下是一些比较有用的指标:
| 指标名称 | 说明 |
| ---- | ---- |
| node_cpu_seconds_total | 提供每个 CPU 核心在所有可用模式下累积使用的秒数,有助于了解 CPU 利用率 |
| node_memory_MemTotal_bytes 和 node_memory_MemAvailable_bytes | 可用于计算可用内存的比例 |
| node_filesystem_size_bytes 和 node_filesystem_avail_bytes | 可用于计算文件系统的利用率 |
| node_textfile_scrape_error | 当 textfile 收集器启用时,告知是否无法解析 textfile 目录中的任何指标文件 |
容器导出器
随着对工作负载隔离和资源优化的不断追求,从物理机到使用虚拟机的转变过程中,资源使用效率存在一定问题。而 Linux 上操作系统级别的虚拟化(即容器的使用)改变了这一现状,通过 cgroups 和 namespaces 等内核特性,用户可以精细控制工作负载可用的资源, cgroups 指标对于现代监控系统至关重要。
cAdvisor
Container Advisor(cAdvisor)是 Google 开发的一个项目,用于收集、聚合、分析和暴露运行中容器的数据。它能收集从内存限制到 GPU 指标等几乎所有可能需要的数据,并且按容器和/或主机进行隔离。
cAdvisor 不局限于 Docker 容器,通常以容器形式部署。它从容器守护进程和 Linux cgroups 收集数据,自动发现容器。当达到进程限制时,它还会暴露进程限制和节流事件,有助于在不影响工作负载的情况下最大化基础设施资源的使用。
除了以 Prometheus 格式暴露指标外,cAdvisor 还提供了一个有用的 Web 界面,可即时可视化主机及其容器的状态。其源代码和安装文件可在 这里 获取。
cAdvisor 配置
以容器形式启动 cAdvisor 时,需要以只读模式提供一些主机路径,以便收集内核、进程和容器数据。以下是一些相关的运行时标志及其说明:
| 标志 | 说明 |
| ---- | ---- |
| --docker | Docker 端点,默认为 unix:///var/run/docker.sock |
| --docker_only | 除根统计信息外,仅报告容器信息 |
| --listen_ip | 绑定的 IP,默认是 0.0.0.0 |
| --port | 监听的端口,默认是 8080 |
| --storage_duration | 数据存储时长,默认是 2m0s |
更多可用的运行时配置可参考 这里 。
cAdvisor 部署
历史上,cAdvisor 代码嵌入在 Kubelet 二进制文件中,但目前计划弃用。因此,我们将以 DaemonSet 形式启动 cAdvisor,确保它在每个节点上运行,并将其作为 Kubernetes 服务暴露其配置和 Web 界面。具体操作步骤如下:
1. 进入相关路径:
cd ./chapter06/provision/kubernetes/
- 创建一个 DaemonSet:
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: cadvisor
namespace: monitoring
...
spec:
containers:
- name: cadvisor
volumeMounts:
- {name: rootfs, mountPath: /rootfs, readOnly: true}
- {name: var-run, mountPath: /var/run, readOnly: true}
- {name: sys, mountPath: /sys, readOnly: true}
- {name: docker, mountPath: /var/lib/docker, readOnly: true}
- {name: disk, mountPath: /dev/disk, readOnly: true}
...
- 应用上述清单:
kubectl apply -f ./cadvisor/cadvisor-daemonset.yaml
- 跟踪部署状态:
kubectl rollout status daemonset/cadvisor -n monitoring
- 部署完成后,添加一个新服务:
apiVersion: v1
kind: Service
metadata:
labels:
p8s-app: cadvisor
name: cadvisor-service
namespace: monitoring
spec:
selector:
p8s-app: cadvisor
type: NodePort
ports:
- {name: http, protocol: TCP, port: 8080, targetPort: http}
- 应用服务清单:
kubectl apply -f ./cadvisor/cadvisor-service.yaml
- 通过以下命令连接到 cAdvisor 的 Web 界面:
minikube service cadvisor-service -n monitoring
- 将 cAdvisor 导出器添加为 Prometheus 的新目标,使用以下 ServiceMonitor 清单:
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
labels:
p8s-app: cadvisor
name: cadvisor-metrics
namespace: monitoring
spec:
endpoints:
- interval: 30s
port: http
selector:
matchLabels:
p8s-app: cadvisor
- 应用上述清单:
kubectl apply -f ./cadvisor/cadvisor-servicemonitor.yaml
几分钟后,可通过以下命令打开 Prometheus 的 Web 界面,查看新添加的目标:
minikube service prometheus-service -n monitoring
cAdvisor 会为每个容器导出大量样本,可能导致每次抓取的指标数量达到数千个,从而在抓取 Prometheus 时可能引发与基数相关的问题。从其导出的数千个指标中,以下几个指标通常对监控问题很有用:
| 指标名称 | 说明 |
| ---- | ---- |
| container_last_seen | 记录容器最后一次被视为运行的时间戳 |
| container_cpu_usage_seconds_total | 提供每个容器每个 CPU 核心使用的 CPU 秒数计数器 |
| container_memory_usage_bytes 和 container_memory_working_set_bytes | 分别跟踪容器的内存使用情况(包括缓存和缓冲区)和活动内存 |
| container_network_receive_bytes_total 和 container_network_transmit_bytes_total | 分别告知容器接收和传输的流量大小 |
当在 Kubernetes 上运行时,cAdvisor 无法提供有关 Kubernetes 集群运行情况的应用级指标,这就需要另一个导出器: kube-state-metrics 。
kube-state-metrics
kube-state-metrics 不导出容器级数据,它在更高层次上操作,暴露 Kubernetes 的状态,提供有关 API 内部对象(如 Pod、服务或部署)的指标。目前使用该导出器时可用的对象指标组如下:
- CronJob 指标
- DaemonSet 指标
- Deployment 指标
- Job 指标
- LimitRange 指标
- Node 指标
- PersistentVolume 指标
- PersistentVolumeClaim 指标
- Pod 指标
- Pod Disruption Budget 指标
- ReplicaSet 指标
- ReplicationController 指标
- Resource quota 指标
- Service 指标
- StatefulSet 指标
- Namespace 指标
- Horizontal Pod Autoscaler 指标
- Endpoint 指标
- Secret 指标
- ConfigMap 指标
kube-state-metrics 暴露两个端点,一个提供 API 对象指标,另一个提供导出器本身的内部指标。其源代码和安装文件可在 这里 获取。
以下是整个部署和使用流程的 mermaid 流程图:
graph LR
classDef startend fill:#F5EBFF,stroke:#BE8FED,stroke-width:2px
classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px
classDef decision fill:#FFF6CC,stroke:#FFBC52,stroke-width:2px
A([开始]):::startend --> B{选择环境}:::decision
B -->|静态基础设施| C(进入路径):::process
C --> D(启动环境):::process
D --> E(验证部署):::process
E --> F(连接实例):::process
F --> G(使用完成后销毁环境):::process
B -->|Kubernetes| H(确保无 minikube 运行):::process
H --> I(启动 minikube 实例):::process
I --> J(进入路径):::process
J --> K(部署 Prometheus Operator):::process
K --> L(部署 Prometheus):::process
L --> M(添加 ServiceMonitors):::process
M --> N(获取 Prometheus 界面):::process
N --> O(验证 StatefulSet):::process
O --> P(选择导出器):::decision
P -->|Node Exporter| Q(检查配置):::process
Q --> R(创建自定义指标):::process
R --> S(请求指标端点):::process
P -->|cAdvisor| T(创建 DaemonSet):::process
T --> U(应用清单):::process
U --> V(添加服务):::process
V --> W(连接 Web 界面):::process
W --> X(添加为 Prometheus 目标):::process
P -->|kube - state - metrics| Y(获取指标):::process
G --> Z([结束]):::startend
X --> Z
S --> Z
Y --> Z
通过以上介绍,我们了解了 Prometheus 生态中多种导出器的使用方法和部署流程,可根据不同的监控需求选择合适的导出器来收集和分析指标。
从日志到指标
在实际的监控场景中,日志是一个丰富的数据来源。很多时候,我们需要从日志中提取关键信息并转化为指标,以便更好地进行监控和分析。虽然文中未详细提及具体的实现工具,但一般可以借助一些日志处理工具和 Prometheus 的相关机制来完成。
常见的做法是使用日志收集工具(如 Fluentd、Logstash 等)将日志收集起来,然后通过相应的插件或自定义脚本将日志中的关键信息提取出来,并转化为 Prometheus 能够识别的指标格式。以下是一个简单的示例流程:
- 日志收集 :使用 Fluentd 收集应用程序的日志。首先安装 Fluentd,并配置其输入和输出。
# 安装 Fluentd
curl -L https://toolbelt.treasuredata.com/sh/install-debian-buster-td-agent4.sh | sh
# 编辑 Fluentd 配置文件 /etc/td-agent/td-agent.conf
<source>
@type tail
path /var/log/app.log # 应用程序日志路径
pos_file /var/log/td-agent/app.log.pos
tag app.log
format none
</source>
<match app.log>
@type stdout # 这里可以替换为后续处理的输出插件
</match>
- 日志处理与指标转换 :编写自定义脚本或使用 Fluentd 插件将日志中的关键信息提取出来并转化为 Prometheus 指标。例如,假设日志中包含请求的响应时间,我们可以提取这个时间并转化为指标。
# 自定义 Fluentd 插件示例
require 'fluent/plugin/filter'
module Fluent
module Plugin
class LogToMetricsFilter < Filter
Fluent::Plugin.register_filter('log_to_metrics', self)
def filter(tag, time, record)
# 假设日志格式为 "Request took 100ms"
if record['message'] =~ /Request took (\d+)ms/
record['response_time_ms'] = $1.to_i
end
record
end
end
end
end
- 指标暴露 :将转换后的指标暴露给 Prometheus。可以使用 Prometheus 的 Pushgateway 或直接让 Prometheus 拉取指标。如果使用 Pushgateway,需要在脚本中添加将指标推送到 Pushgateway 的代码。
# 使用 Pushgateway 推送指标示例
curl -X POST -H "Content-Type: text/plain" --data "response_time_ms 100" http://pushgateway:9091/metrics/job/app_metrics
黑盒监控
黑盒监控主要用于监控网络服务的可用性和性能,它不关心服务内部的实现细节,只关注服务的外部表现。Prometheus 生态中的 Blackbox Exporter 可以实现黑盒监控。
安装与配置 Blackbox Exporter
- 下载并安装 :从 Blackbox Exporter 官方仓库 下载适合你系统的版本,并解压。
wget https://github.com/prometheus/blackbox_exporter/releases/download/v0.22.0/blackbox_exporter-0.22.0.linux-amd64.tar.gz
tar xvfz blackbox_exporter-0.22.0.linux-amd64.tar.gz
cd blackbox_exporter-0.22.0.linux-amd64
- 配置 Blackbox Exporter :编辑
blackbox.yml文件,配置监控的目标和探针类型。
modules:
http_2xx:
prober: http
timeout: 5s
http:
valid_status_codes: [200]
- 启动 Blackbox Exporter :
./blackbox_exporter --config.file=blackbox.yml
在 Prometheus 中配置监控目标
在 Prometheus 的配置文件 prometheus.yml 中添加对 Blackbox Exporter 的监控配置。
scrape_configs:
- job_name: 'blackbox'
metrics_path: /probe
params:
module: [http_2xx]
static_configs:
- targets:
- http://example.com
relabel_configs:
- source_labels: [__address__]
target_label: __param_target
- source_labels: [__param_target]
target_label: instance
- target_label: __address__
replacement: 127.0.0.1:9115 # Blackbox Exporter 地址
重启 Prometheus 后,它就会开始通过 Blackbox Exporter 对目标服务进行监控。
推送指标
在某些场景下,由于目标应用程序无法直接暴露指标供 Prometheus 拉取,或者需要实时推送一些临时指标,我们可以使用 Prometheus 的 Pushgateway。
安装与启动 Pushgateway
从 Pushgateway 官方仓库 下载适合你系统的版本,并启动。
wget https://github.com/prometheus/pushgateway/releases/download/v1.4.2/pushgateway-1.4.2.linux-amd64.tar.gz
tar xvfz pushgateway-1.4.2.linux-amd64.tar.gz
cd pushgateway-1.4.2.linux-amd64
./pushgateway
推送指标到 Pushgateway
使用 curl 或编程语言的 HTTP 库将指标推送到 Pushgateway。
# 推送一个简单的指标
curl -X POST -H "Content-Type: text/plain" --data "my_metric 1" http://pushgateway:9091/metrics/job/my_job
在 Prometheus 中配置拉取 Pushgateway 的指标
在 Prometheus 的配置文件 prometheus.yml 中添加对 Pushgateway 的监控配置。
scrape_configs:
- job_name: 'pushgateway'
static_configs:
- targets: ['pushgateway:9091']
更多导出器
除了前面介绍的导出器,Prometheus 生态中还有许多其他的导出器,可用于不同的场景和系统。以下是一些常见的导出器及其用途:
| 导出器名称 | 用途 |
|---|---|
| MySQL Exporter | 监控 MySQL 数据库的性能指标,如查询次数、连接数等 |
| Redis Exporter | 监控 Redis 缓存的状态和性能,如内存使用、键值数量等 |
| Nginx Exporter | 监控 Nginx 服务器的请求处理情况,如请求速率、响应时间等 |
这些导出器的使用方法通常与前面介绍的导出器类似,一般需要先下载安装,然后进行配置,最后在 Prometheus 中添加相应的监控目标。
以下是一个总结不同导出器使用步骤的表格:
| 导出器 | 安装步骤 | 配置步骤 | 部署与使用步骤 |
|---|---|---|---|
| Node Exporter | 从 GitHub 下载并解压 | 使用 --collector.<name> 或 --no-collector.<name> 标志开启或关闭收集器,设置 --collector.textfile.directory 目录 | 在主机上作为系统守护进程运行,创建自定义指标,请求 /metrics 端点 |
| cAdvisor | 从 GitHub 下载并以容器形式部署 | 设置运行时标志,如 --docker 、 --port 等 | 创建 DaemonSet 和 Service,添加为 Prometheus 目标 |
| kube-state-metrics | 从 GitHub 获取 | 无特殊配置 | 部署并获取 Kubernetes API 对象的指标 |
| Blackbox Exporter | 从 GitHub 下载并解压 | 编辑 blackbox.yml 文件配置探针类型 | 启动并在 Prometheus 中配置监控目标 |
| Pushgateway | 从 GitHub 下载并解压 | 无特殊配置 | 启动并使用 curl 或编程语言推送指标,在 Prometheus 中配置拉取目标 |
通过使用这些导出器,我们可以全面地监控各种系统和应用程序的状态和性能,为系统的稳定运行提供有力保障。
综上所述,Prometheus 生态中的各类导出器为我们提供了丰富的监控手段。我们可以根据不同的监控需求,灵活选择合适的导出器,并按照相应的步骤进行安装、配置和使用。在实际应用中,还需要根据具体情况对导出器进行优化和调整,以确保监控数据的准确性和有效性。同时,随着技术的不断发展,Prometheus 生态也会不断涌现出更多功能强大的导出器,我们需要持续关注和学习,以跟上技术的步伐。

344

被折叠的 条评论
为什么被折叠?



