コンテナ環境では、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_configinstances の構成の構築の詳細については、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.* メトリクスのみを収集することもできます。

その他の参考資料