Dans les environnements conteneurisés, il existe quelques différences dans la façon dont lʼAgent se connecte au serveur JMX. La fonctionnalité Autodiscovery permet de configurer ces intégrations de façon dynamique. Utilisez les intégrations basées sur JMX de Datadog pour collecter des métriques sur les applications JMX de vos pods dans Kubernetes.

Si vous utilisez le traceur Java pour vos applications, vous pouvez également tirer parti de la fonctionnalité de métriques sur le runtime Java pour envoyer ces métriques à lʼAgent.

Installation

Utiliser un Agent compatible avec JMX

Les utilitaires JMX ne sont pas installés par défaut sur lʼAgent. Pour mettre en place une intégration JMX, ajoutez -jmx to your Agent’s image tag. For example, gcr.io/datadoghq/agent:latest-jmx.

Si vous utilisez Datadog Operator ou Helm, les configurations suivantes ajoutent -jmx au tag de l’image de votre Agent :

apiVersion: datadoghq.com/v2alpha1
kind: DatadogAgent
metadata:
  name: datadog
spec:
  #(...)
  override:
    nodeAgent:
      image:
        jmxEnabled: true
agents:
  image:
    tagSuffix: jmx

Configuration

Utilisez l’une des méthodes suivantes :

Annotations Autodiscovery

Dans cette méthode, une configuration de check JMX est appliquée à vos Pods basés sur Java par le biais d’annotations. Cela permet à lʼAgent de configurer automatiquement le check JMX lorsqu’un nouveau conteneur démarre. Assurez-vous que ces annotations se trouvent sur le Pod créé et non sur l’objet (Deployment, DaemonSet, etc.) qui crée le Pod.

Utilisez le modèle suivant pour les annotations dʼAutodiscovery :

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)            

Dans cet exemple :

  • <POD_NAME> est le nom de votre pod.
  • <CONTAINER_IDENTIFIER> correspond au conteneur souhaité dans votre pod.
  • <INTEGRATION_NAME> est le nom de l’intégration JMX souhaitée. Référez-vous à la liste des [intégrations JMX disponibles] (#integrations-JMX-disponibles).
  • Définissez <JMX_PORT> comme vous le souhaitez, en veillant à ce quʼil y ait une correspondance entre les annotations et JAVA_OPTS.

Avec cette configuration, lʼAgent Datadog découvre ce pod et envoie une requête au serveur JMX relative à la variable de modèle Autodiscovery %%host%%. Cette requête se résout en l’adresse IP du module découvert. C’est pourquoi java.rmi.server.hostname est défini sur l’adresse POD_IP précédemment renseignée avec la downward API Kubernetes.

Remarque : la variable dʼenvironnement JAVA_OPTS est couramment utilisée dans les images de conteneur basées sur Java comme paramètre de démarrage (par exemple, java $JAVA_OPTS -jar app.jar). Si vous utilisez une application personnalisée ou si votre application ne suit pas ce modèle, définissez manuellement ces propriétés du système.

Exemple d’annotation : Tomcat

La configuration suivante exécute lʼintégration JMX Tomcat sur le port 9012 :

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)            

Modèle d’annotation de métrique personnalisée

Si vous devez collecter d’autres métriques à partir de ces intégrations, ajoutez-les à la section 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>"
      }]
    }
  }  

Référez-vous à la documentation relative à lʼintégration JMX pour en savoir plus sur le formatage de ces métriques.

Fichiers de configuration Autodiscovery

Si vous devez transmettre une configuration personnalisée plus complexe pour votre intégration Datadog/JMX, vous pouvez utiliser les identificateurs de conteneur Autodiscovery pour envoyer un fichier de configuration d’intégration personnalisé ou un fichier metrics.yaml personnalisé.

2. Composer le fichier de configuration

Pour cette méthode, lʼAgent a besoin d’un fichier de configuration et d’un fichier metrics.yaml facultatif afin que les métriques puissent collecter les données. Ces fichiers peuvent être montés dans le pod de lʼAgent ou intégrés dans l’image de conteneur.

En matière de dénomination du fichier de configuration, on cherche tout d’abord à identifier lʼintégration souhaitée à partir des [étapes préalables des intégrations disponibles] (#integrations-jmx-disponibles). Une fois ce nom déterminé, lʼAgent a besoin d’un fichier de configuration nommé en rapport avec lʼintégration ou dans le répertoire de configuration de lʼintégration.

Par exemple, pour lʼintégration Tomcat, créez soit :

  • /etc/datadog-agent/conf.d/tomcat.yaml ou
  • /etc/datadog-agent/conf.d/tomcat.d/conf.yaml

Si vous utilisez un fichier metrics.yaml personnalisé, incluez-le dans le répertoire de configuration de lʼintégration. Par exemple : /etc/datadog-agent/conf.d/tomcat.d/metrics.yaml.

Ce fichier de configuration doit inclure ad_identifiers :

ad_identifiers:
  - "<SHORT_IMAGE>"

init_config:
  is_jmx: true
  conf:
    <METRICS_TO_COLLECT>

instances:
  - host: "%%host%%"
    port: "<JMX_PORT>"

Remplacez <SHORT_IMAGE> par le nom dʼimage court du conteneur de votre choix. Par exemple, lʼimage de conteneur gcr.io/CompanyName/my-app:latest a pour nom dʼimage court my-app. Lorsque lʼAgent Datadog découvre ce conteneur, il établit la configuration JMX comme décrit dans ce fichier.

Vous pouvez également spécifier des identifiants personnalisés pour vos conteneurs et y faire référence si vous ne souhaitez pas vous baser sur le nom court de l’image.

Comme les annotations Kubernetes, les fichiers de configuration peuvent utiliser les template variables Autodiscovery. Dans ce cas, la configuration host utilise %%host%% pour résoudre l’adresse IP du conteneur découvert.

Référez-vous à la documentation relative à lʼintégration JMX, ainsi quʼaux exemples pré-fournis de configurations pour les intégrations pour en savoir plus sur la structuration de votre configuration init_config et instances pour que la<METRICS_TO_COLLECT>.

2. Monter le fichier de configuration

Si vous utilisez Datadog Operator, ajoutez un override :

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>"            

Dans Helm, utilisez l’option datadog.confd :

datadog:
  confd:
    <INTEGRATION_NAME>.yaml: |
      ad_identifiers:
        - "<SHORT_IMAGE>"

      init_config:
        is_jmx: true

      instances:
        - host: "%%host%%"
          port: "<JMX_PORT>"      

Si vous ne pouvez pas monter ces fichiers dans le conteneur de lʼAgent (par exemple, sur Amazon ECS), vous pouvez créer une image Docker de lʼAgent contenant les fichiers de configuration souhaités.

Par exemple :

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/

Ensuite, utilisez cette nouvelle image personnalisée comme votre Agent conteneurisé classique.

3. Exposer le serveur JMX

Configurez le serveur JMX de manière à permettre à lʼAgent d’y accéder :

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)             

Intégrations JMX disponibles

LʼAgent Datadog est fourni avec plusieurs intégrations JMX préconfigurées.

Chaque intégration du tableau ci-dessus possède un fichier metrics.yaml prédéfini pour correspondre au modèle attendu des métriques JMX renvoyées par chaque application. Utilisez les intégrations listées comme <INTEGRATION_NAME> dans vos annotations ou fichiers de configuration Autodiscovery.

Vous pouvez également utiliser jmx comme <INTEGRATION_NAME> pour mettre en place une intégration JMX basique et collecter les métriques jvm.* par défaut uniquement.

Pour aller plus loin