用户指南

您可以使用提供的 Web 演示运行模拟,也可以直接调用 REST API。

输入和输出

输入和输出文件使用 Terraform 设置中的 Cloud Storage 存储分区。

输入目录必须包含 metrics_config.zippublisher_config.zip 文件。您可以根据需要定义其路径。

输出存储分区包含一个 simulations 目录,该目录按 ID 存储每个模拟。每个模拟目录都包含一个包含复制的输入文件的输入文件夹和一个输出文件夹。输出文件夹包含 bugreport、logcat 文件和生成的模拟器文件。

使用 Web 演示

该平台包含一个基于 Flutter 的 Web 应用 ,用于演示目的,可让您查看、创建和管理模拟。我们建议您构建自己的用户界面,以满足您的需求。

演示版应用部署到 App Engine ,需要用户使用 Google 账号登录。它使用在 Google Cloud 云项目中配置的 OAuth 2.0 客户端 ID 进行保护。登录的账号必须具有调用已部署 Cloud Functions 的 IAM 权限。如需了解如何向用户账号授予必要的权限(例如 Cloud Functions Invoker 角色 (roles/cloudfunctions.invoker)),请参阅管理对 Cloud Functions 的访问权限

用户工作流程

  1. 登录:您使用 Google 账号登录,并通过 OAuth 2.0 流程进行身份验证。
  2. 查看模拟:主页面通过查询 Firestore 数据库列出所有过去和当前的模拟 ,该数据库保存所有执行 信息。
  3. 创建模拟:您可以通过点击右下角的 + 操作按钮,转到表单以安排新的模拟 。您需要提供多个参数,包括输入路径、build ID 和实例类型。 如需了解详情,请参阅创建模拟
  4. 监控状态:模拟列表会更新,以显示 新模拟的状态(PENDINGRUNNINGCOMPLETED 等)。
  5. 查看结果:模拟完成后,您可以查看生成的 报告和工件。输入文件、输出报告、日志、Logcat 和 Bugreport 存储在 Cloud Storage 中。
  6. 删除模拟:您可以取消已安排或正在运行的模拟。

API 使用

如需实现自动化并与其他系统集成,您可以使用 REST API

身份验证部分和端点定义中使用的占位符 CLOUD_FUNCTION_URL 是指 被调用的 Cloud Functions 函数的基本网址。您可以在 Google Cloud 控制台的 Cloud Functions 页面上找到函数网址;每个函数的网址都会显示在其函数详情 页面的触发器 标签页上。或者,您也可以在运行 apply 命令后输出的 Terraform 输出中找到这些网址。

身份验证

所有 API 请求都必须使用 Identity 令牌 进行身份验证,以证明调用者的身份。身份(用户或服务账号)必须对目标函数具有 Cloud Functions Invoker 权限。

  • 1. 用户调用(本地和 CLI) 从本地机器或非 Google Cloud 环境调用 API 时,您必须使用为用户账号获取的 Google 颁发的 Identity 令牌

    TOKEN=$(gcloud auth print-identity-token)
    
  • **2. 服务账号调用(在 Google Cloud 中) 从 Google Cloud 资源(例如,Compute Engine 虚拟机、另一个 Cloud Functions 函数或 Kubernetes 集群)调用 API 时,您应使用资源所关联的服务账号 的身份。令牌应从资源的元数据服务器中提取。

    TOKEN=$(curl -s "http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/identity?audience=CLOUD_FUNCTION_URL" -H "Metadata-Flavor: Google")
    

将检索到的令牌作为 Bearer 令牌包含在请求的 Authorization 标头中。

端点

Cloud Telemetry Simulation 堆栈面向用户的端点可让您创建和删除模拟,或从数据库中读取模拟信息。

创建模拟

此端点会创建一个新的模拟请求并安排其执行。

  • 端点: POST https://CLOUD_FUNCTION_URL/simulation-orchestrator-receive-request
  • 请求正文

    {
      "build_id": "latest",
      "file_path": "inputs/my-test-case/",
      "instance_type": "n1-standard-8",
      "owner": "user@example.com",
      "max_simulation_time": 300,
      "max_report_count": 5
    }
    
    • build_id (字符串):要使用的代理 Docker 映像的标记(例如“latest”)。重要提示:此标记必须与 基础架构的允许映像映射中定义的标记(例如“latest”“stable”)匹配。如果在 Terraform 中定义了 SHA256 映射,系统会拒绝未知标记。
    • file_path (字符串):GCS 存储分区中包含 metrics_config.zippublisher_config.zip 的文件夹的路径。
    • instance_type(字符串):Compute Engine 机器类型。此类型必须支持嵌套虚拟化,例如 n1n2t2d 系列。如需了解详情,请参阅 嵌套虚拟化概览
    • owner(字符串):发起模拟的用户的电子邮件地址。
    • max_simulation_time (整数):模拟运行的最长时间(以 为单位)。
    • max_report_count (整数):模拟结束时的遥测报告数量。
  • 成功响应 (200 OK)

    { "id": "sim-a1b2c3d4e5f6" }
    

