Kubernetes の Java 仮想マシン (JVM) のデータモニタリングは、Kubernetes クラスター内のすべての JVM ベースのサービスに対応した、柔軟かつエンドツーエンドのメトリック収集ソリューションです。このデータモニタリングは、Kubernetes に対応した Logtail 構成と自動サービス検出機能によってサポートされています。
前提条件
Full-stack Observability インスタンスが作成されていること。詳細については、「インスタンスの作成」をご参照ください。
実装
Java Management Extensions (JMX) テクノロジーは、Java SE プラットフォームの標準機能です。JMX は主に、Java アプリケーションや JVM サーバー、リソースの状態などの情報を監視および管理するために使用されます。JMX は、Prometheus エクスポーターと同様に機能するデータインジェストのための Remote Method Invocation (RMI) をサポートしています。Java エージェントを使用するよりも、RMI を呼び出すことでメトリックの読み取りがより安全になり、データ統合のコスト効率も高まります。
Kubernetes において、JVM メトリック収集のデプロイメントモデルは、ログ収集コンポーネントと同じ DaemonSet です。Logtail の多次元的な Kubernetes リソース選択機能を活用することで、環境変数、Kubernetes ラベル、名前空間、Pod 名、コンテナ名を使用して JVM モニタリングデータをフィルタリングできます。ただし、RMI は Java プロセス間の通信を伴うため、Kubernetes リソースの選択が多くの無関係なプロセスを対象としてしまう可能性があります。この問題に対処するため、Logtail は特別な環境変数 ILOGTAIL_JMX_PORT を使用して、ターゲットの選択をさらに絞り込みます。

