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

1. 简介

cb762f29e9183a3f.png 3c7ca8629bc25d9c 1c05e3d0c2bd2b45

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

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

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

第一个 Codelab 中,您学习了如何使用 Eventarc 将 Datadog 监控提醒路由到 Google Cloud。在第二个 Codelab 中,您将学习如何使用 Workflows 响应 Datadog 监控提醒。具体而言,您将创建 2 个 Compute Engine 虚拟机,并使用 Datadog 监控器监控它们。删除其中一个虚拟机后,您会收到 Datadog 通过 Eventarc 发送到 Workflows 的提醒。接着,Workflows 会重新创建已删除的虚拟机,将正在运行的虚拟机数量恢复为 2 个。

学习内容

  • 如何启用 Datadog 的 Google Cloud 集成。
  • 如何创建工作流以检查和创建 Compute Engine 虚拟机。
  • 如何使用 Eventarc 将 Datadog 监控提醒与 Workflows 相关联。
  • 如何创建 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

通道状态应为 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

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

92e475e4da7f826

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

66fdf2d26e4710d

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

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 提供程序的事件连接到 Workflows。您将使用在第一个 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. 定义指标:从(所有)sum by(所有)gcp.gce.instance.is_running
  3. 设置提醒条件:
  4. 当指标在过去 5 minutesbelow达到阈值 at least once 时触发
  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

Datadog 监控提醒后,您应该会看到该提醒通过 Eventarc 转至 Workflows。如果您检查 Workflows 的日志,应该会看到 Workflows 检查当前实例数和预期实例数之间的差异:

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

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

最终,您的项目仍然有 2 个虚拟机,一个是最初创建的,另一个是在 Datadog 提醒出现后由 Workflows 创建的!

11e42028e7142690

10. 恭喜

恭喜,您已完成此 Codelab!

所学内容

  • 如何启用 Datadog 的 Google Cloud 集成。
  • 如何创建工作流以检查和创建 Compute Engine 虚拟机。
  • 如何使用 Eventarc 将 Datadog 监控提醒与 Workflows 相关联。
  • 如何创建 Datadog 监控并在虚拟机删除时发出提醒。