使用 Eventarc 将 Datadog 监控提醒路由到 Google Cloud(第 2 部分)

1. 简介

cb762f29e9183a3f.png 3c7ca8629bc25d9c.png 1c05e3d0c2bd2b45.png

借助 Eventarc,您可以轻松地将 Google Cloud 服务与来自各种来源的事件相关联。它可让您构建微服务松散耦合且分布式的事件驱动型架构。它还会为您处理事件提取、传送、安全、授权和错误处理,从而提高开发者的敏捷性和应用弹性。

Datadog 是一个云应用监控和安全平台。它将端到端跟踪记录、指标和日志整合在一起,让您的应用、基础架构和第三方服务可观测。

Workflows 是一个全托管式编排平台,该平台会按照您定义的顺序执行服务,即工作流。这些工作流可以组合 Cloud Run 或 Cloud Functions 上托管的服务、Google Cloud 服务(如 Cloud Vision AI 和 BigQuery)以及任何基于 HTTP 的 API。

第一个 Codelab 中,您学习了如何使用 Eventarc 将 Datadog 监控提醒路由到 Google Cloud。在此第二个 Codelab 中,您将学习如何使用工作流响应 Datadog 监控提醒。更具体地说,您将创建 2 个 Compute Engine 虚拟机,并使用 Datadog 监控器对其进行监控。删除其中一个虚拟机后,您将通过 Eventarc 从 Datadog 收到有关 Workflows 的提醒。然后,工作流会重新创建已删除的虚拟机,使正在运行的虚拟机数量恢复为 2。

学习内容

  • 如何启用 Datadog 的 Google Cloud 集成。
  • 如何创建工作流来检查和创建 Compute Engine 虚拟机。
  • 如何使用 Eventarc 将 Datadog 监控提醒连接到工作流。
  • 如何创建 Datadog 监控器并在虚拟机被删除时发出提醒。

2. 设置和要求

自定进度的环境设置

  1. 登录 Google Cloud 控制台,然后创建一个新项目或重复使用现有项目。如果您还没有 Gmail 或 Google Workspace 账号,则必须创建一个

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • 项目名称是此项目参与者的显示名称。它是 Google API 尚未使用的字符串,您可以随时对其进行更新。
  • 项目 ID 在所有 Google Cloud 项目中必须是唯一的,并且不可变(一经设置便无法更改)。Cloud Console 会自动生成一个唯一字符串;通常情况下,您无需关注该字符串。在大多数 Codelab 中,您都需要引用项目 ID(它通常标识为 PROJECT_ID),因此如果您不喜欢某个 ID,请再生成一个随机 ID,还可以尝试自己创建一个,并确认是否可用。然后,项目创建后,ID 会处于“冻结”状态。
  • 第三个值是一些 API 使用的项目编号。如需详细了解所有这三个值,请参阅文档
  1. 接下来,您需要在 Cloud Console 中启用结算功能,才能使用 Cloud 资源/API。运行此 Codelab 应该不会产生太多的费用(如果有费用的话)。要关闭资源以避免产生超出本教程范围的费用,请按照此 Codelab 末尾提供的任何“清理”说明操作。Google Cloud 的新用户符合参与 $300 USD 免费试用计划的条件。

启动 Cloud Shell

虽然可以通过笔记本电脑对 Google Cloud 进行远程操作,但在此 Codelab 中,您将使用 Google Cloud Shell,这是一个在云端运行的命令行环境。

Google Cloud 控制台 中,点击右上角工具栏中的 Cloud Shell 图标:

55efc1aaa7a4d3ad.png

预配和连接到环境应该只需要片刻时间。完成后,您应该会看到如下内容:

7ffe5cbb04455448.png

这个虚拟机已加载了您需要的所有开发工具。它提供了一个持久的 5GB 主目录,并且在 Google Cloud 中运行,大大增强了网络性能和身份验证功能。只需一个浏览器,即可完成本实验中的所有工作。

设置 gcloud

在 Cloud Shell 中,设置您的项目 ID 并将其保存为 PROJECT_ID 变量。

此外,还要将 REGION 变量设置为 us-central1。这是您稍后将在其中创建资源的区域。

PROJECT_ID=[YOUR-PROJECT-ID]
REGION=us-central1
gcloud config set core/project $PROJECT_ID

启用 API

启用所有必要的服务:

gcloud services enable \
  workflows.googleapis.com \
  workflowexecutions.googleapis.com

3. 验证 Datadog 渠道

确保您在第一个 Codelab 中创建的 Datadog 渠道处于有效状态。在 Cloud Shell 中,运行以下命令以检索频道的详细信息:

CHANNEL_NAME=datadog-channel
gcloud eventarc channels describe $CHANNEL_NAME --location $REGION

输出应类似如下所示:

