4. 指标数据采集:系统指标与应用指标

大家好,我是老张。今天咱们聊聊指标采集这个核心环节。

说实话,很多运维新手一上来就扎进告警配置里,结果发现告警不准、数据对不上。为什么?因为数据采集这第一步就没走稳。我见过太多项目,最后排查问题发现是采集器配置错了,白白浪费好几天。

所以这一章,咱们把指标采集这件事彻底讲透。

4.1 系统指标:CPU、内存、磁盘、网络

系统指标是运维的「体温计」。机器状态好不好,先看这几个基础指标。

4.1.1 CPU 指标

CPU 不是看「用了多少」,而是看「怎么用的」。我个人习惯关注这几个维度:

  • user:用户态 CPU 使用率。应用跑得欢不欢,看这个。
  • system:内核态 CPU 使用率。系统调用频繁时,这个会飙高。
  • iowait:等待 I/O 的 CPU 时间。这个高了,说明磁盘或网络是瓶颈。
  • idle:空闲率。低于 20% 就要警惕了。
我的经验: 别只看 CPU 整体使用率。有一次线上服务卡顿,CPU 才 30%,但 iowait 占了 25%。最后发现是磁盘队列太深。如果只看整体使用率,你根本找不到根因。

4.1.2 内存指标

内存指标容易踩坑。很多人只看「已用内存」,其实不对。

Linux 的内存管理机制里,buff/cache 这部分是可以回收的。真正需要关注的是:

  • available:可用内存。这是实际能用的,包括可回收的 cache。
  • used:已用内存。但注意,这个值通常偏大。
  • swap usage:交换分区使用量。一旦开始用 swap,性能就会急剧下降。
避坑指南: 我曾经遇到一个案例,监控显示内存用了 90%,但服务运行正常。后来发现是 cache 占了大头。正确的做法是监控 available 而不是 used

4.1.3 磁盘指标

磁盘指标分两块:容量和性能。

容量方面:

  • 磁盘使用率(used%)
  • inode 使用率(inode 满了也会报错)

性能方面:

  • IOPS:每秒读写次数。数据库这类应用很敏感。
  • 吞吐量:每秒读写的数据量。
  • await:I/O 平均等待时间。超过 10ms 就要注意了。

嗯,这里要注意:磁盘性能指标最好按设备分开采集,别混在一起。不然你根本不知道是哪块盘拖了后腿。

4.1.4 网络指标

网络指标相对简单,但容易漏掉关键点:

  • 带宽使用率:入口和出口要分开看。
  • 丢包率:哪怕 0.1% 的丢包,对 TCP 连接的影响都很大。
  • 连接数:特别是 TIME_WAIT 状态的数量,多了会耗尽端口。
核心原则: 系统指标采集,要「全量采集,按需告警」。别怕数据多,就怕数据不全。等出问题时,历史数据就是你的救命稻草。

4.2 应用指标:QPS、延迟、错误率

系统指标告诉你机器「健不健康」,应用指标告诉你服务「好不好用」。

这三个指标,我称之为「黄金三指标」。任何一个出问题,用户都会直接感知到。

4.2.1 QPS(每秒查询数)

QPS 是应用吞吐量的直接体现。但要注意:

  • 区分成功和失败的 QPS:失败的请求也算 QPS,但意义不同。
  • 看趋势,不看绝对值:QPS 突然下降,可能是上游服务挂了;突然上升,可能是被攻击了。

我建议把 QPS 按接口维度采集。这样哪个接口流量异常,一眼就能看出来。

4.2.2 延迟(Latency)

延迟是用户体验的「晴雨表」。采集延迟时,别只看平均值。

为什么?因为平均值会掩盖问题。举个例子:

  • 99% 的请求延迟是 10ms
  • 1% 的请求延迟是 10s
  • 平均延迟只有 110ms

你看,平均值看起来还行,但实际有 1% 的用户体验极差。

我的习惯: 采集 P50、P90、P99 三个分位值。P99 超过 500ms 就要立即处理。P50 超过 200ms 说明系统有优化空间。

4.2.3 错误率(Error Rate)

