使用SPL快速诊断问题根因 -- 延迟分析指南

简介: 查找故障时段内系统异常根因。

使用SPL进行诊断前请阅读下面的数据获取文档,确保拥有数据访问权限。

2025 AI 原生编程挑战赛 数据获取文档

本指南介绍如何诊断系统高延迟问题的根因,通过分析分布式链路追踪数据和资源指标来定位性能瓶颈。

适用范围:本分析方法专门针对CPU资源异常导致的延迟问题

对于其他类型的性能问题(如内存不足、网络延迟等),需要使用相应的专门分析方法。

本文提到的相关代码保存在下面的链接中,选手可以通过教程运行notebook中的STS_Root_Cause_Analysis_Latency.ipynb实现根因诊断。

https://github.com/alibabacloud-observability/tianchi-2025


1. 准备开发环境

1.1 安装基础环境

# 安装Python虚拟环境
python3 -m venv venv
source venv/bin/activate
# 安装依赖项
pip install -r requirements.txt

1.2 配置访问凭证

设置环境变量:

export ALIBABA_CLOUD_ACCESS_KEY_ID="你的AccessKey ID"
export ALIBABA_CLOUD_ACCESS_KEY_SECRET="你的AccessKey Secret"

2025.09.22之前上传个人账号的选手,获取的STS角色名为tianchi-user-a。需要设置变量:

export ALIBABA_CLOUD_ROLE_ARN="acs:ram::1672753017899339:role/tianchi-user-a"

2025.09.22到2025.10.09期间,参加比赛并上传个人账号的选手,获取的STS角色名为tianchi-2025-role-1。需要设置变量:

export ALIBABA_CLOUD_ROLE_ARN="acs:ram::1672753017899339:role/tianchi-2025-role-1"

2025.10.10到2025.11.09期间,参加比赛并上传个人账号的选手,获取的STS角色名为tianchi-2025-role-2。需要设置变量:

export ALIBABA_CLOUD_ROLE_ARN="acs:ram::1672753017899339:role/tianchi-2025-role-2"

从2025.11.10开始,参加比赛并上传个人账号的选手,获取的STS角色名为tianchi-2025-role-3。需要设置变量:

export ALIBABA_CLOUD_ROLE_ARN="acs:ram::1672753017899339:role/tianchi-2025-role-3"

1.3 启动分析环境

cd notebook
jupyter notebook STS_Root_Cause_Analysis_Latency.ipynb

2. 分析流程详解

2.1 环境配置和导入

目标: 初始化分析环境,加载必要的Python模块

操作步骤:

  1. 执行第一个代码段,检查所有依赖项是否正确导入
  2. 如看到✅ All available imports loaded successfully则环境配置成功
  3. 如有警告,请按提示安装缺失依赖

输出示例:

✅ FindRootCauseSpansRT imported successfully
✅ TestCMSQuery imported successfully
✅ Constants imported successfully
✅ All available imports loaded successfully
💡 If you see warnings above, please run: pip install -r requirements.txt

2.2 参数配置

目标: 设置分析时间范围和SLS访问参数

配置示例:

# SLS 配置
PROJECT_NAME = "proj-xtrace-a46b97cfdc1332238f714864c014a1b-cn-qingdao"
LOGSTORE_NAME = "logstore-tracing"
REGION = "cn-qingdao"
# 分析时间区间
ANOMALY_START_TIME = "2025-08-28 20:00:20"
ANOMALY_END_TIME = "2025-08-28 20:05:20"
NORMAL_START_TIME = "2025-08-27 20:00:20"
NORMAL_END_TIME = "2025-08-27 20:05:20"
# 分析参数
DURATION_THRESHOLD = 2000000000  # 2000ms(以纳秒为单位)
LIMIT_NUM = 1000  # 分析的 trace 数量
# CMS 指标配置
CMS_WORKSPACE = "quanxi-tianchi-test"
CMS_ENDPOINT = 'metrics.cn-qingdao.aliyuncs.com'

输出示例

