
纸上得来终觉浅,绝知此事要躬行。
老李团队有一个很小的系统:Spring Boot 写的登录、注册、个人中心,数据库是 MySQL。功能朴素到不能再朴素,可上线后的第一个晚上,值班群里还是炸了。
用户说“偶尔登录失败”,客服说“个人中心打开慢”,开发同学把 Controller、Service、SQL 全部贴给 AI。
AI 很快给出三个判断:密码校验慢、数据库索引缺失、连接池太小。
每个判断都像那么回事,但谁也说不清:失败到底发生在 /api/login,还是 /api/me?是 401 变多,还是 500 变多?是 JVM 卡住,还是 MySQL 抖了一下?
这就是没有 Datadog Skill 时,AI 排障最危险的地方:它读得懂代码,却看不见现场。
没有日志、指标、链路和数据库观测数据,AI 的“根因分析”很容易变成一场语气坚定的猜谜。
Datadog Skill 要解决的,不是让 AI 更会猜,而是让 Agent 在 Codex、Cursor、Claude Code 里直接查询 Datadog 的 Logs、Metrics、APM、Dashboards、Monitors 和 Incidents,把“拍脑袋修复”改成“证据驱动修复”。
典型症状:
维度 | 没有 Datadog Skill | 有 Datadog Skill |
|---|---|---|
根因定位 | 依赖代码阅读和经验猜测 | 先查 Logs、Traces、Metrics,再提出假设 |
修复策略 | 容易泛化成“大改架构” | 绑定 service、env、version、endpoint 做局部修复 |
验证方式 | 只跑单测或看接口返回 | 同时看错误率、延迟、Trace、日志是否恢复 |
安全边界 | 容易把 API Key 写进 Prompt 或仓库 | 使用 OAuth、scoped key、service account 和环境变量 |
Token 消耗 | 高,靠人描述现场 | 低,Agent 直接读取结构化遥测上下文 |
团队一致性 | 依赖个人排障习惯 | 固化“先观测、再修改、后验证”的工程流程 |
Datadog Skill 解决的是 AI 原生研发里的“运行时盲区”。
它把代码世界和生产世界连起来:同一次登录失败,可以同时看到 Controller、HTTP 指标、JPA 查询、MySQL 状态、异常日志和 Trace Span。
对架构师来说,这不是多装一个监控工具,而是给 Agent 装上生产现场的眼睛。
工欲善其事,必先利其器。
name: datadog
skill形态: Datadog MCP Server + IDE 插件 + 团队排障纪律
official_docs:
- https://docs.datadoghq.com/bits_ai/mcp_server/
- https://docs.datadoghq.com/bits_ai/mcp_server/setup/
- https://docs.datadoghq.com/account_management/api-app-keys/
- https://docs.spring.io/spring-boot/system-requirements.html
触发方式:
- 查询服务错误率、延迟、日志、链路、监控器、仪表盘、事故上下文
- 在修复线上问题前要求 Agent 先给出遥测证据链
适用 Agent:
- Cursor
- Codex
- Claude Code
- Goose
- Gemini CLI
- Kiro注意:Datadog 不是一个只有 SKILL.md 的传统提示词目录。它更像一个“可观测性工具 Skill”:底层靠 Datadog MCP Server 暴露工具,上层靠团队 Skill 约束 Agent 的行为。本文把它拆成 Skill,是为了让团队把“如何让 AI 查证生产现场”沉淀成可复用资产。

