监控虚拟机运行状况变化


本文档介绍了如何查看和读取代管式实例组 (MIG) 中虚拟机的运行状况变化日志条目,并提供了特定的用例来帮助您监控代管式实例组中的虚拟机。

如果您为 MIG 配置了基于应用的健康检查,则只要代管式实例的健康状况发生更改,Compute Engine 就会写入日志条目 - 例如,当实例从 HEALTHY 变为 UNHEALTHY 状态时。这些日志条目可帮助您监控和调试每个代管式实例的运行状况以及 MIG 的整体运行状况。

准备工作

  • 参阅设置健康检查和自动修复
  • 如果您尚未设置身份验证,请进行设置。身份验证是通过其进行身份验证以访问 Google Cloud 服务和 API 的过程。如需从本地开发环境运行代码或示例,您可以按如下方式向 Compute Engine 进行身份验证。

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

    控制台

    当您使用 Google Cloud 控制台访问 Google Cloud 服务和 API 时,无需设置身份验证。

    gcloud

    1. 安装 Google Cloud CLI,然后通过运行以下命令初始化 Google Cloud CLI:

      gcloud init
    2. 设置默认区域和可用区

    REST

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

      安装 Google Cloud CLI,然后通过运行以下命令初始化 Google Cloud CLI:

      gcloud init

价格

Compute Engine 使用 Cloud Logging 为代管式实例运行状况更改生成日志条目。Cloud Logging 每月为您提供一定的免费配额,之后日志条目按数据量计费。如需了解详情,请参阅 Cloud Logging 价格摘要

为避免记录费用,您可以停用运行状况更改日志。

查看运行状况更改日志

如果运行状况更改日志保持启用状态,则每当代管式实例的运行状况更改时,Compute Engine 都会将日志条目写入平台日志。您可以查看项目、特定 MIG 或特定代管式实例的这些日志。

查看项目或 MIG 的日志

如需查看项目或特定 MIG 的日志条目,请使用 Google Cloud 控制台、gcloud CLI 或 REST。

控制台

  1. 转到 Google Cloud 控制台中的日志浏览器

    转到日志浏览器

  2. 设置以下查询参数:

    • 资源 - GCE 实例组管理器
    • 日志名称 - instance_group_manager_events
  3. 或者,您可以在查询构建器中复制以下查询。

    resource.type="gce_instance_group_manager" AND
    logName="projects/PROJECT_ID/logs/compute.googleapis.com%2Finstance_group_manager_events" AND
    jsonPayload.instanceHealthStateChange:*
    

    您可以使用以下查询将搜索范围缩小到特定代管式实例组。

    resource.type="gce_instance_group_manager" AND
    logName="projects/PROJECT_ID/logs/compute.googleapis.com%2Finstance_group_manager_events" AND
    jsonPayload.instanceHealthStateChange:* AND
    resource.labels.instance_group_manager_name="MIG_NAME"
    
  4. 点击运行查询查询结果将显示日志。

gcloud

使用 gcloud logging read 命令查看和读取日志条目。

如需查看项目中的所有运行状况更改日志,请使用以下命令:

gcloud logging read 'resource.type="gce_instance_group_manager" AND
    logName="projects/PROJECT_ID/logs/compute.googleapis.com%2Finstance_group_manager_events" AND
    jsonPayload.instanceHealthStateChange:*'\
    --limit 10

如需查看特定代管式实例组的所有运行状况更改日志,请使用以下命令:

gcloud logging read 'resource.type="gce_instance_group_manager" AND
    logName="projects/PROJECT_ID/logs/compute.googleapis.com%2Finstance_group_manager_events" AND
    jsonPayload.instanceHealthStateChange:* AND
    resource.labels.instance_group_manager_name="MIG_NAME"' \
    --limit 10

请替换以下内容:

  • PROJECT_ID:您的项目 ID
  • MIG_NAME:您要查看其健康状况更改日志的 MIG。

REST

如需查看运行状况更改日志,请向 entries.list 方法发出 POST 请求。

如需查看项目中的所有运行状况更改日志,请使用以下命令:

curl -H "Content-Type: application/json" -H "Authorization: Bearer OAUTH2_TOKEN" -X POST -d \
'{"filter":
    "resource.type=gce_instance_group_manager AND
    logName=projects/PROJECT_ID/logs/compute.googleapis.com%2Finstance_group_manager_events AND
    jsonPayload.instanceHealthStateChange:*",
    "orderBy": "timestamp desc",
    "pageSize": 10,
    "resourceNames": ["projects/PROJECT_ID"]
}' https://logging.googleapis.com/v2/entries:list?alt=json

