关于 dt-obs-gcp
面向 Dynatrace 的 GCP 基础设施监控与分析 Skill,使用 Smartscape 和 DQL。它提供资源发现、配置解析、拓扑、安全和跨 GCP 项目归属分析的查询模式。
主要功能
- 01按类型和范围发现 GCP 资源
- 02从 JSON 解析资源配置
- 03遍历资源关系
- 04按标签对资源分组
- 05分析项目与区域层级
适用场景
- 01盘点 Compute Engine 或 GKE 资源
- 02检查资源的配置详情
- 03追踪网络与计算资源之间的关联
- 04按归属或成本分摊对资源分组
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ dynatrace/ dynatrace-for-ai --skill dt-obs-gcp安装后在 Claude Code 中输入/dt-obs-gcp确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
references/compute-instances.mdiam-security.mdkubernetes-gke.mdmessaging-pubsub.mdmonitoring-logging.mdnetworking-dns.mdREADME.mdresource-management.mdresource-ownership.mdserverless-containers.md详细介绍
GCP 云基础设施
使用 Dynatrace Smartscape 和 DQL 监控并分析 GCP 资源。查询 GCP 服务、管理组织层级、审计安全状况,并跟踪 GCP 基础设施中的资源所有权。
何时使用此技能
当用户需要在 Dynatrace 中处理 GCP 资源时,使用此技能。根据任务类型加载参考文件:
| 任务 | 要加载的文件 |
|---|---|
| 清单和拓扑查询 | (无需额外文件 — 使用上面的核心模式) |
| Compute Engine 实例、机器类型、IP 地址 | 加载 references/compute-instances.md |
| GKE 集群、节点池、Pod、部署、服务、RBAC | 加载 references/kubernetes-gke.md |
| Cloud Run 服务、修订版本、执行 | 加载 references/serverless-containers.md |
| VPC 网络、子网、路由、DNS 记录 | 加载 references/networking-dns.md |
| Pub/Sub 主题 | 加载 references/messaging-pubsub.md |
| IAM 服务账号、角色、Secret Manager | 加载 references/iam-security.md |
| 监控仪表板、日志记录、已保存的查询 | 加载 references/monitoring-logging.md |
| GCP 项目、区域、组织层级 | 加载 references/resource-management.md |
| 资源所有权、GCP 标签、组织结构 | 加载 references/resource-ownership.md |
核心概念
实体类型
GCP 资源使用 GCP_* 前缀,可通过 smartscapeNodes 函数查询。所有 GCP 实体都会在 Dynatrace Smartscape 中自动发现并建模。
计算: GCP_COMPUTE_GOOGLEAPIS_COM_INSTANCE、GCP_COMPUTE_GOOGLEAPIS_COM_ADDRESS
网络: GCP_COMPUTE_GOOGLEAPIS_COM_NETWORK、GCP_COMPUTE_GOOGLEAPIS_COM_SUBNETWORK、GCP_COMPUTE_GOOGLEAPIS_COM_ROUTE、GCP_DNS_GOOGLEAPIS_COM_RESOURCERECORDSET
Kubernetes(GKE): GCP_K8S_IO_POD、GCP_K8S_IO_NODE、GCP_K8S_IO_SERVICE、GCP_K8S_IO_SERVICEACCOUNT、GCP_K8S_IO_PERSISTENTVOLUMECLAIM、GCP_APPS_K8S_IO_DEPLOYMENT、GCP_APPS_K8S_IO_STATEFULSET、GCP_CONTAINER_GOOGLEAPIS_COM_NODEPOOL、GCP_RBAC_AUTHORIZATION_K8S_IO_CLUSTERROLEBINDING、GCP_RBAC_AUTHORIZATION_K8S_IO_ROLEBINDING
无服务器: GCP_RUN_GOOGLEAPIS_COM_SERVICE、GCP_RUN_GOOGLEAPIS_COM_REVISION、GCP_RUN_GOOGLEAPIS_COM_EXECUTION
IAM 与安全: GCP_IAM_GOOGLEAPIS_COM_SERVICEACCOUNT、GCP_IAM_GOOGLEAPIS_COM_ROLE、GCP_SECRETMANAGER_GOOGLEAPIS_COM_SECRETVERSION
消息传递: GCP_PUBSUB_GOOGLEAPIS_COM_TOPIC
监控: GCP_MONITORING_GOOGLEAPIS_COM_DASHBOARD、GCP_LOGGING_GOOGLEAPIS_COM_SAVEDQUERY
基础设施: GCP_REGION
常见 GCP 字段
所有 GCP 实体都包含:
gcp.project.id— GCP 项目标识符gcp.region— GCP 区域(例如,us-central1)gcp.zone— GCP 可用区(例如,us-central1-a)gcp.organization.id— GCP 组织标识符gcp.resource.name— 资源名称gcp.resource.type— 资源类型标识符gcp.asset.type— GCP 资产类型gcp.object— 包含完整资源配置的 JSON 数据块
GCP 组织层级
GCP 资源按以下层级组织:
- 组织 — 顶层容器(
gcp.organization.id) - 文件夹 — 组织内的逻辑分组
- 项目 — 资源容器(
gcp.project.id) - 区域/可用区 — 物理位置(
gcp.region、gcp.zone)
实体命名约定
GCP 实体类型遵循 GCP_<SERVICE_API>_<RESOURCE> 模式:
- 服务 API 对应 Google API 域名(例如,
compute.googleapis.com→COMPUTE_GOOGLEAPIS_COM) - 资源表示具体的资源类型(例如,
INSTANCE、NETWORK)
示例:
GCP_COMPUTE_GOOGLEAPIS_COM_INSTANCE— Compute Engine 虚拟机GCP_K8S_IO_POD— GKE PodGCP_RUN_GOOGLEAPIS_COM_SERVICE— Cloud Run 服务
查询模式
所有 GCP 查询都基于四种核心模式。掌握这些模式后,可将其调整用于任何实体类型。
模式 1:资源发现
按类型列出资源,按项目/区域/可用区筛选,并汇总数量:
smartscapeNodes "GCP_COMPUTE_GOOGLEAPIS_COM_INSTANCE"
| fields name, gcp.project.id, gcp.region, gcp.zone, gcp.resource.name
若要列出所有 GCP 资源类型,请替换为 "GCP_*",并添加 | summarize count = count(), by: {type} | sort count desc。添加 | filter gcp.project.id == "<PROJECT_ID>" 或 | filter gcp.region == "<REGION>" 等筛选条件,以限定结果范围。
模式 2:配置解析
解析 gcp.object JSON,以获取详细的配置字段:
smartscapeNodes "GCP_COMPUTE_GOOGLEAPIS_COM_INSTANCE"
| parse gcp.object, "JSON:gcpjson"
| fieldsAdd machineType = gcpjson[configuration][resource][machineType],
status = gcpjson[configuration][resource][status]
| fields name, gcp.project.id, machineType, status
GCP 配置字段嵌套在 gcpjson[configuration][resource][...] 下,包含主要资源属性;扩展属性则位于 gcpjson[configuration][additionalAttributes][...] 下。
模式 3:关系遍历
跟踪资源之间的关系:
smartscapeNodes "GCP_COMPUTE_GOOGLEAPIS_COM_INSTANCE"
| traverse "*", "GCP_COMPUTE_GOOGLEAPIS_COM_SUBNETWORK"
| fields name, gcp.project.id
由于 GCP 实体没有命名的关系类型,因此在遍历中使用 "*" 作为关系名称。使用 fieldsKeep 在遍历过程中保留字段,并使用 dt.traverse.history[-N] 访问祖先字段。
模式 4:基于标签的所有权
按 GCP 标签对资源分组,以跟踪所有权和组织结构:
smartscapeNodes "GCP_*"
| filter isNotNull(`tags:gcp_labels`)
| fields name, gcp.project.id, `tags:gcp_labels`
GCP 标签通过 tags:gcp_labels 字段公开,必须使用反引号语法访问。将 "GCP_*" 替换为特定类型,以限定到某项服务。
参考指南
当上述核心模式需要根据特定服务进行调整时,加载参考文件以执行详细查询。
| 参考文件 | 加载时机 | 主要内容 |
|---|---|---|
| compute-instances.md | Compute Engine 虚拟机、机器类型、IP 地址、磁盘 | 实例清单、机器类型分布、状态检查 |
| kubernetes-gke.md | GKE 集群、节点池、Pod、部署、服务、RBAC | 集群拓扑、工作负载分布、RBAC 绑定 |
| serverless-containers.md | Cloud Run 服务、修订版本、执行记录 | 服务清单、修订版本跟踪、执行分析 |
| networking-dns.md | VPC 网络、子网、路由、DNS 记录 | 网络拓扑、子网分析、路由表、DNS 记录集 |
| messaging-pubsub.md | Pub/Sub 主题 | 主题清单、消息传递拓扑 |
| iam-security.md | IAM 服务账号、角色、Secret Manager | 服务账号审计、角色分析、密钥版本跟踪 |
| monitoring-logging.md | 监控信息板、日志记录、已保存的查询 | 信息板清单、已保存查询分析 |
| resource-management.md | GCP 项目、区域、组织层级 | 项目清单、区域分布、层级映射 |
| resource-ownership.md | 资源所有权、GCP 标签、组织结构 | 基于标签的分组、项目级摘要、成本分摊 |
最佳实践
配置解析
- 始终使用 JSON 解析器解析
gcp.object:parse gcp.object, "JSON:gcpjson" - 通过
gcpjson[configuration][resource][...]访问主要资源属性 - 通过
gcpjson[configuration][additionalAttributes][...]访问扩展属性 - 解析后使用
isNotNull()检查空值
GCP 层级结构
- 组织 → 文件夹 → 项目 → 区域/可用区
- 使用
gcp.project.id作为主要范围筛选条件 - 使用
gcp.organization.id执行跨项目查询 - 使用
gcp.region和gcp.zone执行基于位置的分析
实体命名
- 实体类型遵循
GCP_<SERVICE_API>_<RESOURCE>格式 - 服务 API 对应 Google API 域名,其中的点和连字符替换为下划线
- 使用具体的实体类型(尽可能避免使用
"GCP_*"通配符)
标签
- 必须使用反引号语法访问 GCP 标签:
`tags:gcp_labels` - 使用
isNotNull(tags:gcp_labels)按标签筛选 - 使用汇总操作跟踪标签覆盖情况
关系遍历
- 使用
"*"作为关系名称 — GCP 实体没有命名的关系类型 - 使用
fieldsKeep在遍历过程中保留重要字段 - 使用
dt.traverse.history[-N]访问遍历历史记录 - 复杂拓扑可能需要执行多次遍历操作
限制和说明
Smartscape 限制
- Smartscape 数据反映最近一次扫描的结果;GCP 变更与 Dynatrace 可见性之间可能存在延迟
- 并非所有 GCP 服务都表示为实体类型
- 根据资源设置,某些配置字段可能为 null
- 资源发现取决于 GCP 集成配置
GCP 专属说明
- GCP 标签必须通过反引号语法访问:
`tags:gcp_labels` - GCP 实体在关系遍历中使用
"*"(没有命名的关系类型) - GCP 对象配置需要使用
parse gcp.object, "JSON:gcpjson"进行解析 - 配置字段嵌套在
gcpjson[configuration][resource][...]下(与 AWS 模式不同)
通用提示
- 尽早按项目和区域筛选,以提升性能
- 使用
isNotNull()和isNull()妥善处理 null 值 - 对于大型环境,结合项目和区域筛选
- 使用
countDistinct()统计唯一资源数量 - 探索时使用
| limit N限制结果数量