Kubernetes Java仮想マシン (JVM) のデータモニタリングは、Kubernetesクラスター内のすべてのJVMベースのサービスのための柔軟でエンドツーエンドのメトリック収集ソリューションです。 データモニタリングは、Kubernetes対応のLogtail設定と自動サービス検出に加えてサポートされます。
前提条件
フルスタックのObservabilityインスタンスが作成されます。 詳細は、インスタンスの作成をご参照ください。
実装
Java Management Extensions (JMX) テクノロジは、Java SEプラットフォームの標準的な部分です。 JMXは、主にJavaアプリケーションやJVMサーバ、リソースのステータスなどの情報を監視および管理するために使用されます。 JMXは、Prometheusエクスポータと同様に機能するデータ取り込み用のリモートメソッド呼び出し (RMI) をサポートしています。 メトリック読み取りは、Javaエージェントを使用するよりもRMIを呼び出す方が、より安全で、データ統合のコスト効率が高くなります。
Kubernetesクラスターでは、DaemonSetデプロイメントモデルはJVMメトリック収集コンポーネントとログ収集コンポーネントの両方に使用されます。 JVMからモニタリングデータを収集する場合、環境変数、Kubernetesラベル、名前空間、ポッド名、およびコンテナ名を使用してデータをフィルタリングできます。 データフィルタリングは、Kubernetesリソースの多次元選択をサポートするログ収集コンポーネントを使用して実装されます。 RMIにはJavaプロセス間の通信が必要であり、Kubernetesリソースの選択では無関係なプロセスが多数ヒットする可能性があります。 この場合、Logtailは環境変数ILOGTAIL_JMX_PORTを使用してデータの範囲をさらに絞り込みます。
始める前に
Logtailを使用して、KubernetesクラスターにデプロイされたJavaアプリケーションのJVMからモニタリングデータを自動的に収集する場合は、次の操作を実行する必要があります。
POD_IP宣言を環境変数に追加します。
例:
- name: POD_IP valueFrom: fieldRef: fieldPath: status.podIP
JVM起動パラメータを設定します。
JMXリモートアクセスを有効にするには、次のcom.sun.management.jmxremoteパラメーターを設定します。
com.sun.management.jmxremote.local.onlyパラメーターをfalseに設定します。
com.sun.management.jmxremote.sslとcom.sun.management.jmxremote.authenticateパラメーターの両方をfalseに設定するか、Logtail設定でJMX Passwordパラメーターを設定します。
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パラメーターの値で示されます。
上記の操作を完了したら、必要なポッドに接続し、jpsコマンドを実行してJVM起動パラメーターを表示できます。 jpsコマンドの
JAVA_TOOL_OPTIONS=""
宣言は、ポートの競合を回避するために使用されます。 jpsコマンドの実行時に環境変数JAVA_TOOL_OPTIONSを使用すると、ポートの競合が発生する可能性があります。環境変数を確認する: 必要なポッドに接続し、
env | grep ILOGTAIL_JMX_PORT
コマンドを実行します。
手順
[ログアプリケーション] セクションで、[インテリジェントO&M] タブをクリックします。 次に、[フルスタックの表示] をクリックします。
[Simple Log Serviceのフルスタックの観察可能性] ページで、管理するインスタンスをクリックします。
左側のナビゲーションウィンドウで、[フルスタックモニタリング] をクリックします。
インスタンスでフルスタック監視を初めて使用するときは、[有効化] をクリックします。
左側のナビゲーションウィンドウで、[データインポート] をクリックします。 [データインポート設定] ページで、[Kubernetesモニタリング] セクションの [Kubernetes JVMモニタリング] スイッチを見つけます。
ホストモニタリングデータのLogtail設定を初めて作成するときは、スイッチをオンにして設定ページに移動します。 Logtail設定を作成した場合は、アイコンをクリックして設定ページに移動します。
マシングループを作成する:
マシングループが作成されている場合は、この手順をスキップします。
自己管理KubernetesクラスターにLogtailをインストールする方法の詳細については、「自己管理KubernetesクラスターにLogtailコンポーネントをインストールする」をご参照ください。
Container Service for Kubernetes (ACK) クラスターのマシングループを作成します。 詳細については、「IPアドレスベースのマシングループの作成」をご参照ください。
[既存のマシングループを使用] をクリックします。
モニタリングコンポーネントのインストール後、Simple Log Serviceは、名前が
k8s-group-${your_k8s_cluster_id}
形式のマシングループを自動的に作成します。 このマシングループを使用できます。k8s-group-${your_k8s_cluster_id}
マシングループを選択し、[ソースサーバーグループ] セクションから [応用サーバーグループ] セクションにマシングループを移動し、[次へ] をクリックします。重要マシングループのハートビートステータスがFAILの場合、[自動再試行] をクリックします。 問題が解決しない場合は、Logtailマシングループにハートビートがない場合はどうすればよいですか?
[データソースの指定] ステップで、パラメーターを設定し、[完了] をクリックします。 下表に、各パラメーターを説明します。
設定が完了すると、Simple Log Serviceは自動的にMetricstoreなどのアセットを作成します。 詳細については、「アセット」をご参照ください。
パラメーター
説明
一般設定
設定名
Logtail設定の名前。 カスタム名を指定できます。
クラスター
Kubernetesクラスターの名前。 カスタム名を入力することができます。
このパラメーターを設定すると、Simple Log Serviceは、Logtail設定を使用して収集されたKubernetes JVMモニタリングデータに
cluster=Cluster name
タグを追加します。重要クラスター名が一意であることを確認してください。 そうしないと、データの競合が発生する可能性があります。
JMXユーザー名
JMXサーバーへのアクセスに使用されるユーザー名。
Kubernetesクラスターでは、このパラメーターを設定しないことを推奨します。
JMXパスワード
JMXサーバーへのアクセスに使用されるパスワード。
Kubernetesクラスターでは、このパラメーターを設定しないことを推奨します。
グローバルタグ
収集されたKubernetes JVMモニタリングデータに追加されるカスタムタグ。 タグはキーと値のペアです。
このパラメーターを設定した後、Simple Log Serviceは、Logtail設定を使用して収集されたJVMモニタリングデータにカスタムタグを追加します。
K8sセレクタの設定
名前空間
データが収集される名前空間の名前と一致するために使用される正規表現。
ポッド名
データが収集されるポッドの名前を照合するために使用される正規表現。
コンテナ名
データが収集されるコンテナーの名前を照合するために使用される正規表現。
環境変数ホワイトリスト
環境変数のホワイトリスト。 ホワイトリストは、データを収集できるコンテナを指定します。 デフォルトでは、このパラメーターは空です。これは、システムがすべてのコンテナーからJVMモニタリングデータを収集することを示します。 環境変数ホワイトリストを設定するときは、Keyパラメーターが必要です。 valueパラメーターはオプションです。
EnvValueパラメーターが空の場合、EnvKeyで指定されたキーが環境変数に含まれるコンテナーが一致します。
EnvValueパラメーターが空でない場合、EnvKeyとEnvValueで指定されたキーと値のペアで環境変数が構成されているコンテナーが一致します。
デフォルトでは、EnvValueパラメーターの値に対して文字列照合が実行されます。 コンテナは、環境変数の値がEnvValueパラメーターの値と同じである場合にのみ一致します。 EnvValueパラメーターにキャレット (
^
) で始まり、ドル記号 ($
) で終わる値を指定した場合、正規表現マッチングが実行されます。 たとえば、EnvKeyパラメーターをNGINX_SERVICE_PORTに設定し、EnvValueパラメーターを ^(80 | 6379)$ に設定した場合、ポート番号が80のコンテナーとポート番号が6379のコンテナーが一致します。
キーと値のペアは、OR演算子を使用して接続されます。 指定されたキーと値のペアの1つで構成される環境変数がコンテナーにある場合、コンテナーは照合されます。
環境変数ブラックリスト
環境変数ブラックリスト。 ブラックリストは、データを収集できないコンテナを指定します。 デフォルトでは、このパラメーターは空です。これは、システムがすべてのコンテナーからデータを収集することを示します。 環境変数ブラックリストを設定するときは、Keyパラメーターが必要です。 valueパラメーターはオプションです。
EnvValueパラメーターが空の場合、EnvKeyで指定されたキーが環境変数に含まれるコンテナーは除外されます。
EnvValueパラメーターが空でない場合、EnvKeyとEnvValueで指定されたキーと値のペアで環境変数が構成されているコンテナーは除外されます。
デフォルトでは、EnvValueパラメーターの値に対して文字列照合が実行されます。 コンテナは、環境変数の値がEnvValueパラメーターの値と同じである場合にのみ一致します。 EnvValueパラメーターにキャレット (
^
) で始まり、ドル記号 ($
) で終わる値を指定した場合、正規表現マッチングが実行されます。 たとえば、EnvKeyパラメーターをNGINX_SERVICE_PORTに設定し、EnvValueパラメーターを ^(80 | 6379)$ に設定した場合、ポート番号が80のコンテナーとポート番号が6379のコンテナーが一致します。
キーと値のペアは、OR演算子を使用して接続されます。 指定されたキーと値のペアの1つで構成される環境変数がコンテナーにある場合、コンテナーは除外されます。
K8sラベルホワイトリスト
Kubernetesラベルのホワイトリスト。 ホワイトリストは、データを収集できないコンテナを指定します。 Kubernetesラベルホワイトリストを設定する場合、Keyパラメーターは必須で、valueパラメーターはオプションです。
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ラベルブラックリストを設定する場合、Keyパラメーターは必須で、valueパラメーターはオプションです。
LabelValueパラメーターが空の場合、KubernetesラベルにLabelKeyで指定されたキーが含まれているコンテナーは除外されます。
LabelValueパラメーターが空でない場合、KubernetesラベルがLabelKeyとLabelValueで指定されたキーと値のペアで構成されているコンテナーは除外されます。
デフォルトでは、LabelValueパラメーターの値に対して文字列照合が実行されます。 コンテナーは、Kubernetesラベルの値がLabelValueパラメーターの値と同じである場合にのみ一致します。 キャレット (
^
) で始まり、ドル記号 ($
) で終わる値を指定した場合、正規表現マッチングが実行されます。 たとえば、LabelKeyパラメーターをappに設定し、LabelValueパラメーターを ^(test1 | test2)$ に設定した場合、Kubernetesラベルがapp:test1またはapp:test2で構成されるコンテナが一致します。
キーと値のペアは、OR演算子を使用して接続されます。 指定されたキーと値のペアのいずれかで構成されるKubernetesラベルがコンテナーに含まれている場合、コンテナーは除外されます。
容器ラベルのホワイトリスト
コンテナーラベルのホワイトリスト。 ホワイトリストは、データを収集できるコンテナを指定します。 デフォルトでは、このパラメーターは空です。これは、システムがすべてのコンテナーからJVMモニタリングデータを収集することを示します。 コンテナーラベルのホワイトリストを設定するときは、Keyパラメーターが必要です。 valueパラメーターはオプションです。
LabelValueパラメーターが空の場合、コンテナーラベルにLabelKeyで指定されたキーが含まれているコンテナーが一致します。
LabelValueパラメーターが空でない場合、コンテナーラベルがLabelKeyとLabelValueで指定されたキーと値のペアで構成されているコンテナーが一致します。
デフォルトでは、LabelValueパラメーターの値に対して文字列照合が実行されます。 コンテナーは、コンテナーラベルの値がLabelValueパラメーターの値と同じである場合にのみ一致します。 LabelValueパラメーターに、キャレット (
^
) で始まり、ドル記号 ($
) で終わる値を指定した場合、正規表現マッチングが実行されます。 たとえば、LabelKeyパラメーターをio.kubernetes.container.nameに設定し、LabelValueパラメーターを ^(nginx | cube)$ に設定すると、nginxという名前のコンテナーとcubeという名前のコンテナーが一致します。
キーと値のペアは、OR演算子を使用して接続されます。 指定されたキーと値のペアの1つで構成されるコンテナーラベルがコンテナーにある場合、コンテナーは照合されます。
Container Labelブラックリスト
コンテナーラベルのブラックリスト。 ブラックリストは、データを収集できないコンテナを指定します。 デフォルトでは、このパラメーターは空です。これは、すべてのコンテナーからデータを収集することを示します。 コンテナーラベルブラックリストを設定するときは、Keyパラメーターが必要です。 valueパラメーターはオプションです。
LabelValueパラメーターが空の場合、コンテナーラベルにLabelKeyで指定されたキーが含まれているコンテナーは除外されます。
LabelValueパラメーターが空でない場合、コンテナーラベルがLabelKeyとLabelValueで指定されたキーと値のペアで構成されているコンテナーは除外されます。
デフォルトでは、LabelValueパラメーターの値に対して文字列照合が実行されます。 コンテナーは、コンテナーラベルの値がLabelValueパラメーターの値と同じである場合にのみ一致します。 LabelValueパラメーターに、キャレット (
^
) で始まり、ドル記号 ($
) で終わる値を指定した場合、正規表現マッチングが実行されます。 たとえば、LabelKeyパラメーターをio.kubernetes.container.nameに設定し、LabelValueパラメーターを ^(nginx | cube)$ に設定すると、nginxという名前のコンテナーとcubeという名前のコンテナーが一致します。
キーと値のペアは、OR演算子を使用して接続されます。 指定されたキーと値のペアのいずれかで構成されるコンテナーラベルがコンテナーに含まれている場合、コンテナーは除外されます。
詳細設定
Kubernetesラベルの収集
Kubernetesラベルが設定された後、Simple Log Serviceは、収集されたJVMモニタリングデータにKubernetesラベル関連のフィールドを追加します。
たとえば、ラベルの名前を
app
に設定し、名前のエイリアスをk8s_label_app
に設定します。 Kubernetesクラスターにapp
という名前のラベル (app=serviceA
など) が含まれている場合、Simple Log Serviceはフィールドk8s_label_app: serviceA
をJVMモニタリングデータに追加します。環境変数の収集
環境変数ラベルが設定された後、Simple Log Serviceは収集されたJVMモニタリングデータに環境変数ラベル関連フィールドを追加します。
たとえば、環境変数の名前を
VERSION
に設定し、名前のエイリアスをenv_version
に設定した場合、コンテナにはVERSION
という名前の環境変数 (VERSION=v1.0.0
など) が含まれ、Simple Log Serviceはフィールドenv_version: v1.0.0
をJVMモニタリングデータに追加します。JMXガベージコレクターの新バージョン
スイッチをオンにすると、G1などの新しいバージョンのJMXガベージコレクターがサポートされます。
デフォルトのJVMメトリック
スイッチをオンにすると、Logtailは定義済みのコアJVMメトリックを収集します。
JMXメトリック収集フィルター
JMX bean範囲、JMX bean正規表現、JMX beanタイプ、およびJMX属性範囲を使用したフィルタリングと収集がサポートされています。
設定例
たとえば、デフォルトという名前の名前空間でSpringBoot Demoサービスを開始できます。 次に、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
...
上記の宣言を指定した後、Kubernetes JVMからSimple Log Serviceにモニタリングデータを収集するには、Logtail設定で次の設定を完了する必要があります。
次のステップ
Kubernetes JVMモニタリングデータが収集され、フルスタック監視アプリケーションに送信されると、アプリケーションは自動的にモニタリングデータ専用のダッシュボードを作成します。 ダッシュボードを使用して、モニタリングデータを分析できます。 詳細については、「ダッシュボードの表示」をご参照ください。