📊 Analysis Configuration:
  SLS Project: proj-xtrace-a46b97cfdc1332238f714864c014a1b-cn-qingdao
  Logstore: logstore-tracing
  Anomaly Period: 2025-08-28 20:00:20 to 2025-08-28 20:05:20
  Normal Period: 2025-08-27 20:00:20 to 2025-08-27 20:05:20
  Duration Threshold: 2.0s
  CMS Workspace: quanxi-tianchi-test

关键参数说明:

  • ANOMALY_START_TIMEANOMALY_END_TIME: 异常时间段,故障发生时间(5分钟)
  • NORMAL_START_TIMENORMAL_END_TIME: 正常时间段,前一天同时刻作为基线(5分钟)
  • DURATION_THRESHOLD: 持续时间阈值,2秒以纳秒表示
  • LIMIT_NUM: 分析数量限制,限制查询1000条trace避免超时

2.3 查找高独占时间的调用段

目标: 识别在异常时段消耗大量独占时间的调用段

操作步骤:

  1. 执行2.1 环境配置和导入的代码,初始化分析器
  2. 执行独占时间分析方法
  3. 查看找到的高独占时间调用段数量和示例spanID

输出示例:

🔍 Step 1: Finding high exclusive time spans...
============================================================
获取独占时间数据...
正常时间段查询到的独占时间日志条数: 3000
开始计算正常时间段的平均独占时间...
收集到 16382 个span的独占时间信息
查询到的日志条数: 2000
🔧 处理模式: 处理每个trace中的所有span
总共找到 9308 个有效的span独占时间数据
成功映射 7426 个span的serviceName和spanName
方案1覆盖率: 79.78% (7426/9308)
✅ 选择方案1:直接使用span_list中的serviceName和spanName(推荐)
🚀 [方案1] 使用span_list中的serviceName和spanName进行调整...
🚀 [方案1] 无需额外查询,直接处理 9308 个span
开始本地计算调整后的独占时间...
完成 9308 个span的时间调整计算
📊 结果:
  共找到 3244 个贡献了独占时间前95%的span
🔍 示例span IDs:
  1. a60372370298137a
  2. 54ba7fd7b19710b8
  3. 316778ebde33de90
  4. e4f52bfdb3a16926
  5. 745f145460b09a98
  ... and 3239 more spans

结果解读:

  • 正常时段查询了3000条记录作为基线
  • 收集16382个span的独占时间信息进行计算
  • 最终找到3244个高独占时间调用段用于后续分析

2.4 模式差异分析 (diff_patterns)

目标: 使用diff_patterns算子发现异常调用段的特征模式

操作步骤:

  1. 系统自动生成包含高独占时间spanID的查询条件
  2. 执行diff_patterns查询,分析模式差异
  3. 解析查询结果,提取serviceName和spanName模式

输出示例:

🔍 Step 2: Pattern analysis with diff_patterns...
============================================================
📋 已生成用于模式分析的 diff_patterns 查询语句
🚀 正在使用SLS客户端执行 diff_patterns 查询...
✅ 模式分析完成:共返回 1 条结果记录
📊 模式分析结果:
  结果 1: {'ret': '[["\\"spanName\\"=\'grpc.oteldemo.CartService/GetCart\'","\\"spanName\\"=\'router flagservice egress\'","\\"serviceName\\"=\'cart\' AND \\"spanName\\"=\'POST /oteldemo.CartService/GetCart\'","\\"serviceName\\"=\'cart\' AND \\"spanName\\"=\'POST\'"],[706,471,466,244],[3456,1690,3239,2202],[0.353,0.2355,0.233,0.122],[0.11432351968243466,0.05590473040026464,0.10714521998015217,0.0728415481309957],[0.23867648031756534,0.17959526959973536,0.12585478001984785,0.04915845186900429],[1.0,1.0,1.0,1.0],[0.0,0.0,0.0,0.0],null]'}
  🔍 Analyzing pattern result: {'ret': '[["\\"spanName\\"=\'grpc.oteldemo.CartService/GetCart\'","\\"spanName\\"=\'router flagservice egress\'","\\"serviceName\\"=\'cart\' AND \\"spanName\\"=\'POST /oteldemo.CartService/GetCart\'","\\"serviceName\\"=\'cart\' AND \\"spanName\\"=\'POST\'"],[706,471,466,244],[3456,1690,3239,2202],[0.353,0.2355,0.233,0.122],[0.11432351968243466,0.05590473040026464,0.10714521998015217,0.0728415481309957],[0.23867648031756534,0.17959526959973536,0.12585478001984785,0.04915845186900429],[1.0,1.0,1.0,1.0],[0.0,0.0,0.0,0.0],null]'}
    📊 Extracted patterns: ['"spanName"=\'grpc.oteldemo.CartService/GetCart\'', '"spanName"=\'router flagservice egress\'', '"serviceName"=\'cart\' AND "spanName"=\'POST /oteldemo.CartService/GetCart\'', '"serviceName"=\'cart\' AND "spanName"=\'POST\'']
    📊 Pattern counts: [706, 471, 466, 244]
    ℹ️ Found spanName pattern: 'grpc.oteldemo.CartService/GetCart' (count: 706)
    ℹ️ Found spanName pattern: 'router flagservice egress' (count: 471)
    ✅ Found serviceName pattern: 'cart' (count: 466)
    ✅ Found serviceName pattern: 'cart' (count: 244)
