关于 dt-obs-ext-monitors
此技能通过事件摄取 API 将第三方测试和监控结果发送到 Dynatrace Grail。它定义了测试运行事件及可选的步骤事件,由 OpenPipeline 处理并生成指标和 Smartscape 测试实体。
主要功能
- 01摄取外部测试运行事件
- 02可选摄取测试步骤事件
- 03生成可用性和持续时间指标
- 04将测试注册为 Smartscape 实体
- 05支持来自多个地点的结果
适用场景
- 01将外部监控结果发送到 Grail
- 02跟踪测试运行中的各个步骤
- 03比较不同地点的测试可用性
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ dynatrace/ dynatrace-for-ai --skill dt-obs-ext-monitors安装后在 Claude Code 中输入/dt-obs-ext-monitors确认已加载。
附带文件references/event-ingestion.md
详细介绍
外部监控数据采集
使用事件摄取 API,将第三方测试和监控结果发送到 Dynatrace Grail。
这是已弃用的 POST /api/v1/synthetic/ext/tests 端点的规范替代方案。
概述
发送到 /platform/ingest/custom/events/{endpoint} 的事件会进入 Grail,并由 OpenPipeline 处理,其中:
- 提取指标(
external.test.availability、external.test.duration),用于告警和 SLO - 将每个唯一的
test.id注册为一个EXT_TESTSmartscape 节点,使 Davis 问题能够关联到具名实体(“外部测试 X 已中断”),而非因缺少拓扑上下文而悬空 - 为步骤事件添加
result.status.category(SUCCESS/SKIPPED/FAIL),以便在仪表板中筛选
测试结果由两种事件类型组成:
| 类型 | 用途 |
|---|---|
external_test_run | 单次测试执行的整体通过 / 失败结果 |
external_test_step | 该次运行中的一个步骤(可选;启用步骤级指标) |
身份验证
接受以下两种令牌类型:
| 令牌类型 | 范围 |
|---|---|
| Classic Api-Token | openpipeline.events.custom |
| Platform Token / OAuth | openpipeline:events.custom:ingest |
一个常见但不起作用的错误猜测:events.ingest。
快速开始
前置条件: 发送事件前,必须先在 OpenPipeline 中创建摄取端点。 默认 Dynatrace 3rd-party monitors Monaco 包会自动配置
external.tests端点。 有关设置详情和自定义端点创建,请参阅references/event-ingestion.md。
发送一条最简测试结果(将 external.tests 替换为你配置的端点名称):
curl -X POST "https://{env-id}.live.dynatrace.com/platform/ingest/custom/events/external.tests" \
-H "Authorization: Api-Token {token}" \
-H "Content-Type: application/json" \
-d '[{
"event.kind": "EXTERNAL_TEST_EVENT",
"event.type": "external_test_run",
"test.id": "my-api-health-check",
"test.run.id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"test.name": "My API Health Check",
"test.type": "api",
"test.run.status": "passed",
"test.run.availability": 1,
"test.run.duration_ms": 245,
"test.run.location": "us-east-1",
"dt.security_context": "team-checkout",
"timestamp": "2024-01-15T10:30:00Z"
}]'
预期响应: HTTP 200(空响应正文)。
完整事件架构、步骤事件、包含错误字段和 CI 元数据的扩展示例、Java DTO 结构以及 DQL 查询:
references/event-ingestion.md
在 Grail 中验证
发送后,确认事件已出现:
fetch events, from:now()-1h
| filter event.type == "external_test_run"
| fields timestamp, test.id, test.name, test.run.status, test.run.duration_ms, test.run.location
| sort timestamp desc
| limit 20
主要限制
- 请求正文必须是 JSON 数组(
[{...}]),而不是对象封装({"events":[...]})。 - 单个请求的数组中可以混合运行事件和步骤事件。
timestamp必须采用 ISO 8601 UTC 格式(例如"2024-01-15T10:30:00Z")。test.run.availability必须是整数1或0,不能是字符串。- 某次运行中的所有步骤事件必须与父运行事件具有相同的
test.run.id和test.id。 - 步骤事件除
test.run.id外,还必须包含test.step.id(在该次运行中唯一)。 - 必须包含
event.kind: "EXTERNAL_TEST_EVENT",供 Grail 用于事件分类。 路由到正确的流水线由event.type决定,而不是event.kind。 - 不要发送
dt.smartscape.ext_test或result.status.category——这些字段由流水线在摄取后写入,如果包含在内则会被覆盖。 dt.security_context控制数据访问策略;建议在每个事件中设置该字段,以便在多团队租户中启用按团队访问控制和成本归属。
多地点测试
从多个地点发送相同的 test.id,每个地点使用不同的 test.run.location 值,即可构建多地点测试。OpenPipeline 会为每个 test.id 创建一个 EXT_TEST 节点,并为每个 (test.id, location) 对创建一个可用性指标时间序列。
这开箱即用地支持两级告警:
| 告警类型 | 触发条件 |
|---|---|
| 局部中断 | 单个地点的可用性下降(按地点划分的时间序列) |
| 全局中断 | 所有地点的平均值低于阈值(例如,大多数地点都失败) |
三地点测试的阈值计算:1 个地点失败 → 平均值 0.67(阈值为 0.5 时不告警);2 个地点失败 → 平均值 0.33(触发告警);3 个地点全部失败 → 平均值约为 0(立即触发告警)。
所有地点都应保持 test.id 稳定——更改该值会创建新的 Smartscape 节点,并中断指标历史记录。
相关技能
- dt-dql-essentials — 用于查询已摄取事件和构建分析查询的 DQL 语法
- dt-obs-frontends — 通过
dt.smartscape.frontend将测试运行关联到前端实体,以便在 Smartscape 中绘制 EXT_TEST → FRONTEND 依赖边