8、Prometheus 生态中的各类数据导出器与集成方案

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

Prometheus 生态中的各类数据导出器与集成方案

在 Prometheus 生态中,除了第一方导出器能很好地覆盖基础指标收集外,还有各种各样的第三方导出器可用于收集其他类型的数据。本文将介绍一些实用的导出器,包括操作系统指标收集、容器监控、日志转指标等内容。

测试环境搭建

为了更好地测试这些导出器,我们将使用两种测试环境:基于虚拟机(VM)的传统静态基础设施环境和基于 Kubernetes 的现代工作流环境。

静态基础设施测试环境

此方法可通过几个命令抽象出所有部署和配置细节,快速搭建一个完全配置好的测试环境。具体操作步骤如下:
1. 进入相关路径:

cd ./chapter06/
  1. 确保没有其他测试环境正在运行,并启动当前环境:
vagrant global-status
vagrant up
  1. 验证测试环境是否成功部署:
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/
  1. 部署 Prometheus Operator 并验证部署是否成功:
kubectl apply -f ./provision/kubernetes/operator/bootstrap/
kubectl rollout status deployment/prometheus-operator -n monitoring
  1. 使用 Prometheus Operator 部署 Prometheus 并确保部署成功:
kubectl apply -f ./provision/kubernetes/operator/deploy/
kubectl rollout status statefulset/prometheus-k8s -n monitoring
  1. 添加 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/
  1. 创建一个 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}
...
  1. 应用上述清单:
kubectl apply -f ./cadvisor/cadvisor-daemonset.yaml
  1. 跟踪部署状态:
kubectl rollout status daemonset/cadvisor -n monitoring
  1. 部署完成后,添加一个新服务:
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}
  1. 应用服务清单:
kubectl apply -f ./cadvisor/cadvisor-service.yaml
  1. 通过以下命令连接到 cAdvisor 的 Web 界面:
minikube service cadvisor-service -n monitoring
  1. 将 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
  1. 应用上述清单:
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 能够识别的指标格式。以下是一个简单的示例流程:

  1. 日志收集 :使用 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>
  1. 日志处理与指标转换 :编写自定义脚本或使用 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
  1. 指标暴露 :将转换后的指标暴露给 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
  1. 下载并安装 :从 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
  1. 配置 Blackbox Exporter :编辑 blackbox.yml 文件,配置监控的目标和探针类型。
modules:
  http_2xx:
    prober: http
    timeout: 5s
    http:
      valid_status_codes: [200]
  1. 启动 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 生态也会不断涌现出更多功能强大的导出器,我们需要持续关注和学习,以跟上技术的步伐。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值