如需查看特定代管式实例组的运行状况更改日志,请使用以下命令:

curl -H "Content-Type: application/json" -H "Authorization: Bearer OAUTH2_TOKEN" -X POST -d \
'{"filter":
    "resource.type=gce_instance_group_manager AND
    logName=projects/PROJECT_ID/logs/compute.googleapis.com%2Finstance_group_manager_events AND
    jsonPayload.instanceHealthStateChange:* AND
    resource.labels.instance_group_manager_name=MIG_NAME",
    "orderBy": "timestamp desc",
    "pageSize": 10,
    "resourceNames": ["projects/PROJECT_ID"]
}' https://logging.googleapis.com/v2/entries:list?alt=json

请替换以下内容:

  • OAUTH2_TOKEN:您的应用的访问令牌。对于本地测试,您可以使用 gcloud auth print-access-token 命令生成令牌。
  • PROJECT_ID:您的项目 ID
  • MIG_NAME:您要查看其健康状况更改日志的 MIG。

如需详细了解每个日志条目,请参阅日志条目的格式

您可以将日志导出到 Cloud Storage、BigQuery 或 Pub/Sub 等目标位置,具体取决于您是要将日志归档、使用日志进行分析、将日志流式传输到其他应用,还是触发 Cloud Functions 函数。如需详细了解如何导出日志,请参阅日志导出概览

查看特定虚拟机的健康状况更改日志

如需查看特定代管式实例的日志条目,请使用 Google Cloud 控制台、gcloud CLI 或 REST。

控制台

  1. 转到 Google Cloud 控制台中的日志浏览器

    转到日志浏览器

  2. 查询构建器中复制以下查询。

    resource.type="gce_instance_group_manager" AND
    logName="projects/PROJECT_ID/logs/compute.googleapis.com%2Finstance_group_manager_events" AND
    jsonPayload.instanceHealthStateChange:* AND
    labels."compute.googleapis.com/instance_name"="INSTANCE_NAME"
    
  3. 点击运行查询

gcloud

使用 gcloud logging read 命令查看和读取日志条目。

如需查看代管式实例的运行状况更改日志,请使用以下命令:

gcloud logging read 'resource.type="gce_instance_group_manager" AND
    logName="projects/PROJECT_ID/logs/compute.googleapis.com%2Finstance_group_manager_events" AND
    jsonPayload.instanceHealthStateChange:* AND
    labels."compute.googleapis.com/instance_name"="INSTANCE_NAME"' \
    --limit 10

请替换以下内容:

  • PROJECT_ID:您的项目 ID
  • INSTANCE_NAME:要查看其运行状况更改日志的代管式实例。

REST

如需查看代管式实例的运行状况更改日志,请向 entries.list 方法发出 POST 请求。

curl -H "Content-Type: application/json" -H "Authorization: Bearer OAUTH2_TOKEN" -X POST -d \
'{"filter":
    "resource.type=gce_instance_group_manager AND
        logName=projects/PROJECT_ID/logs/compute.googleapis.com%2Finstance_group_manager_events AND
        jsonPayload.instanceHealthStateChange:* AND
        labels.\"compute.googleapis.com/instance_name\"=\"INSTANCE_NAME\"",
    "orderBy": "timestamp desc",
    "pageSize": 10,
    "resourceNames": ["projects/PROJECT_ID"]
}' https://logging.googleapis.com/v2/entries:list?alt=json

请替换以下内容:

  • OAUTH2_TOKEN:您的应用的访问令牌。对于本地测试,您可以使用 gcloud auth print-access-token 命令生成令牌。
  • PROJECT_ID:您的项目 ID
  • INSTANCE_NAME:要查看其运行状况更改日志的代管式实例。

日志条目的格式

实例运行状况更改日志条目包含对监控和调试代管式实例状态有用的信息。

这些日志写入日志名称为 instance_group_manager_events平台日志。平台日志可帮助您调试和排查问题。

logName="projects/PROJECT_ID/logs/compute.googleapis.com%2Finstance_group_manager_events"

