コンテナ環境では、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_NAME>.checks: |
      {
        "<INTEGRATION_NAME>": {
          "init_config": {
            "is_jmx": true,
            "collect_default_metrics": true
          },
          "instances": [{
            "host": "%%host%%",
            "port": "<JMX_PORT>"
          }]
        }
      }
    # (...)
spec:
  containers:
    - name: '<CONTAINER_NAME>'
      # (...)
      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_NAME>はポッド内の希望するコンテナにマッチします。
- <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_NAME>.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:
  - <CONTAINER_IMAGE>
init_config:
  is_jmx: true
  conf:
    <METRICS_TO_COLLECT>
instances:
  - host: "%%host%%"
    port: "<JMX_PORT>"
<CONTAINER_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:
              - <CONTAINER_IMAGE>
            init_config:
              is_jmx: true
            instances:
              - host: "%%host%%"
                port: "<JMX_PORT>"
Helm で、datadog.confd オプションを使用します。
datadog:
  confd:
    <INTEGRATION_NAME>.yaml: |
      ad_identifiers:
        - <CONTAINER_IMAGE>
      init_config:
        is_jmx: true
      instances:
        - host: "%%host%%"
          port: "<JMX_PORT>"
これらのファイルを Agent コンテナにマウントできない場合 (Amazon ECS など)、希望するコンフィギュレーションファイルを含む Agent Docker イメージを構築できます。
例:
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.* メトリクスのみを収集することもできます。
その他の参考資料