3. 数据采集基础:日志采集、API监控、数据库埋点与数据清洗流程

告警阈值设定的准确性,高度依赖底层数据的质量。如果采集的数据存在延迟、丢失或格式混乱,后续的阈值计算与异常定位将失去意义。本章系统讲解数据采集的三大核心来源——日志、API、数据库埋点,以及保障数据可用性的清洗流程。

3.1 日志采集:从文件到消息队列

日志是系统运行状态最直接的记录。生产环境中,日志采集通常采用 Agent → 传输层 → 存储层 的架构,以应对海量、高并发的写入场景。

核心原则: 日志采集必须保证 至少一次送达(At-Least-Once),并具备断点续传能力,避免因网络抖动导致数据丢失。

3.1.1 主流采集方案对比

组件 采集方式 适用场景 关键特性
Filebeat 监听文件变化,逐行读取 轻量级日志采集,容器化环境 内存占用低,支持多行合并
Fluentd 插件式输入/输出 复杂数据源(HTTP/TCP/Syslog) 内置缓冲与重试机制
Logstash 消费消息队列,过滤转换 需要复杂数据清洗的场景 支持 Grok 正则解析
Vector 统一 Agent + 传输管道 需要同时处理日志、指标、Trace 单一二进制,性能极高

3.1.2 日志采集典型架构

下图展示了一条 Nginx 访问日志从产生到进入 Elasticsearch 的完整链路:

日志采集链路(Nginx → ES) Nginx 应用 access.log Filebeat 监听 /var/log/nginx/ Kafka Topic: nginx-access Logstash Grok 解析 + 清洗 Elasticsearch 索引存储 断点续传:Filebeat 记录偏移量 重启后从上次位置继续采集
避坑提示: 日志采集最常遇到的异常是 多行日志断裂(如 Java 堆栈信息被拆成多条记录)。Filebeat 的 multiline 配置必须按实际日志格式设置匹配模式,否则告警分析时无法还原完整错误上下文。

3.2 API 监控:主动探测与被动采集

API 监控分为 主动探测(模拟请求)和 被动采集(分析真实流量)两种模式。告警阈值设定通常依赖被动采集的延迟、错误率等指标。

3.2.1 被动采集关键指标

指标名称 采集方式 告警阈值参考
P99 延迟 从响应头耗时字段提取 > 2000ms 触发警告
5xx 错误率 状态码计数 / 总请求数 > 1% 触发严重告警
请求量突降 滑动窗口对比前 10 分钟 下降 > 50% 触发异常
超时比例 响应时间 > 5000ms 的请求占比 > 5% 触发告警

3.2.2 数据采集点设计

在 API 网关或反向代理层(如 Nginx、Kong、APISIX)统一采集是最佳实践,避免在每个微服务中重复埋点。

# Nginx 日志格式示例(采集 API 监控所需字段)
log_format api_monitor '$remote_addr - $remote_user [$time_local] '
                       '"$request" $status $body_bytes_sent '
                       '"$http_referer" "$http_user_agent" '
                       '$request_time $upstream_response_time '
                       '$upstream_status $upstream_addr';
注意: 被动采集依赖真实流量,当业务低峰期请求量极低时,错误率等百分比指标会剧烈波动。此时应结合 最小样本数(如每分钟至少 100 个请求)来抑制无效告警。

3.3 数据库埋点:慢查询与连接池监控

数据库是告警阈值设定的核心数据源之一,重点关注 慢查询日志 和 连接池状态。

3.3.1 慢查询日志采集

MySQL 慢查询日志记录了执行时间超过 long_query_time 的 SQL 语句。采集方案通常为:

  • 方案 A: 开启 MySQL slow_query_log,由 Filebeat 采集日志文件。
  • 方案 B: 使用 performance_schema 表直接查询,适合云数据库场景。
  • 方案 C: 通过代理层(如 ProxySQL)统一记录慢查询。

3.3.2 连接池与活跃连接数

连接池耗尽会导致应用无法获取数据库连接,是生产环境的严重故障。以下为关键采集指标:

指标 采集命令/方式 告警阈值建议
活跃连接数 SHOW PROCESSLIST > 80% 最大连接数
等待连接数 连接池监控接口 > 10 持续 30 秒
慢查询数/分钟 慢查询日志计数 > 50 次/分钟
死锁次数 SHOW ENGINE INNODB STATUS > 0 立即告警

3.4 数据清洗流程:从原始数据到可用指标

原始采集数据通常包含脏数据、重复数据、格式异常等问题。数据清洗是告警阈值准确性的最后一道防线。

3.4.1 清洗流程步骤

  1. 格式标准化: 统一时间戳格式(如 ISO 8601)、IP 地址格式、状态码枚举值。
  2. 去重: 基于唯一 ID(如 request_id、trace_id)去除重复记录。
  3. 异常值过滤: 剔除明显不合理的数据(如延迟为负数、请求量为 0 但错误率不为 0)。
  4. 缺失值填充: 对缺失的数值型字段,使用前值填充或默认值(如 0)。
  5. 聚合降采样: 将秒级原始数据按 1 分钟/5 分钟窗口聚合,减少存储压力。

3.4.2 清洗前后数据对比

维度 清洗前 清洗后
时间戳 2024-01-15 10:30:22 +0800 2024-01-15T02:30:22Z
请求延迟 -1(异常值) 剔除(不参与聚合)
状态码 200, 200, 200, 500, 200 200, 200, 200, 500, 200
重复记录 2 条相同 request_id 保留 1 条

3.4.3 清洗流程架构

以下为基于 Flink 的实时数据清洗管道设计:

实时数据清洗管道(Flink) Kafka 原始数据 格式标准化 时间戳/IP/状态码 去重 & 异常过滤 基于 request_id 聚合降采样 1min 滑动窗口 ES/TSDB 清洗后的数据直接用于告警阈值计算,避免脏数据导致误告警 异常值过滤规则需与业务方确认,防止误删有效数据
关键实践: 数据清洗规则必须版本化管理,并记录每次清洗的丢弃率。如果丢弃率突然升高(如 > 5%),说明上游数据源或清洗规则可能存在问题,需要及时排查。

3.5 本章小结

  • 日志采集 采用 Agent → 消息队列 → 清洗 → 存储的架构,重点保障断点续传与多行合并。
  • API 监控 以被动采集为主,关注 P99 延迟、错误率、请求量突降等指标,注意低流量时的统计波动。
  • 数据库埋点 聚焦慢查询日志与连接池状态,连接池耗尽需立即告警。
  • 数据清洗 是告警准确性的保障,包含标准化、去重、异常过滤、聚合四个核心步骤。