JMX を使用したオートディスカバリー
Dash が新機能を発表!インシデントマネジメント、Continuous Profiler など多数の機能が追加されました! Dash イベントで発表された新機能!

JMX を使用したオートディスカバリー

インテグレーションオートディスカバリーアノテーションを活用するか、オートディスカバリーコンテナ識別子を使用して、Kubernetes のポッドから JMX アプリケーションのメトリクスを収集します。オートディスカバリーアノテーションは、Datadog-JMX インテグレーションを構成するための推奨される方法です。コンフィギュレーションパラメーターのセットが長すぎてアノテーションに収まらない場合は、オートディスカバリーコンテナ識別子メソッドを使用します。

オートディスカバリーアノテーション

オートディスカバリーアノテーションロジックは、Agent が JMX チェックコンフィギュレーション要素を「自動的に検出」し、それに応じて JMX チェックを構成できるように、アノテーションを介して JMX チェックコンフィギュレーション要素をポッドに適用します。

  1. 通常の datadog/agent:latest ではなく、datadog/agent:latest-jmx イメージ名を使用して、Kubernetes クラスターで Agent を起動します。

  2. JMX アプリケーションを含むコンテナにオートディスカバリーアノテーションを適用します。

    apiVersion: v1
    kind: Pod
    metadata:
        name: <POD_NAME>
        annotations:
            ad.datadoghq.com/<CONTAINER_IDENTIFIER>.check_names: >-
              '["<INTEGRATION_NAME>"]'
            ad.datadoghq.com/<CONTAINER_IDENTIFIER>.init_configs: >-
              '[{"is_jmx": true, "collect_default_metrics": true}]'
            ad.datadoghq.com/<CONTAINER_IDENTIFIER>.instances: >-
              '[{"host": "%%host%%","port":"<JMX_PORT>"}]'
            ad.datadoghq.com/<CONTAINER_IDENTIFIER>.logs: >-
              '[{"source":"<INTEGRATION_NAME>","service":"<INTEGRATION_NAME>"}]'
        # (...)
    
    spec:
        containers:
            - name: '<CONTAINER_IDENTIFIER>'
            # (...)
              env:
              - name: POD_IP
                valueFrom:
                  fieldRef:
                    fieldPath: status.podIP
    
              - name: JAVA_OPTS
                value: >-
                  -Xms256m -Xmx6144m
                  -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)

Agent が RMI レジストリに接続することを JMX サーバーが許可するように、JAVA_OPTS 環境変数を作成する必要があります。

  **注**:
  - `<JMX_PORT>` は、JMX メトリクスを公開するポートを参照します。
  - 上記の例で、RMI レジストリへの接続は SSL ではありません。SSL を使用したい場合は、`ad.datadoghq.com/<CONTAINER_IDENTIFIER>.instances` アノテーションで `"rmi_registry_ssl": true` を使用し、対応する `Dcom.sun.management.jmxremote` を `JAVA_OPTS` から削除します。

JMX 対応のインテグレーション名 <INTEGRATION_NAME> のリストは次のとおりです。

たとえば、ポート 9012 で JMX メトリクスを公開している Tomcat を実行している場合は、次のようにします。

apiVersion: v1
kind: Pod
metadata:
    name: tomcat-test
    annotations:
        ad.datadoghq.com/tomcat.check_names: >-
          '["tomcat"]'
        ad.datadoghq.com/tomcat.init_configs: >-
          '[{"is_jmx": true, "collect_default_metrics": true}]'
        ad.datadoghq.com/tomcat.instances: >-
          '[{"host": "%%host%%","port":"9012"}]'
        ad.datadoghq.com/tomcat.logs: >-
          '[{"source":"Tomcat","service":"Tomcat"}]'

spec:
    containers:
        - name: tomcat
          image: tomcat:8.0
          imagePullPolicy: Always
          ports:
              - containerPort: 9012
          env:
            - name: POD_IP
              valueFrom:
                fieldRef:
                  fieldPath: status.podIP

            - name: JAVA_OPTS
              value: >-
                -Xms256m -Xmx6144m
                -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)

オートディスカバリーコンテナ識別子

