mcpField
D
dt-obs-problems

dt-obs-problems

github.com/dynatrace云与 DevOps1692.7k 次安装今天更新
代码仓库

关于 dt-obs-problems

用于分析 Dynatrace 检测问题的技能,涵盖问题分诊、根因与影响调查及重复模式分析,并提供 DQL 查询指导。

主要功能

  1. 01排列活动问题优先级
  2. 02追踪根因与受影响实体
  3. 03分析重复问题和趋势
  4. 04关联事件并评估影响

适用场景

  1. 01分诊当前可用性或服务问题
  2. 02查明问题根因及影响范围
  3. 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.md
problem-correlation.md
problem-merging.md
problem-trending.md

详细介绍

问题分析技能

分析 Dynatrace AI 检测到的问题,包括根因识别、影响评估以及与日志和指标的关联。


使用场景

1. 活跃问题分诊
  • 目标: 列出当前活跃问题并确定优先级
  • 触发:“活跃问题”“有哪些未解决的问题”“当前问题”“可用性问题”
  • 完成: 提供按优先级排序的活跃问题列表,包含类别、用户影响和显示 ID
2. 根因调查
  • 目标: 确定特定问题的根因实体
  • 触发:“P-12345 的根因”“是什么导致了这个问题”“哪个实体是根因”
  • 完成: 确定根因实体,并列出受影响实体和影响范围
3. 问题趋势分析
  • 目标: 分析一段时间内的问题模式,识别重复出现的问题
  • 触发:“重复出现的问题”“问题历史记录”“过去 30 天的问题趋势”
  • 完成: 提供趋势数据,展示问题频率、重复出现的根因和解决时间

概述

Dynatrace 会自动检测环境中的异常、性能下降和故障,创建问题,将相关的警报、警告和信息级事件汇总在一起,并提供根因和影响方面的洞察。

什么是问题?

问题是自动检测到的软件和基础设施运行状况及韧性问题,能够:

  • 自动关联服务、基础设施、前端应用和用户会话中的相关警报、警告和信息级事件
  • 识别根因,通过 Smartscape 依赖关系进行因果分析
  • 评估业务影响,跟踪受影响的用户和服务
  • 减少警报噪声,将具有相同根因和影响的相关症状归并为单个问题
  • 跟踪问题生命周期,从早期检测到解决
事件类型

event.kind 字段(稳定,权限)用于标识事件的高级类型:

event.kind 值描述
DAVIS_EVENTDavis 检测到的基础设施/应用事件
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:已解决的问题,可用于历史分析

核心字段

常见字段名称错误
❌ 错误✅ 正确描述
titleevent.name问题标题/描述
statusevent.status问题生命周期状态
severityevent.category问题类型/类别
startevent.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。对找到的每个类别:

  1. 类别名称和问题数量
  2. 触发条件——简要说明(例如,RESOURCE = CPU、内存或磁盘阈值超限;AVAILABILITY = 服务或实体无法访问)
  3. 来自租户数据的具体示例(受影响的实体名称、问题 ID)

不要在前两个类别后就停止——用户希望了解完整情况。请参阅上方的“问题类别”表,了解触发条件说明。

分析结果

呈现查询结果时:

  • 包含实体名称(而非仅提供 ID),但请选择高效的方法:
    • **实体较少(< 5 个):**可以调用 get-entity-name
    • **实体较多:**使用直接返回名称的 query-problems 工具,或在 DQL 查询中加入 root_cause_entity_name / entityName(),以内联方式解析名称。避免对 10 个以上的实体循环调用 get-entity-name——这可能耗尽工具调用限额,导致无法返回任何答案。
  • 根据已识别的原因提供可执行的建议
  • 按频率或影响程度组织内容,以便于确定优先级

最佳实践

基本规则
  1. 始终过滤重复项:使用 not(dt.davis.is_duplicate),避免对同一问题重复计数
  2. 使用正确的状态值:使用 "ACTIVE" 或 "CLOSED",绝不能使用 "OPEN"
  3. 指定时间范围:始终包含时间边界,以优化性能
  4. 包含 display_id:这是识别和关联问题的关键字段
  5. 逐步测试:构建查询时,每次只添加一个筛选条件或字段
  6. 尽早筛选:获取数据后立即应用 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:
  • 评估业务影响(受影响的用户、服务)
  • 计算根因实体的影响范围
  • 根据技术影响和用户影响确定问题优先级

参考资料

相关技能

  • dt-dql-essentials - 问题查询的核心 DQL 语法和查询结构
  • dt-obs-logs - 将问题与应用程序和基础设施日志关联起来
  • dt-obs-tracing - 通过分布式追踪分析调查问题

评论

支持 Markdown