使用 App Topology API

您可以使用 REST API 或 Google Cloud CLI 以编程方式运行查询,以关联 Google Cloud 中的数据。

概览

运行 App Topology API 查询时,该 API 会返回与您的查询匹配的图节点(资源)和边(关系)列表。App Topology 会整合 Google Cloud 服务(例如以下服务)中的数据:

  • 来自 Cloud Asset Inventory、App Hub、代理注册表的资源元数据
  • 部署数据,例如 Git 提交或容器映像的 build 出处
  • Security Command Center 中的安全数据,例如漏洞或 Identity and Access Management (IAM) 所有权
  • Google Cloud Observability 数据,例如跟踪记录和提醒

如需运行查询,您需要提供以下信息:

  • 您要查询的网域。SRE 网域包含所有受支持的数据。如需了解如何列出可用的网域,请参阅列出网域。
  • 您可以包含在查询中的受支持的图节点、边和属性。您可以获取网域的完整或部分架构。如需了解详情,请参阅获取架构。
  • 要搜索的包含节点和边的查询句式。请参阅运行查询。

准备工作

  1. 设置应用拓扑。

  2. 选择标签页以了解您打算如何使用本页面上的示例:

    gcloud

    在 Google Cloud 控制台中,激活 Cloud Shell。

    激活 Cloud Shell

    Cloud Shell 会话随即会在 Google Cloud 控制台的底部启动,并显示命令行提示符。Cloud Shell 是一个已安装 Google Cloud CLI 且已为当前项目设置值的 Shell 环境。该会话可能需要几秒钟时间来完成初始化。

    REST

    如需在本地开发环境中使用本页面上的 REST API 示例,请使用您提供给 gcloud CLI 的凭证。

      安装 Google Cloud CLI。

      如果您使用的是外部身份提供方 (IdP),则必须先使用联合身份登录 gcloud CLI。

    如需了解详情,请参阅 Google Cloud 身份验证文档中的使用 REST 时进行身份验证。

    如需了解如何为生产环境设置身份验证,请参阅 Google Cloud 身份验证文档中的 为在 Google Cloud上运行的代码设置应用默认凭据 。

所需的角色

如需获得使用 App Topology API 所需的权限,请让您的管理员为您授予以下 IAM 角色:

  • 运行查询:您要使用 App Topology 的项目的 App Topology Viewer (roles/apptopology.viewer)

如需详细了解如何授予角色,请参阅管理对项目、文件夹和组织的访问权限。

这些预定义角色包含使用 App Topology API 所需的权限。如需查看所需的确切权限,请展开所需权限部分:

所需权限

如需使用 App Topology API,需要以下权限:

  • 获取网域:
    • apptopology.domains.get
    • apptopology.domains.list
  • 获取架构: apptopology.schemas.get
  • 获取发现的资源数据: apptopology.discoveredResourcesTopologies.generate
  • 获取 DevOps 网域数据: apptopology.devOpsDomainTopologies.generate
  • 获取安全网域数据: apptopology.securityDomainTopologies.generate
  • 获取 SRE 网域数据(所有受支持的数据): apptopology.sreDomainTopologies.generate

您也可以使用自定义角色或其他预定义角色来获取这些权限。

列出网域

网域是专注于特定类型查询的资源数据集。

  • 如需查询 App Topology 支持的所有数据,请使用 SRE 网域。
  • 如需获取有关智能体资源的数据,您必须使用 SRE 网域。
  • 本文档中的所有请求响应示例均使用 SRE 网域。

如有需要,您可以列出项目中的可用网域。

gcloud

列出网域

在使用下面的命令数据之前,请先进行以下替换:

  • PROJECT_ID:您的项目 ID

执行 gcloud app-topology domains list 命令:

Linux、macOS 或 Cloud Shell

gcloud app-topology domains list --project=PROJECT_ID

Windows (PowerShell)

gcloud app-topology domains list --project=PROJECT_ID

Windows (cmd.exe)

gcloud app-topology domains list --project=PROJECT_ID

您应该会收到类似如下所示的响应:

NAME
DEVOPS
SECURITY
SRE

REST

列出网域

在使用任何请求数据之前,请先进行以下替换:

  • PROJECT_ID:您的项目 ID

HTTP 方法和网址:

GET https://apptopology.googleapis.com/v1/projects/PROJECT_ID/locations/global/domains

