go mcp动态追踪
A Go实现 Dynatrace MCP服务器 -模型上下文协议(MCP)服务器,使LLM能够与Dynatrace交互,以完成可观察性、安全性和自动化任务。
特性
- 完全支持MCP协议:实现无缝LLM集成的模型上下文协议
- Dynatrace集成:查询问题、漏洞、实体、日志、指标等
- 戴维斯副驾驶:自然语言到DQL的转换、DQL解释和会话AI
- 戴维斯分析仪:执行预测、异常检测和相关性分析器
- 自动化:创建和管理工作流,通过电子邮件和Slack发送通知
- 预算跟踪:内置Grail查询预算管理
- 综合录井:具有可配置级别的基于文件的日志记录
- DQL查询日志记录:用于调试和审核的所有DQL查询的可选基于文件的日志记录
- MCP资源:DQL语言参考作为MCP资源提供
快速开始
先决条件
- 转到1.21或更高版本
- Dynatrace平台环境
- OAuth凭据或平台令牌
安装
# Clone the repository
git clone https://github.com/dynatrace-oss/go-mcp-dynatrace.git
cd go-mcp-dynatrace
# Build
go build -o go-mcp-dynatrace .
# Or install directly
go install github.com/dynatrace-oss/go-mcp-dynatrace@latest配置
设置所需的环境变量:
# Required: Dynatrace environment URL
export DT_ENVIRONMENT="https://abc12345.apps.dynatrace.com"
# Authentication Option 1: OAuth credentials (recommended)
export OAUTH_CLIENT_ID="dt0s02.XXXXXXXX"
export OAUTH_CLIENT_SECRET="dt0s02.XXXXXXXX.XXXXXXXXXXXXXXXX"
export DT_ACCOUNT_URN="urn:dtaccount:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
# Authentication Option 2: Platform token
export DT_PLATFORM_TOKEN="dt0c01.XXXXXXXX.XXXXXXXXXXXXXXXX"
# Optional: Custom SSO URL (default: https://sso.dynatrace.com/sso/oauth2/token)
export DT_SSO_URL="https://sso.dynatrace.com/sso/oauth2/token"
# Optional: Slack integration
export SLACK_CONNECTION_ID="your-slack-connection-id"
# Optional: Query budget (default: 1000 GB)
export DT_GRAIL_QUERY_BUDGET_GB="500"备注:使用OAuth身份验证时 DT_ACCOUNT_URN 是必需的。您可以在Dynatrace帐户管理门户的帐户设置下找到您的帐户UUID。跑步
# Run in stdio mode (for MCP clients)
./go-mcp-dynatrace
# Run in HTTP mode
./go-mcp-dynatrace --http --port 3000
# Run with debug logging
./go-mcp-dynatrace -log-level debugHTTP模式详细信息
在HTTP模式下运行时,服务器会公开:
POST /-MCP JSON-RPC端点GET /health-健康检查端点(返回{"status":"ok","version":"X.X.X"})
认证:HTTP模式需要 Authorization 所有请求的标头(除 /health).授权层是可插拔的;默认情况下,它接受任何令牌。
按请求凭据:在HTTP模式下,Dynatrace OAuth凭据可以通过标头而不是环境变量传递,从而支持多用户场景:
| 标题 | 描述 |
|---|---|
X-DT-OAuth-Client-Id | OAuth客户端ID(覆盖 OAUTH_CLIENT_ID) |
X-DT-OAuth-Client-Secret | OAuth客户端密钥(覆盖 OAUTH_CLIENT_SECRET) |
X-DT-Account-URN | 帐户URN(覆盖 DT_ACCOUNT_URN) |
这些标头会覆盖相应的环境变量(如果存在)。
使用Claude Desktop
添加到您的Claude Desktop配置(claude_desktop_config.json):
{
"mcpServers": {
"dynatrace": {
"command": "/path/to/go-mcp-dynatrace",
"env": {
"DT_ENVIRONMENT": "https://abc12345.apps.dynatrace.com",
"OAUTH_CLIENT_ID": "dt0s02.XXXXXXXX",
"OAUTH_CLIENT_SECRET": "dt0s02.XXXXXXXX.XXXXXXXXXXXXXXXX",
"DT_ACCOUNT_URN": "urn:dtaccount:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}
}
}
}使用Continue.dev
JSON配置
添加到“继续”配置(config.json):
{
"experimental": {
"modelContextProtocolServers": [
{
"transport": {
"type": "stdio",
"command": "/path/to/go-mcp-dynatrace",
"args": [],
"env": {
"DT_ENVIRONMENT": "https://abc12345.apps.dynatrace.com",
"OAUTH_CLIENT_ID": "dt0s02.XXXXXXXX",
"OAUTH_CLIENT_SECRET": "dt0s02.XXXXXXXX.XXXXXXXXXXXXXXXX",
"DT_ACCOUNT_URN": "urn:dtaccount:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}
}
}
]
}
}YAML配置
添加到“继续”配置(config.yaml):
experimental:
modelContextProtocolServers:
- transport:
type: stdio
command: /path/to/go-mcp-dynatrace
args: []
env:
DT_ENVIRONMENT: https://abc12345.apps.dynatrace.com
OAUTH_CLIENT_ID: dt0s02.XXXXXXXX
OAUTH_CLIENT_SECRET: dt0s02.XXXXXXXX.XXXXXXXXXXXXXXXX
DT_ACCOUNT_URN: urn:dtaccount:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx使用环境变量
您可以在配置中引用环境变量,以避免硬编码敏感值。
带有环境变量的JSON:
{
"experimental": {
"modelContextProtocolServers": [
{
"transport": {
"type": "stdio",
"command": "/path/to/go-mcp-dynatrace",
"args": [],
"env": {
"DT_ENVIRONMENT": "${DT_ENVIRONMENT}",
"OAUTH_CLIENT_ID": "${OAUTH_CLIENT_ID}",
"OAUTH_CLIENT_SECRET": "${OAUTH_CLIENT_SECRET}",
"DT_ACCOUNT_URN": "${DT_ACCOUNT_URN}"
}
}
}
]
}
}带有环境变量的YAML:
experimental:
modelContextProtocolServers:
- transport:
type: stdio
command: /path/to/go-mcp-dynatrace
args: []
env:
DT_ENVIRONMENT: ${DT_ENVIRONMENT}
OAUTH_CLIENT_ID: ${OAUTH_CLIENT_ID}
OAUTH_CLIENT_SECRET: ${OAUTH_CLIENT_SECRET}
DT_ACCOUNT_URN: ${DT_ACCOUNT_URN}工具参考
此MCP服务器提供19个工具,分为6类,用于全面的Dynatrace可观察性操作。
发现工具(只读)
首先使用这些工具来了解您的环境并查找实体。
| 工具 | 说明 | 何时使用 |
|---|---|---|
get_environment_info | 获取Dynatrace环境详细信息(名称、ID、功能) | 首次致电以验证连接并了解环境 |
find_entity_by_name | 按名称模式搜索受监视的实体 | 按名称查找主机、服务或应用程序 |
查询工具(只读)
根据Grail数据湖执行并验证DQL查询。
| 工具 | 说明 | 何时使用 |
|---|---|---|
execute_dql | 对日志、指标、跨度、事件、实体运行DQL查询 | 主数据检索-用于所有可观察性查询 |
verify_dql | 在不执行的情况下验证DQL语法 | 在运行昂贵的查询之前检查查询语法 |
安全工具(只读)
监控安全态势和漏洞。
| 工具 | 说明 | 何时使用 |
|---|---|---|
list_vulnerabilities | 获取具有严重性的主动安全漏洞 | 安全审计、漏洞评估 |
list_problems | 列出Davis检测到的活动问题 | 事件响应、问题调查 |
list_exceptions | 获取应用程序异常和堆栈跟踪 | 调试应用程序错误 |
get_kubernetes_events | 检索K8s集群事件 | Kubernetes故障排除 |
人工智能工具(Davis CoPilot)
利用Davis AI进行自然语言交互和分析。
| 工具 | 说明 | 何时使用 |
|---|---|---|
generate_dql_from_natural_language | 将纯英语转换为DQL查询 | 当不确定如何编写DQL查询时 |
explain_dql_in_natural_language | 获取人类可读的DQL解释 | 理解复杂的现有查询 |
chat_with_davis_copilot | 询问任何Dynatrace问题 | 一般问题、最佳实践、指导 |
list_davis_analyzers | 列出可用的AI分析器 | 发现可用的分析功能 |
execute_davis_analyzer | 运行预测、异常或相关性分析 | 预测分析、根本原因分析 |
写入工具(修改)
创建和管理自动化工作流程。
| 工具 | 说明 | 何时使用 |
|---|---|---|
create_workflow_for_notification | 创建警报通知工作流 | 设置自动警报 |
make_workflow_public | 与其他用户共享工作流 | 启用工作流协作 |
管理工具
系统管理和通知。
| 工具 | 说明 | 何时使用 |
|---|---|---|
send_email | 通过Dynatrace电子邮件服务发送电子邮件 | 发送报告、通知 |
send_slack_message | 发布到Slack频道 | 团队通知、事件警报 |
reset_grail_budget | 重置查询预算计数器 | 预算在会话中期用完时 |
______________________________________________________________________
常见工作流
工作流程1:事故调查
在调查生产问题时,请遵循以下顺序:
1. get_environment_info # Verify connection
2. list_problems # See active Davis-detected problems
3. execute_dql # Query logs around problem timeframe
Query: fetch logs, from: now() - 1h | filter loglevel == "ERROR" | limit 100
4. find_entity_by_name # Find affected services/hosts
5. execute_dql # Get related spans for tracing
Query: fetch spans, from: now() - 1h | filter status == "ERROR"
6. chat_with_davis_copilot # Ask Davis for root cause insights工作流程2:安全评估
1. list_vulnerabilities # Get all active vulnerabilities
2. execute_dql # Query security events
Query: fetch security_events, from: now() - 24h | summarize count(), by: {severity}
3. find_entity_by_name # Find vulnerable hosts/services
4. execute_davis_analyzer # Run security analysis工作流程3:性能分析
1. execute_dql # Get latency percentiles
Query: fetch spans, from: now() - 1h
| summarize p50=percentile(duration, 50), p95=percentile(duration, 95), p99=percentile(duration, 99), by: {span.name}
2. list_davis_analyzers # Find available analyzers
3. execute_davis_analyzer # Run anomaly detection
4. generate_dql_from_natural_language # "Show me slow database queries"工作流程4:日志分析
1. execute_dql # Search for errors
Query: fetch logs, from: now() - 1h | filter loglevel == "ERROR" | summarize count(), by: {log.source}
2. execute_dql # Parse and extract fields
Query: fetch logs | parse content, "status=INT:status duration=INT:duration" | filter status >= 400
3. explain_dql_in_natural_language # Understand complex existing query工作流程5:自然语言查询
当用户用简单的英语描述他们想要什么时:
1. generate_dql_from_natural_language # Convert request to DQL
2. verify_dql # Validate generated query
3. execute_dql # Run the query
4. explain_dql_in_natural_language # Explain what query does (if needed)______________________________________________________________________
DQL快速参考
基本查询模式
# Error count by source (last hour)
fetch logs, from: now() - 1h
| filter loglevel == "ERROR"
| summarize count(), by: {log.source}
| sort count() desc
# Top 10 slowest services
fetch spans, from: now() - 1h
| summarize avg_duration = avg(duration), by: {span.name}
| sort avg_duration desc
| limit 10
# Error rate calculation
fetch logs, from: now() - 1h
| summarize
total = count(),
errors = countIf(loglevel == "ERROR"),
error_rate = 100.0 * countIf(loglevel == "ERROR") / count()
# Time series for graphing
fetch logs, from: now() - 6h
| filter loglevel == "ERROR"
| summarize count(), by: {bin(timestamp, 5m)}
| sort timestamp asc
# Text search in logs
fetch logs, from: now() - 1h
| filter matchesPhrase(content, "connection timeout")
# Find specific entities
fetch entities
| filter entity.type == "HOST"
| filter matchesValue(tags, "environment:production")
| fields entity.name, id, tags数据源参考
| 来源 | 用途 | 查询示例 | |
|---|---|---|---|
logs | 应用程序/系统日志 | `fetch logs \ | filter loglevel == "ERROR"` |
spans | 分布式跟踪 | `fetch spans \ | filter duration > 1000000000` |
events | 戴维斯事件 | `fetch events \ | filter event.type == "ERROR_EVENT"` |
entities | 受监控的组件 | `fetch entities \ | filter entity.type == "SERVICE"` |
metrics | 时间序列指标 | `fetch metrics \ | filter metric.key == "cpu.usage"` |
bizevents | 商务活动 | `fetch bizevents \ | filter event.type == "purchase"` |
常用函数
| 功能 | 目的 | 示例 |
|---|---|---|
count() | 统计记录 | summarize count() |
countIf(cond) | 有条件计数 | summarize countIf(status >= 400) |
avg(field) | 平均值 | summarize avg(duration) |
percentile(field, p) | 百分位数计算 | summarize percentile(latency, 95) |
bin(ts, interval) | 时光倒流 | by: {bin(timestamp, 5m)} |
contains(str, substr) | 变电站检查 | filter contains(content, "error") |
matchesPhrase(str, phrase) | 索引文本搜索 | filter matchesPhrase(content, "timeout") |
时间范围
from: now() - 1h # Last hour
from: now() - 24h # Last 24 hours
from: now() - 7d # Last 7 days
from: "2024-01-15T00:00:00Z", to: "2024-01-15T23:59:59Z" # Absolute range性能提示
- 早期过滤 -将过滤器放在后面
fetch - 使用
matchesPhrase-比contains用于索引搜索 - 限制时间范围 -始终指定
from:对于大型数据集 - 使用
scanLimitGBytes-控制查询成本:fetch logs, scanLimitGBytes: 100 - 选择特定字段 -使用
fields减少数据传输
______________________________________________________________________
可用工具(传统格式)
命令行选项
Options:
--http Run in HTTP mode instead of stdio
-p, --port
Port for HTTP server (default: 3000)
-H, --host Host for HTTP server (default: 127.0.0.1)
-log-dir
Directory for log files
-log-level Log level: off, error, warn, info, access, debug
-version Show version information
-help Show help information环境变量
| 变量 | 必填 | 描述 |
|---|---|---|
DT_ENVIRONMENT | 是 | Dynatrace平台的URL |
OAUTH_CLIENT_ID | \* | OAuth客户端ID |
OAUTH_CLIENT_SECRET | \* | OAuth客户端密钥 |
DT_ACCOUNT_URN | \* | OAuth的帐户URN(格式: urn:dtaccount:) |
DT_PLATFORM_TOKEN | \*\* | 平台身份验证令牌 |
DT_SSO_URL | 无 | SSO URL(默认:SSO.dynatrace.com) |
DT_GRAIL_QUERY_BUDGET_GB | 否 | 圣杯查询预算(GB)(默认值:1000) |
DT_LOG_QUERIES | 否 | 将DQL查询记录到文件中(默认值:false) |
SLACK_CONNECTION_ID | 否 | 松弛连接器ID |
MCP_LOG_DIR | 否 | 日志目录 |
MCP_LOG_LEVEL | 否 | 日志级别 |
\*OAuth身份验证所必需的 \*\*OAuth的替代方案-改用平台令牌
全局环境文件
所有go-mcp服务器都支持从以下位置加载环境变量 ~/.mcp_env。这提供了一个配置凭据和设置的中心位置,在GUI应用程序不从继承shell环境变量的macOS上特别有用 .zshrc 或 .bashrc.
文件格式
创建 ~/.mcp_env 对于KEY=VALUE对:
# ~/.mcp_env - MCP Server Environment Variables
# Dynatrace Configuration
DT_ENVIRONMENT=https://abc12345.apps.dynatrace.com
OAUTH_CLIENT_ID=dt0s02.XXXXXXXX
OAUTH_CLIENT_SECRET=dt0s02.XXXXXXXX.XXXXXXXXXXXXXXXX
DT_ACCOUNT_URN=urn:dtaccount:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
# Logging
MCP_LOG_DIR=~/mcp-logs
MCP_LOG_LEVEL=info特性
- 以开头的行
#被视为评论 - 空行被忽略
- 值可以用单引号或双引号括起来
- 现有环境变量不会被覆盖 (环境变量优先)
- 路径与
~会自动扩展到您的主目录
路径扩展
支持所有与路径相关的设置 ~ 扩展:
MCP_LOG_DIR=~/logs/dynatrace这在 ~/.mcp_env 文件、环境变量和命令行标志。
日志记录
日志被写入 ~/go-mcp-dynatrace/logs/ 默认情况下,每天轮换。
当 MCP_LOG_DIR 已设置或 -log-dir 使用标志后,日志会自动放置在以二进制文件命名的子文件夹中(go-mcp-dynatrace).这允许多个MCP服务器共享同一日志目录:
MCP_LOG_DIR=/var/log/mcp
└── go-mcp-dynatrace/
└── go-mcp-dynatrace-2026-01-04.log日志级别:
off-禁用日志记录error-仅错误warn-警告和错误info-一般信息(默认)access-API访问操作debug-详细调试
安全说明:日志永远不会捕获查询结果、令牌或响应内容等敏感数据。仅记录操作元数据(端点、持续时间、记录计数)。
DQL查询日志记录
通过设置启用DQL查询文件日志记录以进行调试和审核:
export DT_LOG_QUERIES=true启用后,所有DQL查询都将保存到单个文件中:
~/go-mcp-dynatrace/logs/DQL/YYYYMMDD/{name}.YYYYMMDD.HHmmss.dql例子:
~/go-mcp-dynatrace/logs/DQL/20260103/fetch_logs.20260103.142530.dql
~/go-mcp-dynatrace/logs/DQL/20260103/list_problems.20260103.143215.dql这有助于:
- 调试查询问题
- 审核执行了哪些查询
- 在Dynatrace UI中再现查询
- 构建一个DQL查询库
需要OAuth作用域
服务器请求以下作用域:
app-engine:apps:run-环境信息storage:*:read-读取日志、指标、事件、实体、跨度davis-copilot:*:execute-Davis CoPilot功能davis:analyzers:read/execute-戴维斯分析仪automation:workflows:*-工作流管理email:emails:send-电子邮件发送app-settings:objects:read-应用程序设置
从源头构建
# Build for current platform
go build -o go-mcp-dynatrace .
# Build for all platforms
./build.sh # Linux/macOS
./build.ps1 # Windows
# Run tests
go test ./...建筑
go-mcp-dynatrace/
├── main.go # Entry point
├── pkg/
│ ├── mcp/ # MCP protocol implementation
│ │ ├── server.go # JSON-RPC server with resource support
│ │ └── types.go # Protocol types
│ ├── dynatrace/ # Dynatrace API client
│ │ ├── client.go # HTTP client with OAuth
│ │ ├── types.go # API types
│ │ └── token_cache.go # OAuth token caching
│ ├── dql/ # DQL language reference
│ │ ├── reference.go # Reference provider
│ │ └── mcp_adapter.go # MCP resource adapter
│ ├── tools/ # MCP tool implementations
│ │ └── tools.go # All tool handlers
│ └── logging/ # Logging infrastructure
│ └── logging.go # Logger with DQL query file logging
└── go.mod贡献
欢迎投稿!请在提交PR之前阅读投稿指南。
许可证
MIT许可证-有关详细信息,请参阅许可证文件。
致谢
- 基于 Dynatrace MCP服务器 (TypeScript)
- MCP架构的灵感来自 go-mcp文件上下文服务器