🎯 识别出的service模式:
  - cart: 710 次模式匹配
💡 在模式中出现最多的serviceName: cart

结果解读:

  • spanName模式: grpc.oteldemo.CartService/GetCart 在异常span中出现706次,router flagservice egress出现471次
  • 服务模式: cart 服务的相关模式共出现710次
  • 目标确定: 系统自动设置TARGET_SERVICE = "cart"用于后续CPU分析

2.5 CPU指标分析

目标: 分析识别出的目标服务的CPU使用情况

分析维度:

  1. CPU使用率vs限制 (deployment_cpu_usage_vs_limits) - 查看CPU使用率是否接近限制
  2. CPU绝对使用量 (deployment_cpu_usage_total) - 查看CPU使用量的绝对变化

Kubernetes概念映射:

  • serviceName (链路追踪) ↔ deployment name (Kubernetes)
  • deployment → pod → container 的层级关系
  • CPU指标在deployment级别聚合

操作步骤:

  1. 系统根据模式分析结果自动确定TARGET_SERVICE
  2. 执行CPU使用率查询,获取时序数据
  3. 对比异常时段和正常时段的CPU使用情况
  4. 执行内存使用率查询作为对比验证

2.6 异常检测 (series_decompose_anomalies)

目标: 使用机器学习算法自动检测CPU指标异常

操作步骤:

  1. 对目标服务执行CPU异常检测查询
  2. 统计异常点数量和类型
  3. 根据异常点数量判断是否存在显著异常

2.7 根因分析总结

目标: 综合所有证据,得出最终的根因判断

证据权重评估:

  1. span证据: 是否找到高独占时间的span
  2. 模式证据: 是否成功识别目标服务
  3. 指标证据: 是否获取到CPU/内存数据
  4. 异常证据: 是否检测到显著异常(≥3个异常点)

置信度评级:

  • 高置信度: span证据 + 模式证据 + 指标证据 + 异常证据 (≥3异常点)
  • 中置信度: span证据 + 模式证据 + 指标证据,但异常证据不足
  • 低置信度: 证据不足或无法确定目标服务

根因候选格式: {service}.cpu (如: recommendation.cpu, cart.cpu)

输出示例:

🎯 最终答复:cart.cpu
📈 置信度:高
🔍 证据:TRUE
📝 支持证据:
   - 发现 3244 个高独占时间span
   - 模式分析表明涉及服务 cart
   - 自动异常检测确认了CPU使用异常
   - 检测到 210 个异常点(已达≥3阈值)

2.8 附加分析

目标: 分析其他服务的异常情况,排除其他可能的根因

分析范围: frontend、cart、checkout、payment、shipping、currency、ad、recommendation等常见服务

操作逻辑:

  1. 对每个服务执行CPU和内存异常检测
  2. 统计各服务的异常点数量
  3. 识别是否有其他服务也出现异常

