关于 dt-obs-problems
用于分析 Dynatrace 检测问题的技能,涵盖问题分诊、根因与影响调查及重复模式分析,并提供 DQL 查询指导。
主要功能
- 01排列活动问题优先级
- 02追踪根因与受影响实体
- 03分析重复问题和趋势
- 04关联事件并评估影响
适用场景
- 01分诊当前可用性或服务问题
- 02查明问题根因及影响范围
- 03回顾重复问题与解决时间
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ dynatrace/ dynatrace-for-ai --skill dt-obs-problems安装后在 Claude Code 中输入/dt-obs-problems确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
references/impact-analysis.mdproblem-correlation.mdproblem-merging.mdproblem-trending.md详细介绍
问题分析技能
分析 Dynatrace AI 检测到的问题,包括根因识别、影响评估以及与日志和指标的关联。
使用场景
1. 活跃问题分诊
- 目标: 列出当前活跃问题并确定优先级
- 触发:“活跃问题”“有哪些未解决的问题”“当前问题”“可用性问题”
- 完成: 提供按优先级排序的活跃问题列表,包含类别、用户影响和显示 ID
2. 根因调查
- 目标: 确定特定问题的根因实体
- 触发:“P-12345 的根因”“是什么导致了这个问题”“哪个实体是根因”
- 完成: 确定根因实体,并列出受影响实体和影响范围
3. 问题趋势分析
- 目标: 分析一段时间内的问题模式,识别重复出现的问题
- 触发:“重复出现的问题”“问题历史记录”“过去 30 天的问题趋势”
- 完成: 提供趋势数据,展示问题频率、重复出现的根因和解决时间
概述
Dynatrace 会自动检测环境中的异常、性能下降和故障,创建问题,将相关的警报、警告和信息级事件汇总在一起,并提供根因和影响方面的洞察。
什么是问题?
问题是自动检测到的软件和基础设施运行状况及韧性问题,能够:
- 自动关联服务、基础设施、前端应用和用户会话中的相关警报、警告和信息级事件
- 识别根因,通过 Smartscape 依赖关系进行因果分析
- 评估业务影响,跟踪受影响的用户和服务
- 减少警报噪声,将具有相同根因和影响的相关症状归并为单个问题
- 跟踪问题生命周期,从早期检测到解决
事件类型
event.kind 字段(稳定,权限)用于标识事件的高级类型:
event.kind 值 | 描述 |
|---|---|
DAVIS_EVENT | Davis 检测到的基础设施/应用事件 |
BIZ_EVENT | 业务事件(通过 API 注入或从 span 中捕获) |
RUM_EVENT | 真实用户监控事件 |
AUDIT_EVENT | 管理/安全审计事件 |
event.provider(稳定,权限)用于标识事件来源。
问题类别
常见的 event.category 值:
| 类别 | 描述 | 示例 |
|---|---|---|
| AVAILABILITY | 基础设施或服务不可用 | Web 服务未返回数据、合成测试主动失败、数据库连接丢失 |
| ERROR | 错误率超出基线并有所上升 | API 错误率从 0.1% 升至 15% |
| SLOWDOWN | 性能下降 | 响应时间从 200ms 增至 5000ms |
| RESOURCE | 资源饱和 | 容器内存占用达到 95%,导致 OOM 终止 |
| CUSTOM | 自定义异常检测 | 业务 KPI(每分钟订单数)低于阈值 |
问题生命周期
Detection → ACTIVE → Under Investigation → CLOSED
- ACTIVE:当前正在发生、需要关注的问题
- CLOSED:已解决的问题,可用于历史分析
核心字段
常见字段名称错误
| ❌ 错误 | ✅ 正确 | 描述 |
|---|---|---|
title | event.name | 问题标题/描述 |
status | event.status | 问题生命周期状态 |
severity | event.category | 问题类型/类别 |
start | event.start | 问题开始时间 |
正确的状态值
// ✅ CORRECT: Use these status values
fetch dt.davis.problems
| filter event.status == "ACTIVE" // Currently occurring problems
// or event.status == "CLOSED" // Resolved problems
// ❌ INCORRECT: event.status == "OPEN" does not exist!
| limit 1
关键字段参考
fetch dt.davis.problems, from:now() - 1h
| filter not(dt.davis.is_duplicate)
| fields
event.start, // Problem start timestamp
event.end, // Problem end timestamp (if closed)
display_id, // Human-readable problem ID (P-XXXXX)
event.name, // Problem title
event.description, // Detailed description
event.category, // Problem type
event.status, // ACTIVE or CLOSED
dt.smartscape_source.id, // The smartscape ID for the affected resource
dt.davis.affected_users_count, // Number of affected users
affected_entity_ids = smartscape.affected_entities[][id], // Array of affected entity IDs
dt.smartscape.service, // Affected services (may be array)
dt.davis.root_cause_entity, // Entity identified as root cause
root_cause_entity_id, // Root cause entity ID
root_cause_entity_name, // Human-readable root cause name
dt.davis.is_duplicate, // Whether duplicate detection
dt.davis.is_rootcause // Root cause vs. symptom
| limit 10
标准查询模式
始终以以下基础条件开始问题查询:
fetch dt.davis.problems, from:now() - 2h
| filter not(dt.davis.is_duplicate) and event.status == "ACTIVE"
| fields event.start, display_id, event.name, event.category
| sort event.start desc
| limit 20
关键组成部分:
fetch dt.davis.problems- 问题数据源not(dt.davis.is_duplicate)- 筛除重复检测结果event.status == "ACTIVE"- 仅显示活跃问题- 时间范围 - 始终指定合理的时间范围
常见查询模式
按类别查看活跃问题
fetch dt.davis.problems
| filter not(dt.davis.is_duplicate) and event.status == "ACTIVE"
| summarize problem_count = count(), by: {event.category}
| sort problem_count desc
高影响活跃问题(影响许多用户)
fetch dt.davis.problems
| filter not(dt.davis.is_duplicate) and event.status == "ACTIVE"
| filter dt.davis.affected_users_count > 100
| fields event.start, display_id, event.name, dt.davis.affected_users_count, event.category
| sort dt.davis.affected_users_count desc
高影响活跃问题(影响许多 smartscape 实体)
fetch dt.davis.problems
| filter not(dt.davis.is_duplicate) and event.status == "ACTIVE"
| filter arraySize(affected_entity_ids) > 5
| fields event.start, display_id, event.name, affected_entity_ids, event.category, impacted_entity_count = arraySize(affected_entity_ids)
| sort impacted_entity_count desc
特定问题详情
fetch dt.davis.problems
| filter display_id == "P-XXXXXXXXXX"
| fields event.start, event.end, event.name, event.description, affected_entity_ids, dt.davis.affected_users_count, root_cause_entity_id, root_cause_entity_name
特定服务的问题历史
fetch dt.davis.problems, from:now() - 7d
| filter not(dt.davis.is_duplicate)
| filter in(dt.smartscape.service, toSmartscapeId("SERVICE-XXXXXXXXX"))
| summarize problems = count(), by: {event.category, event.status}
根因分析模式
基本根因查询
fetch dt.davis.problems, from:now() - 24h
| filter not(dt.davis.is_duplicate) and event.status == "ACTIVE"
| fields
display_id,
event.name,
event.description,
root_cause_entity_id,
root_cause_entity_name,
affected_entity_ids = smartscape.affected_entities[][id]
按实体类型分析根因
确定最常导致问题的实体类型:
fetch dt.davis.problems, from:now() - 7d
| filter not(dt.davis.is_duplicate)
| filter isNotNull(root_cause_entity_id)
| summarize problem_count = count(), by:{root_cause_entity_name}
| sort problem_count desc
| limit 20
受影响实体是 AWS 资源
fetch dt.davis.problems, from:now() - 24h
| filter not(dt.davis.is_duplicate) and event.status == "ACTIVE"
| filter iAny(startsWith(smartscape.affected_entities[][type], "AWS_"))
基础设施根因及服务影响
fetch dt.davis.problems, from:now() - 30m
| filter not(dt.davis.is_duplicate) and event.status == "ACTIVE"
| filter matchesPhrase(root_cause_entity_id, "HOST-")
| filter isNotNull(dt.smartscape.service)
| fields display_id, event.name, root_cause_entity_name, dt.smartscape.service
问题影响范围
计算每个根因影响的实体:
fetch dt.davis.problems, from:now() - 7d
| filter not(dt.davis.is_duplicate)
| filter isNotNull(root_cause_entity_id)
| fieldsAdd affected_count = arraySize(smartscape.affected_entities)
| summarize
avg_affected = avg(affected_count),
max_affected = max(affected_count),
problem_count = count(),
by:{root_cause_entity_name}
| sort avg_affected desc
重复出现的根因
确定反复导致问题的实体:
fetch dt.davis.problems, from:now() - 24h
| filter not(dt.davis.is_duplicate)
| filter isNotNull(root_cause_entity_id)
| summarize
problem_count = count(),
first_occurrence = min(event.start),
last_occurrence = max(event.start),
by:{root_cause_entity_id, root_cause_entity_name}
| filter problem_count > 3
| sort problem_count desc
原因类别与根因实体
这是两个不同的问题——请采用正确的方法:
- “什么会导致问题?” / “最常见的原因” → 按
event.category汇总 (SLOWDOWN、ERROR、RESOURCE、AVAILABILITY、CUSTOM)。说明每个类别由什么触发。 - “哪个实体会导致问题?” / “根因实体” → 按
root_cause_entity_name分组。列出具体的服务、主机或应用。
原因类别明细(询问常见原因、模式或类型时使用):
fetch dt.davis.problems, from:now() - 30d
| filter not(dt.davis.is_duplicate)
| summarize problem_count = count(), by: {event.category}
| sort problem_count desc
然后,使用“问题类别”表说明每个类别的触发条件,并引用租户数据中的具体实体作为示例。
问题趋势与模式分析
跟踪问题随时间的变化趋势,识别重复出现的问题,并分析解决情况。
主要文件:
references/problem-trending.md- 时间序列分析与模式检测
常见用例:
- 使用
makeTimeseries查看随时间变化的活跃问题 - 按类别统计问题创建率
- 按时间安排检测重复问题
- 解决时间趋势与 P95 时长分析
关键技巧:
makeTimeseries与bin():针对生命周期跨度与离散事件选择合适的方法- NULL 处理:对活跃问题使用
coalesce(event.end, now()) - 高峰时段分析:确定问题最常发生的时间
- 影响趋势:跟踪用户影响随时间的变化
完整的查询模式和最佳实践请参阅 references/problem-trending.md。
跨领域问题查询
与 Kubernetes 集群相关的问题
使用 affected_entity_ids 或 dt.smartscape_source.id 查找与 Kubernetes 相关的问题:
fetch dt.davis.problems, from:now() - 7d
| filter not(dt.davis.is_duplicate)
| filter matchesPhrase(dt.smartscape_source.id, "KUBERNETES_CLUSTER")
OR matchesPhrase(dt.smartscape_source.id, "K8S_")
| fields event.start, display_id, event.name, event.category, event.status,
dt.smartscape_source.id, affected_entity_ids
| sort event.start desc
替代方法:展开受影响的实体,并筛选 K8s 实体类型:
fetch dt.davis.problems, from:now() - 7d
| filter not(dt.davis.is_duplicate)
| expand entity_id = affected_entity_ids
| filter matchesPhrase(entity_id, "KUBERNETES_CLUSTER")
OR matchesPhrase(entity_id, "K8S_")
| fields event.start, display_id, event.name, event.category, entity_id
| sort event.start desc
简单的问题列表
列出过去 24 小时内的所有问题(常见请求):
fetch dt.davis.problems, from:now() - 24h
| filter not(dt.davis.is_duplicate)
| fields event.start, event.end, display_id, event.name, event.category, event.status
| sort event.start desc
构建响应
问题原因摘要
汇总问题原因、类别或模式时,请对数据中出现的所有标准类别提供全面的明细:AVAILABILITY、ERROR、SLOWDOWN、RESOURCE 和 CUSTOM。对找到的每个类别:
- 类别名称和问题数量
- 触发条件——简要说明(例如,RESOURCE = CPU、内存或磁盘阈值超限;AVAILABILITY = 服务或实体无法访问)
- 来自租户数据的具体示例(受影响的实体名称、问题 ID)
不要在前两个类别后就停止——用户希望了解完整情况。请参阅上方的“问题类别”表,了解触发条件说明。
分析结果
呈现查询结果时:
- 包含实体名称(而非仅提供 ID),但请选择高效的方法:
- **实体较少(< 5 个):**可以调用
get-entity-name - **实体较多:**使用直接返回名称的
query-problems工具,或在 DQL 查询中加入root_cause_entity_name/entityName(),以内联方式解析名称。避免对 10 个以上的实体循环调用get-entity-name——这可能耗尽工具调用限额,导致无法返回任何答案。
- **实体较少(< 5 个):**可以调用
- 根据已识别的原因提供可执行的建议
- 按频率或影响程度组织内容,以便于确定优先级
最佳实践
基本规则
- 始终过滤重复项:使用
not(dt.davis.is_duplicate),避免对同一问题重复计数 - 使用正确的状态值:使用
"ACTIVE"或"CLOSED",绝不能使用"OPEN" - 指定时间范围:始终包含时间边界,以优化性能
- 包含 display_id:这是识别和关联问题的关键字段
- 逐步测试:构建查询时,每次只添加一个筛选条件或字段
- 尽早筛选:获取数据后立即应用
not(dt.davis.is_duplicate)
查询开发
- 从简单开始:先进行基本筛选,再逐步增加复杂度
- 先测试字段:使用
| limit 1验证字段名称是否存在 - 使用有意义的时间范围:范围过宽会浪费资源,过窄则会漏掉数据
- 记录问题 ID:始终捕获并保存
display_id以供参考
根因验证
- 在需要时,始终筛选
isNotNull(root_cause_entity_id) - 使用
dt.davis.event_ids交叉引用事件 - 考虑时间延迟:根因可能在问题出现前几分钟就已记录在日志中
时间范围指南
// ✅ GOOD - Specific time range
fetch dt.davis.problems, from:now() - 4h
// ❌ BAD - Scans all historical data
fetch dt.davis.problems
绝对时间范围必须使用双引号
在 DQL 查询中为 from 和 to 使用 ISO 8601 绝对时间戳时,必须始终用双引号括起时间戳。不加引号的时间戳会导致语法错误。
// ✅ CORRECT - absolute timestamps quoted
fetch dt.davis.problems, from: "2026-05-18T22:50:00Z", to: "2026-05-18T23:35:00Z"
| filter not(dt.davis.is_duplicate)
| fields event.start, display_id, event.name, event.category, event.status
| sort event.start desc
故障排除
| 问题 | 原因 | 解决方案 |
|---|---|---|
| 未返回任何问题 | 使用了 event.status == "OPEN" | 使用 "ACTIVE" 或 "CLOSED"——"OPEN" 不存在 |
| 结果中有重复问题 | 缺少去重筛选条件 | 在 fetch 后立即添加 filter not(dt.davis.is_duplicate) |
字段名称错误(title、status、severity) | 使用了类似 SQL 的命名方式 | 使用 event.name、event.status、event.category——参见上方字段名称表 |
root_cause_entity_id 为 null | 并非所有问题都已识别根因 | 查询根因时,添加 filter isNotNull(root_cause_entity_id) |
| 查询扫描数据过多/超时 | 缺少时间范围 | 始终在 fetch 命令中指定 from:now() - <duration> |
affected_entity_ids 是空数组 | 问题没有映射到受影响实体 | 可改为检查 dt.smartscape.service 或 dt.smartscape_source.id |
何时加载参考资料
在以下情况下加载 problem-trending.md:
- 分析问题频率随时间的变化
- 按计划检测重复出现的问题
- 计算解决时间趋势和 P95 时长
- 按类别比较问题创建率
在以下情况下加载 problem-correlation.md:
- 将问题与日志或其他遥测数据关联起来
- 调查问题发生前的事件
- 将问题与部署或配置更改关联起来
在以下情况下加载 impact-analysis.md:
- 评估业务影响(受影响的用户、服务)
- 计算根因实体的影响范围
- 根据技术影响和用户影响确定问题优先级
参考资料
- problem-trending.md — 问题趋势和时间序列分析模式
- problem-correlation.md — 将问题与日志及其他遥测数据关联起来
- impact-analysis.md — 业务和技术影响评估
- problem-merging.md — DAVIS 将事件合并为问题的时机和原因
相关技能
- dt-dql-essentials - 问题查询的核心 DQL 语法和查询结构
- dt-obs-logs - 将问题与应用程序和基础设施日志关联起来
- dt-obs-tracing - 通过分布式追踪分析调查问题