Datadog-JMX インテグレーションのより複雑なコンフィギュレーションを渡す必要がある場合は、オートディスカバリーコンテナ識別子を利用して、カスタムインテグレーションコンフィギュレーションファイルまたはカスタム metrics.yaml ファイルを渡します。

Agent の準備

Agent がクラスターのコンテナとして実行されているか、ホストで直接実行されているかを選択します。

Agent がクラスターで実行されており、JMX メトリクスを収集するためにコンテナを自動検出する場合:

  1. 通常の datadog/agent:latest イメージではなく、必ず Agent イメージ datadog/agent:latest-jmx を実行してください。

  2. インテグレーションに関連付けられているコンフィギュレーションファイル conf.yamlmetrics.yaml を取得します。Datadog-JMX ベースのインテグレーションと関連するファイルのリストを以下に示します。

    インテグレーション名メトリクスファイルコンフィギュレーションファイル
    activemqmetrics.yamlconf.yaml.example
    cassandrametrics.yamlconf.yaml.example
    confluent_platformmetrics.yamlconf.yaml.example
    hivemetrics.yamlconf.yaml.example
    jboss_wildflymetrics.yamlconf.yaml.example
    kafkametrics.yamlconf.yaml.example
    solrmetrics.yamlconf.yaml.example
    prestometrics.yamlconf.yaml.example
    tomcatmetrics.yamlconf.yaml.example
  3. conf.yaml.example ファイルの名前を conf.yaml に変更します。

  4. Agent オートディスカバリーロジックに適合するように、conf.yaml のパラメーター値を置き換えます。コンフィギュレーションファイルにはデフォルトでホストパラメーター値があり、代わりにオートディスカバリーテンプレート変数ロジックを使用します。次の Tomcat チェックの例では、host パラメーター値が localhost から %%host%% に変更されています。

    init_config:
        ## @param is_jmx - boolean - required
        ## Whether or not this file is a configuration for a JMX integration.
        #
        is_jmx: true
    
        ## @param collect_default_metrics - boolean - required
        ## Whether or not the check should collect all default metrics.
        #
        collect_default_metrics: true
    
    instances:
        ## @param host - string - required
        ## Tomcat JMX hostname to connect to.
        #
        - host: '%%host%%'
    
          ## @param port - integer - required
          ## Tomcat JMX port to connect to.
          #
          port: 9012
  5. このコンフィギュレーションファイルをアプリケーションコンテナに適用する Agent に指定するには、conf.yaml ファイルの先頭に ad_identifiers パラメーターを構成します。

    ad_identifiers:
        - '<CUSTOM_AD_IDENTIFIER>'
    
    init_config:
        # (...)
    instances:
        # (...)

    : 上記の例ではカスタム ad_identifers 値を使用していますが、必要に応じて、コンテナショートイメージad_identifiers として指定できます。

  6. conf.d/<INTEGRATION_NAME>.d/ フォルダーの Agent にコンフィギュレーションファイル (conf.yamlmetrics.yaml) をマウントします。

  7. (任意) - Agent コンテナ (AWS ECS など) で上記のファイルをマウントできない場合は、これら 2 つのコンフィギュレーションファイルを使用して Agent Docker イメージを再構築する必要があります。

    FROM datadog/agent:latest-jmx
    COPY <PATH_JMX_CONF_FILE> conf.d/tomcat.d/
    COPY <PATH_JMX_METRICS_FILE> conf.d/tomcat.d/

    その後、この新しいカスタムイメージを正規のコンテナ化された Agent として使用します。

