动态跟踪观察性助手
AI驱动的可观察性助手,结合了 GitHub Copilot LLMs, 动态跟踪MCP (模型上下文协议), dtctl命令行界面,以及 Dynatrace域技能 将其整合为一个单一的web应用程序,用于Dynatrace环境的智能、证据驱动的调查和管理。
它的作用
助理充当 Dynatrace的代理AI副驾驶。它可以:
- 查询实时可观察性数据 --通过Dynatrace MCP服务器实时获取日志、指标、跟踪、问题和实体拓扑。
- 执行DQL查询 --使用来自领域技能的内置语法指导生成和运行Dynatrace查询语言查询。
- 管理Dynatrace配置 --通过dtctl创建、修改和检查工作流、仪表板、笔记本、SLO和设置。
- 分析上传的上下文 --摄取配置文件、日志或数据导出,并与实时遥测一起对其进行推理。
- 分类事件 --遵循结构化工作流程(问题→ 影响→ 痕迹→ 根本原因→ 补救),并在每个步骤调用工具。
- 提供领域专业知识 --加载涵盖13个Dynatrace域(DQL、服务、前端、跟踪、主机、Kubernetes、AWS、日志、问题、仪表板、笔记本电脑和实体迁移)的按需技能包,每个都有详细的参考文件。
LLM在一个 代理工具调用循环 (每条消息最多10轮),自主决定调用哪些工具——用于实时数据的MCP、用于配置的dtctl和用于领域知识的技能——然后将结果合成为实时流式传输的连贯响应。
______________________________________________________________________
建筑
┌─────────────────────────────────────────────────────────────────────┐
│ Frontend (React + Vite + Tailwind) │
│ ┌────────────┐ ┌────────────────┐ ┌───────────────────────────┐ │
│ │ Left Panel │ │ Chat Panel │ │ Right Panel │ │
│ │ • Prompts │ │ • Messages │ │ • dtctl status & login │ │
│ │ • Context │ │ • SSE stream │ │ • Telemetry config │ │
│ │ files │ │ • Tool calls │ │ • MCP connection │ │
│ │ • Model │ │ • Markdown │ │ • Model selection │ │
│ │ selector │ │ • MCP log │ │ │ │
│ └────────────┘ └────────────────┘ └───────────────────────────┘ │
│ Zustand (auth + chat stores) │
└──────────────────────────┬──────────────────────────────────────────┘
│ HTTP + SSE
┌──────────────────────────┴──────────────────────────────────────────┐
│ Backend (Fastify + TypeScript) │
│ │
│ Routes Services │
│ ├─ /api/auth/* GitHub OAuth ├─ Session store (in-memory) │
│ ├─ /api/chat/stream SSE chat ├─ MCP client (JSON-RPC 2.0) │
│ ├─ /api/context/* file upload ├─ MCP context builder (96k budget) │
│ ├─ /api/dynatrace/* MCP proxy ├─ dtctl service (binary mgmt) │
│ ├─ /api/dtctl/* CLI mgmt ├─ Skills service (13 skills) │
│ ├─ /api/models model list └─ System instructions engine │
│ └─ /api/telemetry OTel config │
│ │
│ ┌────────────────── Agentic Tool Loop (max 10 rounds) ──────────┐ │
│ │ LLM ←→ load_dynatrace_skill ←→ dtctl_run ←→ MCP tools │ │
│ │ ←→ load_dynatrace_skill_reference ←→ dtctl_context_info │ │
│ └───────────────────────────────────────────────────────────────┘ │
│ │
│ OpenTelemetry (GenAI semconv → OTLP → Dynatrace) │
└─────────────────────────────────────────────────────────────────────┘
│ │ │
▼ ▼ ▼
GitHub Copilot API Dynatrace MCP Server dtctl binary
(LLM inference) (live observability) (config mgmt)双平面设计
| 平面 | 通道 | 用途 | 示例 |
|---|---|---|---|
| 运行时 | Dynatrace MCP | 实时可观察性查询和分析 | 获取日志、列表问题、查询指标、跟踪跨度 |
| 管理 | dtctl CLI | 配置更改和资源清册 | 创建仪表板、编辑工作流、应用设置、列出笔记本 |
LLM的系统指令对 路线决策图 因此,它会自动为每个任务选择正确的平面。
______________________________________________________________________
特性
核心聊天
- 流媒体响应 -来自GitHub Copilot API的实时SSE,带有delta、tool-call和MCP-流量事件
- 模型选择 -GPT-4o、GPT-4o-Mini、Claude Sonnet 4、o3-Mini(Copilot API动态列表)
- 代理工具调用 --多轮循环(最多10次迭代),LLM自主调用工具并对结果进行推理
- Markdown渲染 --完全支持GFM,语法突出显示代码块
Dynatrace MCP集成
- 连接到任何Dynatrace MCP服务器 --UI中的URL+承载令牌配置
- 自动工具发现 --MCP工具被列出并注册为LLM函数调用
- 实时MCP活动日志 --可扩展的每条消息日志,显示发送/接收的工具流量
dtctl CLI集成
- 自动安装 --一键下载dtctl v0.18.0二进制文件(检测到平台/arch)
- OAuth登录 --基于浏览器的SSO流,用于在Dynatrace环境中进行身份验证
- 安全命令执行 --写入操作需要明确确认;防止注射(无分号、管道、回扣)
- 情境感知 --飞行前检查(
dtctl_context_info)在任何状态更改命令之前
Dynatrace域名技能
- 13领域技能 LLM通过工具调用按需加载:
| 技能 | 领域 |
|---|---|
dt-dql-essentials | DQL语法、函数、陷阱、优化 |
dt-obs-services | 服务RED指标,特定于运行时的遥测(.NET、Java、Node.js、Python、PHP、Go) |
dt-obs-frontends | RUM、Web Vitals、用户会话、移动端、前端错误 |
dt-obs-tracing | 分布式跟踪、跨度、故障检测、性能 |
dt-obs-hosts | 主机/进程指标——CPU、内存、磁盘、容器 |
dt-obs-kubernetes | 集群、Pod、节点、工作负载、存储、网络 |
dt-obs-aws | EC2、RDS、Lambda、ECS/EKS、VPC、成本优化 |
dt-obs-logs | 日志查询、过滤、模式分析、相关性 |
dt-obs-problems | 问题、RCA、影响分析、问题相关性 |
dt-app-dashboards | 仪表板创建、图块、布局、变量 |
dt-app-notebooks | 笔记本创建、分区、分析工作流程 |
dt-migration | 经典实体→ Smartscape迁移模式 |
- 110+参考文件 对于深入的子主题(例如,单个DQL功能类别、特定于运行时的度量、实体迁移模式),可通过以下方式加载
load_dynatrace_skill_reference
上下文管理
- 文件上传 --JSON、YAML、TXT、CSV、MD、LOG、XML、Python、JS/TS、Dockerfile、.env(最多20个文件,总共12 MB,每个文件5 MB)
- 智能上下文预算 --96k令牌系统上下文,每个文件截断(60k令牌),预算警告为80%
- 自定义系统提示 --覆盖或增强默认系统指令
身份验证和安全
- GitHub OAuth设备流 --不需要重定向URI;非常适合当地发展和示范
- 8小时课程 --带有httpOnly签名Cookie的内存会话存储
- 后端代理 -Dynatrace API令牌保持服务器端(从不向浏览器公开)
- 速率限制 --每个客户端每分钟100个请求
- 安全标头 --头盔(CSP、HSTS等)+每个环境的CORS
- 文件验证 --扩展白名单、大小限制、二进制拒绝
可观测性(开放遥测)
- GenAI语义约定 --每个LLM调用和工具执行都会发出带有输入/输出令牌、模型、完成原因、工具参数和结果的OTel跨度
- OTLP导出到Dynatrace --跟踪和指标发送到任何与OTLP兼容的后端
- 运行时重新配置 --在不重新启动服务器的情况下,从UI更改OTLP终结点和令牌
- 连接测试 --在提交配置更改之前验证OTLP连接
预定义提示
按类别组织的一键提示:
| 类别 | 提示 |
|---|---|
| Dynatrace | 列出活动问题、主机运行状况概述、服务性能、最近的错误日志、SLO状态、最近的部署 |
| 上下文 | 分析上传的上下文,解释配置 |
| dtctl | 检查上下文、列出工作流、列出仪表板、健康检查(医生)、DQL查询、列出笔记本 |
______________________________________________________________________
先决条件
- Node.js 20+
- GitHub OAuth应用程序 — 在此处创建一个
- GitHub Copilot许可证 对GitHub帐户进行身份验证
- Dynatrace环境 (可选)--用于MCP和dtctl集成
______________________________________________________________________
快速开始
1.克隆和配置
git clone
cd DEMO_MCP_DT
cp .env.example .env编辑 .env 使用您的凭据:
# Required — GitHub OAuth App
GITHUB_CLIENT_ID=your_client_id
GITHUB_CLIENT_SECRET=your_client_secret
# Optional — OpenTelemetry export to Dynatrace
OTEL_EXPORTER_OTLP_ENDPOINT=https://.live.dynatrace.com/api/v2/otlp
OTEL_EXPORTER_OTLP_HEADERS=Authorization=Api-Token 2.安装依赖项
npm run install:all3.开始开发
npm run dev| 服务 | URL |
|---|---|
| 前端(Vite) | http://localhost:5173 |
| 后端(禁食) | http://localhost:3001 |
4.身份验证
- 在浏览器中打开前端。
- 点击 使用GitHub登录 --显示设备代码。
- 打开GitHub验证URL,输入代码并授权。
- 应用程序轮询令牌并开始会话。
5.连接到Dynatrace(可选)
通过MCP服务器:
- 在右侧面板中,输入您的Dynatrace MCP服务器URL和承载令牌。
- 点击 连接 --可用工具会自动列出。
通过dtctl:
- 在右侧面板中,单击 安装dtctl (自动下载二进制文件)。
- 点击 登录 并输入您的Dynatrace环境URL。
- 完成基于浏览器的SSO流程。
______________________________________________________________________
GitHub OAuth设置
- 首选
- 创建新的OAuth应用程序:
- 应用程序名称:动态跟踪观察性助手 - 主页网址: http://localhost:5173 - 授权回调URL: http://localhost:5173
- 复制 客户端ID 和 客户端密钥 进入你的
.env文件。
______________________________________________________________________
环境变量
| 变量 | 默认值 | 描述 |
|---|---|---|
GITHUB_CLIENT_ID | — | 必修的。 GitHub OAuth应用程序客户端ID |
GITHUB_CLIENT_SECRET | — | 必修的。 GitHub OAuth应用程序客户端密码 |
PORT | 3001 | 服务器侦听端口 |
NODE_ENV | development | development 或 production |
LOG_LEVEL | info | Pino日志级别(debug, info, warn, error) |
COOKIE_SECRET | *自动生成* | Cookie签名密钥(未设置时随机) |
ALLOWED_ORIGIN | -- | CORS生产来源(例如。, https://myapp.example.com) |
OTEL_SERVICE_NAME | dynatrace-observability-assistant | OpenTetry服务名称 |
OTEL_SERVICE_VERSION | 1.0.0 | OpenTetry服务版本 |
OTEL_EXPORTER_OTLP_ENDPOINT | -- | OTLP端点(例如。, https://.live.dynatrace.com/api/v2/otlp) |
OTEL_EXPORTER_OTLP_HEADERS | -- | OTLP认证头(例如。, Authorization=Api-Token dt0c01...) |
______________________________________________________________________
Docker部署
该项目包括一个多阶段的Dockerfile,用于优化生产构建。
构建并运行
docker compose up --build该应用程序可在 http://localhost:3000.
Docker构建的功能是什么
| 阶段 | 目的 |
|---|---|
| 建造者 | 安装所有依赖项,构建Vite客户端,编译TypeScript服务器 |
| 生产 | 仅将生产依赖项+内置工件复制到精简版中 node:20-alpine 图像(约150 MB) |
docker-compose.yml
services:
mcp-chat:
build: .
ports:
- "3000:3000"
environment:
- NODE_ENV=production
- PORT=3000
- GITHUB_CLIENT_ID=${GITHUB_CLIENT_ID}
- GITHUB_CLIENT_SECRET=${GITHUB_CLIENT_SECRET}
- COOKIE_SECRET=${COOKIE_SECRET}
restart: unless-stopped生产注意事项
- 会话存储 --对于多实例部署,用Redis替换内存中的会话存储。
- 跨域资源共享 --设置
ALLOWED_ORIGIN到您的生产领域。 - 秘密 --使用秘密管理器;不要承诺
.env文件夹。 - 遥测 --设置
OTEL_EXPORTER_OTLP_ENDPOINT和OTEL_EXPORTER_OTLP_HEADERS用于跟踪/度量导出。
______________________________________________________________________
项目结构
├── client/ # React frontend (Vite + Tailwind)
│ └── src/
│ ├── components/
│ │ ├── ChatLayout.tsx # 3-panel layout shell
│ │ ├── ChatPanel.tsx # Chat messages, SSE consumer, markdown
│ │ ├── LeftPanel.tsx # Prompts, file uploads, model selector
│ │ ├── RightPanel.tsx # dtctl, telemetry, MCP config
│ │ └── LoginScreen.tsx # GitHub device flow UI
│ ├── stores/
│ │ ├── auth.ts # Authentication state (Zustand)
│ │ └── chat.ts # Chat, context, MCP, dtctl state (Zustand)
│ └── main.tsx
├── server/ # Fastify backend (TypeScript)
│ └── src/
│ ├── config/
│ │ └── env.ts # Environment variable parsing
│ ├── instructions/
│ │ ├── system-instructions.md # LLM system prompt (routing, safety, workflows)
│ │ └── skills/ # 13 domain skills + 110 reference files
│ │ ├── dt-dql-essentials.md
│ │ ├── dt-dql-essentials/ # 31 DQL reference files
│ │ ├── dt-obs-services.md
│ │ ├── dt-obs-services/ # 7 runtime-specific refs
│ │ ├── ... # (one .md + directory per skill)
│ │ └── dt-migration/ # 14 migration reference files
│ ├── routes/
│ │ ├── auth.ts # GitHub OAuth device flow
│ │ ├── chat.ts # SSE streaming + agentic tool loop
│ │ ├── context.ts # File upload/download/budget
│ │ ├── dtctl.ts # dtctl install/login/exec
│ │ ├── dynatrace.ts # MCP server connect/tools
│ │ ├── models.ts # LLM model listing
│ │ └── telemetry.ts # OTel config management
│ ├── services/
│ │ ├── dtctl.ts # dtctl binary management + command execution
│ │ ├── dtctl-skill.ts # System instructions loader
│ │ ├── mcp-client.ts # MCP JSON-RPC 2.0 client
│ │ ├── mcp-context.ts # Context aggregation + budget management
│ │ ├── session.ts # In-memory session store (8h TTL)
│ │ └── skills.ts # Skill catalog, loader, reference loader
│ ├── telemetry.ts # OpenTelemetry SDK setup + runtime reconfig
│ ├── semconv.ts # GenAI semantic convention constants
│ └── index.ts # Entry point
├── shared/ # Shared TypeScript types
│ └── src/index.ts # ChatMessage, ContextPayload, MCPConfig, etc.
├── Dockerfile # Multi-stage production build
├── docker-compose.yml
└── package.json # Root workspace scripts______________________________________________________________________
运作原理
代理聊天流
User sends message
│
▼
Build system context
(instructions + skills catalog + files + DT data)
│
▼
Truncate to 96k-token budget
│
▼
┌─── Tool loop (up to 10 rounds) ──────────────────┐
│ │
│ Send messages + tools → GitHub Copilot API │
│ │ │
│ ▼ │
│ Stream response (SSE deltas to browser) │
│ │ │
│ finish_reason = tool_calls? │
│ │ YES │ NO │
│ ▼ ▼ │
│ Dispatch each tool call Done — send 'done' SSE │
│ ┌─ load_dynatrace_skill │
│ ├─ load_dynatrace_skill_reference │
│ ├─ dtctl_run / dtctl_context_info │
│ └─ MCP tool (via JSON-RPC) │
│ │ │
│ Add tool results to messages │
│ Continue loop ───────────────────────────────────┘
│ │
└────────────────────────────────────────────────────┘上下文预算
系统上下文(作为第一条消息发送到LLM)由以下内容组装而成:
- 系统指令 (约6k个令牌)--路由规则、安全协议、DQL指南、工作流程、技能目录
- 用户系统提示 (可选)--来自上下文面板的自定义说明
- 已上传的文件 --每个文件截断为6万个代币,总预算为9.6万个代币
- 动态跟踪数据 -来自MCP或上下文API的JSON有效负载
当使用量超过预算的80%时,通过SSE发出警告。
工具调度命令
当LLM发出工具调用时,它们会按照以下优先级进行调度:
load_dynatrace_skill--加载域技能(返回降价内容)load_dynatrace_skill_reference--加载技能的参考文件dtctl_run/dtctl_context_info--执行dtctl命令或获取上下文信息- MCP工具 (回退)--通过JSON-RPC转发到连接的Dynatrace MCP服务器
______________________________________________________________________
API终点
身份验证(/api/auth)
| 方法 | 端点 | 描述 |
|---|---|---|
| 职位 | /device-code | 启动GitHub设备流(返回 user_code + verification_uri) |
| 职位 | /poll-token | 用户授权后轮询访问令牌 |
| 得到 | /status | 检查当前会话和用户信息 |
| 职位 | /logout | 销毁会话 |
聊天(/api/chat)
| 方法 | 端点 | 描述 |
|---|---|---|
| 职位 | /stream | 与SSE流媒体进行代理聊天(主要端点) |
背景(/api/context)
| 方法 | 端点 | 描述 |
|---|---|---|
| 职位 | /upload | 上传上下文文件(多部分,最大5 MB) |
| 得到 | /files | 列出上传的文件 |
| 删除 | /files/:name | 删除特定文件 |
| 删除 | /files | 清除所有文件 |
| 得到 | /payload | 获取完整的上下文负载 |
| 得到 | /budget | 获取上下文使用情况(字节、百分比、文件计数) |
动态跟踪MCP(/api/dynatrace)
| 方法 | 端点 | 描述 |
|---|---|---|
| 职位 | /connect | 连接到Dynatrace MCP服务器 |
| 职位 | /tools | 列出可用的MCP工具 |
| 职位 | /disconnect | 断开与MCP服务器的连接 |
dtctl(/api/dtctl)
| 方法 | 端点 | 描述 |
|---|---|---|
| 得到 | /status | 检查dtctl安装、版本、身份验证状态 |
| 职位 | /install | 自动下载并安装dtctl二进制文件 |
| 职位 | /exec | 执行dtctl命令 |
| 职位 | /login | OAuth登录到Dynatrace环境 |
| 职位 | /logout | 注销并删除上下文 |
型号(/api/models)
| 方法 | 端点 | 描述 |
|---|---|---|
| 得到 | / | 列出可用的GitHub Copilot模型 |
遥测(/api/telemetry)
| 方法 | 端点 | 描述 |
|---|---|---|
| 得到 | /config | 获取当前OTel配置 |
| 职位 | /config | 在运行时更新OTel配置 |
| 职位 | /test | 测试OTLP端点连接 |
健康
| 方法 | 端点 | 描述 |
|---|---|---|
| 得到 | /api/health | 退货 { status: 'ok', timestamp } |
______________________________________________________________________
关键设计决策
| 决定 | 理由 |
|---|---|
| 快车 比Express快2-3倍,内置模式验证,TypeScript优先 | |
| 上海证券交易所 通过WebSocket | 单向流媒体更简单,原生浏览器支持 |
| 设备流程 auth | 无需重定向URI即可工作——非常适合本地开发和演示 |
| 状态 state | 最小样板,没有上下文提供者,小捆绑包 |
| 后端代理 对于DT | neneneba API令牌,保持服务器端,防止浏览器暴露 |
| 内存会话 | 足以进行单实例演示;切换到Redis进行生产 |
| 按需技能 | 仅在LLM需要时加载——保持系统上下文精简 |
| 双平面布线 | 将实时观察(MCP)与配置更改(dtctl)分开 |
| 森科尼酒店 | LLM交互的完全可观察性——令牌使用、工具结果、延迟 |
______________________________________________________________________
安全
- GitHub代币 存储在httpOnly签名Cookie中(从不存储在localStorage中)
- Dynatrace API令牌 代理服务器端(从不发送到浏览器)
- SSRF保护 在Dynatrace代理上(仅相对路径)
- 命令注入预防 --dtctl命令根据允许的动词白名单进行解析和验证;分号、管道和倒钩被堵塞
- 写操作安全 --dtctl写动词需要显式
confirmWrite旗;上下文已验证(dtctl_context_info)执行前 - 文件上传验证 --扩展白名单,每个文件限制5 MB,二进制内容拒绝
- 速率限制 --每个客户端每分钟100个请求
- 安全标头 --头盔(CSP、X-Content-Type-Options、HSTS等)
- 跨域资源共享 --仅限于
localhost:5173正在开发中,可通过以下方式配置ALLOWED_ORIGIN生产中
______________________________________________________________________
运行测试
cd server && npm test