运行状况更改日志条目包含以下类型的信息:

  • 大多数日志中显示的常规信息,例如严重性、项目 ID、MIG 名称和 ID、项目编号、时间戳等。
  • 特定于实例运行状况的字段。

在每个运行状况更改日志条目中,jsonPayload.instanceHealthStateChange 字段包含以下信息:

字段 说明
instance 实例的网址,具体取决于字符串项目 ID 和实例名称。
instanceWithId 实例的网址,具体取决于其数字项目 ID 和实例 ID。
ipAddress 实例的 IP 地址,由健康检查探测。
network 此实例的网络资源的网址,具体取决于字符串项目 ID 和网络名称。
networkWithId 此实例的网络资源的网址,具体取决于其数字项目 ID 和网络 ID。
healthCheck 为代管式实例组配置的健康检查的网址。
previousDetailedHealthState 实例之前的运行状况。如需查看可能的状态的列表,请参阅运行状况
detailedHealthState 实例的当前运行状况。如需查看可能的状态的列表,请参阅运行状况
notificationTime 运行状况更改时的时间戳。

布尔值类型的日志字段通常仅在其值为 true 时才会显示。如果某个布尔值字段的值为 false,则日志中将不会出现该字段。

日志字段强制采用 UTF-8 编码。非 UTF-8 字符将被替换为问号。

日志条目示例

以下示例展示了虚拟机实例的运行状况从 HEALTHY 更改为 UNHEALTHY

  {
    "logName": "projects/my-project/logs/compute.googleapis.com%2Finstance_group_manager_events",
    "resource": {
      "type": "gce_instance_group_manager",
      "labels": {
        "instance_group_manager_id": "3138236342290985981",
        "instance_group_manager_name": "my-mig",
        "project_id": "my-project",
        "location": "europe-west3"
      }
    },
    "labels": {
      "compute.googleapis.com/instance_id": "6498902454451155884",
      "compute.googleapis.com/instance_location": "europe-west3-a",
      "compute.googleapis.com/instance_name": "my-mig-a"
    },
    "timestamp": "2019-11-19T15:47:57.127Z",
    "severity": "INFO",
    "jsonPayload": {
      "@type": "type.googleapis.com/compute.InstanceGroupManagerEvent",
      "instanceHealthStateChange": {
        "instance": "projects/my-project/zones/europe-west3-a/instances/my-mig-a",
        "instanceWithId": "projects/123456/zones/europe-west3-a/instances/6498902454451155884",
        "ipAddress": "10.0.0.4",
        "network": "projects/my-project/global/networks/net-1",
        "networkWithId": "projects/123456/global/networks/456",
        "healthCheck": "projects/my-project/global/healthChecks/my-mig-health-check",
        "previousDetailedHealthState": "HEALTHY",
        "detailedHealthState": "UNHEALTHY",
        "notificationTime": "2019-11-19T15:47:56.444Z"
      }
    },
    "receiveTimestamp": "2019-11-19T15:47:57.296439184Z"
  }
  

使用场景

您可在以下监控或调试场景中使用运行状况更改日志:

  • 了解特定虚拟机实例在一段时间内的运行状况更改频率。
  • 评估 MIG 出现实例运行状况更改的频率。
  • 确定经常出现 UNHEALTHY 的故障虚拟机实例。
  • 找出导致自动修复尝试的原因。
  • 确定特定虚拟机实例的自动修复尝试是否成功。
  • 通过确定自动修复的相应初始延迟时间,微调应用的健康检查配置。

监控虚拟机的运行状况更改

通过创建指标来跟踪特定虚拟机的运行状况更改,您可以监控虚拟机实例的运行状况更改频率。

