Prometheus
一、基础简介
1.1.prometheus简介
1.2.数据模型
1.3.指标类型
1.4.Jobs和Instances
二、安装部署
2.1.rpm部署监控组件
2.2.docker部署监控组件
三、PromSQL
3.1.PromQL基本使用
3.2.Prometheus基础查询
3.3.查询操作符
3.4.内置函数
3.5.在HTTPAPI中使用PromQL
3.6.最佳实践
四、告警处理
4.1.告警简介
4.2.自定义Prometheus告警规则
4.3.常见告警规则
4.4.部署Alertmanager
4.5.Alertmanager配置概述
4.6.基于标签的告警处理路由
4.7.使用Receiver接收告警信息
4.8.自定义告警模板
4.9.屏蔽告警通知
4.10.使用RecodingRules优化性能
五、Exporter
5.1.exporter
5.2.NodeExporter
5.3.ProcessExporter
5.4.cAdvisor
5.5.MysqlExporter
5.6.BlackboxExporter
5.7.ProcessExporter
5.8.Ipmiexport
5.9.Pushgateway
PostgresExporter
六、Grafana
6.1.grafana基本概念
6.2.创建dashboard与Panel
6.3.变化趋势:Graph面板
6.4.graph面板常用操作
6.5.分布统计:Heatmap面板
6.6.当前状态:SingleStat面板
6.7.变量
6.8.grafana报警
七、集群高可用
7.1.本地存储
7.2.远程存储
7.3.联邦集群
7.4.prometheus高可用
7.5.Alertmanager高可用
八、服务发现
8.1.Prometheus与服务发现
8.2.基于文件的服务发现
8.3.标签管理
九、Operator
9.1.什么是PrometheusOperator
9.2.PrometheusOperator自定义监控项
9.3.配置PrometheusRule
十、AlterManager
10.1.基础入门
10.2.配置详解
十一、常见问题
Prometheus 联邦机制中的 out-of-order samples与 up 指标波动问题
本文档使用 MrDoc 发布
-
+
首页
Prometheus 联邦机制中的 out-of-order samples与 up 指标波动问题
## 引言 在 Prometheus 监控系统中,联邦机制(Federation) 是一种常见的架构设计,用于跨层级聚合监控数据。 然而,在实际使用中,可能会遇到一些问题: - 联邦抓取时出现 `out-of-order samples` 错误日志 - 部分一级节点下的 `up` 指标出现异常波动(间歇性下线) - 仅某个特定一级节点存在问题,其他节点数据正常 本文将从 问题现象、根本原因、排查方法、解决方案 等多个维度,深入分析这类问题的成因,并提供系统性的排查思路和优化建议。 ## 1. 问题现象 ### 1.1 联邦架构概述 - 一级节点(L1 Prometheus):负责直接抓取采集器(如 Node Exporter、应用 Metrics 端点)的数据。 - 二级节点(L2 Prometheus):通过 `/federate` 接口从多个一级节点聚合数据。 ``` 采集器 (Targets) | ▼ 一级节点 (L1 Prometheus) [联邦 `/federate`] | ▼ 二级节点 (L2 Prometheus) ``` ### 1.2 具体问题表现 1. 一级节点本地数据正常 - 所有采集器的 `up` 指标稳定为 `1`(在线)。 - 无 `out-of-order samples` 错误日志。 2. 二级节点联邦抓取异常 - 仅某个特定一级节点的数据出现问题。 - 该节点下的 `up` 指标出现间歇性波动(频繁跳变 `1`/`0`)。 - 二级节点日志出现大量 `out-of-order samples num_dropped=XXXX` 错误。 3. 测试发现 - 二级节点仅抓取该问题一级节点时,仍有 `out-of-order` 错误,但 `up` 指标稳定(无波动)。 - 其他一级节点联邦抓取完全正常。 --- ## 2. 根本原因分析 ### 1) `out-of-order samples` 是什么 Prometheus 要求每个时间序列(`metric + labelset`)的样本时间戳严格单调递增。如果某个样本的时间戳 `t_new` ≤ 该序列在 TSDB 中已存储的最新时间戳 `t_last`,则会被丢弃,并记录 `out-of-order sample` 错误。 ### 2) 为什么会导致 `up` 指标波动? - `up{job="...", instance="..."}` 是 Prometheus 抓取时生成的瞬时状态(`1`=在线,`0`=离线)。 - 如果 `up=1` 的样本因 `out-of-order` 被丢弃,而二级节点 TSDB 中该序列的上一个样本是 `up=0`,则在图表上会显示为短暂下线(即使目标实际在线)。 ### 3) 为什么仅影响特定一级节点? - 一级节点本地数据正常 ⇒ 问题不在采集器。 - 其他一级节点联邦抓取正常 ⇒ 问题不在二级节点本身。 - 问题锁定在:该一级节点的 `/federate` 接口暴露的数据流存在时间戳乱序。 --- ## 3. 可能的原因与排查方法 ### 3.1 时间不同步(Clock Skew) #### 问题原理 - 如果一级节点的系统时钟比二级节点快,后续因 NTP 矫正或手动调整导致时间回跳,生成的样本时间戳可能出现回退。 - 当二级节点拉取 `/federate` 数据时,会检测到时间戳乱序并丢弃样本。 #### 排查方法 ```bash # 检查 NTP 同步状态 ntpq -p chronyc sources # 检查系统日志(时间跳变记录) journalctl -u chronyd | grep "CLOCK" dmesg | grep "time jump" # 对比硬件时钟 hwclock --compare ``` #### 解决方案 - 确保所有节点使用相同的可靠 NTP 源(如 `pool.ntp.org` 或企业内部 NTP 服务器)。 - 在虚拟化环境中,启用 KVM `tsc=reliable` 或调整 VMware 时间同步策略。 - 禁止手动修改服务器时间! --- ### 3.2 一级节点高负载/性能瓶颈 #### 问题原理 - 抓取延迟:一级节点负载高(CPU、IO 瓶颈)导致抓取循环 (`scrape_loop`) 延迟,样本时间戳与实际抓取时间不一致。 - 查询 (`/federate`) 压力:大范围查询可能导致返回样本顺序异常(虽然 TSDB 内部有序,但传输时可能乱序)。 #### 排查方法 ```bash # 监控一级节点资源 node_cpu_seconds_total{mode="iowait"} process_resident_memory_bytes{job="prometheus"} # Prometheus 自身指标 prometheus_target_interval_length_seconds prometheus_tsdb_wal_fsync_duration_seconds prometheus_http_request_duration_seconds{handler="/federate"} ``` #### 解决方案 - 垂直扩容:升级 CPU/内存,使用 SSD 存储(尤其 WAL 目录)。 - 优化抓取配置: - 减少 `scrape_interval` 或目标数量。 - 调整 `scrape_timeout` 避免超时。 - 调整 TSDB 参数: ```yaml --storage.tsdb.retention.time=7d # 控制数据保留时间 --storage.tsdb.wal-segment-size=128MB # 优化 WAL 分段大小 ``` --- ### 3.3 网络问题(乱序、丢包) #### 问题原理 - TCP 报文乱序:极端网络条件下,`/federate` 的大响应可能被拆分成多个 TCP 包,乱序到达导致解析出的样本时间戳异常。 - HTTP Keep-Alive 复用问题:连接复用可能导致响应流交错(较罕见)。 #### 排查方法 ```bash # 检查网络质量 mtr -r <一级节点IP> ss -i # 查看 TCP 重传率 # 抓包分析(谨慎,数据量大) tcpdump -i eth0 host <一级节点IP> and port 9090 -w /tmp/federation.pcap ``` #### 解决方案 - 修复网络基础设施(交换机、网卡)。 - 在二级节点调整抓取配置: ```yaml scrape_configs: - job_name: "federation" honor_timestamps: false # 忽略样本时间戳,改用抓取时间(诊断用) scrape_interval: 60s # 降低抓取频率 scrape_timeout: 30s # 增加超时 ``` --- ### 3.4 Prometheus 版本或配置差异 #### 问题原理 - 特定版本可能存在联邦查询 Bug(如 [#XXXXX](https://github.com/prometheus/prometheus/issues))。 - 问题一级节点的 `external_labels` 或 `relabel_configs` 导致时序标识异常。 #### 排查方法 ```bash # 对比 Prometheus 版本 prometheus --version # 检查配置差异 diff /etc/prometheus/prometheus.yml <(ssh node2 cat /etc/prometheus/prometheus.yml) ``` #### 解决方案 - 升级到最新稳定版本(如 `v2.40.0+`)。 - 确保所有一级节点的 `global.external_labels` 一致。 --- ### 3.5 指标基数爆炸(高基数问题) #### 问题原理 - 如果某个 Job 的标签组合数(如 `instance`、`pod`)过多,会导致: - 一级节点写入压力大(加剧 OOS)。 - `/federate` 查询响应体积膨胀(加剧网络问题)。 #### 排查方法 ```bash # 查询序列数最多的指标 topk(10, count by (__name__)({__name__!=""})) # 使用 promtool 分析 TSDB promtool tsdb analyze /data/prometheus/wal ``` #### 解决方案 - 优化采集配置,减少不必要的高基数标签: ```yaml metric_relabel_configs: - action: labeldrop regex: "(unused_label|pod_name)" ``` --- ## 4. 总结与建议排查步骤 ### 4.1 推荐排查流程 1. 检查时钟同步(NTP 状态、系统日志)。 2. 在二级节点设置 `honor_timestamps: false`(诊断是否时间戳问题)。 3. 监控一级节点资源(CPU、内存、磁盘 IO)。 4. 分析 Prometheus 自身指标(抓取延迟、WAL 刷盘时间)。 5. 检查网络质量(延迟、丢包、TCP 重传)。 6. 对比配置与版本(确保一致性)。 7. 优化高基数指标(减少标签数量)。 ### 4.2 长期优化建议 - 联邦架构优化:考虑改用 `Remote Write` 替代联邦(更适合大规模场景)。 - 分片抓取:将高负载一级节点的采集任务拆分到多个 Prometheus 实例。 - 监控告警:对 `out-of-order samples` 设置告警规则,提前发现问题。 --- ## 5. 结语 Prometheus 联邦机制在跨层级数据聚合中非常有用,但也可能因时间同步、性能瓶颈、网络问题、配置差异等因素导致 `out-of-order samples` 和 `up` 指标波动。本文通过系统性分析,提供了从时钟、性能、网络、版本、基数等多个维度的排查方法,帮助运维人员快速定位和解决问题。
Nathan
2025年6月20日 13:39
转发文档
收藏文档
上一篇
下一篇
手机扫码
复制链接
手机扫一扫转发分享
复制链接
Markdown文件
PDF文件
Docx文件
分享
链接
类型
密码
更新密码