Dynatrace MCP服务器实现

一个Go语言实现的Dynatrace模型上下文协议(MCP)服务器,支持LLM与Dynatrace平台交互,实现可观测性、安全性和自动化任务。

  • by JeremyProffittOrg
  • Go
  • 本地部署
  • 更新于
在 GitHub 查看 JeremyProffitt/go-mcp-dynatrace

使用说明

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 debug

HTTP模式详细信息

在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

性能提示

  1. 早期过滤 -将过滤器放在后面 fetch
  2. 使用 matchesPhrase -比 contains 用于索引搜索
  3. 限制时间范围 -始终指定 from: 对于大型数据集
  4. 使用 scanLimitGBytes -控制查询成本: fetch logs, scanLimitGBytes: 100
  5. 选择特定字段 -使用 fields 减少数据传输

可用工具(传统格式)

命令行选项

Options:
    --http              Run in HTTP mode instead of stdio
    -p, --port <port>   Port for HTTP server (default: 3000)
    -H, --host <host>   Host for HTTP server (default: 127.0.0.1)
    -log-dir <path>     Directory for log files
    -log-level <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:<uuid>)
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许可证-有关详细信息,请参阅许可证文件。

致谢