使用 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 CLI,然后 使用联合身份登录 gcloud CLI。 登录后,运行以下命令来初始化 Google Cloud CLI:

    gcloud init

    REST

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

      安装 Google Cloud CLI,然后 使用联合身份登录 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"
          }
        }
      }
    }
  ]
}

后续步骤