activationToken: so5g4Kdasda7y2MSasdaGn8njB2
createTime: '2022-03-09T09:53:42.428978603Z'
name: projects/project-id/locations/us-central1/channels/datadog-channel
provider: projects/project-id/locations/us-central1/providers/datadog
pubsubTopic: projects/project-id/topics/eventarc-channel-us-central1-datadog-channel-077
state: ACTIVE
uid: 183d3323-8cas-4e95-8d72-7d8c8b27cf9e
updateTime: '2022-03-09T09:53:48.290217299Z'

您还可以在 Google Cloud 控制台中查看渠道状态:

8399d528ccbd4c20.png

渠道状态应为 ACTIVE。如果未显示,请返回到第一个 Codelab,然后按照相应步骤创建并激活与 Datadog 的渠道。

4. 启用 Datadog 的 Google Cloud 集成

如需使用 Datadog 监控项目,您需要启用 Datadog 所需的 API、创建服务账号,并将该服务账号连接到 Datadog。

为 Datadog 启用 API

gcloud services enable compute.googleapis.com \
  cloudasset.googleapis.com \
  monitoring.googleapis.com

创建服务账号

Datadog 的 Google Cloud 集成使用服务账号来调用 Cloud Logging API,以从 Compute Engine 实例收集节点级指标。

为 Datadog 创建服务账号:

DATADOG_SA_NAME=datadog-service-account

gcloud iam service-accounts create $DATADOG_SA_NAME \
    --display-name "Datadog Service Account"

通过授予以下 IAM 角色,使 Datadog 服务账号能够收集指标、标记、事件和用户标签:

DATADOG_SA_EMAIL=$DATADOG_SA_NAME@$PROJECT_ID.iam.gserviceaccount.com

gcloud projects add-iam-policy-binding $PROJECT_ID \
    --member serviceAccount:$DATADOG_SA_EMAIL \
    --role roles/cloudasset.viewer

gcloud projects add-iam-policy-binding $PROJECT_ID \
    --member serviceAccount:$DATADOG_SA_EMAIL \
    --role roles/compute.viewer

gcloud projects add-iam-policy-binding $PROJECT_ID \
    --member serviceAccount:$DATADOG_SA_EMAIL \
    --role roles/monitoring.viewer

创建并下载服务账号密钥。您需要密钥文件才能完成与 Datadog 的集成。

在 Cloud Shell 主目录中创建服务账号密钥文件:

gcloud iam service-accounts keys create ~/key.json \
  --iam-account $DATADOG_SA_EMAIL

在 Cloud Shell 中,点击 More ⁝,然后选择 Download File。在 File path 字段中,输入 key.json。如需下载密钥文件,请点击 Download

将服务账号关联到 Datadog

在 Datadog 账号中,前往 Integrations 部分,然后搜索 Google Cloud 集成图块:

cf1ffa6547fba3e4.png

将光标悬停在 Google Cloud Platform 上,前往 Install 页面:

31b365a31bc50cc8.png

通过在 Upload Private Key File 部分上传服务账号密钥,然后点击 Install Integration 来安装集成:

92e475e4da7f826.png

完成集成后,Datadog 会在 Dashboards 下自动创建多个与 Google Cloud 相关的信息中心:

66fdf2d26e4710d.png

5. 创建 Compute Engine 虚拟机

接下来,创建一些 Compute Engine 虚拟机 (VM)。您将使用 Datadog 监控器监控这些虚拟机,并使用 Google Cloud 中的工作流响应 Datadog 提醒。

创建 2 个 Compute Engine 虚拟机:

gcloud compute instances create instance-1 instance-2 --zone us-central1-a

您应该会在 Cloud 控制台中看到创建并运行的虚拟机。过一段时间(通常为 10 分钟)后,您还应该会在 Datadog 中看到这些虚拟机,具体位于 Dashboards 下的 Google Compute Engine 信息中心内:

78a51374c1d0c11e.png

6. 创建工作流

现在,您已经有 2 个正在运行的虚拟机,接下来创建一个工作流,用于响应来自 Datadog 监控器的提醒。工作流可以根据您的需求变得非常复杂,但在本例中,工作流将检查正在运行的虚拟机实例数量,如果该数量低于 2,则会创建新的虚拟机实例,以确保始终有 2 个虚拟机在运行。

创建一个包含以下内容的 workflow-datadog2.yaml 文件:

