SkyWalking Metrics 索引异常排查报告
一、问题概述
2026 年 7 月 24 日,Java 应用重启后,SkyWalking UI 中无法正常看到原有服务及实例信息。
同时,SkyWalking OAP 持续出现以下告警:
Metric: service_cpm values size is not equal to duration points size,
metrics values size: 0, duration points size: 31
Metric: service_instance_cpm values size is not equal to duration points size,
metrics values size: 0, duration points size: 31
涉及的主要指标包括:
service_cpm
service_sla
service_apdex
service_resp_time
service_instance_cpm
service_instance_sla
service_instance_resp_time
从界面现象看,问题一度表现为 Java 应用重启后未成功注册到 SkyWalking。
二、问题发生前的变更
2026 年 7 月 23 日,为释放 Elasticsearch 存储空间,人工删除了部分 SkyWalking 历史索引。
删除的 Trace 索引包括:
sw_segment-20260721
sw_segment-20260722
删除的 Metrics 索引包括:
sw_metrics-all-20260717
sw_metrics-all-20260718
sw_metrics-all-20260719
sw_metrics-all-20260720
sw_metrics-all-20260721
sw_metrics-all-20260722
删除后,部分历史 Metrics 索引再次被创建,但索引内文档数为 0:
sw_metrics-all-20260720 docs.count=0
sw_metrics-all-20260721 docs.count=0
sw_metrics-all-20260722 docs.count=0
当前日期的 Metrics 索引仍在正常写入:
sw_metrics-all-20260723 docs.count=12438965 size=4.6GB
sw_metrics-all-20260724 docs.count=2524054 size=1GB
三、排查过程
3.1 Java Agent 加载正常
Java Agent 日志中可见:
SkyWalking agent version:
8.16.0-dominos-1.0.0-SNAPSHOT
Agent 启动后虽然短暂处于:
DISCONNECT
但随后正常选择 OAP Collector,并建立 gRPC 通道。
由此可以确认:
- Java Agent 已正常加载;
- Java 启动参数中的
-javaagent已生效; - Agent 插件初始化正常。
3.2 Agent 到 OAP 的通信链路正常
Agent 已成功连接 OAP:
skywalking-skywalking-helm-oap.skywalking.svc.cluster.local:11800
Agent 向 OAP 上报 Event 数据时,返回:
HTTP status: 200
grpc-status: 0
Agent 上报 JVM Metrics 时,同样返回:
HTTP status: 200
grpc-status: 0
其中:
grpc-status: 0
表示 gRPC 请求处理成功。
因此可以排除:
- Java Agent 未加载;
- OAP 地址配置错误;
- Kubernetes DNS 异常;
- Java Pod 到 OAP 11800 端口不通;
- OAP gRPC 服务不可用;
- Agent 上报被 OAP 拒绝。
结论:
Java Agent → OAP
链路正常。
3.3 当前 Metrics 写入正常
sw_metrics-all-20260724 已持续写入数据,说明以下链路正常:
Java Agent
↓
OAP 11800
↓
Metrics 聚合
↓
Elasticsearch
因此可以确认:
- 当前 Metrics 数据仍在持续写入;
- OAP 到 Elasticsearch 的存储链路正常;
- 问题不是 Metrics 全局停止写入;
- 问题不是 Java 应用真正无法上报。
3.4 当前时间查询仍返回空指标
本次在 SkyWalking UI 中查看的是当前时间范围,并未主动查询已删除日期的历史数据。
但 OAP 仍持续出现:
metrics values size: 0
duration points size: 31
这里的:
duration points size: 31
表示当前查询时间窗口被划分为 31 个采样点,并不代表查询了 31 天,也不能据此判断查询范围包含历史日期。
因此,本次告警不能简单解释为:
UI 查询了已经被删除的历史数据。
结合实际现象,更符合情况的解释是:
- 人工删除
sw_metrics-all-*索引后,OAP 对 Metrics 索引集合的识别或查询出现异常; - 即使查询的是当前时间,OAP 仍无法正常获得服务、实例及对应指标;
- 最终表现为服务列表消失、实例不可见以及当前指标查询为空。
3.5 OAP 出现 Alias 获取失败
OAP 日志中发现:
AliasClient - Failed to get indices by alias sw_metrics-all
该日志说明 OAP 在通过:
sw_metrics-all
获取关联 Metrics 索引时发生失败。
虽然没有单独删除 Alias,但删除 Elasticsearch Index 时,该 Index 与 Alias 的关联关系也会同步移除。
结合以下现象:
- 人工删除了多个
sw_metrics-all-*Index; - OAP 出现
Failed to get indices by alias sw_metrics-all; - 原有服务和实例在 SkyWalking UI 中消失;
- 部分历史 Index 后续被重新创建为空索引;
- 当前日期 Index 仍可正常写入;
可以判断,人工删除操作造成了 SkyWalking Metrics 索引集合及 Alias 查询状态的阶段性异常。
现有日志能够确认 Alias 获取曾失败,但不足以证明 Alias 被永久损坏。
四、根因分析
4.1 已确认事实
本次排查已确认:
- Java Agent 正常加载;
- Agent 到 OAP 的 gRPC 链路正常;
- Event 和 JVM Metrics 上报成功;
- OAP 返回
grpc-status: 0; - 当前日期 Metrics Index 持续写入;
- 异常发生前人工删除了多个
sw_metrics-all-*Index; - 删除后 OAP 出现:
Failed to get indices by alias sw_metrics-all
- 删除后原有服务和实例无法在 UI 中正常显示;
- 部分被删除的历史 Metrics Index 被重新创建为空索引。
4.2 根因判断
本次问题的直接诱因是:
人工删除 SkyWalking 自主管理的
sw_metrics-all-*历史 Index。
删除操作一方面造成历史 Metrics 数据永久丢失,另一方面影响了 OAP 对 sw_metrics-all 索引集合的识别和查询。
在此期间,OAP 曾无法通过 sw_metrics-all Alias 正常获取关联索引,导致 SkyWalking UI 无法正常加载原有服务、实例及当前指标信息。
因此,即使查询的是当前时间范围,也会出现:
metrics values size: 0
duration points size: 31
并表现为:
- 原有服务列表消失;
- Java 应用重启后看不到新实例;
- 当前服务指标为空;
- 界面上类似应用未注册。
4.3 更准确的故障描述
本次问题不应描述为:
Java 应用重启后无法注册 SkyWalking。
更准确的描述是:
Java Agent 已正常连接 OAP 并持续上报数据,但人工删除
sw_metrics-all-*Index 后,OAP 对 Metrics 索引集合及 Alias 的查询出现阶段性异常,导致 SkyWalking UI 无法正常展示原有服务、实例及当前指标,从界面表现上类似应用未注册。
4.4 故障链路
人工删除 sw_metrics-all-* Index
↓
历史 Metrics 数据丢失
↓
Index 与 Alias 的关联关系发生变化
↓
OAP 获取 sw_metrics-all 关联索引失败
↓
服务、实例及当前 Metrics 查询异常
↓
SkyWalking UI 中原有服务和实例消失
↓
当前时间查询返回 values size=0
↓
表现为 Java 应用未注册或无数据
五、处理方案
5.1 调整 Metrics TTL
SkyWalking OAP 配置文件中:
metricsDataTTL: ${SW_CORE_METRICS_DATA_TTL:7}
其中:
7
只是默认值。
OAP Deployment 已增加:
- name: SW_CORE_METRICS_DATA_TTL
value: "3"
因此实际生效配置为:
metricsDataTTL=3 天
增加该环境变量并完成 OAP Pod 滚动更新后,SkyWalking 已能够自动删除超过 3 天保留周期的 Metrics Index。
处理流程如下:
修改 OAP Deployment
↓
增加 SW_CORE_METRICS_DATA_TTL=3
↓
滚动更新 OAP Pod
↓
OAP 加载 metricsDataTTL=3
↓
SkyWalking TTL 任务执行
↓
自动删除超过保留周期的 Metrics Index
5.2 停止人工删除 SkyWalking Index
后续不再人工执行:
DELETE sw_metrics-all-*
也不建议使用:
DELETE sw*
SkyWalking 对 Elasticsearch Index 有自身的:
- Alias 管理;
- 时间分片管理;
- TTL 管理;
- Mapping 管理;
- 索引初始化和维护逻辑。
人工删除可能造成:
- 历史 Metrics 数据丢失;
- Alias 查询异常;
- 服务和实例列表异常;
- 空 Index 被重新创建;
- OAP 持续出现 MQE WARN。
5.3 历史数据缺失期间的查询建议
历史 Metrics 数据已经被人工删除,无法通过重新创建空 Index 恢复。
在历史数据缺失期间,SkyWalking UI 建议优先查看:
最近 15 分钟
最近 1 小时
最近 24 小时
用于确认当前服务、实例和指标是否恢复正常。
六、处理结果
当前状态如下:
Java Agent 正常
Agent → OAP 11800 正常
OAP gRPC 接收 正常
OAP → ES 当前 Metrics 写入 正常
当前 Metrics Index 正常增长
历史 Metrics 数据 部分已人工删除,无法直接恢复
Alias 获取 删除后曾出现阶段性失败
Metrics TTL 已调整为 3 天
历史 Index 清理 已由 SkyWalking 自动执行
Java 应用是否需要重启 不需要
七、后续措施
-
SkyWalking Metrics Index 统一通过
SW_CORE_METRICS_DATA_TTL管理,不再人工删除。 -
如需调整数据保留周期,统一修改 OAP Deployment 中的 TTL 环境变量。
-
索引清理前必须确认:
- Index 类型;
- Index 日期;
- 是否仍处于 SkyWalking TTL 管理范围;
- Alias 关联关系;
- 删除后对服务、实例、Metrics 和 Trace 查询的影响。
-
增加以下监控项:
- Metrics Index 每日增长量;
- 当前日期 Index 文档增长速率;
- OAP Alias 查询失败;
- OAP MQEVisitor WARN;
- Elasticsearch Bulk 写入失败;
- TTL 清理执行结果。
八、最终结论
本次异常不是 Java Agent 注册失败。Java Agent 到 OAP 的 gRPC 链路以及当前 Metrics 写入均正常。根因是人工删除 SkyWalking 管理的
sw_metrics-all-*Index 后,历史数据丢失,并造成 OAP 对sw_metrics-all索引集合及 Alias 的获取出现阶段性异常,最终导致 SkyWalking UI 无法正常展示原有服务、实例和当前指标。现已通过SW_CORE_METRICS_DATA_TTL=3将 Metrics 保留周期调整为 3 天,并验证 SkyWalking 能够自动清理超过保留周期的历史 Index。后续统一使用 SkyWalking TTL 机制管理索引生命周期。