컨테이너 환경에서는 Agent가 JMX 서버에 연결하는 방식에 몇 가지 차이점이 있습니다. Autodiscovery 기능을 사용하면 이러한 통합을 동적으로 설정할 수 있습니다. 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 점검을 자동으로 구성할 수 있습니다. 이러한 주석은 포드를 생성하는 객체(Deployment, DaemonSet 등)가 아니라 생성된 포드에 있어야 합니다.

Autodiscovery 주석에는 다음 템플릿을 사용하세요.

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 통합 목록을 확인하세요.
  • 주석과 JAVA_OPTS 사이에 일치한다면 원하는 대로 <JMX_PORT>를 설정하세요.

이 구성을 사용하면 Datadog Agent가 해당 포드를 검색하고 %%host%%Autodiscovery 템플릿 변수를 기준으로 JMX 서버에 요청을 보냅니다. 이 요청은 검색된 포드의 IP 주소로 확인됩니다. 따라서 java.rmi.server.hostname이 이전에 Kubernetes Downward API를 통해 입력된 POD_IP 주소로 설정됩니다.

참고: JAVA_OPTS 환경 변수는 Java 기반 컨테이너 이미지에서 시작 파라미터로 일반적으로 사용됩니다(예: java $JAVA_OPTS -jar app.jar). 사용자 지정 애플리케이션을 사용하거나 애플리케이션이 이 패턴을 따르지 않는 경우 이러한 시스템 속성을 수동으로 설정하세요.

예제 주석: Tomcat

다음 구성은 포트 9012Tomcat 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 통합 문서를 참고하세요.

Autodiscovery 구성 파일

Datadog-JMX 통합에 보다 복잡한 사용자 정의 구성을 전달해야 하는 경우 Autodiscovery Container Identifiers를 사용하여 사용자 정의 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 파일을 사용하는 경우 통합의 config 디렉터리에 포함하세요. (예: /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 주석과 마찬가지로 구성 파일도 Autodiscovery 템플릿 변수를 사용할 수 있습니다. 이 경우 host 구성은 검색된 컨테이너의 IP 주소를 확인하기 위해 %%host%%를 사용합니다.

<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:
              - <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 파일이 있습니다. 안내된 통합의 이름을 Autodiscovery 주석이나 구성 파일에서 <INTEGRATION_NAME>으로 사용하세요.

또는 jmx<INTEGRATION_NAME>으로 사용하여 기본 JMX 통합을 설정하고 기본 jvm.* 메트릭만 수집할 수 있습니다.

참고 자료