结果用途:

  • 验证主要根因的唯一性
  • 发现可能的次要影响服务
  • 了解系统健康状况

3. 可能出现报错的情况

如果在运行代码时报错如下:

image.png

大概率是系统的后台没有及时获取到选手的账号ID,这时候可以去比赛界面的【数据获取】入口再次上传您的账号ID,就能让系统立即发现您的账号,并授权。

4. 代码中的默认参数介绍

代码中涉及到的参数介绍:

  • PROJECT_NAME:日志服务项目名称,默认为proj-xtrace-a46b97cfdc1332238f714864c014a1b-cn-qingdao
  • LOGSTORE_NAME:日志库名称,默认为logstore-tracing
  • REGION:地域,默认为cn-qingdao
  • CMS_WORKSPACE:云监控工作区间,这是您进行宏观监控和发现异常的主要入口。默认为quanxi-tianchi-test
  • CMS_ENDPOINT:云监控API接入地址,这是云监控服务的API终端地址,所有通过程序(如SDK、命令行工具)对云监控指标数据的请求,都需要发送到这个地址。默认为metrics.cn-qingdao.aliyuncs.com


参考文档

相关文章
|
监控
使用云监控2.0页面诊断问题根因-错误分析指南
针对一次故障的根因诊断,通过云监控2.0调用链分析。
2441 0
|
人工智能 运维 监控
2025 AI 原生编程挑战赛 数据获取文档
本文介绍了参赛者如何配置阿里云服务以参加AI运维赛。首先开通阿里云日志服务,随后创建RAM用户并为其分配访问权限。接着为该用户授权,确保其具备读取数据的权限。最后,可选地创建或重新生成AccessKey以用于后续的数据查询操作。整个流程帮助选手完成基础环境配置,以便使用阿里云日志服务进行数据分析。
2672 2
|
运维 监控 存储
使用SPL快速诊断问题根因 -- 错误分析指南
本内容记录了一次故障排查过程
2084 0
|
监控 Perl 容器
使用云监控2.0页面诊断问题根因-延迟分析指南
针对一次故障的根因诊断,云监控2.0调用链分析发现异常耗时,经排查为【checkout】服务独占耗时过长,进一步分析确认其CPU使用率突增至100%,判定根因为【checkout.cpu】性能问题。
1364 0
|
存储 安全 Linux
Docker 离线安装与基本使用
Docker 离线安装与基本使用
3796 0
Docker 离线安装与基本使用
|
人工智能 Kubernetes Perl
2025 AI 原生编程挑战赛 术语说明与FAQ
本文档介绍了天池2025比赛的相关术语和一些疑问的解答。包括云监控平台(CloudMonitor 2.0)、日志服务(SLS)、观测数据租户(Workspace)、地域(Region)等平台与入口概念,并详解了Trace、Span、Log、Metric、Event等核心数据模型及其关键字段。文档还涵盖了PromQL告警规则、SPL日志查询、Kubernetes实体层级、诊断方法论术语等内容,同时提供了根因分析的命名规范、提交格式(JSONL)、时间窗口要求及常见问题解答,旨在帮助参赛者高效定位并解决系统故障。
1175 2
|
机器学习/深度学习 监控 Web App开发
SLS机器学习最佳实战:根因分析(一)
通过算法,快速定位到某个宏观异常在微观粒度的具体表现形式,能够更好的帮助运营同学和运维同学分析大量异常,降低问题定位的时间。
13330 0
|
5月前
|
人工智能 运维 监控
让天下没有难查的故障:2025 阿里云 AI 原生编程挑战赛正式启动
本次大赛由阿里云主办,云原生应用平台承办,聚焦 Operation Intelligence 的智能运维(AIOps)赛道,为热爱 AI 技术的开发者提供发挥创意和想象力的舞台,借助 LLM 强大的推理能力与标准化整合的多源可观测数据,找到 AI 应用在智能运维(AIOps)场景上的新方式。
616 31
|
6月前
|
人工智能 量子技术 调度
别只盯着ChatGPT了,量子计算才是下一个能源“爆点”!
别只盯着ChatGPT了,量子计算才是下一个能源“爆点”!
250 17