コンテナ環境では、Agent が JMX サーバーに接続する方法にいくつかの違いがあります。オートディスカバリー機能により、これらのインテグレーションを動的にセットアップできます。Datadog の JMX ベースのインテグレーションを使用して、Kubernetes のポッドから JMX アプリケーションのメトリクスを収集しす。
アプリケーションに Java トレーサーを使用している場合、代わりに Java ランタイムメトリクス機能を利用して、これらのメトリクスを Agent に送信することができます。
インストール
JMX 対応 Agent の使用
JMX ユーティリティはデフォルトでは Agent にインストールされません。JMX インテグレーションを設定するには、Agent のイメージタグに -jmx
を追加します。例えば、gcr.io/datadoghq/agent:latest-jmx
です。
Datadog Operator または Helm を使用している場合、以下の構成で Agent のイメージタグに -jmx
を追加します。
apiVersion: datadoghq.com/v2alpha1
kind: DatadogAgent
metadata:
name: datadog
spec:
#(...)
override:
nodeAgent:
image:
jmxEnabled: true
agents:
image:
tagSuffix: jmx
構成
以下のいずれかの方法を使用します。
オートディスカバリーアノテーション
この方法では、Java ベースのポッド上のアノテーションを使用して JMX チェック構成が適用されます。これにより、新しいコンテナの起動時に Agent が自動的に JMX チェックを構成できるようになります。これらのアノテーションが、ポッドを作成するオブジェクト (デプロイ、DaemonSet など) 上ではなく、作成されたポッド上にあることを確認してください。
オートディスカバリーのアノテーションには、以下のテンプレートを使用します。
apiVersion: v1
kind: Pod
metadata:
name: <POD_NAME>
annotations:
ad.datadoghq.com/<CONTAINER_IDENTIFIER>.checks: |
{
"<INTEGRATION_NAME>": {
"init_config": {
"is_jmx": true,
"collect_default_metrics": true
},
"instances": [{
"host": "%%host%%",
"port": "<JMX_PORT>"
}]
}
}
# (...)
spec:
containers:
- name: '<CONTAINER_IDENTIFIER>'
# (...)
env:
- name: POD_IP
valueFrom:
fieldRef:
fieldPath: status.podIP
- name: JAVA_OPTS
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=<JMX_PORT>
-Dcom.sun.management.jmxremote.rmi.port=<JMX_PORT>
-Djava.rmi.server.hostname=$(POD_IP)
この例では
<POD_NAME>
はポッドの名前です。<CONTAINER_IDENTIFIER>
はポッド内の希望するコンテナにマッチします。<INTEGRATION_NAME>
は希望する JMX インテグレーションの名前です。利用可能な JMX インテグレーション](#available-jmx-integrations)のリストを参照してください。<JMX_PORT>
は、アノテーションと JAVA_OPTS
間で一致する限り、任意に設定します。
この構成では、Datadog Agent はこのポッドを検出し、%%host%%
オートディスカバリーテンプレート変数に相対する JMX サーバーにリクエストを行います。このリクエストは、検出されたポッドの IP アドレスに解決されます。このため、java.rmi.server.hostname
には、Kubernetes downward API で事前に入力された POD_IP
アドレスが設定されます。
注: JAVA_OPTS
環境変数は、Java ベースのコンテナイメージで起動パラメーターとして一般的に使用されます (例えば、java $JAVA_OPTS -jar app.jar
)。カスタムアプリケーションを使用している場合や、アプリケーションがこのパターンに従っていない場合は、これらのシステムプロパティを手動で設定してください。
アノテーション例: Tomcat
以下の構成では、ポート 9012
に対して Tomcat JMX インテグレーションを実行します。
apiVersion: v1
kind: Pod
metadata:
name: tomcat-test
annotations:
ad.datadoghq.com/tomcat.checks: |
{
"tomcat": {
"init_config": {
"is_jmx": true,
"collect_default_metrics": true
},
"instances": [{
"host": "%%host%%",
"port": "9012"
}]
}
}
spec:
containers:
- name: tomcat
image: tomcat:8.0
imagePullPolicy: Always
ports:
- name: jmx-metrics
containerPort: 9012
env:
- name: POD_IP
valueFrom:
fieldRef:
fieldPath: status.podIP
- name: JAVA_OPTS
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=9012
-Dcom.sun.management.jmxremote.rmi.port=9012
-Djava.rmi.server.hostname=$(POD_IP)
カスタムメトリクスアノテーションテンプレート
これらのインテグレーションから追加のメトリクスを収集する必要がある場合は、init_config
セクションに追加します。
ad.datadoghq.com/<CONTAINER_IDENTIFIER>.checks: |
{
"<INTEGRATION_NAME>": {
"init_config": {
"is_jmx": true,
"collect_default_metrics": true,
"conf": [{
"include": {
"domain": "java.lang",
"type": "OperatingSystem",
"attribute": {
"FreePhysicalMemorySize": {
"metric_type": "gauge",
"alias": "jvm.free_physical_memory"
}
}
}
}]
},
"instances": [{
"host": "%%host%%",
"port": "<JMX_PORT>"
}]
}
}
これらのメトリクスのフォーマットについての詳細は、JMX インテグレーションドキュメントを参照してください。
オートディスカバリーコンフィギュレーションファイル
Datadog-JMX インテグレーションのより複雑なカスタム構成を渡す必要がある場合は、オートディスカバリーコンテナ識別子を使用して、カスタムインテグレーションコンフィギュレーションファイルとカスタム metrics.yaml
ファイルを渡すことができます。
1. コンフィギュレーションファイルを構成する
この方法を使用する場合、Agent はコンフィギュレーションファイルと、収集するメトリクス用の metrics.yaml
ファイル (オプション) を必要とします。これらのファイルは、Agent ポッドにマウントするか、コンテナイメージに組み込みます。
コンフィギュレーションファイルの命名規則は、まず 利用可能なインテグレーションの前提ステップから希望のインテグレーション名を特定します。これが決まったら、Agent はそのインテグレーションに相対する名前のコンフィギュレーションファイル_または_そのインテグレーションの構成ディレクトリ内のコンフィギュレーションファイルを必要とします。
例えば、Tomcat インテグレーションでは、以下の_いずれか_を作成します。
/etc/datadog-agent/conf.d/tomcat.yaml
、または/etc/datadog-agent/conf.d/tomcat.d/conf.yaml
カスタム metrics.yaml
ファイルを使用している場合は、インテグレーションの構成ディレクトリにこれを含めます (例: /etc/datadog-agent/conf.d/tomcat.d/metrics.yaml
)。
このコンフィギュレーションファイルには ad_identifiers
を含める必要があります。
ad_identifiers:
- "<SHORT_IMAGE>"
init_config:
is_jmx: true
conf:
<METRICS_TO_COLLECT>
instances:
- host: "%%host%%"
port: "<JMX_PORT>"
<SHORT_IMAGE>
は、希望するコンテナのショートイメージ名に置き換えてください。例えば、コンテナイメージ gcr.io/CompanyName/my-app:latest
のショートイメージ名は my-app
です。Datadog Agent がこのコンテナを検出すると、このファイルに記述されているように JMX 構成を設定します。
ショートイメージ名を基にしたくない場合は、コンテナへのカスタム識別子を参照して指定することもできます。
Kubernetes アノテーションと同様に、コンフィギュレーションファイルもオートディスカバリーテンプレート変数を使用できます。この場合、host
構成は %%host%%
を使用して、検出されたコンテナの IP アドレスに解決します。
<METRICS_TO_COLLECT>
の init_config
と instances
の構成の構築の詳細については、JMX インテグレーションのドキュメント (および、事前提供のインテグレーションの構成例)を参照してください。
2. コンフィギュレーションファイルをマウントする
Datadog Operator を使用している場合は、オーバーライドを追加します。
apiVersion: datadoghq.com/v2alpha1
kind: DatadogAgent
metadata:
name: datadog
spec:
#(...)
override:
nodeAgent:
image:
jmxEnabled: true
extraConfd:
configDataMap:
<INTEGRATION_NAME>.yaml: |-
ad_identifiers:
- "<SHORT_IMAGE>"
init_config:
is_jmx: true
instances:
- host: "%%host%%"
port: "<JMX_PORT>"
Helm で、datadog.confd
オプションを使用します。
datadog:
confd:
<INTEGRATION_NAME>.yaml: |
ad_identifiers:
- "<SHORT_IMAGE>"
init_config:
is_jmx: true
instances:
- host: "%%host%%"
port: "<JMX_PORT>"
If you cannot mount these files in the Agent container (for example, on Amazon ECS) you can build an Agent Docker image containing the desired configuration files.
例:
FROM gcr.io/datadoghq/agent:latest-jmx
COPY <PATH_JMX_CONF_FILE> conf.d/tomcat.d/
COPY <PATH_JMX_METRICS_FILE> conf.d/tomcat.d/
その後、この新しいカスタムイメージを正規のコンテナ化された Agent として使用します。
3. JMX サーバーを公開する
Agent がアクセスできるように JMX サーバーを設定します。
spec:
containers:
- # (...)
env:
- name: POD_IP
valueFrom:
fieldRef:
fieldPath: status.podIP
- name: JAVA_OPTS
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=<JMX_PORT>
-Dcom.sun.management.jmxremote.rmi.port=<JMX_PORT>
-Djava.rmi.server.hostname=$(POD_IP)
利用可能な JMX インテグレーション
Datadog Agent には、いくつかの JMX インテグレーションが事前に構成されています。
上記の表にある各インテグレーションには、アプリケーションごとに返される JMX メトリクスの予想されるパターンに一致するように事前に定義された metrics.yaml
ファイルがあります。オートディスカバリーのアノテーションまたはコンフィギュレーションファイルで、<INTEGRATION_NAME>
としてリストされたインテグレーション名を使用してください。
あるいは、<INTEGRATION_NAME>
に jmx
を指定して、基本的な JMX インテグレーションをセットアップし、デフォルトの jvm.*
メトリクスのみを収集することもできます。
その他の参考資料