如需创建指标并监控更改,请执行以下操作:

  1. 转到 Google Cloud 控制台中的日志浏览器

    转到日志浏览器

  2. 查询构建器中输入以下查询,使用您的项目 ID 和实例名称。

    resource.type="gce_instance_group_manager" AND
    logName="projects/PROJECT_ID/logs/compute.googleapis.com%2Finstance_group_manager_events" AND
    jsonPayload.instanceHealthStateChange:* AND
    labels."compute.googleapis.com/instance_name"="INSTANCE_NAME"
    
  3. 查询结果部分中,点击操作,然后点击创建指标

  4. 创建日志指标页面上,执行以下操作:

    1. 指标类型设置为计数器
    2. 输入日志指标名称,例如 health-mig-xyzq

      构建过滤条件部分显示来自日志浏览器的日志查询。您还可以通过将 severity>=WARNING 添加到过滤条件,将指标的过滤条件配置为仅考虑中断性状态,例如 UNHEALTHYTIMEOUT

    3. 标签下,点击添加标签

    4. 输入标签名称,例如 health_state

    5. 标签类型设置为 STRING

    6. 字段名称设置为 jsonPayload.instanceHealthStateChange.detailedHealthState。这可让您区分不同的运行状况更改。

    7. 点击完成,添加标签。

    8. 点击创建指标

  5. 前往基于日志的指标页面,然后找到新创建的指标。

  6. 点击该指标所在行中的菜单 ,然后选择在 Metrics Explorer 中查看Metrics Explorer 会打开并显示一个图表,代表您在查询中指定的虚拟机实例的健康状况变化。

监控 MIG 中所有虚拟机的运行状况更改

您可以创建指标来跟踪代管式实例的运行状况更改,以监控所有代管式实例的运行状况更改。

如需创建指标并监控更改,请执行以下操作:

  1. 转到 Google Cloud 控制台中的日志浏览器

    转到日志浏览器

  2. 查询构建器中输入以下查询,使用您的项目 ID 和代管式实例组的名称。

    resource.type="gce_instance_group_manager" AND
    logName="projects/PROJECT_ID/logs/compute.googleapis.com%2Finstance_group_manager_events" AND
    jsonPayload.instanceHealthStateChange:* AND
    resource.labels.instance_group_manager_name="MIG_NAME"
    
  3. 查询结果部分中,点击操作,然后点击创建指标

  4. 创建日志指标页面上,执行以下操作:

    1. 指标类型设置为计数器
    2. 输入日志指标名称,例如 health-mig-xyzq
    3. 标签下,点击添加标签
    4. 输入标签名称,例如 health_state
    5. 标签类型设置为 STRING
    6. 字段名称设置为 jsonPayload.instanceHealthStateChange.detailedHealthState。这可让您区分不同的运行状况更改。
    7. 点击完成,添加标签。
    8. 点击创建指标
  5. 前往基于日志的指标页面,然后找到新创建的指标。

  6. 点击该指标所在行中的菜单 ,然后选择在 Metrics Explorer 中查看Metrics Explorer 会打开并显示一个图表,代表您在查询中指定的代管式实例组中的所有虚拟机实例的健康状况变化。

识别经常出现运行状况不佳情况的虚拟机

您可以通过创建指标来跟踪 MIG 中所有虚拟机实例的运行状况更改,并按实例对指标进行分组,找出经常变为 UNHEALTHY 的故障虚拟机。

要创建指标并按实例进行分组,请执行以下操作:

  1. 转到 Google Cloud 控制台中的日志浏览器

    转到日志浏览器

  2. 查询构建器中输入以下查询,使用您的项目 ID 和代管式实例组的名称。

    resource.type="gce_instance_group_manager" AND
    logName="projects/PROJECT_ID/logs/compute.googleapis.com%2Finstance_group_manager_events" AND
    jsonPayload.instanceHealthStateChange:* AND
    resource.labels.instance_group_manager_name="MIG_NAME"
    
  3. 查询结果部分中,点击操作,然后点击创建指标

  4. 创建日志指标页面上,执行以下操作:

    1. 指标类型设置为计数器
    2. 输入日志指标名称,例如 health-mig-xyzq
    3. 标签下,点击添加标签
    4. 输入标签名称,例如 health_state
    5. 标签类型设置为 STRING
    6. 字段名称设置为 jsonPayload.instanceHealthStateChange.detailedHealthState。这可让您区分不同的运行状况更改。
    7. 点击完成,添加标签。
    8. 同样,添加第二个标签(例如 instance),并将字段名称设置为 jsonPayload.instanceHealthStateChange.instance
    9. 点击创建指标
  5. 前往基于日志的指标页面,然后找到新创建的指标。

  6. 点击该指标所在行中的菜单 ,然后选择在 Metrics Explorer 中查看Metrics Explorer 会打开并显示一个图表,代表您在查询中指定的代管式实例组中的所有虚拟机实例的健康状况变化。

  7. 分组依据设置为 instance,查看每个实例的运行状况更改总数。

汇总的运行状况更改最多的实例是最常出现运行状况不佳情况的实例。