错误率是最直接的「报警器」。但采集时要注意:

  • 区分错误类型:4xx 是客户端问题,5xx 是服务端问题。处理方式完全不同。
  • 设置合理的阈值:0.1% 的错误率在某些场景下可以接受,但在支付场景下 0.01% 都不行。

我曾经遇到一个案例:错误率从 0.1% 突然升到 0.5%,但业务方说没收到投诉。后来发现是某个内部接口超时了,外部用户没感知。但如果不采集这个指标,等外部接口出问题时,我们已经错过了最佳排查时机。

4.3 使用 Prometheus Exporter 采集

好了,指标定义清楚了,怎么采集呢?

Prometheus 生态里,Exporter 就是干这个活的。说白了,Exporter 是一个「翻译官」——把各种系统数据翻译成 Prometheus 能理解的格式。

4.3.1 常用 Exporter

Exporter 名称 采集对象 端口 备注
node_exporter 系统指标(CPU、内存、磁盘、网络) 9100 最常用,几乎每台机器都装
mysqld_exporter MySQL 数据库指标 9104 连接数、慢查询、缓冲池等
nginx_exporter Nginx 指标 9113 需要开启 stub_status 模块
blackbox_exporter 网络探测(HTTP、TCP、ICMP) 9115 用于外部监控

4.3.2 实战:部署 node_exporter

咱们以 node_exporter 为例,看看怎么采集系统指标。

第一步:下载并启动

# 下载最新版本
wget https://github.com/prometheus/node_exporter/releases/download/v1.6.0/node_exporter-1.6.0.linux-amd64.tar.gz

# 解压
tar -xzf node_exporter-1.6.0.linux-amd64.tar.gz

# 启动(默认监听 9100 端口)
./node_exporter

第二步:验证采集是否正常

# 访问 metrics 接口
curl http://localhost:9100/metrics | head -20

你会看到类似这样的输出:

# HELP node_cpu_seconds_total Seconds the cpus spent in each mode.
# TYPE node_cpu_seconds_total counter
node_cpu_seconds_total{cpu="0",mode="idle"} 123456.78
node_cpu_seconds_total{cpu="0",mode="system"} 2345.67
node_cpu_seconds_total{cpu="0",mode="user"} 34567.89

嗯,这就是 Prometheus 能识别的指标格式了。

第三步:配置 Prometheus 抓取

# prometheus.yml
scrape_configs:
  - job_name: 'node'
    static_configs:
      - targets: ['localhost:9100']
注意: 生产环境中,建议用 systemd 管理 node_exporter,并配置日志轮转。我曾经遇到过 Exporter 进程挂了三天没人发现,就是因为没做进程守护。

4.3.3 应用指标采集:自定义 Exporter

系统指标有现成的 Exporter,但应用指标往往需要自己写。Prometheus 提供了多种语言的客户端库:

  • Go:prometheus/client_golang
  • Python:prometheus_client
  • Java:simpleclient

以 Python 为例,采集 QPS 和延迟:

from prometheus_client import start_http_server, Summary, Counter
import random
import time

# 定义指标
REQUEST_COUNT = Counter('app_requests_total', 'Total requests')
REQUEST_LATENCY = Summary('app_request_latency_seconds', 'Request latency')

# 模拟业务逻辑
@REQUEST_LATENCY.time()
def handle_request():
    time.sleep(random.uniform(0.01, 0.5))
    REQUEST_COUNT.inc()

if __name__ == '__main__':
    start_http_server(8000)
    while True:
        handle_request()

启动后访问 http://localhost:8000/metrics,就能看到自定义的应用指标了。

4.4 本章小结

指标采集这件事,说难不难,说简单也不简单。核心就三点:

  1. 系统指标:CPU、内存、磁盘、网络,用 node_exporter 一把梭。
  2. 应用指标:QPS、延迟、错误率,黄金三指标一个不能少。
  3. 采集工具:Prometheus Exporter 生态成熟,开箱即用。

你想想看,如果连数据都采不准,后面的告警、分析、自动化,全都是空中楼阁。所以这一章的内容,值得你反复实践。

下一章咱们聊聊数据存储和查询,到时候会用到 PromQL,那才是真正体现功力的地方。


公众号:蓝海资料掘金营,微信deep3321