如需发送您的请求,请展开以下选项之一:

您应该收到类似以下内容的 JSON 响应:

{
  "domains": [
    {
      "name": "projects/PROJECT_ID/locations/global/domains/DEVOPS"
    },
    {
      "name": "projects/PROJECT_ID/locations/global/domains/SECURITY"
    },
    {
      "name": "projects/PROJECT_ID/locations/global/domains/SRE"
    }
  ]
}

获取架构

为了帮助您构建查询,您可以获取网域的所有受支持的节点、边和属性的列表。您还可以通过 REST API 获取部分架构。

由于架构中的项数量较多,因此请求完整架构可能比请求部分架构花费的时间长得多。

获取完整架构

gcloud

获取完整架构

在使用下面的命令数据之前,请先进行以下替换:

  • PROJECT_ID:您的项目 ID
  • DOMAIN:您要查询的网域。SRE 网域包含所有受支持的数据。

执行 gcloud app-topology domains schema describe 命令:

Linux、macOS 或 Cloud Shell

gcloud app-topology domains schema describe DOMAIN --project=PROJECT_ID

Windows (PowerShell)

gcloud app-topology domains schema describe DOMAIN --project=PROJECT_ID

Windows (cmd.exe)

gcloud app-topology domains schema describe DOMAIN --project=PROJECT_ID

以下示例摘自某个响应,仅包含节点类型、边类型、边规则和标签属性的架构中的第一个项。

{
  "nodeTypes": [
    {
      "type": "Base/compute.googleapis.com/UrlMap",
      "labels": [
        "Base/Resource",
        "Base/compute.googleapis.com/UrlMap"
      ],
      "description": "Represents a Compute UrlMap."
    }
  ],
  "edgeTypes": [
    {
      "type": "Observability/SENDS_TRAFFIC/Base/geminidataanalytics.googleapis.com/DataAgent:Base/apps.k8s.io/DaemonSet",
      "labels": [
        "Observability/SENDS_TRAFFIC"
      ]
    }
  ],
  "labelProperties": [
    {
      "label": "Base/compute.googleapis.com/InstanceSettings",
      "description": "Classifies a node as a Compute Instance Settings."
    }
  ],
  "edgeRules": [
    {
      "edgeType": "Observability/SENDS_TRAFFIC/Base/geminidataanalytics.googleapis.com/DataAgent:Base/apps.k8s.io/DaemonSet",
      "srcNodeType": "Base/geminidataanalytics.googleapis.com/DataAgent",
      "destNodeType": "Base/apps.k8s.io/DaemonSet"
    }
  ]
}

REST

获取完整架构

在使用任何请求数据之前,请先进行以下替换:

  • PROJECT_ID:您的项目 ID
  • DOMAIN:您要查询的网域。SRE 网域包含所有受支持的数据。

HTTP 方法和网址:

GET https://apptopology.googleapis.com/v1/projects/PROJECT_ID/locations/global/domains/DOMAIN/schema

如需发送您的请求,请展开以下选项之一:

以下示例摘自某个响应,其中仅包含节点类型、边类型、边规则和标签属性的架构中的第一个项。

{
  "nodeTypes": [
    {
      "type": "Base/compute.googleapis.com/UrlMap",
      "labels": [
        "Base/Resource",
        "Base/compute.googleapis.com/UrlMap"
      ],
      "description": "Represents a Compute UrlMap."
    }
  ],
  "edgeTypes": [
    {
      "type": "Observability/SENDS_TRAFFIC/Base/geminidataanalytics.googleapis.com/DataAgent:Base/apps.k8s.io/DaemonSet",
      "labels": [
        "Observability/SENDS_TRAFFIC"
      ]
    }
  ],
  "labelProperties": [
    {
      "label": "Base/compute.googleapis.com/InstanceSettings",
      "description": "Classifies a node as a Compute Instance Settings."
    }
  ],
  "edgeRules": [
    {
      "edgeType": "Observability/SENDS_TRAFFIC/Base/geminidataanalytics.googleapis.com/DataAgent:Base/apps.k8s.io/DaemonSet",
      "srcNodeType": "Base/geminidataanalytics.googleapis.com/DataAgent",
      "destNodeType": "Base/apps.k8s.io/DaemonSet"
    }
  ]
}

获取部分架构

您可以获取指定起始标签在指定跳数内的部分网域架构。

