

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 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
+ 在特定的 Kafka 工作負載中最多支援 500 個 EC2 執行個體 AWS 區域
+ CloudWatch 代理程式的最新版本
+ EC2 執行個體上安裝的 SSM 代理程式
**注意**  
AWS Systems Manager (SSM 代理程式） 預先安裝在由 AWS 和信任的第三方提供的一些 [Amazon Machine Image AMIs)](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 指標收集，免除手動檢測需求。
+ 提供預先設定的整合式 CloudWatch 儀表板，專門用於監控 Kafka 和 JVM 指標。儀表板將自動處理透過此解決方案設定之新 Kafka EC2 執行個體產生的指標，即使您第一次建立儀表板時這些指標不存在。透過它，您還可以將指標分組到邏輯應用程式中，以便於監控和管理。

下圖是此解決方案之儀表板的範例。

![\[Kafka 叢集 dashboard showing metrics for partitions, producer/consumer performance, and broker status.\]](http://docs.aws.amazon.com/zh_tw/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` 維度的指標。對於具有主題維度的指標，每個主題計為單獨的指標。
+ 一個自訂儀表板。
+ CloudWatch 代理程式請求的 API 操作，用於發布指標。在此解決方案的預設組態下，CloudWatch 代理程式每分鐘會針對每個 EC2 主機呼叫 **PutMetricData** 一次。這表示在一個 30 天的月份，針對每個 EC2 主機，系統將呼叫 **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 average number of disk paths per EC2 host) \$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 指標的清單，請參閱[由 CloudWatch 代理程式在 Linux 和 macOS 執行個體上收集的指標](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。如果依據安全政策/規定，您必須透過密碼身分驗證機或 SSL 啟用 JMX 以進行遠端存取，請參閱 [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`。結果應顯示 JMX 連接埠已在 JVM 程序上設定。

**此解決方案的代理程式組態**

代理程式收集的指標在代理程式組態中定義。解決方案提供代理程式組態，以收集適用於解決方案儀表板的建議指標與適當維度。每個 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 參數儲存區中的獨立參數，如稍後的[步驟 2：將建議的 CloudWatch 代理程式設定檔儲存在 Systems Manager 參數儲存區中](#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 連接埠。如果是透過密碼身分驗證或 SSL 啟用 JMX 以進行遠端存取，請參閱[收集 Java Management Extensions (JMX) 指標](CloudWatch-Agent-JMX-metrics.md)以取得有關視需要設定 TLS 或授權的資訊。

此組態中顯示的 EC2 指標 (在 JMX 區塊外部顯示的組態) 僅適用於 Linux 和 macOS 執行個體。如果您使用的是 Windows 執行個體，可以選擇在組態中省略這些指標。如需在 Windows 執行個體上收集之指標的資訊，請參閱[由 CloudWatch 代理程式在 Windows Server 執行個體上收集的指標](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 代理程式的組態，可以將組態合併到現有的參數值。如需詳細資訊，請參閱[管理 CloudWatch 代理程式設定檔](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 參數儲存區中。
+ 步驟 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 執行個體。請依循[使用 IAM 角色啟動執行個體](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-roles-for-amazon-ec2.html#launch-instance-with-role)中的步驟，在啟動新的 EC2 執行個體時連結角色。若要將角色連結至現有的 EC2 執行個體，請依循[將 IAM 角色連結至執行個體](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-roles-for-amazon-ec2.html#attach-iam-role)中的步驟。

### 步驟 2：將建議的 CloudWatch 代理程式設定檔儲存在 Systems Manager 參數儲存區中
<a name="Solution-Kafka-Agent-Step2"></a>

參數儲存區透過安全地儲存和管理組態參數，簡化在 EC2 執行個體上安裝 CloudWatch 代理程式的流程，無需使用硬式編碼值。這可確保部署程序更安全、更靈活，實現集中式管理，並能更輕鬆地更新多個執行個體的組態。

依循下列步驟，將建議的 CloudWatch 代理程式設定檔儲存為參數儲存區中的參數。

**建立 CloudWatch 代理程式設定檔作為參數**

1. 在 https：//[https://console.aws.amazon.com/systems-manager/](https://console.aws.amazon.com/systems-manager/) 開啟 AWS Systems Manager 主控台。

1. 從導覽窗格中，選擇**應用程式管理**、**參數儲存區**。

1. 依循下列步驟為組態建立新的參數。

   1. 選擇 **Create parameter (建立參數)**。

   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. 選擇 **Create parameter (建立參數)**。

### 步驟 3：安裝 CloudWatch 代理程式並使用 CloudFormation 範本套用組態
<a name="Solution-Kafka-Agent-Step3"></a>

您可以使用 AWS CloudFormation 安裝代理程式，並將其設定為使用您在先前步驟中建立的 CloudWatch 代理程式組態。

**為此解決方案安裝和設定 CloudWatch 代理程式**

1. 使用此連結開啟 CloudFormation **快速建立堆疊**精靈：https：//[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**。(對於 Auto Scaling 群組，請為 **TagKey** 指定 **aws:autoscaling:groupName**，並為 **TagValue** 指定 Auto Scaling 群組名稱，以部署到 Auto Scaling 群組內的所有執行個體。)

         如果您同時指定 **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。請遵循 [使用 安裝 CloudWatch 代理程式的故障診斷 CloudFormation](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 服務自動儀表板的詳細資訊，請參閱 [檢視單一服務的 CloudWatch 儀表板 AWS](CloudWatch_Automatic_Dashboards_Focus_Service.md)。

若要建立儀表板，可以使用下列選項：
+ 使用 CloudWatch 主控台建立儀表板。
+ 使用 AWS CloudFormation 主控台部署儀表板。
+ 下載 AWS CloudFormation 基礎設施做為程式碼，並將其整合為持續整合 (CI) 自動化的一部分。

透過使用 CloudWatch 主控台建立儀表板，您可以在實際建立和收費之前預覽儀表板。

**注意**  
在此解決方案 CloudFormation 中使用 建立的儀表板會顯示部署解決方案的區域指標。請務必在發佈 JVM 和 Kafka 指標的區域中建立 CloudFormation 堆疊。  
如果您已在 CloudWatch 代理程式組態`CWAgent`中指定 以外的自訂命名空間，則必須變更儀表板的 CloudFormation 範本，以`CWAgent`將 取代為您正在使用的自訂命名空間。

**透過 CloudWatch 主控台建立儀表板**
**注意**  
解決方案儀表板目前僅顯示 G1 垃圾回收器的垃圾回收相關指標，G1 垃圾回收器是最新 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：//[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\$1COMPLETE** 之後，請在所建立堆疊下方選擇**資源**索引標籤，然後選擇**實體 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 垃圾回收器的垃圾回收相關指標，G1 垃圾回收器是最新 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"
          }
        }
      ]
    }
  }
}
```