Agent がホストで実行されており、JMX メトリクスを収集するためにコンテナを自動検出する場合:

  1. Agent のオートディスカバリーを有効化します

  2. Agent インテグレーションディレクトリの対応する conf.yaml.example ファイルの名前を conf.yaml に変更して、使用する JMX インテグレーションを有効にします。たとえば Tomcat の場合、/etc/datadog-agent/conf.d/tomcat.d/conf.yaml.example の名前を /etc/datadog-agent/conf.d/tomcat.d/conf.yaml に変更します。

  3. Agent オートディスカバリーロジックに適合するように、conf.yaml ファイルのパラメーター値を置き換えます。コンフィギュレーションファイルにはデフォルトでホストパラメーター値があり、代わりにオートディスカバリーテンプレート変数を使用します。次の Tomcat コンフィギュレーションの例では、host パラメーター値が localhost から %%host%% に変更されています。

    init_config:
        ## @param is_jmx - boolean - required
        ## Whether or not this file is a configuration for a JMX integration.
        #
        is_jmx: true
    
        ## @param collect_default_metrics - boolean - required
        ## Whether or not the check should collect all default metrics.
        #
        collect_default_metrics: true
    
    instances:
        ## @param host - string - required
        ## Tomcat JMX hostname to connect to.
        #
        - host: '%%host%%'
    
          ## @param port - integer - required
          ## Tomcat JMX port to connect to.
          #
          port: 9012
  4. このコンフィギュレーションファイルをアプリケーションコンテナに適用する Agent に指定するには、conf.yaml ファイルの先頭に ad_identifiers パラメーターを構成します。

    ad_identifiers:
        - '<CUSTOM_AD_IDENTIFIER>'
    
    init_config:
        # (...)
    instances:
        # (...)

    : 上記の例ではカスタム ad_identifers 値を使用していますが、必要に応じて、コンテナショートイメージad_identifiers として指定できます。

  5. Agent を再起動します

コンテナの準備

Agent を構成して実行したら、アプリケーションコンテナの com.datadoghq.ad.check.id:"<CUSTOM_AD_IDENTIFIER>" ラベル/アノテーションを使用して、オートディスカバリーからチェックコンフィギュレーションを適用します。

apiVersion: v1
kind: Pod
# (...)
metadata:
    name: '<POD_NAME>'
    annotations:
        ad.datadoghq.com/<CONTAINER_IDENTIFIER>.check.id: '<CUSTOM_AD_IDENTIFIER>'
        # (...)
spec:
    containers:
        - name: '<CONTAINER_IDENTIFIER>'
          # (...)
          env:
            - name: POD_IP
              valueFrom:
                fieldRef:
                  fieldPath: status.podIP

            - name: JAVA_OPTS
              value: >-
                -Xms256m -Xmx6144m
                -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)
# (...)

:

  • 特定のコンフィギュレーションをコンテナに適用するには、オートディスカバリーはイメージではなく、名前でコンテナを認識します。<CONTAINER_IDENTIFIER>.spec.containers[0].image ではなく .spec.containers[0].name にマッチさせるよう試みます。
  • kind: Pod を使用して Kubernetes ポッドを直接定義する場合は、各ポッドのアノテーションを metadata セクションの真下に追加します。レプリケーションコントローラー、ReplicaSets、またはデプロイメントを使用してポッドを間接的に定義する場合は、ポッドアノテーションを .spec.template.metadata の下に追加します。
  • Agent が RMI レジストリに接続することを JMX サーバーが許可するように、JAVA_OPTS 環境変数を作成する必要があります。
  • <JMX_PORT> は、JMX メトリクスを公開するポートを参照します。
  • 上記の例で、RMI レジストリへの接続は SSL ではありません。SSL を使用したい場合は、ad.datadoghq.com/<CONTAINER_IDENTIFIER>.instances アノテーションで "rmi_registry_ssl": true を使用し、対応する Dcom.sun.management.jmxremoteJAVA_OPTS から削除します。

Dockerfile:

LABEL "com.datadoghq.ad.check.id"= '<CUSTOM_AD_IDENTIFIER>'

docker-compose.yaml:

labels:
    com.datadoghq.ad.check.id: '<CUSTOM_AD_IDENTIFIER>'

docker run command:

-l com.datadoghq.ad.check.id= '<CUSTOM_AD_IDENTIFIER>'

Docker Swarm:

Docker Cloud の Swarm モードを使用する場合は、以下のようにラベルをイメージに適用する必要があります。

version: '1.0'
services:
# ...
project:
    image: '<IMAGE_NAME>'
    labels:
        com.datadoghq.ad.check.id: '<CUSTOM_AD_IDENTIFIER>'

: Agent と JMX コンテナが同じネットワークブリッジ上にある場合は、JMX サーバーを -Djava.rmi.server.hostname=<CONTAINER_NAME>" でインスタンス化する必要があります。<CONTAINER_NAME> は JMX アプリケーションコンテナ名です。

その他の参考資料