这些说明中的示例命令会获取从 Base/Agent 节点开始的部分架构,深度为 1,页面大小为 5。

获取部分架构

在使用任何请求数据之前,请先进行以下替换:

  • PROJECT_ID:您的项目 ID
  • DOMAIN:您要查询的网域。SRE 网域包含所有受支持的数据。

HTTP 方法和网址:

POST https://apptopology.googleapis.com/v1/projects/PROJECT_ID/locations/global/domains/DOMAIN/schema:explore

请求 JSON 正文:

{
  "startLabels": [
    "Base/Agent"
  ],
  "depth": 1,
  "pageSize": 5
}

如需发送您的请求,请展开以下选项之一:

在响应中,nodeTypes 和 edgeTypes 的顺序是一致的,但 labelProperties 的顺序可能会因请求而异。

展开回答标题即可查看回答示例。

运行查询

运行查询时,您需要指定一个查询句式,其中包含要搜索的节点、边和属性。

查询句式基于 AIP-160 过滤语法。如需大致了解查询模式和查询限制,请参阅关于查询。以下说明假定您已阅读查询结构和限制信息。

以下说明使用了一个示例查询,用于查询指定项目中的所有 App Hub 服务和工作负载,包括已注册 (Base/apphub.googleapis.com/Service、Base/apphub.googleapis.com/Workload) 和已发现 (Base/DiscoveredService、Base/DiscoveredWorkload) 的服务和工作负载。

这些命令在 JSON 文件中指定查询句式。在这些说明中,该文件对于 gcloud CLI 和 REST 请求略有不同。

  • 对于 gcloud CLI,请将要查询的网域指定为命令的参数。相应网域未包含在查询模式文件中。
  • 对于 REST 请求,请在请求的 JSON 正文中同时指定网域和查询句式。在 topologyDomains 字段中设置网域,并在 filter 对象下指定查询句式。

gcloud

生成拓扑

在使用下面的命令数据之前,请先进行以下替换:

  • PROJECT_ID:您的项目 ID
  • DOMAIN:您要查询的网域。SRE 网域包含所有受支持的数据。

将以下内容保存在名为 request.json 的文件中:

{
  "startingNode": {
    "alias": "sw",
    "labelPropertiesPattern": {
      "labelMatcherExpr": "Base/apphub.googleapis.com/Service OR Base/apphub.googleapis.com/Workload OR Base/DiscoveredService OR Base/DiscoveredWorkload"
    }
  }
}

执行 gcloud app-topology resources-graph generate 命令:

Linux、macOS 或 Cloud Shell

gcloud app-topology resources-graph generate --domains=DOMAIN --project=PROJECT_ID --pattern-file=request.json --format=json

Windows (PowerShell)

gcloud app-topology resources-graph generate --domains=DOMAIN --project=PROJECT_ID --pattern-file=request.json --format=json

Windows (cmd.exe)

gcloud app-topology resources-graph generate --domains=DOMAIN --project=PROJECT_ID --pattern-file=request.json --format=json

以下示例响应摘录显示了前 2 个节点。这些节点是 MCP 服务器。Google MCP 服务器具有标签 Base/DiscoveredService,该标签是查询模式中的标签之一。

在输出中,以下变量表示与您通过 PROJECT_ID 指定的项目相关联的值:

  • PROJECT_NUMBER - 指定项目的项目编号。
  • ORGANIZATION_NUMBER - 包含指定项目的 Google Cloud 组织的组织编号。
{
  "graph": {
    "nodes": [
      {
        "properties": {
          "project": "projects/PROJECT_NUMBER",
          "Base/location": "global",
          "createTime": "2026-08-13T15:14:53.477680Z",
          "Base/agentregistry/urn": "urn:mcp:googleapis.com:projects:PROJECT_NUMBER:locations:global:storage",
          "Base/resourceType": "agentregistry.googleapis.com/GoogleMcpServer",
          "organization": "organizations/ORGANIZATION_NUMBER"
        },
        "name": "urn:mcp:googleapis.com:projects:PROJECT_NUMBER:locations:global:storage",
        "labels": [
          "Base/MCPServer",
          "Base/DiscoveredService",
          "Base/Resource",
          "Base/agentregistry.googleapis.com/GoogleMcpServer"
        ],
        "context": {
          "type": "Base/agentregistry.googleapis.com/GoogleMcpServer"
        }
      },
      {
        "properties": {
          "createTime": "2026-08-13T16:22:24.732600Z",
          "Base/resourceType": "agentregistry.googleapis.com/GoogleMcpServer",
          "Base/agentregistry/urn": "urn:mcp:googleapis.com:projects:PROJECT_NUMBER:locations:global:pubsub",
          "Base/location": "global",
          "organization": "organizations/ORGANIZATION_NUMBER",
          "project": "projects/PROJECT_NUMBER"
        },
        "name": "urn:mcp:googleapis.com:projects:PROJECT_NUMBER:locations:global:pubsub",
        "labels": [
          "Base/agentregistry.googleapis.com/GoogleMcpServer",
          "Base/Resource",
          "Base/DiscoveredService",
          "Base/MCPServer"
        ],
        "context": {
          "type": "Base/agentregistry.googleapis.com/GoogleMcpServer"
        }
      }
    ]
  }
}

