

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

# 使用 Amazon Managed Grafana 監控 JVM 應用程式的解決方案
<a name="solution-jvm"></a>

使用 Java 虛擬機器 (JVM) 建置的應用程式有專門的監控需求。此頁面說明 範本，提供監控在 Amazon EKS 叢集上執行之 JVM 型應用程式的解決方案。您可以使用 安裝解決方案[AWS Cloud Development Kit (AWS CDK)](https://docs.aws.amazon.com/cdk/v2/guide/home.html)。

**注意**  
此解決方案提供 JVM 應用程式的監控。如果您的 JVM 應用程式特別為 Apache Kafka 應用程式，您可以選擇使用 [Kafka 監控解決方案](solution-kafka.md)，其中包含 JVM 和 Kafka 監控。

此解決方案會設定：
+ Amazon Managed Service for Prometheus 工作區，用於存放來自 Amazon EKS 叢集的 Java 虛擬機器 (JVM) 指標。
+ 使用 CloudWatch 代理程式以及 CloudWatch 代理程式附加元件收集特定 JVM 指標。指標設定為傳送至 Amazon Managed Service for Prometheus 工作區。
+ 您的 Amazon Managed Grafana 工作區可提取這些指標，並建立儀表板以協助您監控叢集。

**注意**  
此解決方案為在 Amazon EKS 上執行的應用程式提供 JVM 指標，但不包含 Amazon EKS 指標。您也可以使用[可觀測性解決方案來監控 Amazon EKS](solution-eks.md)，以查看 Amazon EKS 叢集的指標和提醒。

## 關於此解決方案
<a name="solution-jvm-about"></a>

此解決方案會設定 Amazon Managed Grafana 工作區，為您的 Java 虛擬機器 (JVM) 應用程式提供指標。這些指標用於產生儀表板，透過提供應用程式運作狀態和效能的洞察，協助您更有效地操作應用程式。

下圖顯示此解決方案所建立其中一個儀表板的範例。

![\[此影像顯示使用此解決方案建置的 Grafana 儀表板資料夾範例。\]](http://docs.aws.amazon.com/zh_tw/grafana/latest/userguide/images/jvm-solution-overview.png)


指標會以 1 分鐘的抓取間隔進行抓取。儀表板會根據特定指標，顯示彙總至 1 分鐘、5 分鐘或更多的指標。

如需此解決方案追蹤的指標清單，請參閱 [追蹤的指標清單](#solution-jvm-metrics)。

## 成本
<a name="solution-jvm-costs"></a>

此解決方案會在您的工作區中建立和使用 資源。您將需要支付所建立資源的標準用量費用，包括：
+ 使用者存取 Amazon Managed Grafana 工作區。如需定價的詳細資訊，請參閱 [Amazon Managed Grafana 定價](https://aws.amazon.com/grafana/pricing/)。
+ Amazon Managed Service for Prometheus 指標擷取和儲存，以及指標分析 （查詢範例處理）。此解決方案使用的指標數量取決於您的應用程式組態和用量。

  您可以使用 CloudWatch 檢視 Amazon Managed Service for Prometheus 中的擷取和儲存指標 如需詳細資訊，請參閱《*Amazon Managed Service for Prometheus 使用者指南*》中的 [CloudWatch 指標](https://docs.aws.amazon.com/prometheus/latest/userguide/AMP-CW-usage-metrics.html)。

  您可以使用 [Amazon Managed Service for Prometheus 定價](https://aws.amazon.com/prometheus/pricing/)頁面上的定價計算器來估計成本。指標數量取決於叢集中的節點數量，以及應用程式產生的指標。
+ 網路成本。您可能會針對跨可用區域、區域或其他流量產生標準 AWS 網路費用。

每個產品的定價頁面提供定價計算器，可協助您了解解決方案的潛在成本。下列資訊有助於取得在與 Amazon EKS 叢集相同可用區域中執行之解決方案的基本成本。


| 產品 | 計算器指標 | Value | 
| --- | --- | --- | 
| Amazon Managed Service for Prometheus | 作用中系列 | 50 （每個應用程式 Pod) | 
|  | 平均收集間隔 | 60 （秒） | 
| Amazon Managed Grafana | 作用中編輯器/管理員的數量 | 1 （或更多，視您的使用者而定） | 

這些數字是在 Amazon EKS 上執行的 JVM 應用程式的基本號碼。這將為您提供基本成本的預估。當您將 Pod 新增至應用程式時，成本將會增加，如下所示。這些成本會免除網路使用成本，這取決於 Amazon Managed Grafana 工作區、Amazon Managed Service for Prometheus 工作區和 Amazon EKS 叢集是否位於相同的可用區域 AWS 區域和 VPN。

## 先決條件
<a name="solution-jvm-prerequisites"></a>

此解決方案需要您在使用解決方案之前完成以下操作。

1. 您必須擁有或**建立您要監控的 Amazon Elastic Kubernetes Service 叢集**，且叢集必須至少有一個節點。叢集必須設定 API 伺服器端點存取，以包含私有存取 （也可以允許公開存取）。

   [身分驗證模式](https://docs.aws.amazon.com/eks/latest/userguide/grant-k8s-access.html#set-cam)必須包含 API 存取 （可以設定為 `API`或 `API_AND_CONFIG_MAP`)。這可讓解決方案部署使用存取項目。

   應該在叢集中安裝下列項目 （透過主控台建立叢集時預設為 true，但如果您使用 AWS API 或 建立叢集，則必須新增） AWS CLI：Amazon EKS Pod Identity Agent、 AWS CNI、CoreDNS、Kube-proxy 和 Amazon EBS CSI Driver AddOns （解決方案在技術上不需要 Amazon EBS CSI Driver AddOn，但某些 JVM 應用程式需要）。

   *儲存叢集名稱以稍後指定*。這可在 Amazon EKS 主控台的叢集詳細資訊中找到。
**注意**  
如需如何建立 Amazon EKS 叢集的詳細資訊，請參閱 [Amazon EKS 入門](https://docs.aws.amazon.com/eks/latest/userguide/getting-started.html)。

1. 您必須在 Amazon EKS 叢集的 Java 虛擬機器上執行應用程式。

1. 您必須在 AWS 帳戶 與 **Amazon EKS 叢集相同的 中建立 Amazon Managed Service for Prometheus 工作區**。如需詳細資訊，請參閱《*Amazon Managed Service for Prometheus 使用者指南*》中的[建立工作區](https://docs.aws.amazon.com/prometheus/latest/userguide/AMP-create-workspace.html)。

   *儲存 Amazon Managed Service for Prometheus 工作區 ARN 以供稍後指定。*

1. 您必須在**與 Amazon EKS 叢集相同的 中，使用 Grafana 第 9 版或更新版本建立 Amazon Managed Grafana 工作區**。 AWS 區域 如需建立新工作區的詳細資訊，請參閱 [建立 Amazon Managed Grafana 工作區](AMG-create-workspace.md)。

   工作區角色必須具有存取 Amazon Managed Service for Prometheus 和 Amazon CloudWatch APIs許可。最簡單的方法是使用[服務受管許可](AMG-manage-permissions.md)，然後選取 Amazon Managed Service for Prometheus 和 CloudWatch。您也可以手動將 [AmazonPrometheusQueryAccess](https://docs.aws.amazon.com/prometheus/latest/userguide/security-iam-awsmanpol.html#AmazonPrometheusQueryAccess) 和 [AmazonGrafanaCloudWatchAccess](security-iam-awsmanpol.md#security-iam-awsmanpol-AmazonGrafanaCloudWatchAccess) 政策新增至工作區 IAM 角色。

   *儲存 Amazon Managed Grafana 工作區 ID 和端點以供稍後指定。*ID 的格式為 `g-123example`。您可以在 Amazon Managed Grafana 主控台中找到 ID 和端點。端點是工作區的 URL，並包含 ID。例如 `https://g-123example.grafana-workspace.<region>.amazonaws.com/`。

**注意**  
雖然不需要嚴格設定解決方案，但您必須在 Amazon Managed Grafana 工作區中設定使用者身分驗證，使用者才能存取建立的儀表板。如需詳細資訊，請參閱[驗證 Amazon Managed Grafana 工作區中的使用者](authentication-in-AMG.md)。

## 使用此解決方案
<a name="solution-jvm-use"></a>

此解決方案會設定 AWS 基礎設施，以支援從 Amazon EKS 叢集中執行的 Java 虛擬機器 (JVM) 應用程式報告和監控指標。您可以使用 安裝它[AWS Cloud Development Kit (AWS CDK)](https://docs.aws.amazon.com/cdk/v2/guide/home.html)。

**注意**  
此處的步驟假設您有一個已安裝 AWS CLI、 和 AWS CDK以及 [Node.js ](https://nodeja.org/)和 [NPM](https://docs.npmjs.com/) 的環境。您將使用 `make`和 `brew`來簡化建置和其他常見動作。

**使用此解決方案透過 監控 Amazon EKS 叢集 AWS CDK**

1. 請確定您已完成所有[先決條件](#solution-jvm-prerequisites)步驟。

1. 從 Amazon S3 下載解決方案的所有檔案。檔案位於 `s3://aws-observability-solutions/JVM_EKS/OSS/CDK/v1.0.0/iac`，您可以使用下列 Amazon S3 命令下載。從命令列環境中的資料夾執行此命令。

   ```
   aws s3 sync s3://aws-observability-solutions/JVM_EKS/OSS/CDK/v1.0.0/iac/ .
   ```

   您不需要修改這些檔案。

1. 在命令列環境中 （從您下載解決方案檔案的資料夾），執行下列命令。

   設定所需的環境變數。將 *REGION*、*AMG\$1ENDPOINT*、*EKS\$1CLUSTER* 和 *AMP\$1ARN* 取代為您的 AWS 區域、Amazon Managed Grafana 工作區端點 （格式為 `http://g-123example.grafana-workspace.us-east-1.amazonaws.com`)、Amazon EKS 叢集名稱和 Amazon Managed Service for Prometheus 工作區 ARN。

   ```
   export AWS_REGION=REGION
   export AMG_ENDPOINT=AMG_ENDPOINT
   export EKS_CLUSTER_NAME=EKS_CLUSTER
   export AMP_WS_ARN=AMP_ARN
   ```

1. 建立可供解決方案使用的註釋。您可以選擇直接註釋命名空間、部署、狀態集、協助程式集或 Pod。JSM 解決方案需要兩個註釋。您將使用 `kubectl`以下列命令來註釋資源：

   ```
   kubectl annotate <resource-type> <resource-value> instrumentation.opentelemetry.io/inject-java=true
   kubectl annotate <resource-type> <resource-value> cloudwatch.aws.amazon.com/inject-jmx-jvm=true
   ```

   將 *<resource-type>* 和 *<resource-value>* 取代為系統的正確值。例如，若要註釋您的`foo`部署，您的第一個命令將是：

   ```
   kubectl annotate deployment foo instrumentation.opentelemetry.io/inject-java=true
   ```

1. 建立具有 ADMIN 存取權的服務帳戶字符，以呼叫 Grafana HTTP APIs。如需詳細資訊，請參閱[使用服務帳戶向 Grafana HTTP APIs進行身分驗證](service-accounts.md)。您可以使用 AWS CLI 搭配下列命令來建立字符。您需要以 Grafana 工作區的 ID 取代 *GRAFANA\$1ID* （格式為 `g-123example`)。此金鑰會在 7，200 秒或 2 小時後過期。如果需要，您可以變更時間 (`seconds-to-live`)。部署時間不到一小時。

   ```
   # creates a new service account (optional: you can use an existing account)
   GRAFANA_SA_ID=$(aws grafana create-workspace-service-account \
     --workspace-id GRAFANA_ID \
     --grafana-role ADMIN \
     --name grafana-operator-key \
     --query 'id' \
     --output text)
   
   # creates a new token for calling APIs
   export AMG_API_KEY=$(aws grafana create-workspace-service-account-token \
     --workspace-id $managed_grafana_workspace_id \
     --name "grafana-operator-key-$(date +%s)" \
     --seconds-to-live 7200 \
     --service-account-id $GRAFANA_SA_ID \
     --query 'serviceAccountToken.key' \
     --output text)
   ```

    AWS Systems Manager 使用下列命令將 API 金鑰 AWS CDK 新增至 ，使其可供 使用。將 *AWS\$1REGION* 取代為您的解決方案將在其中執行的區域 （格式為 `us-east-1`)。

   ```
   aws ssm put-parameter --name "/observability-aws-solution-jvm-eks/grafana-api-key" \
     --type "SecureString" \
     --value $AMG_API_KEY \
     --region AWS_REGION \
     --overwrite
   ```

1. 執行下列`make`命令，這會為專案安裝任何其他相依性。

   ```
   make deps
   ```

1. 最後，執行 AWS CDK 專案：

   ```
   make build && make pattern aws-observability-solution-jvm-eks-$EKS_CLUSTER_NAME deploy
   ```

1. 【選用】 堆疊建立完成後，只要您完成每個 （包括單獨的 Amazon Managed Grafana 和 Amazon Managed Service for Prometheus 工作區） 的其他先決條件，您就可以使用相同的環境為在相同區域中 Amazon EKS 叢集上執行的其他 JVM 應用程式建立更多堆疊執行個體。您需要使用新參數重新定義`export`命令。

堆疊建立完成後，您的 Amazon Managed Grafana 工作區將填入儀表板，其中顯示應用程式和 Amazon EKS 叢集的指標。收集指標時，需要幾分鐘的時間才會顯示指標。

## 追蹤的指標清單
<a name="solution-jvm-metrics"></a>

此解決方案會從以 JVM 為基礎的應用程式收集指標。這些指標儲存在 Amazon Managed Service for Prometheus 中，然後顯示在 Amazon Managed Grafana 儀表板中。

系統會使用此解決方案追蹤下列指標。
+ jvm.classes.loaded
+ jvm.gc.collections.count
+ jvm.gc.collections.elapsed
+ jvm.memory.heap.init
+ jvm.memory.heap.max
+ jvm.memory.heap.used
+ jvm.memory.heap.committed
+ jvm.memory.nonheap.init
+ jvm.memory.nonheap.max
+ jvm.memory.nonheap.used
+ jvm.memory.nonheap.committed
+ jvm.memory.pool.init
+ jvm.memory.pool.max
+ jvm.memory.pool.used
+ jvm.memory.pool.committed
+ jvm.threads.count

## 疑難排解
<a name="solution-jvm-troubleshooting"></a>

有幾件事可能會導致專案設定失敗。請務必檢查下列項目。
+ 您必須先完成所有[先決條件](#solution-jvm-prerequisites)，才能安裝解決方案。
+ 叢集必須至少有一個節點，才能嘗試建立解決方案或存取指標。
+ 您的 Amazon EKS 叢集必須安裝 `AWS CNI`、 `CoreDNS`和 `kube-proxy` 附加元件。如果未安裝，解決方案將無法正常運作。透過主控台建立叢集時，預設會安裝它們。如果叢集是透過 AWS SDK 建立，您可能需要安裝它們。
+ Amazon EKS Pod 安裝逾時。如果節點容量不足，就可能發生這種情況。這些問題有多種原因，包括：
  + Amazon EKS 叢集已使用 Fargate 而非 Amazon EC2 初始化。此專案需要 Amazon EC2。
  + 節點會[受到污點](https://docs.aws.amazon.com/eks/latest/userguide/node-taints-managed-node-groups.html)，因此無法使用。

    您可以使用 `kubectl describe node NODENAME | grep Taints`檢查污點。然後`kubectl taint node NODENAME TAINT_NAME-`移除污點。請務必在污點名稱`-`後面包含 。
  + 節點已達到容量限制。在這種情況下，您可以建立新的節點或增加容量。
+ 您在 Grafana 中看不到任何儀表板：使用不正確的 Grafana 工作區 ID。

  執行下列命令以取得 Grafana 的相關資訊：

  ```
  kubectl describe grafanas external-grafana -n grafana-operator
  ```

  您可以檢查結果是否有正確的工作區 URL。如果不是您預期的工作空間，請使用正確的工作區 ID 重新部署。

  ```
  Spec:
    External:
      API Key:
        Key:   GF_SECURITY_ADMIN_APIKEY
        Name:  grafana-admin-credentials
      URL:     https://g-123example.grafana-workspace.aws-region.amazonaws.com
  Status:
    Admin URL:  https://g-123example.grafana-workspace.aws-region.amazonaws.com
    Dashboards:
      ...
  ```
+ 您在 Grafana 中看不到任何儀表板：您正在使用過期的 API 金鑰。

  若要尋找此案例，您需要取得 grafana 運算子並檢查日誌是否有錯誤。使用此命令取得 Grafana 運算子的名稱：

  ```
  kubectl get pods -n grafana-operator
  ```

  這將傳回運算子名稱，例如：

  ```
  NAME                               READY   STATUS    RESTARTS   AGE
  grafana-operator-1234abcd5678ef90   1/1     Running   0          1h2m
  ```

  在下列命令中使用運算子名稱：

  ```
  kubectl logs grafana-operator-1234abcd5678ef90 -n grafana-operator
  ```

  下列錯誤訊息表示 API 金鑰已過期：

  ```
  ERROR   error reconciling datasource    {"controller": "grafanadatasource", "controllerGroup": "grafana.integreatly.org", "controllerKind": "GrafanaDatasource", "GrafanaDatasource": {"name":"grafanadatasource-sample-amp","namespace":"grafana-operator"}, "namespace": "grafana-operator", "name": "grafanadatasource-sample-amp", "reconcileID": "72cfd60c-a255-44a1-bfbd-88b0cbc4f90c", "datasource": "grafanadatasource-sample-amp", "grafana": "external-grafana", "error": "status: 401, body: {\"message\":\"Expired API key\"}\n"}
  github.com/grafana-operator/grafana-operator/controllers.(*GrafanaDatasourceReconciler).Reconcile
  ```

  在此情況下，請建立新的 API 金鑰並再次部署解決方案。如果問題仍然存在，您可以在重新部署之前使用下列命令強制同步：

  ```
  kubectl delete externalsecret/external-secrets-sm -n grafana-operator
  ```
+ 缺少 SSM 參數。如果您看到類似以下的錯誤，請執行 `cdk bootstrap` ，然後再試一次。

  ```
  Deployment failed: Error: aws-observability-solution-jvm-eks-$EKS_CLUSTER_NAME: SSM 
  parameter /cdk-bootstrap/xxxxxxx/version not found. Has the environment been 
  bootstrapped? Please run 'cdk bootstrap' (see https://docs.aws.amazon.com/cdk/latest/
  guide/bootstrapping.html)
  ```