检查导致自动修复尝试的原因

您可以通过过滤给定虚拟机实例的 repair 操作日志来了解导致自动修复尝试的原因。

如需过滤修复操作,请执行以下操作:

  1. 转到 Google Cloud 控制台中的日志浏览器

    转到日志浏览器

  2. 查询构建器中输入以下查询,并使用您的项目 ID 和实例名称。

    resource.type="gce_instance" AND
    logName="projects/PROJECT_ID/logs/cloudaudit.googleapis.com%2Fsystem_event" AND
    protoPayload.methodName="compute.instances.repair.recreateInstance" AND
    protoPayload.resourceName=~"/INSTANCE_NAME$"
    
  3. 点击运行查询查询结果会显示虚拟机上所有的自动修复尝试,并在 protoPayload.status.message 中显示自动修复原因。

检查虚拟机自动修复是否成功

您可以通过按虚拟机实例名称过滤 repair 操作的日志和运行状况更改来确定虚拟机实例的自动修复尝试是否成功。在修复操作完成后,如果实例的运行状况更改为 HEALTHY,您将看到相应的运行状况更改日志。请执行以下步骤:

  1. 转到 Google Cloud 控制台中的日志浏览器

    转到日志浏览器

  2. 查询构建器中输入以下查询,并使用您的项目 ID 和实例名称。

    (resource.type="gce_instance" AND
    logName="projects/PROJECT_ID/logs/cloudaudit.googleapis.com%2Fsystem_event" AND
    protoPayload.methodName="compute.instances.repair.recreateInstance" AND
    protoPayload.resourceName=~"/INSTANCE_NAME$")
    OR
    (resource.type="gce_instance_group_manager" AND
    logName="projects/PROJECT_ID/logs/compute.googleapis.com%2Finstance_group_manager_events" AND
    jsonPayload.instanceHealthStateChange:* AND
    labels."compute.googleapis.com/instance_name"="INSTANCE_NAME")
    

    查询的第一部分显示实例修复操作,这些操作表示 MIG 自动修复触发了重新创建,以使实例运行状况恢复正常。查询的第二部分显示虚拟机实例的所有运行状况更改。

    查询结果中,如果运行状况更改事件的 detailedHealthState 在修复操作完成后很快设置为 HEALTHY,则该事件显示自动修复尝试成功。

确定 MIG 的初始延迟时间值

通过虚拟机实例运行状况日志记录,可轻松地确定 MIG 自动修复的相应初始延迟时间值。您可以使用日志来观察 instances.insert 操作完成与收到组中一组实例的第一个运行状况良好信号之间的时间。此时间间隔显示了实例完全启动所需的时间。由于某些虚拟机的启动速度可能低于其他虚拟机,因此 Google 建议在自动修复政策中指定初始延迟时间时,向观察到的初始化时间(从插入操作到出现运行状况良好状态之间的时间)添加某个时间差。

要衡量实例插入操作与实例出现运行状况良好状态之间的时间,请按虚拟机实例名称对 insert 操作和运行状况更改日志运行查询。在这两种操作中,使用时间戳来计算实例的初始化时间。请执行以下步骤:

  1. 转到 Google Cloud 控制台中的日志浏览器

    转到日志浏览器

  2. 查询构建器中输入以下查询,并使用您的项目 ID 和实例名称。

    (resource.type="gce_instance" AND
    logName="projects/PROJECT_ID/logs/cloudaudit.googleapis.com%2Factivity" AND
    protoPayload.request.@type="type.googleapis.com/compute.instances.insert" AND
    operation.last="true" AND
    protoPayload.resourceName=~"/INSTANCE_NAME$") OR
    (resource.type="gce_instance_group_manager" AND
    logName="projects/PROJECT_ID/logs/compute.googleapis.com%2Finstance_group_manager_events" AND
    jsonPayload.instanceHealthStateChange:* AND
    labels."compute.googleapis.com/instance_name"="INSTANCE_NAME")
    

    查询的第一部分显示了虚拟机插入操作的完成情况。第二部分显示虚拟机的所有运行状况更改。

    查询结果中,如果运行状况更改事件的 detailedHealthState 在插入操作完成后很快设置为 HEALTHY,则该事件的时间戳显示了此虚拟机启动所需的时间。

  3. 对更多虚拟机重复上述步骤,以获取初始延迟时间参数的更优近似值。