

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# 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 アプリケーションの場合は、代わりに、JVM と Kafka の両方のモニタリングを含む [Kafka モニタリングソリューション](solution-kafka.md)を使用することもできます。

このソリューションは以下を設定します。
+ Amazon EKS クラスターからの Java 仮想マシン (JVM) メトリクスを保存する Amazon Managed Service for Prometheus ワークスペース。
+ 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>

このソリューションは、Java 仮想マシン (JVM) アプリケーションのメトリクスを提供するように Amazon Managed Grafana ワークスペースを設定します。メトリクスは、アプリケーションの健全性とパフォーマンスに関するインサイトを提供することで、アプリケーションの運用をより効果的にするのに役立つダッシュボードを生成するために使用されます。

次の図は、このソリューションによって作成されたダッシュボードのサンプルを示しています。

![\[このソリューションを使用して構築した Grafana ダッシュボードフォルダの例を示すイメージ。\]](http://docs.aws.amazon.com/ja_jp/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 クラスターと同じアベイラビリティーゾーンで実行されているソリューションの、基本コストを取得するのに役立ちます。


| 製品 | 計算メトリクス | 値 | 
| --- | --- | --- | 
| Amazon Managed Service for Prometheus | アクティブなシリーズ | 50 (アプリケーションポッドあたり) | 
|  | 平均収集間隔 | 60 (秒) | 
| Amazon Managed Grafana | アクティブなエディタ/管理者の数 | 1 (またはユーザーに基づき、さらに多く) | 

これらの数は、Amazon EKS で実行されている JVM アプリケーションのベースの数です。これにより基本コストの見積もりが得られます。アプリケーションにポッドを追加すると、次に示すようにコストが増加します。これらのコストは、Amazon Managed Grafana ワークスペース、Amazon Managed Service for Prometheus ワークスペース、Amazon EKS クラスターが同じアベイラビリティーゾーン、 AWS リージョンおよび VPN にあるかどうかによって異なります。

## 前提条件
<a name="solution-jvm-prerequisites"></a>

このソリューションを使用する前に、次のことを行う必要があります。

1. モニタリングする **[Amazon Elastic Kubernetes Service クラスターを作成する]**、またはそのクラスターがあるいる必要があります。そのクラスターには少なくとも 1 つのノードが必要です。クラスターには、プライベートアクセスを含めるように設定された 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. Amazon EKS クラスター AWS アカウント と同じ に 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. **Grafana バージョン 9 以降の Amazon Managed Grafana ワークスペースは、Amazon EKS クラスターと同じ に作成**する必要があります。 AWS リージョン 新しいワークスペースの作成の詳細については、「[Amazon Managed Grafana ワークスペースを作成する](AMG-create-workspace.md)」を参照してください。

   ワークスペースロールには、Amazon Managed Service for Prometheus および Amazon CloudWatch API にアクセスするためのアクセス許可が必要です。この許可を付与する最も簡単な方法は、[[サービス管理のアクセス許可]](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` の形式になります。ID とエンドポイントは Amazon Managed Grafana コンソールにあります。エンドポイントはワークスペースの 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>

このソリューションは、Amazon EKS クラスターで実行されている Java 仮想マシン (JVM) アプリケーションからのメトリクスのレポートとモニタリングをサポートする AWS ようにインフラストラクチャを設定します。[AWS Cloud Development Kit (AWS CDK)](https://docs.aws.amazon.com/cdk/v2/guide/home.html) を使用してインストールできます。

**注記**  
ここでのステップでは、 AWS CLI、、および [Node.js](https://nodeja.org/) AWS CDKと [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* を、 、Amazon Managed Grafana ワークスペースエンドポイント ( の形式`http://g-123example.grafana-workspace.us-east-1.amazonaws.com`) AWS リージョン、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. ソリューションで使用できる注釈を作成します。名前空間、デプロイ、ステートフルセット、デーモンセット、またはポッドに直接注釈を付けることができます。JSM ソリューションには 2 つの注釈が必要です。`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. Grafana HTTP API を呼び出すには、ADMIN アクセス許可を持つサービスアカウントトークンを作成します。詳細については、「[サービスアカウントを使用した Grafana HTTP API の認証](service-accounts.md)」を参照してください。トークンを作成するには、次のコマンド AWS CLI で を使用できます。*GRAFANA\$1ID* を ご使用の Grafana ワークスペースの ID に置き換える必要があります (`g-123example` 形式)。このキーは 7,200 秒または 2 時間後に期限が切れます。必要に応じて、時間 (`seconds-to-live`) を変更できます。デプロイにかかる時間は 1 時間未満です。

   ```
   # 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)
   ```

   次のコマンドを使用して API キーを に追加 AWS CDK することで、 API キー AWS Systems Manager を で使用できるようにします。*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) を完了する必要があります。
+ ソリューションの作成やメトリクスへのアクセスを試みる前に、クラスターに少なくとも 1 つのノードを含める必要があります。
+ Amazon EKS クラスターには、`AWS CNI`、`CoreDNS`、`kube-proxy` アドオンをインストールする必要があります。インストールしないとソリューションが正しく動作しません。これらは、コンソールを介してクラスターを作成するときにデフォルトでインストールされます。クラスターが AWS SDK を介して作成された場合は、インストールが必要になる場合があります。
+ Amazon EKS ポッドのインストールがタイムアウトしました。これは、使用可能なノード容量が十分でないときに発生する場合があります。これらの問題には、次のような複数の原因があります。
  + Amazon EKS クラスターが Amazon EC2 ではなく Fargate で初期化されました。このプロジェクトでは 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)
  ```