

# CloudWatch 解决方案：Amazon EC2 上的 Kafka 工作负载
<a name="Solution-Kafka-On-EC2"></a>

此解决方案可帮助您使用 CloudWatch 代理为在 EC2 实例上运行的 Kafka 工作负载（代理、生产者和消费者）配置开箱即用的指标收集。此外，它还可以帮助您设置预配置的 CloudWatch 控制面板。有关所有 CloudWatch 可观测性解决方案的一般信息，请参阅 [CloudWatch 可观测性解决方案](Monitoring-Solutions.md)。

**Topics**
+ [要求](#Solution-Kafka-On-EC2-Requirements)
+ [优势](#Solution-Kafka-On-EC2-Benefits)
+ [成本](#Solution-Kafka-On-EC2-Costs)
+ [此解决方案的 CloudWatch 代理配置](#Solution-Kafka-CloudWatch-Agent)
+ [为您的解决方案部署代理](#Solution-Kafka-Agent-Deploy)
+ [创建 Kafka 解决方案控制面板](#Solution-Kafka-Dashboard)
+ [为同一实例上的多个 Kafka 角色配置代理](#Kafka-Multiple-Roles)

## 要求
<a name="Solution-Kafka-On-EC2-Requirements"></a>

此解决方案适用于以下情况：
+ 工作负载：Kafka v0.8.2.x 及更高版本
+ 计算：Amazon EC2
+ 在给定的 AWS 区域中跨所有 Kafka 工作负载支持最多 500 个 EC2 实例
+ 最新版本的 CloudWatch 代理
+ EC2 实例上已安装 SSM 代理
**注意**  
AWS Systems Manager（SSM Agent）预装在由 AWS 和受信任的第三方提供的一些[亚马逊机器映像（AMI）](https://docs.aws.amazon.com/systems-manager/latest/userguide/ami-preinstalled-agent.html)上。如果未安装代理，您可以根据操作系统类型使用程序手动安装。  
[在适用于 Linux 的 EC2 实例上手动安装和卸载 SSM 代理](https://docs.aws.amazon.com/systems-manager/latest/userguide/manually-install-ssm-agent-linux.html)
[在适用于 macOS 的 EC2 实例上手动安装和卸载 SSM 代理](https://docs.aws.amazon.com/systems-manager/latest/userguide/manually-install-ssm-agent-macos.html)
[在适用于 Windows Server 的 EC2 实例上手动安装和卸载 SSM 代理](https://docs.aws.amazon.com/systems-manager/latest/userguide/manually-install-ssm-agent-windows.html)

## 优势
<a name="Solution-Kafka-On-EC2-Benefits"></a>

该解决方案提供 Kafka 服务器监测，为以下用例提供宝贵的见解：
+ 通过复制和同步指标监测 Kafka 集群的运行状况。
+ 通过请求失败和延迟以及网络流量来跟踪代理性能。
+ 监测生产者/消费者错误、延迟和消费者延迟。
+ 分析 Kafka 集群的底层 JVM 性能。
+ 在同一账户下通过解决方案配置的多个 Kafka 集群、生产者和消费者之间切换。

以下是该解决方案的主要优点：
+ 使用 CloudWatch 代理配置自动收集 Kafka 和底层 JVM 指标，无需手动检测。
+ 为 Kafka 和 JVM 指标提供预配置的整合 CloudWatch 控制面板。控制面板将自动处理使用该解决方案配置的新 Kafka EC2 实例的指标，即使这些指标在您首次创建控制面板时不存在。它还允许您将指标分组为逻辑应用程序，以便于关注和管理。

下图是此解决方案控制面板的示例。

![\[Kafka 集群 dashboard showing metrics for partitions, producer/consumer performance, and broker status.\]](http://docs.aws.amazon.com/zh_cn/AmazonCloudWatch/latest/monitoring/images/KafkaDashboard.png)


## 成本
<a name="Solution-Kafka-On-EC2-Costs"></a>

此解决方案在您的账户中创建和使用资源。您需要为标准使用量付费，包括以下各项：
+ CloudWatch 代理收集的所有指标按自定义指标收费。此解决方案使用的指标数量取决于 EC2 主机的数量。
  + 为解决方案配置的每台代理主机发布 33 个指标，外加一个指标（`disk_used_percent`），每台 EC2 主机的指标数量取决于该主机的磁盘路径数量。
  + 为该解决方案配置的每台生产者主机都会发布三个具有 `topic` 维度的指标和三个没有 `topic` 维度的指标。对于具有 `topic` 维度的指标，每个主题都算作一个单独的指标。
  + 为该解决方案配置的每台消费者主机都会发布两个具有 `topic` 维度的指标和三个没有 `topic` 维度的指标。对于具有 topic 维度的指标，每个主题都算作一个单独的指标。
+ 一个自定义控制面板。
+ CloudWatch 代理请求用于发布指标的 API 操作。使用此解决方案的默认配置，CloudWatch 代理每分钟为每台 EC2 主机调用一次 **PutMetricData**。这意味着每台 EC2 主机将在 30 天（一个月）内调用 **PutMetricData** API `30*24*60=43,200` 次。

有关 CloudWatch 定价的信息，请参阅 [Amazon CloudWatch 定价](https://aws.amazon.com/cloudwatch/pricing/)。

定价计算器可帮助您估算使用此解决方案的每月大致费用。

**使用定价计算器估算每月解决方案成本**

1. 打开 [Amazon CloudWatch 定价计算器](https://calculator.aws/#/createCalculator/CloudWatch)。

1. 在**指标**部分中，对于**指标数量**，输入 **broker\$1metrics\$1count \$1 producer\$1metrics\$1count \$1 consumer\$1metrics\$1count**。按如下方式计算这些指标：
   + `broker_metrics_count` = (33 \$1 每台 EC2 主机的平均磁盘路径数) \$1 number\$1of\$1ec2\$1broker\$1hosts 
   + `producer_metrics_count` = (3 \$1 average\$1number\$1of\$1topics\$1per\$1producer\$1host \$1 3) \$1 number\$1of\$1ec2\$1producer\$1hosts 
   + `consumer_metrics_count` = (2 \$1 average\$1number\$1of\$1topics\$1per\$1consumer\$1host \$1 3) \$1 number\$1of\$1ec2\$1consumer\$1hosts 

1. 在 **API** 部分中，对于 **API 请求的数量**，输入 **43200 \$1 number of EC2 instances configured for this solution**。

   默认情况下，CloudWatch 代理每分钟为每台 EC2 主机执行一次 **PutMetricData** 操作。

1. 在**控制面板和警报**部分中，对**控制面板数量**输入 **1**。

1. 您可以在定价计算器底部查看每月估算成本。

## 此解决方案的 CloudWatch 代理配置
<a name="Solution-Kafka-CloudWatch-Agent"></a>

CloudWatch 代理是在您的服务器和容器化环境中持续自主运行的软件。它从您的基础设施和应用程序收集指标、日志和跟踪，并将其发送到 CloudWatch 和 X-Ray。

有关 CloudWatch 代理的更多信息，请参阅[使用 CloudWatch 代理采集指标、日志和跟踪数据](Install-CloudWatch-Agent.md)。

此解决方案中的代理配置收集 Kafka、JVM 和 EC2 的基础指标。可以将 CloudWatch 代理配置为收集比控制面板默认显示更多的 Kafka 和 JVM 指标。有关您可以收集的所有 Kafka 指标的列表，请参阅 [收集 Kafka 指标](CloudWatch-Agent-JMX-metrics.md#CloudWatch-Agent-Kafka-metrics)。有关您可以收集的所有 JVM 指标的列表，请参阅 [收集 JVM 指标](CloudWatch-Agent-JMX-metrics.md#CloudWatch-Agent-JVM-metrics)。有关 EC2 指标的列表，请参阅 [Linux 和 macOS 实例上的 CloudWatch 代理收集的指标](metrics-collected-by-CloudWatch-agent.md#linux-metrics-enabled-by-CloudWatch-agent)。

**公开 Kafka 代理、生产者和消费者角色的 JMX 端口**

CloudWatch 代理依靠 JMX 来收集与 Kafka 代理、生产者和消费者相关的指标。要做到这一点，必须在服务器和应用程序上公开 JMX 端口。

对于 Kafka 代理，您必须使用 `JMX_PORT` 环境变量来设置端口。设置此环境变量后，必须重启代理。查看应用程序的起始脚本和配置文件，找到添加这些参数的最佳位置。

例如，对于 Linux 和 macOS 系统，您可以使用以下命令来设置 JMX 端口。请务必指定未使用的端口号。

```
export JMX_PORT=port-number
```

对于 Kafka 生产者和消费者，公开 JMX 端口的说明取决于您在生产者或消费者 JVM 应用程序中使用的工作负载类型。有关这些说明，请参阅应用程序的文档。

通常，要启用 JMX 端口进行监测和管理，需要为 JVM 应用程序设置以下系统属性。以下示例设置未经身份验证的 JMX。如果您的安全策略/要求需要使用密码身份验证启用 JMX 或 SSL 进行远程访问，请参阅 [JMX 文档](https://docs.oracle.com/en/java/javase/17/management/monitoring-and-management-using-jmx-technology.html)以设置所需的属性。

```
-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=port-number
-Dcom.sun.management.jmxremote.authenticate=false 
-Dcom.sun.management.jmxremote.ssl=false
```

要验证 JMX 端口，请运行 `ps aux | grep jmxremote.port`。结果应显示已在 JVM 进程上设置了 JMX 端口。

**此解决方案的代理配置**

代理收集的指标在代理配置中定义。该解决方案提供代理配置，以收集建议的指标，并为解决方案的控制面板提供合适的维度。每个 Kafka 角色（例如代理、生产者或消费者）都有自己的代理配置，可以收集 Kafka 指标以及底层 JVM 和 EC2 指标。

稍后将在[为您的解决方案部署代理](#Solution-Kafka-Agent-Deploy)中介绍部署解决方案的步骤。以下信息旨在帮助您了解如何针对环境自定义代理配置。

您必须针对自己的环境自定义以下代理配置的某些部分：
+ JMX 端口号是您在本文档上一节中配置的端口号。端口号位于配置的 `endpoint` 行中。
+ `ClusterName`：此项用作收集的代理指标的维度。提供一个有意义的名称，代表运行 Kafka 代理的实例的集群分组。
+ `ProcessGroupName`：此项用作为代理收集的 JVM 指标的维度。提供与 `ClusterName` 相同的值。这样便可在解决方案控制面板中查看与代理指标相同的 Kafka 代理组的 JVM 指标。
+ `ProducerGroupName`：此项用作收集的生产者指标的维度。提供一个有意义的名称，代表生产者实例的组。对于此值，您可以指定要用于解决方案控制面板中生产者指标组合视图的生产者应用程序或服务。
+ `ConsumerGroupName`：此项用作收集的消费者指标的维度。提供一个有意义的名称，代表消费者实例的组。这与 Kafka 中的消费者组概念不同。这只是一个分组维度，您可以在其中指定要用于解决方案控制面板中消费者指标组合视图的消费者应用程序或服务 

例如，如果您在同一个账户中运行两个 Kafka 集群，一个用于 `order-processing` 应用程序，另一个用于 `inventory-management` 应用程序，则应在代理实例的代理配置中相应地设置 `ClusterName` 和 `ProcessGroupName` 维度。
+ 对于 `order-processing` 集群代理实例，设置 `ClusterName=order-processing` 和 `ProcessGroupName=order-processing`。
+ 对于 `inventory-management` 集群代理实例，设置 `ClusterName=inventory-management` 和 `ProcessGroupName=inventory-management`。
+ 同样，根据各自的应用程序，为生产者实例设置 `ProducerGroupName`，为消费者实例设置 `ConsumerGroupName`。

正确设置上述维度后，解决方案控制面板将根据 `ClusterName`、`ProducerGroupName` 和 `ConsumerGroupName` 维度自动对指标进行分组。控制面板将包括下拉选项，用于选择和查看特定集群和组的指标，从而允许您单独监测各个集群和组的性能。

请务必将相关的代理配置部署到正确的 EC2 实例。每个配置都将作为单独参数存储在 SSM 的 Parameter Store 中，稍后将在[步骤 2：在 Systems Manager Parameter Store 中存储建议的 CloudWatch 代理配置文件](#Solution-Kafka-Agent-Step2)中详细介绍。

以下说明介绍将生产者、消费者和代理角色部署到不同的 EC2 实例而不存在任何重叠的情况。如果您在同一 EC2 实例上运行多个 Kafka 角色，请参阅[为同一实例上的多个 Kafka 角色配置代理](#Kafka-Multiple-Roles)了解更多信息。

### Kafka 代理的代理配置
<a name="Solution-Kafka-Agent-Broker"></a>

在部署 Kafka 代理的 EC2 实例上使用以下 CloudWatch 代理配置。将 *ClusterName* 替换为用于将这些指标分组以获得统一视图的集群名称。您为 *ClusterName* 指定的值用作 `ClusterName` 维度和 `ProcessGroupName` 维度。将 *port-number* 替换为 Kafka 服务器的 JMX 端口。如果 JMX 启用了密码身份验证或 SSL 进行远程访问，请参阅 [收集 Java 管理扩展（JMX）指标](CloudWatch-Agent-JMX-metrics.md)，了解有关根据需要设置 TLS 或授权的信息。

此配置（在 JMX 区块之外显示的配置）中显示的 EC2 指标仅适用于 Linux 和 macOS 实例。如果您使用的是 Windows 实例，则可以选择在配置中省略这些指标。有关在 Windows 实例上收集的指标的信息，请参阅 [Windows Server 实例上的 CloudWatch 代理收集的指标](metrics-collected-by-CloudWatch-agent.md#windows-metrics-enabled-by-CloudWatch-agent)。

```
{
  "metrics": {
    "namespace": "CWAgent",
    "append_dimensions": {
      "InstanceId": "${aws:InstanceId}"
    },
    "metrics_collected": {
      "jmx": [
        {
          "endpoint": "localhost:port-number",
          "kafka": {
            "measurement": [
              "kafka.request.time.avg",
              "kafka.request.failed",
              "kafka.request.count",
              "kafka.purgatory.size",
              "kafka.partition.under_replicated",
              "kafka.partition.offline",
              "kafka.network.io",
              "kafka.leader.election.rate",
              "kafka.isr.operation.count"
            ]
          },
          "append_dimensions": {
            "ClusterName": "ClusterName"
          }
        },
        {
          "endpoint": "localhost:port-number",
          "jvm": {
            "measurement": [
              "jvm.classes.loaded",
              "jvm.gc.collections.count",
              "jvm.gc.collections.elapsed",
              "jvm.memory.heap.committed",
              "jvm.memory.heap.max",
              "jvm.memory.heap.used",
              "jvm.memory.nonheap.committed",
              "jvm.memory.nonheap.max",
              "jvm.memory.nonheap.used",
              "jvm.threads.count"
            ]
          },
          "append_dimensions": {
            "ProcessGroupName": "ClusterName"
          }
        }
      ],
      "disk": {
        "measurement": [
          "used_percent"
        ]
      },
      "mem": {
        "measurement": [
          "used_percent"
        ]
      },
      "swap": {
        "measurement": [
          "used_percent"
        ]
      },
      "netstat": {
        "measurement": [
          "tcp_established",
          "tcp_time_wait"
        ]
      }
    }
  }
}
```

### Kafka 生产者的代理配置
<a name="Solution-Kafka-Agent-Producer"></a>

在部署 Kafka 生产者的 Amazon EC2 实例上使用以下 CloudWatch 代理配置。将 *ProducerGroupName* 替换为要用于将指标进行分组以获得统一视图的应用程序或组的名称。将 *port-number* 替换为 Kafka 生产者应用程序的 JMX 端口。

 该解决方案没有为 Kafka 生产者启用 JVM 指标，因为解决方案控制面板未显示与生产者的 JVM 相关的 JVM 指标。您也可以自定义代理配置以发出 JVM 指标，但是，与生产者相关的 JVM 指标在解决方案控制面板上不可见。

```
{
  "metrics": {
    "namespace": "CWAgent",
    "append_dimensions": {
      "InstanceId": "${aws:InstanceId}"
    },
    "metrics_collected": {
      "jmx": [
        {
          "endpoint": "localhost:port-number",
          "kafka-producer": {
            "measurement": [
              "kafka.producer.request-rate",
              "kafka.producer.byte-rate",
              "kafka.producer.request-latency-avg",
              "kafka.producer.response-rate",
              "kafka.producer.record-error-rate",
              "kafka.producer.record-send-rate"
            ]
          },
          "append_dimensions": {
            "ProducerGroupName": "ProducerGroupName"
          }
        }
      ]
    }
  }
}
```

### Kafka 消费者的代理配置
<a name="Solution-Kafka-Agent-Consumer"></a>

在运行 Kafka 消费者的 EC2 实例上使用以下 CloudWatch 代理配置。将 *ConsumerGroupName* 替换为要用于将这些指标进行分组以获得统一视图的应用程序或组的名称。将 *port-number* 替换为 Kafka 消费者应用程序的 JMX 端口。

该解决方案没有为 Kafka 消费者启用 JVM 指标，因为解决方案控制面板未显示与消费者的 JVM 相关的 JVM 指标。您也可以自定义代理配置以发出 JVM 指标，但是，与消费者相关的 JVM 指标在解决方案控制面板上不可见。

```
{
  "metrics": {
    "append_dimensions": {
      "InstanceId": "${aws:InstanceId}"
    },
    "metrics_collected": {
      "jmx": [
        {
          "endpoint": "localhost:port-number",
          "kafka-consumer": {
            "measurement": [
              "kafka.consumer.fetch-rate",
              "kafka.consumer.total.bytes-consumed-rate",
              "kafka.consumer.records-consumed-rate",
              "kafka.consumer.bytes-consumed-rate",
              "kafka.consumer.records-lag-max"
            ]
          },
          "append_dimensions": {
            "ConsumerGroupName": "ConsumerGroupName"
          }
        }
      ]
    }
  }
}
```

## 为您的解决方案部署代理
<a name="Solution-Kafka-Agent-Deploy"></a>

安装 CloudWatch 代理有几种方法，具体视用例而定。对于此解决方案，我们建议使用 Systems Manager。它提供了控制台体验，使在单个 AWS 账户中管理一组托管服务器变得更加简单。本节中的说明使用 Systems Manager，适用于没有使用现有配置运行 CloudWatch 代理的情况。您可以按照[验证 CloudWatch 代理是否正在运行](troubleshooting-CloudWatch-Agent.md#CloudWatch-Agent-troubleshooting-verify-running)中的步骤检查 CloudWatch 代理是否正在运行。

如果您已经在部署工作负载的 EC2 主机上运行 CloudWatch 代理并管理代理配置，则可以跳过本节中的说明并按照现有部署机制更新配置。请务必将根据角色（代理、生产者或消费者）的代理配置与现有的代理配置合并，然后部署合并的配置。如果您使用 Systems Manager 存储和管理 CloudWatch 代理的配置，则可以将配置合并到现有参数值。有关更多信息，请参阅 [Managing CloudWatch agent configuration files](https://docs.aws.amazon.com/prescriptive-guidance/latest/implementing-logging-monitoring-cloudwatch/create-store-cloudwatch-configurations.html)。

**注意**  
使用 Systems Manager 部署以下 CloudWatch 代理配置，将替换或覆盖 EC2 实例上任何现有的 CloudWatch 代理配置。您可以修改此配置以适应您独有的环境或用例。此解决方案中定义的指标是建议控制面板所需的最低要求。

部署过程包括以下步骤：
+ 步骤 1：确保目标 EC2 实例具有所需的 IAM 权限。
+ 步骤 2：在 Systems Manager Parameter Store 中存储建议的代理配置文件。
+ 步骤 3：使用 CloudFormation 堆栈在一个或多个 EC2 实例上安装 CloudWatch 代理。
+ 步骤 4：验证代理设置是否正确配置。

您必须根据自己的代理、生产者和消费者是部署在同一 EC2 实例上还是不同实例上重复这些步骤。例如，如果 Kafka 代理、生产者和消费者部署在不同的实例上而没有重叠，则必须使用代理、生产者和消费者 EC2 实例的相应代理配置重复这些步骤三次。

### 步骤 1：确保目标 EC2 实例具有所需的 IAM 权限
<a name="Solution-Kafka-Agent-Step1"></a>

您必须授予 Systems Manager 安装和配置 CloudWatch 代理的权限。您还必须授予 CloudWatch 代理将遥测数据从 EC2 实例发布到 CloudWatch 的权限。确保附加到实例的 IAM 角色已附加 **CloudWatchAgentServerPolicy** 和 **AmazonSSMManagedInstanceCore** IAM 策略。
+ 创建角色后，将该角色附加到 EC2 实例。在启动新的 EC2 实例时，按照[启动带有 IAM 角色的实例](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-roles-for-amazon-ec2.html#launch-instance-with-role)中的步骤进行操作以附加角色。要将角色附加到现有 EC2 实例，请按照[将 IAM 角色附加到实例](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-roles-for-amazon-ec2.html#attach-iam-role)中的步骤进行操作。

### 步骤 2：在 Systems Manager Parameter Store 中存储建议的 CloudWatch 代理配置文件
<a name="Solution-Kafka-Agent-Step2"></a>

Parameter Store 通过安全地存储和管理配置参数，简化了 CloudWatch 代理在 EC2 实例上的安装，而无需硬编码值。这可确保更加安全灵活的部署过程，从而实现集中管理，并且可以更轻松地跨多个实例更新配置。

使用以下步骤将建议的 CloudWatch 代理配置文件作为参数存储在 Parameter Store 中。

**创建 CloudWatch 代理配置文件作为参数**

1. 访问 [https://console.aws.amazon.com/systems-manager/](https://console.aws.amazon.com/systems-manager/)，打开 AWS Systems Manager 控制台。

1. 从导航窗格中，依次选择**应用程序管理**、**Parameter Store**。

1. 按照以下步骤为配置创建新参数。

   1. 选择**创建参数**。

   1. 为将存储 CloudWatch 代理配置的参数提供一个名称，例如 **AmazonCloudWatch-Kafka-Producer-Configuration** 用于生产者、**AmazonCloudWatch-Kafka-Consumer-Configuration** 用于消费者或 **AmazonCloudWatch-Kafka-Broker-Configuration** 用于代理。如果在一个 EC2 上有多个 Kafka 角色，请相应地命名这些角色以便于识别。该值稍后将用于将此配置分配给在您的 EC2 实例上运行的代理。

   1. 对于**参数层**，选择**标准**。

   1. 对于**类型**，选择**字符串**。

   1. 对于**数据类型**，选择**文本**。

   1. 在**值**框中，粘贴 CloudWatch 代理配置的全文。请务必为此实例托管的 Kafka 角色选择 JSON 块。分别存储代理、生产者和消费者的配置时，请参阅 [Kafka 代理的代理配置](#Solution-Kafka-Agent-Broker)、[Kafka 生产者的代理配置](#Solution-Kafka-Agent-Producer)和 [Kafka 消费者的代理配置](#Solution-Kafka-Agent-Consumer)中提供的配置。如果您在同一 EC2 实例上运行多个 Kafka 角色，请务必根据需要合并配置，如同一实例上的[为同一实例上的多个 Kafka 角色配置代理](#Kafka-Multiple-Roles)中所述

   1. 选择**创建参数**。

### 步骤 3：安装 CloudWatch 代理并使用 CloudFormation 模板应用配置
<a name="Solution-Kafka-Agent-Step3"></a>

您可以使用 AWS CloudFormation 安装代理，并将其配置为使用您在前面步骤中创建的 CloudWatch 代理配置。

**为此解决方案安装和配置 CloudWatch 代理**

1. 使用以下链接打开 CloudFormation **快速创建堆栈**向导：[https://console.aws.amazon.com/cloudformation/home?\$1/stacks/quickcreate?templateURL=https://aws-observability-solutions-prod-us-east-1.s3.us-east-1.amazonaws.com/CloudWatchAgent/CFN/v1.0.0/cw-agent-installation-template-1.0.0.json](https://console.aws.amazon.com/cloudformation/home?#/stacks/quickcreate?templateURL=https://aws-observability-solutions-prod-us-east-1.s3.us-east-1.amazonaws.com/CloudWatchAgent/CFN/v1.0.0/cw-agent-installation-template-1.0.0.json)。

1. 确认控制台上的所选区域是运行 Kafka 工作负载的区域。

1. 对于**堆栈名称**，输入用于识别此堆栈的名称，如 **CWAgentInstallationStack**。

1. 在**参数**部分中，指定以下各项：

   1. 对于 **CloudWatchAgentConfigSSM**，请输入您之前创建的代理配置的 Systems Manager 参数名称，例如 **AmazonCloudWatch-Kafka-Broker-Configuration** 用于代理，**AmazonCloudWatch-Kafka-Producer-Configuration** 用于生产者，**AmazonCloudWatch-Kafka-Consumer-Configuration** 用于消费者。

   1. 要选择目标实例，您有两种选择。

      1. 对于 **InstanceIds**，请指定一个以逗号分隔的实例 ID 列表，其中包含希望使用此配置安装 CloudWatch 代理的实例 ID。您可以列出一个或多个实例。

      1. 如果要大规模部署，则可以指定 **TagKey** 和相应的 **TagValue**，以将具有此标签和值的所有 EC2 实例作为目标。如果指定 **TagKey**，则必须指定相应的 **TagValue**。（对于自动扩缩组，为 **TagKey** 指定 **aws:autoscaling:groupName** 并为 **TagValue** 指定自动扩缩组名称，以部署到自动扩缩组内的所有实例。）

         如果同时指定了 **InstanceIds** 和 **TagKeys** 参数，将优先采用 **InstanceIds**，而标签将被忽略。

1. 检查设置，然后选择**创建堆栈**。

如果要先编辑模板文件进行自定义，请选择**创建堆栈向导**下的**上传模板文件**选项，上传编辑后的模板。有关更多信息，请参阅[在 CloudFormation 控制台上创建堆栈](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-console-create-stack.html)。您可以使用以下链接下载模板：[https://aws-observability-solutions-prod-us-east-1.s3.us-east-1.amazonaws.com/CloudWatchAgent/CFN/v1.0.0/cw-agent-installation-template-1.0.0.json](https://aws-observability-solutions-prod-us-east-1.s3.us-east-1.amazonaws.com/CloudWatchAgent/CFN/v1.0.0/cw-agent-installation-template-1.0.0.json)。

**注意**  
完成此步骤后，此 Systems Manager 参数将与目标实例中运行的 CloudWatch 代理相关联。这意味着：  
如果删除 Systems Manager 参数，代理将停止。
如果编辑了 Systems Manager 参数，则配置更改将按计划频率（默认为 30 天）自动应用到代理。
如果要立即应用对此 Systems Manager 参数的更改，则必须再次运行此步骤。有关关联的更多信息，请参阅[在 Systems Manager 中使用关联](https://docs.aws.amazon.com/systems-manager/latest/userguide/state-manager-associations.html)。

### 步骤 4：验证代理设置是否正确配置
<a name="Solution-Kafka-Agent-Step4"></a>

您可以按照[验证 CloudWatch 代理是否正在运行](troubleshooting-CloudWatch-Agent.md#CloudWatch-Agent-troubleshooting-verify-running)中的步骤验证 CloudWatch 代理是否已安装。如果 CloudWatch 代理尚未安装和运行，请确保已正确设置所有内容。
+ 请确保您已为 EC2 实例附加具有正确权限的角色，如[步骤 1：确保目标 EC2 实例具有所需的 IAM 权限](Solution-Tomcat-On-EC2.md#Solution-Tomcat-Agent-Step1)中所述。
+ 请确保您已正确配置 Systems Manager 参数的 JSON。按照 [对利用 CloudFormation 的 CloudWatch 代理安装进行故障排除](Install-CloudWatch-Agent-New-Instances-CloudFormation.md#CloudWatch-Agent-CloudFormation-troubleshooting) 中的步骤操作。

如果一切设置正确，那么您应该会看到 Kafka 指标发布到 CloudWatch。您可以查看 CloudWatch 控制台以验证这些指标是否已发布。

**验证 Kafka 指标是否已发布到 CloudWatch**

1. 通过 [https://console.aws.amazon.com/cloudwatch/](https://console.aws.amazon.com/cloudwatch/) 打开 CloudWatch 控制台。

1. 选择**指标**、**所有指标**。

1. 确保您已选择部署解决方案的区域，然后选择**自定义命名空间**、**CWAgent**。

1. 搜索本文档代理配置部分中提及的指标，例如 `kafka.partition.offline` 用于代理、`kafka.consumer.fetch.rate` 用于消费者或 `kafka.producer.request-rate` 用于生产者。如果您看到这些指标的结果，则表明这些指标已发布到 CloudWatch。

## 创建 Kafka 解决方案控制面板
<a name="Solution-Kafka-Dashboard"></a>

此控制面板显示 Kafka 和底层 JVM 新发出的指标。此控制面板提供了跨生产者、代理和消费者的 Kafka 工作负载运行状况排名靠前的贡献者视图。排名靠前的贡献者视图显示每个指标的前 10 名小部件。这样就能一眼识别出异常值。

解决方案控制面板不显示 EC2 指标。要查看 EC2 指标，您需要使用 EC2 自动控制面板查看 EC2 公开发布的指标，并使用 EC2 控制台控制面板查看 CloudWatch 代理收集的 EC2 指标。有关 AWS 服务自动控制面板的更多信息，请参阅[查看单项 AWS 服务的 CloudWatch 控制面板](CloudWatch_Automatic_Dashboards_Focus_Service.md)。

要创建控制面板的操作，可以使用以下选项：
+ 使用 CloudWatch 控制台创建控制面板。
+ 使用 AWS CloudFormation 控制台部署控制面板。
+ 以 AWS CloudFormation 基础设施即代码，并将其作为持续集成（CI）自动化的一部分进行集成。

通过使用 CloudWatch 控制台创建控制面板，您可以在实际创建和收费之前预览控制面板。

**注意**  
此解决方案中使用 CloudFormation 创建的控制面板显示解决方案部署区域的指标。请务必在发布 JVM 和 Kafka 指标的区域创建 CloudFormation 堆栈。  
如果您在 CloudWatch 代理配置中指定了 `CWAgent` 以外的自定义命名空间，则必须更改控制面板的 CloudFormation 模板，将 `CWAgent` 替换为您使用的自定义命名空间。

**使用 CloudWatch 控制台创建控制面板**
**注意**  
解决方案控制面板目前仅显示 G1 Garbage Collector 的垃圾回收相关指标，G1 Garbage Collector 是最新 Java 版本的默认收集器。如果您使用的是不同的垃圾回收算法，则与垃圾回收相关的小部件为空。但是，您可以通过更改控制面板 CloudFormation 模板，并将相应的垃圾回收类型应用于垃圾回收相关指标的名称维度来自定义这些小部件。例如，如果您使用的是并行垃圾回收，请将垃圾回收计数指标 `jvm.gc.collections.count` 从 **name=\$1"G1 Young Generation\$1"** 更改为 **name=\$1"Parallel GC\$1"**。

1. 使用以下链接打开 CloudWatch 控制台**创建控制面板**：[https://console.aws.amazon.com/cloudwatch/home?\$1dashboards?dashboardTemplate=ApacheKafkaOnEc2&referrer=os-catalog](https://console.aws.amazon.com/cloudwatch/home?#dashboards?dashboardTemplate=ApacheKafkaOnEc2&referrer=os-catalog)。

1. 确认控制台上的所选区域是运行 Kafka 工作负载的区域。

1. 输入控制面板的名称，然后选择**创建控制面板**。

   为了便于将此控制面板与其他区域的类似控制面板区分开来，我们建议在控制面板名称中包含区域名称，例如 **KafkaDashboard-us-east-1**。

1. 预览控制面板并选择**保存**以创建控制面板。

**通过 CloudFormation 创建控制面板**

1. 使用以下链接打开 CloudFormation **快速创建堆栈**向导：[https://console.aws.amazon.com/cloudformation/home?\$1/stacks/quickcreate?templateURL=https://aws-observability-solutions-prod-us-east-1.s3.us-east-1.amazonaws.com/Kafka\$1EC2/CloudWatch/CFN/v1.0.0/dashboard-template-1.0.0.json](https://console.aws.amazon.com/cloudformation/home?#/stacks/quickcreate?templateURL=https://aws-observability-solutions-prod-us-east-1.s3.us-east-1.amazonaws.com/Kafka_EC2/CloudWatch/CFN/v1.0.0/dashboard-template-1.0.0.json)。

1. 确认控制台上的所选区域是运行 Kafka 工作负载的区域。

1. 对于**堆栈名称**，输入用于识别此堆栈的名称，如 **KafkaDashboardStack**。

1. 在**参数**部分，在 **DashboardName** 参数下指定控制面板的名称。

   为了便于将此控制面板与其他区域的类似控制面板区分开来，我们建议在控制面板名称中包含区域名称，例如 **KafkaDashboard-us-east-1**。

1. 在**功能和转换**下确认转换的访问功能。请注意，CloudFormation 不会添加任何 IAM 资源。

1. 检查设置，然后选择**创建堆栈**。

1. 堆栈状态为 **CREATE\$1COM PLETE** 后，选择创建的堆栈下的**资源**选项卡，然后选择**物理 ID** 下的链接转至控制面板。您也可以通过在控制台左侧导航窗格中选择**控制面板**，然后在**自定义控制面板**下找到控制面板名称，在 CloudWatch 控制台中访问控制面板。

如果要编辑模板文件以出于任何目的对其进行自定义，则可以使用**创建堆栈向导**下的**上传模板文件**选项来上传编辑后的模板。有关更多信息，请参阅[在 CloudFormation 控制台上创建堆栈](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-console-create-stack.html)。您可以使用以下链接下载模板：[https://aws-observability-solutions-prod-us-east-1.s3.us-east-1.amazonaws.com/Kafka\$1EC2/CloudWatch/CFN/v1.0.0/dashboard-template-1.0.0.json](https://aws-observability-solutions-prod-us-east-1.s3.us-east-1.amazonaws.com/Kafka_EC2/CloudWatch/CFN/v1.0.0/dashboard-template-1.0.0.json)。

**注意**  
解决方案控制面板目前仅显示 G1 Garbage Collector 的垃圾回收相关指标，G1 Garbage Collector 是最新 Java 版本的默认收集器。如果您使用的是不同的垃圾回收算法，则与垃圾回收相关的小部件为空。但是，您可以通过更改控制面板 CloudFormation 模板，并将相应的垃圾回收类型应用于垃圾回收相关指标的名称维度来自定义这些小部件。例如，如果您使用的是并行垃圾回收，请将垃圾回收计数指标 `jvm.gc.collections.count` 从 **name=\$1"G1 Young Generation\$1"** 更改为 **name=\$1"Parallel GC\$1"**。

### 开始使用 Kafka 控制面板
<a name="Solution-Kafka-Dashboard-GetStarted"></a>

您可以使用新的 Kafka 控制面板尝试以下几项任务。这些任务允许您验证控制面板是否正常运行，并为您提供使用它来监测 Kafka 集群的一些实践经验。在尝试这些任务的过程中，您将熟悉如何浏览控制面板和解读可视化指标。

**使用下拉列表**

控制面板顶部提供了下拉列表，可以用来筛选和选择要监测的特定 Kafka 集群、生产者和消费者组。
+ 要显示特定 Kafka 集群的指标，请在 **Kafka 集群**下拉列表中选择该集群名称。
+ 要显示特定 Kafka 生产者组的指标，请在 **Kafka 生产者**下拉列表中选择该生产者组的名称。
+ 要显示特定 Kafka 消费者组的指标，请在 **Kafka 消费者组**下拉列表中选择该消费者组的名称。

**验证集群运行状况**

从**集群概览**部分中，找到**进行复制的分区**和**进行同步的副本**小部件。理想情况下，这些指标应为零或较小的数字。这些指标中的任何一个值较大都可能表明 Kafka 集群存在需要调查的问题。

**调查代理性能**

在**代理**部分，找到**失败的提取请求**和**失败的生产者请求**小部件。这些小部件分别显示了失败的提取和生产操作请求的数量。高失败率可能表明代理或网络连接存在问题，需要进一步调查。

**监测生产者性能**

在**生产者组概览**部分，找到**平均请求率**、**平均请求延迟**和**平均记录发送/错误率**小部件。这些小部件将使您大致了解所选组中生产者的性能。您还可以在**生产者**部分中深入了解特定生产者和主题的指标。

**监测消费者延迟**

在**消费者组概览**部分，找到**消费者延迟**小部件。这一小部件显示消费者在处理来自其订阅的分区中最新偏移量的消息时的滞后时间。理想情况下，消费者延迟应较低或为零。消费者延迟较高可能表示消费者无法跟上数据生产的速度，从而导致潜在的数据丢失或处理延迟。您还可以在**消费者**部分中深入了解特定消费者和主题的指标。

## 为同一实例上的多个 Kafka 角色配置代理
<a name="Kafka-Multiple-Roles"></a>

[此解决方案的 CloudWatch 代理配置](#Solution-Kafka-CloudWatch-Agent)中列出的 Kafka 角色的各种配置仅适用于将生产者、消费者和代理角色部署在不同的 EC2 实例上且没有任何重叠的情况。如果您在同一 Amazon EC2 实例上运行多个 Kafka 角色，则有两种选择：
+ 创建单个代理配置文件，其中列出并配置在该实例上部署的所有 Kafka 角色的所有指标。如果您要使用 Systems Manager 管理代理配置，这是首选方案。

  如果您选择此选项，并且多个 Kafka 角色属于同一 JVM 进程，则必须在代理配置中为每个 Kafka 角色指定相同的端点。如果多个 Kafka 角色属于不同的 JVM 进程，则每个角色的端点可能不同，具体取决于为该进程设置的 JMX 端口。
+ 为每个 Kafka 角色创建单独的代理配置文件，并将代理配置为应用这两个配置文件。有关应用多个配置文件的说明，请参阅[创建多个 CloudWatch 代理配置文件](create-cloudwatch-agent-configuration-file.md#CloudWatch-Agent-multiple-config-files)。

以下示例显示 CloudWatch 代理配置，其中生产者和消费者角色属于同一 JVM 进程，在一个实例上运行。在这种情况下，以下配置的生产者和消费者部分的端口号必须相同。相反，如果运行的这两个角色属于不同的 JVM 进程，则可以根据每个单独的 JVM 进程的 JMX 端口为每个角色指定不同的端口号。

```
{
  "metrics": {
    "namespace": "CWAgent",
    "append_dimensions": {
      "InstanceId": "${aws:InstanceId}"
    },
    "metrics_collected": {
      "jmx": [
        {
          "endpoint": "localhost:port-number",
          "kafka-producer": {
            "measurement": [
              "kafka.producer.request-rate",
              "kafka.producer.byte-rate",
              "kafka.producer.request-latency-avg",
              "kafka.producer.response-rate",
              "kafka.producer.record-error-rate",
              "kafka.producer.record-send-rate"
            ]
          },
          "append_dimensions": {
            "ProducerGroupName": "ProducerGroupName"
          }
        },
        {
          "endpoint": "localhost:port-number",
          "kafka-consumer": {
            "measurement": [
              "kafka.consumer.fetch-rate",
              "kafka.consumer.total.bytes-consumed-rate",
              "kafka.consumer.records-consumed-rate",
              "kafka.consumer.bytes-consumed-rate",
              "kafka.consumer.records-lag-max"
            ]
          },
          "append_dimensions": {
            "ConsumerGroupName": "ConsumerGroupName"
          }
        }
      ]
    }
  }
}
```