main:
  params: [event]
  steps:
  - init:
      assign:
      - projectId: ${sys.get_env("GOOGLE_CLOUD_PROJECT_ID")}
      - zone: "us-central1-a"
      - minInstanceCount: 2
      - namePattern: "datadog-instance-##"
  - listInstances:
      call: googleapis.compute.v1.instances.list
      args:
        project: ${projectId}
        zone: ${zone}
      result: listResult
  - getInstanceCount:
      steps:
          - initInstanceCount:
              assign:
                - instanceCount: 0
          - setInstanceCount:
              switch:
                - condition: ${"items" in listResult}
                  steps:
                    - stepA:
                        assign:
                          - instanceCount: ${len(listResult.items)}
  - findDiffInstanceCount:
      steps:
        - assignDiffInstanceCount:
            assign:
              - diffInstanceCount: ${minInstanceCount - instanceCount}
        - logDiffInstanceCount:
            call: sys.log
            args:
              data: ${"instanceCount->" + string(instanceCount) + " diffInstanceCount->" + string(diffInstanceCount)}
        - endEarlyIfNeeded:
            switch:
              - condition: ${diffInstanceCount < 1}
                next: returnResult
  - bulkInsert:
      call: googleapis.compute.v1.instances.bulkInsert
      args:
          project: ${projectId}
          zone: ${zone}
          body:
              count: ${diffInstanceCount}
              namePattern: ${namePattern}
              instanceProperties:
                  machineType: "e2-micro"
                  disks:
                  - autoDelete: true
                    boot: true
                    initializeParams:
                      sourceImage: projects/debian-cloud/global/images/debian-10-buster-v20220310
                  networkInterfaces:
                  - network: "global/networks/default"
      result: bulkInsertResult
  - returnResult:
      return: ${bulkInsertResult}

请注意,工作流正在接收一个事件作为参数。此事件将通过 Eventarc 从 Datadog 监控中发出。收到事件后,工作流会检查正在运行的实例数量,并根据需要创建新的虚拟机实例。

部署工作流:

WORKFLOW_NAME=workflow-datadog2
gcloud workflows deploy $WORKFLOW_NAME \
  --source workflow-datadog2.yaml \
  --location $REGION

工作流已部署,但尚未运行。当收到 Datadog 提醒时,它将由 Eventarc 触发器执行。

7. 创建 Eventarc 触发器

现在,您可以使用 Eventarc 触发器将 Datadog 提供方的事件连接到工作流。您将使用在第一个 Codelab 中设置的频道和服务账号。

创建具有 Datadog 渠道、事件类型和工作流目的地的触发器:

PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID --format='value(projectNumber)')

gcloud eventarc triggers create datadog-trigger2 \
  --location $REGION \
  --destination-workflow $WORKFLOW_NAME \
  --destination-workflow-location $REGION \
  --channel $CHANNEL_NAME \
  --event-filters type=datadog.v1.alert \
  --service-account $PROJECT_NUMBER-compute@developer.gserviceaccount.com

您可以列出触发器,以查看新创建的触发器是否处于有效状态:

gcloud eventarc triggers list --location $REGION

NAME: datadog-trigger2
TYPE: datadog.v1.alert
DESTINATION: Workflows: workflow-datadog2
ACTIVE: Yes

8. 创建 Datadog 监控器

现在,您将创建一个 Datadog 监控器并将其连接到 Eventarc。

监控器将检查正在运行的 Compute Engine 虚拟机的数量,并在该数量低于 2 时发出提醒。

如需在 Datadog 中创建监控器,请登录 Datadog。将光标悬停在主菜单中的 Monitors 上,然后点击子菜单中的 New Monitor。显示器类型有很多种。选择 Metric 监控器类型。

New Monitor 页面中,创建具有以下内容的监控工具:

  1. 选择检测方法:Threshold
  2. 定义指标:gcp.gce.instance.is_running(所有位置)sum by(所有内容)
  3. 设置提醒条件:
  4. 在过去 5 minutes 内,当指标达到阈值 at least oncebelow 时触发
  5. 提醒阈值:< 2
  6. 通知您的团队:@eventarc_<your-project-id>_<your-region>_<your-channel-name>
  7. 监控器名称示例:Compute Engine instances < 2

现在,点击底部的 Create 以创建监控器。

9. 测试监控器和触发器

为了测试 Datadog 监控器、Eventarc 触发器以及最终的工作流,您将删除其中一个虚拟机:

gcloud compute instances delete instance-2 --zone us-central1-a

几秒钟后,您应该会在 Google Cloud 控制台中看到实例已删除。

此更改需要过一段时间才会显示在 Datadog 中。过一段时间(通常为 10 分钟)后,您应该会在 Datadog 中看到以下监控器,用于在 Manage Monitors 部分下检测并提醒此问题:

50f93d560b6c1973.png

Datadog 监控器发出提醒后,您应该会看到该提醒通过 Eventarc 发送到工作流。如果您检查 Workflows 的日志,应该会看到 Workflows 会检查当前实例数与预期实例数之间的差异:

2022-03-28 09:30:53.371 BST instanceCount->1 diffInstanceCount->1

它会通过创建带有 datadog-instance-## 前缀的新虚拟机实例来响应该提醒。

最后,您的项目中仍会有 2 个虚拟机,一个最初由您创建,另一个由工作流在 Datadog 提醒后创建!

11e42028e7142690.png

10. 恭喜

恭喜,您已完成此 Codelab!

所学内容

  • 如何启用 Datadog 的 Google Cloud 集成。
  • 如何创建工作流来检查和创建 Compute Engine 虚拟机。
  • 如何使用 Eventarc 将 Datadog 监控提醒连接到工作流。
  • 如何创建 Datadog 监控器并在虚拟机被删除时发出提醒。