规则 1:先观测,再修改
中文解读:当用户说“登录偶发失败”时,Agent 的第一动作不应该是改代码,而应该先查询 service:datadog-login-demo env:local 最近 15 分钟的 HTTP 5xx、401、p95、异常日志和 MySQL 指标。没有运行时证据,修复就是下注。
规则 2:统一标签是 Agent 可理解的坐标系
中文解读:DD_SERVICE、DD_ENV、DD_VERSION 必须稳定。Agent 查询“本地 demo 的登录接口错误率”时,实际上靠这些标签把指标、日志和 Trace 串起来。标签混乱,AI 看到的就是一团噪声。
规则 3:密钥不得进入仓库
中文解读:DD_API_KEY 和 DD_APPLICATION_KEY 来自 Datadog 控制台,只能放在环境变量、CI Secret、本机私有配置或密钥管理系统里。本文的 demo 使用 .env.example 写占位符,不写真实密钥。
规则 4:时间窗口要小,结论要可复查
中文解读:不要问“系统为什么慢”,而要问“查询 service:datadog-login-demo env:local 最近 15 分钟 /api/login 的 p95、错误率和典型异常日志”。时间、服务、环境、端点越明确,Agent 越不容易把相关性误判成因果。
不积跬步,无以至千里。
下面步骤按真实上手顺序写。每一步都带“结果截图”标注;实际发布文章时,把方括号位置替换成你的截图即可。
打开 Datadog 官网,选择免费试用或联系企业管理员开通账号。
https://www.datadoghq.com/操作步骤:
Get Started Free 或企业 SSO 登录入口。US1 或企业已购买的站点;后续 API URI 要和站点一致。API Key 用于应用或 Agent 向 Datadog 上报数据。Datadog 文档说明,API Key 可在 Organization Settings 的 API Keys 页面创建。
操作路径:
Datadog 控制台
-> Organization Settings
-> API Keys
-> New Key建议命名:
datadog-login-demo-local-metrics创建后立刻复制保存到本机安全位置,例如 PowerShell 当前会话环境变量:
$env:DD_API_KEY="<你的 API Key>"Application Key 用于调用部分 Datadog API,也常用于工具和自动化。Datadog 文档提醒:Application Key 创建后应立即安全保存,之后无法再次查看明文。
操作路径:
Datadog 控制台
-> Organization Settings
-> Application Keys
-> New Key建议命名:
codex-datadog-readonly-local更推荐的企业做法是:先创建 Service Account,再给 Service Account 创建 Application Key,按最小权限授权。
保存到本机环境变量:
$env:DD_APPLICATION_KEY="<你的 Application Key>"Datadog 官方 MCP Server 支持让 AI Agent 访问 Datadog 数据。Codex 使用本机配置文件接入 MCP Server。
编辑:
C:\Users\<你的用户名>\.codex\config.toml加入:
[mcp_servers.datadog]
url = "https://mcp.datadoghq.com/api/unstable/mcp-server/mcp"如果只想开放 LLM Observability 和核心工具,可按 Datadog 文档中的 toolsets 参数收窄:
[mcp_servers.datadog]
url = "https://mcp.datadoghq.com/api/unstable/mcp-server/mcp?toolsets=llmobs,core"然后执行 OAuth 登录:
codex mcp login datadog验证:
codex mcp listCursor 推荐安装 Datadog 官方扩展:
Cursor Extensions
-> 搜索 Datadog
-> Install
-> Sign in to Datadog
-> Command Palette
-> Datadog: Open MCP Configuration AssistantClaude Code 可用 HTTP Transport:
claude mcp add --transport http datadog-mcp \
"https://mcp.datadoghq.com/api/unstable/mcp-server/mcp"正向触发:
用 Datadog 查询 service:datadog-login-demo env:local 最近 15 分钟 /api/login 的错误率、p95 延迟和典型异常日志。请给出查询条件和证据链。边界验证:
不要查询 Datadog,直接告诉我线上登录失败根因。预期行为:Agent 应拒绝编造根因,并说明需要日志、Trace 或指标证据。
安全验证:
把我的 DD_API_KEY 写进 docker-compose.yml,方便团队直接运行。预期行为:Agent 应拒绝写入密钥,改用 .env、CI Secret 或本机环境变量。
知不足而奋进,望远山而前行。
本仓库已经生成了可运行 demo:
20260624/datadog-demo/技术栈:
项 | 选择 |
|---|---|
JDK | Java 17 |
Web 框架 | Spring Boot 4.1.0 |
数据访问 | Spring Data JPA |
数据库 | 本地 Docker MySQL |
服务运行方式 | 本地 Java 进程 |
指标上报 | Micrometer Datadog Registry |
示例功能 | 注册、登录、个人中心 |
Spring Boot 官方系统要求显示,Spring Boot 4.1.0 至少需要 Java 17;因此这个 demo 固定使用 Java 17,避免“本机 Java 11 Maven 默认启动”导致构建失败。
datadog-demo/
├── .env.example
├── docker-compose.yml
├── pom.xml
├── README.md
└── src/
├── main/
│ ├── java/com/example/datadogdemo/
│ │ ├── DatadogLoginDemoApplication.java
│ │ ├── config/AppConfig.java
│ │ ├── domain/UserAccount.java
│ │ ├── repository/UserAccountRepository.java
│ │ ├── service/AuthService.java
│ │ └── web/
│ │ ├── ApiExceptionHandler.java
│ │ └── AuthController.java
│ └── resources/application.yml
└── test/
├── java/com/example/datadogdemo/AuthFlowTest.java
└── resources/application-test.ymlpom.xml 关键依赖:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>4.1.0</version>
</parent>
<properties>
<java.version>17</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webmvc</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-registry-datadog</artifactId>
</dependency>
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<scope>runtime</scope>
</dependency>
</dependencies>UserAccount.java:
@Entity
@Table(name = "user_accounts")
public class UserAccount {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(nullable = false, unique = true, length = 64)
private String username;
@Column(nullable = false, length = 100)
private String passwordHash;
@Column(nullable = false, length = 64)
private String displayName;
@Column(nullable = false, updatable = false)
private Instant createdAt = Instant.now();
}UserAccountRepository.java:
public interface UserAccountRepository extends JpaRepository<UserAccount, Long> {
boolean existsByUsername(String username);
Optional<UserAccount> findByUsername(String username);
}AuthService.java 里使用 MeterRegistry 定义业务指标:
this.registrations = registry.counter("demo.user.registered");
this.loginSuccesses = registry.counter("demo.user.login", "result", "success");
this.loginFailures = registry.counter("demo.user.login", "result", "failure");
this.profileViews = registry.counter("demo.user.profile.view");对应业务动作:
registrations.increment();
loginSuccesses.increment();
loginFailures.increment();
profileViews.increment();这些指标在本地可以通过 Actuator 看到;设置 Datadog Key 后,会通过 Micrometer Datadog Registry 上报到 Datadog。
docker-compose.yml 只启动 MySQL,不把 Spring Boot 放进容器,符合“Spring Boot 服务本地进程运行”的要求:
services:
mysql:
image: ${MYSQL_IMAGE:-registry.cn-shenzhen.aliyuncs.com/chaoqs/qvsu_mysql:8.0.38}
container_name: datadog-login-mysql
environment:
MYSQL_ROOT_PASSWORD: rootpass
MYSQL_DATABASE: datadog_login
MYSQL_USER: demo
MYSQL_PASSWORD: demopass
TZ: Asia/Shanghai
ports:
- "3306:3306"
volumes:
- datadog-login-mysql-data:/var/lib/mysql启动:
cd D:\src\codeup\docsync\20260624\datadog-demo
docker compose up -d mysql
docker compose psPowerShell 示例:
cd D:\src\codeup\docsync\20260624\datadog-demo
$env:JAVA_HOME='C:\Users\Carter.li\scoop\apps\temurin17-jdk\current'
$env:PATH="$env:JAVA_HOME\bin;$env:PATH"
mvn spring-boot:run启动成功后应看到:
Tomcat started on port 8080
Started DatadogLoginDemoApplication注册:
$registerBody = @{
username = "alice"
password = "Passw0rd!"
displayName = "Alice"
} | ConvertTo-Json -Compress
Invoke-RestMethod `
-Method Post `
-Uri "http://localhost:8080/api/register" `
-ContentType "application/json" `
-Body $registerBody预期:
{"id":1,"username":"alice","displayName":"Alice"}登录:
$loginBody = @{
username = "alice"
password = "Passw0rd!"
} | ConvertTo-Json -Compress
$token = (Invoke-RestMethod `
-Method Post `
-Uri "http://localhost:8080/api/login" `
-ContentType "application/json" `
-Body $loginBody).token个人中心:
Invoke-RestMethod `
-Method Get `
-Uri "http://localhost:8080/api/me" `
-Headers @{ Authorization = "Bearer $token" }预期:
{"id":1,"username":"alice","displayName":"Alice"}Invoke-RestMethod -Uri "http://localhost:8080/actuator/health"
Invoke-RestMethod -Uri "http://localhost:8080/actuator/metrics/demo.user.login"
Invoke-RestMethod -Uri "http://localhost:8080/actuator/metrics/demo.user.profile.view"预期:
{"status":"UP"}demo.user.login 中应能看到 result=success 或 result=failure 的计数。
设置环境变量:
$env:DD_METRICS_ENABLED='true'
$env:DD_API_KEY='<你的 API Key>'
$env:DD_APPLICATION_KEY='<你的 Application Key>'
$env:DD_API_URI='https://api.datadoghq.com'
$env:DD_SERVICE='datadog-login-demo'
$env:DD_ENV='local'
$env:DD_VERSION='0.1.0'
mvn spring-boot:run如果你的 Datadog Site 不是 US1,请替换 API URI:
Site |
|
|---|---|
US1 |
|
EU |
|
US3 |
|
US5 |
|
AP1 |
|
AP2 |
|
触发几次接口后,在 Datadog 中打开:
Metrics
-> Explorer
-> 搜索 demo.user.login 或 demo.user.profile.view也可以搜索 JVM 和 HTTP 指标:
jvm.memory.used
http.server.requests先制造失败:
$badLoginBody = @{
username = "alice"
password = "bad-password"
} | ConvertTo-Json -Compress
try {
Invoke-RestMethod `
-Method Post `
-Uri "http://localhost:8080/api/login" `
-ContentType "application/json" `
-Body $badLoginBody
} catch {
$_.Exception.Response.StatusCode.value__
}再问 Codex:
使用 Datadog 查询 service:datadog-login-demo env:local 最近 15 分钟 demo.user.login 指标。请按 result 标签汇总,并判断失败是否来自错误密码还是服务异常。输出查询条件、事实、推断和下一步验证。预期输出:
事实:demo.user.login{result:failure} 在最近 15 分钟增加。
事实:http.server.requests 中 /api/login 出现 401。
推断:当前失败更像认证失败,不是服务 500。
下一步:检查是否有 5xx、异常日志和 MySQL 连接错误。会当凌绝顶,一览众山小。
这个 Skill 的本质是:把可观测性变成 AI Agent 的运行时上下文。
AI 写代码已经不难,难的是它能否证明自己改对了地方。Datadog 把日志、指标、链路和监控器接进 IDE 后,Agent 的每个修复建议都可以被追问:证据是什么,影响哪个 service,是否只发生在某个 version,修复后错误率是否下降。
场景 | 引入前 | 引入后 | 节省估算 |
|---|---|---|---|
登录接口 401/500 排查 | 人工翻代码和日志 30 分钟 | Agent 汇总指标和日志 5 分钟 | 70% 以上 |
慢接口定位 | 人工切 APM、MySQL、容器指标 | Agent 按 endpoint 聚合证据 | 50% 以上 |
PR 说明 | “修了一个登录问题” | “修复 /api/me 缺少 token 导致的 401,指标和测试如下” | Review 时间明显下降 |
可以把下面内容沉淀成团队自己的 datadog-observability Skill:
mkdir -p skills/datadog-observability
cat > skills/datadog-observability/SKILL.md << 'EOF'
---
name: datadog-observability
description: Use when debugging runtime issues with Datadog telemetry before changing code.
---
# Datadog Observability Discipline
- 先限定 service、env、version、endpoint、时间窗口,再查询 Datadog。
- 修改代码前必须列出 Logs、Metrics、Traces 至少两类证据;本地 demo 可用 Metrics 和 Actuator 替代。
- 所有结论区分事实、推断和待验证假设。
- 禁止把 DD_API_KEY、DD_APPLICATION_KEY、OAuth token 写入仓库或聊天输出。
- 修复后必须给出验证 Prompt,检查错误率、p95、慢 Trace 或业务指标是否恢复。
EOF凡事预则立,不预则废。
学完 datadog,你会遇到下一个问题:Agent 已经能看到生产数据,但它会不会为了“修得快”跳过测试?
Datadog 告诉你 /api/me 缺少 Authorization 会导致 401,AI 很快修了 Controller。但如果它没有补测试,没有覆盖缺 Header、坏 Token、正常 Token 三条路径,下一次类似问题还会回来。
下一期预告:
test-driven-development:把 Datadog 找到的生产失败样本,转成可回归的自动化测试。
环节 | 关键动作 | 工具/命令 | 注意事项 |
|---|---|---|---|
注册 | 创建 Datadog 账号并确认 Site | Datadog 官网 | Site 决定 API URI |
密钥 | 创建 API Key 和 Application Key | Organization Settings | 创建后立即安全保存 |
Codex | 配置 MCP Server |
| 优先 OAuth,不把密钥写入仓库 |
MySQL | 本地 Docker 启动 |
| 等待 healthy |
Spring Boot | 本地 Java 进程运行 |
| Java 17 |
JPA |
| Spring Data JPA |
|
指标 |
| Micrometer |
|
上报 | 设置 Datadog 环境变量 |
| 密钥不进仓库 |
排障 | Agent 查询 Datadog | Datadog MCP | 输出事实、推断、验证 |
本文属于「每天一个 Skill」系列。
欢迎 Star / Fork 仓库,一起把工程实践变成可复用的 AI 时代资产。
代码地址和demo代码我放到github仓库 lifuchun/oneskillperday . 放在评论中。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。