REST

生成拓扑

在使用任何请求数据之前,请先进行以下替换:

  • PROJECT_ID:您的项目 ID
  • DOMAIN:您要查询的网域。SRE 网域包含所有受支持的数据。

HTTP 方法和网址:

POST https://apptopology.googleapis.com/v1/projects/PROJECT_ID/locations/global/discoveredResourcesTopology:generate

请求 JSON 正文:

{
  "topologyDomains": [
    "projects/PROJECT_ID/locations/global/domains/DOMAIN"
  ],
  "filter": {
    "startingNode": {
      "alias": "sw",
      "labelPropertiesPattern": {
        "labelMatcherExpr": "Base/apphub.googleapis.com/Service OR Base/apphub.googleapis.com/Workload OR Base/DiscoveredService OR Base/DiscoveredWorkload"
      }
    }
  }
}

如需发送您的请求,请展开以下选项之一:

以下示例响应摘录显示了前 2 个节点。这些节点是 MCP 服务器。Google MCP 服务器具有标签 Base/DiscoveredService,该标签是查询模式中的标签之一。

在输出中,以下变量表示与您通过 PROJECT_ID 指定的项目相关联的值:

  • PROJECT_NUMBER - 指定项目的项目编号。
  • ORGANIZATION_NUMBER - 包含指定项目的 Google Cloud 组织的组织编号。
{
  "graph": {
    "nodes": [
      {
        "properties": {
          "project": "projects/PROJECT_NUMBER",
          "Base/location": "global",
          "createTime": "2026-08-13T15:14:53.477680Z",
          "Base/agentregistry/urn": "urn:mcp:googleapis.com:projects:PROJECT_NUMBER:locations:global:storage",
          "Base/resourceType": "agentregistry.googleapis.com/GoogleMcpServer",
          "organization": "organizations/ORGANIZATION_NUMBER"
        },
        "name": "urn:mcp:googleapis.com:projects:PROJECT_NUMBER:locations:global:storage",
        "labels": [
          "Base/MCPServer",
          "Base/DiscoveredService",
          "Base/Resource",
          "Base/agentregistry.googleapis.com/GoogleMcpServer"
        ],
        "context": {
          "type": "Base/agentregistry.googleapis.com/GoogleMcpServer"
        }
      },
      {
        "properties": {
          "createTime": "2026-08-13T16:22:24.732600Z",
          "Base/resourceType": "agentregistry.googleapis.com/GoogleMcpServer",
          "Base/agentregistry/urn": "urn:mcp:googleapis.com:projects:PROJECT_NUMBER:locations:global:pubsub",
          "Base/location": "global",
          "organization": "organizations/ORGANIZATION_NUMBER",
          "project": "projects/PROJECT_NUMBER"
        },
        "name": "urn:mcp:googleapis.com:projects:PROJECT_NUMBER:locations:global:pubsub",
        "labels": [
          "Base/agentregistry.googleapis.com/GoogleMcpServer",
          "Base/Resource",
          "Base/DiscoveredService",
          "Base/MCPServer"
        ],
        "context": {
          "type": "Base/agentregistry.googleapis.com/GoogleMcpServer"
        }
      }
    ]
  }
}

如需查看其他查询句式示例,请参阅查询模式示例。

查询句式示例

使用以下查询句式示例,帮助您构建自己的查询句式以运行查询。本部分中的所有示例均使用 JSON 格式。

包含实例组、网络和磁盘的虚拟机