事前準備
Logtail を使用して、Kubernetes クラスターにデプロイされた Java アプリケーションの JVM からモニタリングデータを自動的に収集するには、以下の操作を実行する必要があります。
環境変数に `POD_IP` の宣言を追加します。
例:
- name: POD_IP valueFrom: fieldRef: fieldPath: status.podIP-
JVM 起動パラメーターを設定します。
以下の com.sun.management.jmxremote パラメーターを設定して、JMX リモートアクセスを有効にします。
com.sun.management.jmxremote.local.only パラメーターを false に設定します。
-
com.sun.management.jmxremote.sslとcom.sun.management.jmxremote.authenticateパラメーターを false に設定します。そうしない場合、データインポート構成で JMX パスワード を設定する必要があります。 com.sun.management.jmxremote.port および com.sun.management.jmxremote.rmi.port パラメーターを、宣言された RMI ポートに設定します。
java.rmi.server.hostname パラメーターを POD_IP 環境変数の値に設定します。
-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.local.only=false -Dcom.sun.management.jmxremote.port=9999 -Dcom.sun.management.jmxremote.rmi.port=9999 -Djava.rmi.server.hostname=$(POD_IP) 環境変数に `ILOGTAIL_JMX_PORT` の宣言を追加します。この宣言は公開されるメトリックポートを指定するもので、
com.sun.management.jmxremote.portパラメーターの値で示されます。-
設定完了後、ターゲット Pod に接続し、`jps` コマンドを実行して JVM 起動パラメーターを表示します。以下の例をご参照ください。
JAVA_TOOL_OPTIONS=""の宣言は、`jps` プログラムがJAVA_TOOL_OPTIONS環境変数を継承するのを防ぎ、ポートの競合を回避します。root@jvm-new-1-74c78dc9b7-7c1h2:/# JAVA_TOOL_OPTIONS="" jps -v Picked up JAVA_TOOL_OPTIONS: 1 demo-0.0.1-SNAPSHOT.jar -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.local.only=false -Dcom.sun.management.jmxremote.port=9999 -Dcom.sun.management.jmxremote.rmi.port=9999 -Djava.rmi.server.hostname=10.xx.x.xx -Dserver.port=8081 115 Jps -Dapplication.home=/usr/local/openjdk-11 -Xms8m -Djdk.module.main=jdk.jcmd 環境変数の確認:対象の Pod に接続し、
env|grep ILOGTAIL_JMX_PORTコマンドを実行します。
操作手順
Simple Log Service コンソールにログインします。
[ログアプリケーション] セクションで、[インテリジェント O&M] タブをクリックします。 次に、[フルスタック可観測性] をクリックします。
[Simple Log Service フルスタックオブザーバビリティ] ページで、目的のインスタンスをクリックします。
-
左側のナビゲーションウィンドウで、フルスタックモニタリング をクリックします。
このインスタンスで初めてフルスタックモニタリングを使用する場合は、有効化をクリックします。
-
左側のナビゲーションウィンドウで、データのインポート をクリックします。データアクセス設定 ページで、Kubernetes JVM モニタリング セクションの Kubernetes モニタリング を探します。
対象のモニタリング項目に対して初めてデータアクセス構成を作成する場合は、スイッチをオンにして構成ページを開きます。構成が既に存在する場合は、
アイコンをクリックして構成ページを開きます。 -
既存のサーバーグループの使用 をクリックします。
モニタリングコンポーネントをインストールすると、Simple Log Service は `
k8s-group-${your_k8s_cluster_id}` という形式の名前のマシングループを自動的に作成します。このマシングループを使用できます。 -
ターゲットのマシングループ (
k8s-group-${your_k8s_cluster_id}) を選択し、ソースサーバーグループ リストから 適用されたサーバーグループ リストに移動し、次へ をクリックします。重要マシングループのハートビートのステータスが 失敗 の場合は、自動再試行 をクリックします。問題が解決しない場合は、「Logtail マシングループにハートビートがない場合の対処方法」をご参照ください。
-
データソースの設定 ステップで、次のパラメーターを設定し、完成 をクリックします。
設定が完了すると、Simple Log Service は Metricstore などのアセットを自動的に作成します。
パラメーター
説明
一般構成
設定名
Logtail 構成の名前。カスタム名を指定できます。
クラスター
Kubernetes クラスターの名前。カスタム名を入力できます。
このパラメーターを設定すると、Simple Log Service は、Logtail 構成を使用して収集された Kubernetes JVM モニタリングデータに `
cluster=クラスター名` タグを追加します。重要クラスター名が一意であることを確認してください。一意でない場合、データ競合が発生する可能性があります。
JMX ユーザー名
JMX サーバーへのアクセスに使用するユーザー名。
Kubernetes クラスターでは、このパラメーターを設定しないことを推奨します。
JMX パスワード
JMX サーバーへのアクセスに使用するパスワード。
Kubernetes クラスターでは、このパラメーターを設定しないことを推奨します。
グローバルタグ
収集された Kubernetes JVM モニタリングデータに追加されるカスタムタグ。タグはキーと値のペアです。
このパラメーターを設定すると、Simple Log Service は、Logtail 構成を使用して収集された JVM モニタリングデータにカスタムタグを追加します。
K8s セレクターの設定
[名前空間]
データ収集元の名前空間の名前と一致させるために使用される正規表現。
ポッド名
データ収集元の Pod の名前と一致させるために使用される正規表現。
コンテナー名
データ収集元のコンテナの名前と一致させるために使用される正規表現。
環境変数のホワイトリスト
環境変数ホワイトリスト。データ収集が可能なコンテナを指定します。デフォルトではこのパラメーターは空で、すべてのコンテナから JVM モニタリングデータを収集することを示します。環境変数ホワイトリストを設定する場合、キーパラメーターは必須ですが、値パラメーターはオプションです。
EnvValue パラメーターが空の場合、環境変数に EnvKey で指定されたキーが含まれるコンテナが一致します。
EnvValue パラメーターが空でない場合、環境変数が EnvKey と EnvValue で指定されたキーと値のペアで構成されるコンテナが一致します。
デフォルトでは、EnvValue パラメーターの値に対して文字列マッチングが実行されます。環境変数の値が EnvValue パラメーターの値と同じ場合にのみ、コンテナがマッチします。EnvValue パラメーターにキャレット (
^) で始まり、ドル記号 ($) で終わる値を指定した場合、正規表現マッチングが実行されます。たとえば、[EnvKey] パラメーターを NGINX_SERVICE_PORT に設定し、[EnvValue] パラメーターを ^(80|6379)$ に設定した場合、ポート番号が 80 のコンテナとポート番号が 6379 のコンテナがマッチします。
キーと値のペアは OR 演算子で結合されます。コンテナに指定されたキーと値のペアのいずれかを持つ環境変数がある場合、そのコンテナは一致します。
環境変数のブラックリスト
環境変数ブラックリスト。データ収集ができないコンテナを指定します。デフォルトではこのパラメーターは空で、すべてのコンテナからデータを収集することを示します。環境変数ブラックリストを設定する場合、キーパラメーターは必須ですが、値パラメーターはオプションです。
EnvValue パラメーターが空の場合、環境変数に EnvKey で指定されたキーが含まれるコンテナは除外されます。
EnvValue パラメーターが空でない場合、環境変数が EnvKey と EnvValue で指定されたキーと値のペアで構成されるコンテナは除外されます。
デフォルトでは、EnvValue パラメーターの値に対して文字列マッチングが実行されます。 環境変数の値が EnvValue パラメーターの値と同一である場合にのみ、コンテナがマッチします。 EnvValue パラメーターにキャレット (
^) で始まり、ドル記号 ($) で終わる値を指定した場合、正規表現マッチングが実行されます。 たとえば、[EnvKey] パラメーターを NGINX_SERVICE_PORT に設定し、[EnvValue] パラメーターを ^(80|6379)$ に設定した場合、ポート番号が 80 のコンテナとポート番号が 6379 のコンテナがマッチします。
キーと値のペアは OR 演算子で結合されます。コンテナに指定されたキーと値のペアのいずれかを持つ環境変数がある場合、そのコンテナは除外されます。
K8s ラベルホワイトリスト
Kubernetes ラベルホワイトリスト。データ収集ができないコンテナを指定します。Kubernetes ラベルホワイトリストを設定する場合、キーパラメーターは必須ですが、値パラメーターはオプションです。
LabelValue パラメーターが空の場合、Kubernetes ラベルに LabelKey で指定されたキーが含まれるコンテナが一致します。
LabelValue パラメーターが空でない場合、Kubernetes ラベルが LabelKey と LabelValue で指定されたキーと値のペアで構成されるコンテナが一致します。
デフォルトでは、LabelValue パラメーターの値に対して文字列マッチングが実行されます。Kubernetes ラベルの値が LabelValue パラメーターの値と同じ場合にのみ、コンテナが一致します。キャレット (
^) で始まり、ドル記号 ($) で終わる値を指定した場合、正規表現マッチングが実行されます。たとえば、[LabelKey] パラメーターを app に設定し、[LabelValue] パラメーターを ^(test1|test2)$ に設定した場合、Kubernetes ラベルが app:test1 または app:test2 であるコンテナが一致します。
キーと値のペアは OR 演算子で結合されます。コンテナに指定されたキーと値のペアのいずれかを持つ Kubernetes ラベルがある場合、そのコンテナは一致します。
K8s ラベルブラックリスト
Kubernetes ラベルブラックリスト。データ収集ができないコンテナを指定します。Kubernetes ラベルブラックリストを設定する場合、キーパラメーターは必須ですが、値パラメーターはオプションです。
LabelValue パラメーターが空の場合、Kubernetes ラベルに LabelKey で指定されたキーが含まれるコンテナは除外されます。
LabelValue パラメーターが空でない場合、Kubernetes ラベルが LabelKey と LabelValue で指定されたキーと値のペアで構成されるコンテナは除外されます。
デフォルトでは、LabelValue パラメーターの値に対して文字列マッチングが実行されます。コンテナが一致するのは、Kubernetes ラベルの値が LabelValue パラメーターの値と同じ場合のみです。キャレット (
^) で始まり、ドル記号 ($) で終わる値を指定した場合、正規表現マッチングが実行されます。たとえば、[LabelKey] パラメーターを app に設定し、[LabelValue] パラメーターを ^(test1|test2)$ に設定した場合、Kubernetes ラベルが app:test1 または app:test2 であるコンテナが一致します。
キーと値のペアは OR 演算子で結合されます。コンテナに指定されたキーと値のペアのいずれかを持つ Kubernetes ラベルがある場合、そのコンテナは除外されます。
コンテナ ラベル ホワイトリスト
コンテナラベルホワイトリスト。データ収集が可能なコンテナを指定します。デフォルトではこのパラメーターは空で、すべてのコンテナから JVM モニタリングデータを収集することを示します。コンテナラベルホワイトリストを設定する場合、キーパラメーターは必須ですが、値パラメーターはオプションです。
LabelValue パラメーターが空の場合、コンテナラベルに LabelKey で指定されたキーが含まれるコンテナが一致します。
LabelValue パラメーターが空でない場合、コンテナラベルが LabelKey と LabelValue で指定されたキーと値のペアで構成されるコンテナが一致します。
デフォルトでは、LabelValue パラメーターの値に対して文字列マッチングが実行されます。 コンテナのラベルの値が LabelValue パラメーターの値と同じ場合にのみ、コンテナが照合されます。 LabelValue パラメーターに、キャレット (
^) で始まり、ドル記号 ($) で終わる値を指定した場合、正規表現マッチングが実行されます。 たとえば、[LabelKey] パラメーターを io.kubernetes.container.name に設定し、[LabelValue] パラメーターを ^(nginx|cube)$ に設定した場合、nginx という名前のコンテナと cube という名前のコンテナが照合されます。
キーと値のペアは OR 演算子で結合されます。コンテナに指定されたキーと値のペアのいずれかを持つコンテナラベルがある場合、そのコンテナは一致します。
コンテナ ラベル ブラックリスト
コンテナラベルブラックリスト。データ収集ができないコンテナを指定します。デフォルトではこのパラメーターは空で、すべてのコンテナからデータを収集することを示します。コンテナラベルブラックリストを設定する場合、キーパラメーターは必須ですが、値パラメーターはオプションです。
LabelValue パラメーターが空の場合、コンテナラベルに LabelKey で指定されたキーが含まれるコンテナは除外されます。
LabelValue パラメーターが空でない場合、コンテナラベルが LabelKey と LabelValue で指定されたキーと値のペアで構成されるコンテナは除外されます。
デフォルトでは、LabelValue パラメーターの値に対して文字列マッチングが実行されます。 コンテナは、コンテナのラベルの値が LabelValue パラメーターの値と同じである場合にのみマッチします。 LabelValue パラメーターにキャレット (
^) で始まり、ドル記号 ($) で終わる値を指定した場合、正規表現マッチングが実行されます。 たとえば、[LabelKey] パラメーターを io.kubernetes.container.name に設定し、[LabelValue] パラメーターを ^(nginx|cube)$ に設定した場合、nginx という名前のコンテナと cube という名前のコンテナがマッチします。
キーと値のペアは OR 演算子で結合されます。コンテナに指定されたキーと値のペアのいずれかを持つコンテナラベルがある場合、そのコンテナは除外されます。
詳細設定
K8s Label の副次的な収集
Kubernetes ラベルを設定すると、Simple Log Service は収集された JVM モニタリングデータに Kubernetes ラベル関連のフィールドを追加します。
たとえば、ラベルの名前を `
app` に、名前のエイリアスを `k8s_label_app` に設定します。Kubernetes クラスターに `app=serviceA` のような `app` という名前のラベルが含まれている場合、Simple Log Service は JVM モニタリングデータに `k8s_label_app: serviceA` というフィールドを追加します。環境変数の副次的な収集
環境変数ラベルを設定すると、Simple Log Service は収集された JVM モニタリングデータに環境変数ラベル関連のフィールドを追加します。
たとえば、環境変数の名前を `
VERSION` に、名前のエイリアスを `env_version` に設定した場合、コンテナに `VERSION=v1.0.0` のような `VERSION` という名前の環境変数が含まれていると、Simple Log Service は JVM モニタリングデータに `env_version: v1.0.0` というフィールドを追加します。新規ガベージコレクタ JMX モード
このスイッチをオンにすると、G1 などの新バージョンの JMX ガベージコレクターがサポートされます。
デフォルトの JVM メトリクス
このスイッチをオンにすると、Logtail は事前定義されたコア JVM メトリックを収集します。
JMX 収集範囲フィルター
JMX Bean の範囲、JMX Bean の正規表現、JMX Bean のタイプ、および JMX 属性の範囲を使用したフィルタリングと収集がサポートされています。
設定例
たとえば、`default` という名前空間で SpringBoot デモサービスを開始できます。次に、ILOGTAIL_JMX_PORT 宣言を使用してポート 9999 を公開します。環境変数 JAVA_TOOL_OPTIONS に、公開されたポート 9999 に対応する JMX メトリック用の JVM 起動パラメーターを追加します。
環境変数 JAVA_TOOL_OPTIONS を使用して環境変数 POD_IP を参照する前に、環境変数 POD_IP を定義する必要があります。
apiVersion: apps/v1
kind: Deployment
metadata:
name: jvm-new-1
namespace: default
spec:
...
template:
metadata:
labels:
app: jvm1
spec:
containers:
- image: evanljp/full-stack:jvm-new-0.1
name: jvm
env:
- name: "ILOGTAIL_JMX_PORT"
value: "9999"
- name: "ILOGTAIL_JMX_TAGS"
value: "a=b,c=d"
- name: POD_IP
valueFrom:
fieldRef:
fieldPath: status.podIP
- name: JAVA_TOOL_OPTIONS
value: >-
-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.local.only=false
-Dcom.sun.management.jmxremote.port=9999
-Dcom.sun.management.jmxremote.rmi.port=9999
-Djava.rmi.server.hostname=$(POD_IP)
-Dserver.port=8081
...
上記宣言を指定した後、Logtail 構成で以下の設定を完了して、Kubernetes JVM から Simple Log Service にモニタリングデータを収集する必要があります。
JVM モニタリングの K8s 自動検出構成ページで、[クラスター] を `test1` に設定します。[K8s セレクターの設定] セクションで、[K8s ラベルホワイトリスト] エントリを追加し、[LabelKey] を `app` に、[LabelValue] を `jvm1` に設定します。これは、前述の Deployment YAML で定義された `labels.app: jvm1` に対応します。
次のステップ
Kubernetes JVM モニタリングデータが収集され、Full-stack Monitoring アプリケーションに送信されると、アプリケーションはモニタリングデータ専用のダッシュボードを自動的に作成します。これらのダッシュボードを使用して、モニタリングデータを分析できます。詳細については、「ダッシュボードの表示」をご参照ください。