删除模拟

此端点会取消待处理或正在运行的模拟,并删除其关联的资源。

  • 端点: POST https://CLOUD_FUNCTION_URL/simulation-orchestrator-delete-simulation
  • 标头
    • Content-Type: application/json
  • 请求正文

    { "id": "sim-a1b2c3d4e5f6" }
    
  • 成功响应 (200 OK):一个空的 JSON 对象 {}

读取模拟数据

如需读取模拟数据,您可以与 simulation-reader 函数进行交互。 这些端点使用 GET 方法来检索历史记录、状态和系统配置。

1. 列出模拟

检索模拟的分页列表,并支持过滤和排序。

  • 端点: GET https://CLOUD_FUNCTION_URL/simulation-reader/simulations
  • 查询参数 (均为可选):

    • status(字符串):按模拟状态(runningSimulation request receivedcancelledcompleted)过滤。
    • owner(字符串):按所有者的电子邮件地址过滤。
    • sort_by (字符串):要排序的字段(received_atstatus_updated_atstarted_at)。默认为 received_at
    • sort_order(字符串):排序方向,ascdesc。默认为 desc
    • page_size(整数):每页的结果数。默认为 20。
    • page_token(字符串):用于提取下一页结果的令牌。
  • 请求示例

    curl -H "Authorization: Bearer $TOKEN"
    "https://CLOUD_FUNCTION_URL/simulation-reader/simulations?status=completed&owner=user@example.com&sort_by=status_updated_at"
    
  • 成功响应 (200 OK)

    • 返回一个 JSON 对象,其中包含模拟数组和一个可选的 next_page_token
    {
      "simulations": [
        {
          "id": "1234-abcd",
          "owner": "some@email.com",
          "status": "completed",
          "status_updated_at": "2025-12-05T14:50:00.952Z",
          "received_at": "2025-12-05T14:46:43.106Z",
          "started_at": "2025-12-05T14:47:05.848Z",
          "ended_at": "0001-01-01T00:00:00Z",
          "instance_id": "sim-1234-abcd",
          "ip": "10.156.15.230",
          "build_id": "europe-west3-docker.pkg.dev/your-project/simulation/simulation-agent:latest",
          "instance_type": "n1-standard-8",
          "file_path": "gs://your-project-simulation_files/path/",
          "max_simulation_time": 60,
          "max_report_count": 1
        },
        {
          "id": "5678-efgh",
          "owner": "some@email.com",
          "status": "completed",
          "status_updated_at": "2025-11-07T14:49:54.25Z",
          "received_at": "2025-11-07T14:46:54.959Z",
          "started_at": "2025-11-07T14:47:13.714Z",
          "ended_at": "0001-01-01T00:00:00Z",
          "instance_id": "sim-5678-efgh",
          "ip": "10.156.15.221",
          "build_id": "europe-west3-docker.pkg.dev/your-project/simulation/simulation-agent:latest",
          "instance_type": "n1-standard-8",
          "file_path": "gs://your-project-simulation_files/path/",
          "max_simulation_time": 60,
          "max_report_count": 1
        }
      ],
      "next_page_token": "M7bydGsAptLncj8SOCb1"
    }
    

**2. 获取特定模拟

按 ID 检索特定模拟的完整详细信息。

  • 端点

    GET https://CLOUD_FUNCTION_URL/simulation-reader/simulations/[SIMULATION_ID]
    
  • 成功响应 (200 OK):返回一个 JSON 对象,其中包含所请求模拟的详细信息 。

    {
      "id": "1234-abcd",
      "owner": "some@email.com",
      "status": "completed",
      "status_updated_at": "2025-12-05T14:50:00.952Z",
      "received_at": "2025-12-05T14:46:43.106Z",
      "started_at": "2025-12-05T14:47:05.848Z",
      "ended_at": "0001-01-01T00:00:00Z",
      "instance_id": "sim-1234-abcd",
      "ip": "10.156.15.230",
      "build_id": "europe-west3-docker.pkg.dev/your-project/simulation/simulation-agent:latest",
      "instance_type": "n1-standard-8",
      "file_path": "gs://your-project-simulation_files/path/",
      "max_simulation_time": 60,
      "max_report_count": 1
    }
    

3. 获取系统指标和配置

这些端点可让您深入了解模拟基础架构的当前负载和配置。

  • 获取运行计数:返回正在运行的模拟的计数。

    • 端点

      GET https://CLOUD_FUNCTION_URL/simulation-reader/simulations/running/count
      
    • 成功响应 (200 OK)

      {
        "count": 0
      }
      
  • 获取并发虚拟机数量上限:返回配置的 并发运行虚拟机数量上限。

    • 端点

      GET https://CLOUD_FUNCTION_URL/simulation-reader/config/max-running-vms
      
    • 成功响应 (200 OK)

      {
        "max_running_vms": 5
      }