查询实例组中具有网络和磁盘的 Compute Engine 实例。

该模式从 Base/compute.googleapis.com/Instance 开始,在顶层 neighbors 对象下有三个主要 edge 分支,用于定义以下条件:

  • 属于代管式实例组的实例
  • 具有已连接网络的实例
  • 具有 Persistent Disk 的实例

由于分支与 AND 合并,因此响应仅包含属于代管式实例组且同时具有网络和磁盘的实例。

{
  "startingNode": {
    "alias": "instance",
    "labelPropertiesPattern": {
      "labelMatcherExpr": "Base/compute.googleapis.com/Instance"
    }
  },
  "neighbors": [
    {
      "edge": {
        "direction": "FROM",
        "labelPropertiesPattern": {
          "labelMatcherExpr": "CONTAINS"
        }
      },
      "graph": {
        "startingNode": {
          "alias": "instance_group",
          "labelPropertiesPattern": {
            "labelMatcherExpr": "Base/compute.googleapis.com/InstanceGroup"
          }
        },
        "neighbors": [
          {
            "edge": {
              "direction": "FROM",
              "labelPropertiesPattern": {
                "labelMatcherExpr": "DEPENDS_ON"
              }
            },
            "graph": {
              "startingNode": {
                "alias": "instance_group_manager",
                "labelPropertiesPattern": {
                  "labelMatcherExpr": "Base/compute.googleapis.com/InstanceGroupManager"
                }
              }
            }
          }
        ]
      }
    },
    {
      "edge": {
        "direction": "TO",
        "labelPropertiesPattern": {
          "labelMatcherExpr": "DEPENDS_ON"
        }
      },
      "graph": {
        "startingNode": {
          "alias": "network",
          "labelPropertiesPattern": {
            "labelMatcherExpr": "Base/compute.googleapis.com/Network"
          }
        }
      }
    },
    {
      "edge": {
        "direction": "TO",
        "labelPropertiesPattern": {
          "labelMatcherExpr": "DEPENDS_ON"
        }
      },
      "graph": {
        "startingNode": {
          "alias": "disk",
          "labelPropertiesPattern": {
            "labelMatcherExpr": "Base/compute.googleapis.com/Disk"
          }
        }
      }
    }
  ]
}

智能体资源

使用来自 Agent Registry 的信息(包括智能体、MCP 服务器、端点和技能的数据)查询代理资源及其关系。

{
  "startingNode": {
    "alias": "resource",
    "labelPropertiesPattern": {
      "labelMatcherExpr": "Base/Agent OR Base/MCPServer OR Base/agentregistry.googleapis.com/Skill OR Base/agentregistry.googleapis.com/SkillRevision OR Base/agentregistry.googleapis.com/AiApplication OR Base/agentregistry.googleapis.com/GoogleMcpServer OR Base/agentregistry.googleapis.com/McpEnablement OR Base/agentregistry.googleapis.com/Publisher OR Base/agentregistry.googleapis.com/Binding OR Base/agentregistry.googleapis.com/Service OR Base/aiplatform.googleapis.com/Endpoint"
    }
  }
}

App Topology 支持两种类型的端点:

  • Base/aiplatform.googleapis.com/Endpoint 是 Gemini Enterprise Agent Platform 模型端点。
  • Base/Endpoint 是Agent Endpoint 的目标网址,也是 Agent Registry 服务 (Base/agentregistry.googleapis.com/Service) 上的标签。由于查询模式中包含 Base/agentregistry.googleapis.com/Service,因此 Agent Endpoint 会包含在查询响应结果中。

智能体流量

使用 Cloud Trace 中的数据查询代理与其他代理或 MCP 服务器之间的流量。每个边缘都包含错误率和 p95 延迟时间数据。

{
  "startingNode": {
    "alias": "agent",
    "labelPropertiesPattern": {
      "labelMatcherExpr": "Base/Agent"
    }
  },
  "neighbors": [
    {
      "edge": {
        "direction": "ANY",
        "labelPropertiesPattern": {
          "labelMatcherExpr": "Observability/SENDS_TRAFFIC"
        }
      },
      "graph": {
        "startingNode": {
          "alias": "peer",
          "labelPropertiesPattern": {
            "labelMatcherExpr": "Base/Agent OR Base/MCPServer"
          }
        }
      }
    }
  ]
}

后续步骤