본문 바로가기
WIKI 기술 지식 베이스

자체 호스팅 MongoDB용 Database Monitoring 설정하기

원문 보기 위키 갱신

이 페이지에서는 자체 호스팅 MongoDB 데이터베이스에 Database Monitoring을 설정하는 방법을 설명드릴게요. Database Monitoring은 핵심 메트릭, 느린 작업, 작업 샘플, explain plan, 복제 상태 변경에 대한 액세스를 제공해 MongoDB 데이터베이스에 대한 포괄적인 인사이트를 제공합니다. MongoDB용 Database Monitoring을 활용하려면 Datadog Agent가 설치되어 MongoDB 인스턴스에 연결하도록 구성되어 있어야 해요. 이 가이드는 자체 호스팅 MongoDB에 Database Monitoring을 설정하는 단계를 설명합니다.

출처: 문서

본문

시작하기 전에 (Before you begin)

  • 지원되는 MongoDB 메이저 버전: 4.4, 5.0, 6.0, 7.0, 8.0
  • 지원되는 MongoDB 에디션: Community, Enterprise
  • 지원되는 Agent 버전: 7.58.0+
  • 성능 영향: Database Monitoring의 기본 Agent 구성은 보수적이지만, 수집 간격이나 작업 샘플링 비율 같은 설정을 필요에 맞게 조정할 수 있어요. 대부분의 워크로드에서 에이전트는 데이터베이스 쿼리 실행 시간의 1% 미만, CPU의 1% 미만을 차지합니다.
  • 연결 문자열 또는 SRV 문자열: MongoDB 연결 문자열이나 SRV 문자열은 자동 장애 조치와 로드 밸런싱 같은 많은 이점을 제공하지만, Datadog Agent는 모니터링되는 MongoDB 인스턴스에 직접 연결해야 해요. 에이전트가 실행 중에 다른 MongoDB 인스턴스에 연결하면(장애 조치, 로드 밸런싱 등의 경우) 에이전트는 두 호스트 사이의 통계 차이를 계산해 부정확한 메트릭을 만들어내요.
  • 데이터 보안 고려 사항: 에이전트가 데이터베이스에서 수집하는 데이터와 이를 안전하게 유지하는 방법은 민감 정보 (Sensitive information) 문서를 참고하세요.

설정 (Setup)

데이터베이스에 Database Monitoring을 활성화하려면:

  1. 에이전트에 MongoDB 인스턴스 액세스 권한 부여하기
  2. 에이전트 설치 및 구성하기

에이전트에 MongoDB 인스턴스 액세스 권한 부여하기

Datadog Agent는 통계와 쿼리를 수집하기 위해 MongoDB 인스턴스에 대한 읽기 전용 액세스가 필요해요.

{% tab title="Standalone" %} Mongo 셸에서 MongoDB 인스턴스에 인증하고, admin 데이터베이스에 Datadog Agent용 읽기 전용 사용자를 만든 뒤 필요한 권한을 부여하세요.

# admin 사용자로 인증합니다.
use admin
db.auth("admin", "<YOUR_MONGODB_ADMIN_PASSWORD>")

# Datadog Agent용 사용자를 만듭니다.
db.createUser({
  "user": "datadog",
  "pwd": "<UNIQUE_PASSWORD>",
  "roles": [
    { role: "read", db: "admin" },
    { role: "read", db: "local" },
    { role: "clusterMonitor", db: "admin" }
  ]
})

모니터링하려는 데이터베이스에서 datadog 사용자에게 추가 권한을 부여하세요.

db.grantRolesToUser("datadog", [
  { role: "read", db: "mydatabase" },
  { role: "read", db: "myotherdatabase" }
])

또는 admin 데이터베이스의 datadog 사용자에게 readAnyDatabase 역할을 부여해 모든 데이터베이스를 모니터링할 수 있어요.

db.grantRolesToUser("datadog", [
  { role: "readAnyDatabase", db: "admin" }
])

{% /tab %}

{% tab title="Replica Set" %} Mongo 셸에서 레플리카 셋의 프라이머리 노드에 인증하고, admin 데이터베이스에 Datadog Agent용 읽기 전용 사용자를 만든 뒤 필요한 권한을 부여하세요.

# admin 사용자로 인증합니다.
use admin
db.auth("admin", "<YOUR_MONGODB_ADMIN_PASSWORD>")

# Datadog Agent용 사용자를 만듭니다.
db.createUser({
  "user": "datadog",
  "pwd": "<UNIQUE_PASSWORD>",
  "roles": [
    { role: "read", db: "admin" },
    { role: "read", db: "local" },
    { role: "clusterMonitor", db: "admin" }
  ]
})

모니터링하려는 데이터베이스에서 datadog 사용자에게 추가 권한을 부여하세요.

db.grantRolesToUser("datadog", [
  { role: "read", db: "mydatabase" },
  { role: "read", db: "myotherdatabase" }
])

또는 admin 데이터베이스의 datadog 사용자에게 readAnyDatabase 역할을 부여해 모든 데이터베이스를 모니터링할 수 있어요.

db.grantRolesToUser("datadog", [
  { role: "readAnyDatabase", db: "admin" }
])

{% /tab %}

{% tab title="Sharded Cluster" %}

  1. 클러스터의 각 샤드에 대해 샤드의 프라이머리 노드에 연결하고, admin 데이터베이스에 Datadog Agent용 읽기 전용 사용자를 만든 뒤 필요한 권한을 부여하세요.
# admin 사용자로 인증합니다.
use admin
db.auth("admin", "<YOUR_MONGODB_ADMIN_PASSWORD>")

# Datadog Agent용 사용자를 만듭니다.
db.createUser({
  "user": "datadog",
  "pwd": "<UNIQUE_PASSWORD>",
  "roles": [
    { role: "read", db: "admin" },
    { role: "read", db: "local" },
    { role: "clusterMonitor", db: "admin" }
  ]
})

모니터링하려는 데이터베이스에서 datadog 사용자에게 추가 권한을 부여하세요.

db.grantRolesToUser("datadog", [
  { role: "read", db: "mydatabase" },
  { role: "read", db: "myotherdatabase" }
])

또는 admin 데이터베이스의 datadog 사용자에게 readAnyDatabase 역할을 부여해 모든 데이터베이스를 모니터링할 수 있어요.

db.grantRolesToUser("datadog", [
  { role: "readAnyDatabase", db: "admin" }
])

mongos 프록시에서도 같은 단계를 수행해 같은 사용자를 만드세요. 이렇게 하면 로컬 사용자가 config 서버에 생성되어 직접 연결이 가능해집니다. {% /tab %}

비밀번호를 안전하게 저장하기

Vault 같은 비밀 관리 소프트웨어로 비밀번호를 저장하세요. 그러면 에이전트 설정 파일에서 이 비밀번호를 ENC[<SECRET_NAME>]로 참조할 수 있어요. 예: ENC[datadog_user_database_password]. 자세한 내용은 비밀 관리 (Secrets Management)를 참고하세요.

이 페이지의 예시는 비밀번호가 저장된 비밀의 이름으로 datadog_user_database_password를 사용합니다. 비밀번호를 평문으로 참조하는 것도 가능하지만 권장되지는 않아요.

에이전트 설치 및 구성하기

Datadog은 MongoDB 호스트에 직접 에이전트를 설치할 것을 권장합니다. 그래야 MongoDB 전용 원격 측정 외에도 다양한 시스템 원격 측정(CPU, 메모리, 디스크, 네트워크)을 수집할 수 있어요.

구성 파일 만들기

{% tab title="Standalone" %} 에이전트가 standalone MongoDB 인스턴스를 모니터링하도록 구성하려면 다음 구성 블록을 사용하세요.

init_config:
instances:
    ## @param hosts - required
    ## standalone mongod 인스턴스의 호스트 이름, IP 주소 또는 UNIX 도메인
    ## 소켓을 지정하세요. 포트 번호를 지정하지 않으면
    ## 기본 포트 27017이 사용됩니다.
    #
  - hosts:
      - <HOST>:<PORT>

    ## @param username - string - optional
    ## 인증에 사용할 사용자 이름.
    #
    username: datadog

    ## @param password - string - optional
    ## 인증에 사용할 비밀번호.
    #
    password: "ENC[datadog_user_database_password]"

    ## @param options - mapping - optional
    ## 연결 옵션. 전체 목록은 다음을 참고하세요:
    ## https://docs.mongodb.com/manual/reference/connection-string/#connections-connection-options
    #
    options:
      authSource: admin

    ## @param tls - boolean - optional
    ## TLS로 MongoDB 인스턴스에 연결하려면 true로 설정하세요.
    #
    tls: true

    ## @param dbm - boolean - optional
    ## Database Monitoring을 활성화하려면 true로 설정하세요.
    #
    dbm: true

    ## @param cluster_name - string - optional
    ## 모니터링되는 MongoDB 인스턴스가 속한 클러스터의 고유 이름.
    ## MongoDB 클러스터에서 MongoDB 인스턴스를 그룹화하는 데 사용됩니다.
    ## cluster_name은 Datadog 태그 명명 규칙을 따라야 합니다. 다음을 참고하세요:
    ## https://docs.datadoghq.com/extend/guide/what-best-practices-are-recommended-for-naming-metrics-and-tags/#rules-and-best-practices-for-naming-tags
    ## `dbm`이 활성화되면 필수입니다.
    #
    cluster_name: <MONGO_CLUSTER_NAME>

    ## @param reported_database_hostname - string - optional
    ## 연결된 MongoDB 인스턴스의 보고된 데이터베이스 호스트 이름을 설정하세요.
    ## 이 값은 에이전트가 MongoDB admin 명령 serverStatus.host에서
    ## 감지한 MongoDB 호스트 이름을 재정의합니다.
    #
    reported_database_hostname: <DATABASE_HOSTNAME_OVERRIDE>

    ## @param additional_metrics - list of strings - optional
    ## 수집할 추가 메트릭 목록. 사용 가능한 옵션:
    ## - metrics.commands: 데이터베이스 명령 사용
    ## - tcmalloc: TCMalloc 메모리 할당자
    ## - top: 각 컬렉션의 사용 통계
    ## - collection: 지정된 컬렉션의 메트릭
    #
    additional_metrics: ["metrics.commands", "tcmalloc", "top", "collection"]

    ## @param collections_indexes_stats - boolean - optional
    ## 지정된 컬렉션의 인덱스 통계를 수집하려면 true로 설정하세요.
    ## `collections`가 설정되어 있어야 합니다.
    #
    collections_indexes_stats: true

    ## @param database_autodiscovery - mapping - optional
    ## 데이터베이스 자동 탐지를 활성화해 모든 MongoDB 데이터베이스에서 메트릭을 자동으로 수집하세요.
    #
    database_autodiscovery:
      ## @param enabled - boolean - required
      ## 데이터베이스 자동 탐지를 활성화합니다.
      #
      enabled: true

      ## @param include - list of strings - optional
      ## 자동 탐지에 포함할 데이터베이스 목록. 여러 데이터베이스를 매칭하려면 정규식을 사용하세요.
      ## 예를 들어 "mydb"로 시작하는 모든 데이터베이스를 포함하려면 "^mydb.*"를 사용하세요.
      ## 기본적으로 include는 ".*"로 설정되어 모든 데이터베이스가 포함됩니다.
      #
      include:
        - "^mydb.*"

      ## @param exclude - list of strings - optional
      ## 자동 탐지에서 제외할 데이터베이스 목록. 여러 데이터베이스를 매칭하려면 정규식을 사용하세요.
      ## 예를 들어 "mydb"로 시작하는 모든 데이터베이스를 제외하려면 "^mydb.*"를 사용하세요.
      ## exclude 목록이 include 목록과 충돌하면 exclude 목록이 우선합니다.
      #
      exclude:
        - "^mydb2.*"
        - "admin$"

      ## @param max_databases - integer - optional
      ## 메트릭을 수집할 최대 데이터베이스 수. 기본값은 100입니다.
      #
      max_databases: 100

      ## @param refresh_interval - integer - optional
      ## 데이터베이스 목록을 새로고침하는 간격(초). 기본값은 600초입니다.
      #
      refresh_interval: 600

{% /tab %}

{% tab title="Replica Set" %} MongoDB 레플리카 셋을 모니터링하려면 에이전트가 레플리카 셋의 모든 멤버(arbiter 포함)에 연결해야 해요.

레플리카 셋 멤버에 연결하도록 에이전트를 구성하는 예시로 다음 구성 블록을 사용하세요.

init_config:
instances:
    ## @param hosts - required
    ## 레플리카 셋 구성에 나열된 대로 mongod 인스턴스의
    ## 호스트 이름, IP 주소 또는 UNIX 도메인 소켓을 지정하세요.
    ## 포트 번호를 지정하지 않으면 기본 포트 27017이 사용됩니다.
    #
  - hosts:
      - <HOST>:<PORT>

    ## @param username - string - optional
    ## 인증에 사용할 사용자 이름.
    #
    username: datadog

    ## @param password - string - optional
    ## 인증에 사용할 비밀번호.
    #
    password: "ENC[datadog_user_database_password]"

    ## @param options - mapping - optional
    ## 연결 옵션. 전체 목록은 다음을 참고하세요:
    ## https://docs.mongodb.com/manual/reference/connection-string/#connections-connection-options
    #
    options:
      authSource: admin

    ## @param tls - boolean - optional
    ## TLS로 MongoDB 인스턴스에 연결하려면 true로 설정하세요.
    #
    tls: true

    ## @param dbm - boolean - optional
    ## Database Monitoring을 활성화하려면 true로 설정하세요.
    #
    dbm: true

    ## @param cluster_name - string - optional
    ## 모니터링되는 MongoDB 인스턴스가 속한 클러스터의 고유 이름.
    ## MongoDB 클러스터에서 MongoDB 인스턴스를 그룹화하는 데 사용됩니다.
    ## cluster_name은 Datadog 태그 명명 규칙을 따라야 합니다. 다음을 참고하세요:
    ## https://docs.datadoghq.com/extend/guide/what-best-practices-are-recommended-for-naming-metrics-and-tags/#rules-and-best-practices-for-naming-tags
    ## `dbm`이 활성화되면 필수입니다.
    #
    cluster_name: <MONGO_CLUSTER_NAME>

    ## @param reported_database_hostname - string - optional
    ## 연결된 MongoDB 인스턴스의 보고된 데이터베이스 호스트 이름을 설정하세요.
    ## 이 값은 에이전트가 MongoDB admin 명령 serverStatus.host에서
    ## 감지한 MongoDB 호스트 이름을 재정의합니다.
    #
    reported_database_hostname: <DATABASE_HOSTNAME_OVERRIDE>


    ## @param additional_metrics - list of strings - optional
    ## 수집할 추가 메트릭 목록. 사용 가능한 옵션:
    ## - metrics.commands: 데이터베이스 명령 사용
    ## - tcmalloc: TCMalloc 메모리 할당자
    ## - top: 각 컬렉션의 사용 통계
    ## - collection: 지정된 컬렉션의 메트릭
    #
    additional_metrics: ["metrics.commands", "tcmalloc", "top", "collection"]

    ## @param collections_indexes_stats - boolean - optional
    ## 지정된 컬렉션의 인덱스 통계를 수집하려면 true로 설정하세요.
    ## `collections`가 설정되어 있어야 합니다.
    #
    collections_indexes_stats: true

    ## @param database_autodiscovery - mapping - optional
    ## 데이터베이스 자동 탐지를 활성화해 모든 MongoDB 데이터베이스에서 메트릭을 자동으로 수집하세요.
    #
    database_autodiscovery:
      ## @param enabled - boolean - required
      ## 데이터베이스 자동 탐지를 활성화합니다.
      #
      enabled: true

      ## @param include - list of strings - optional
      ## 자동 탐지에 포함할 데이터베이스 목록. 여러 데이터베이스를 매칭하려면 정규식을 사용하세요.
      ## 예를 들어 "mydb"로 시작하는 모든 데이터베이스를 포함하려면 "^mydb.*"를 사용하세요.
      ## 기본적으로 include는 ".*"로 설정되어 모든 데이터베이스가 포함됩니다.
      #
      include:
        - "^mydb.*"

      ## @param exclude - list of strings - optional
      ## 자동 탐지에서 제외할 데이터베이스 목록. 여러 데이터베이스를 매칭하려면 정규식을 사용하세요.
      ## 예를 들어 "mydb"로 시작하는 모든 데이터베이스를 제외하려면 "^mydb.*"를 사용하세요.
      ## exclude 목록이 include 목록과 충돌하면 exclude 목록이 우선합니다.
      #
      exclude:
        - "^mydb2.*"
        - "admin$"

      ## @param max_databases - integer - optional
      ## 메트릭을 수집할 최대 데이터베이스 수. 기본값은 100입니다.
      #
      max_databases: 100

      ## @param refresh_interval - integer - optional
      ## 데이터베이스 목록을 새로고침하는 간격(초). 기본값은 600초입니다.
      #
      refresh_interval: 600

프라이머리 1개와 세컨더리 2개가 있는 레플리카 셋의 예시 구성은 다음과 같아요.

init_config:
instances:
  - hosts:
      - <HOST_REPLICA_1>:<PORT>  # Primary node
    username: datadog
    password: "ENC[datadog_user_database_password]"
    options:
      authSource: admin
    tls: true
    dbm: true
    cluster_name: <MONGO_CLUSTER_NAME>
    reported_database_hostname: <DATABASE_HOSTNAME_OVERRIDE>
    additional_metrics: ["metrics.commands", "tcmalloc", "top", "collection"]
    collections_indexes_stats: true
    database_autodiscovery:
      enabled: true
  - hosts:
      - <HOST_REPLICA_2>:<PORT>  # Secondary node
    username: datadog
    password: "ENC[datadog_user_database_password]"
    options:
      authSource: admin
    tls: true
    dbm: true
    cluster_name: <MONGO_CLUSTER_NAME>
    reported_database_hostname: <DATABASE_HOSTNAME_OVERRIDE>
    additional_metrics: ["metrics.commands", "tcmalloc", "top", "collection"]
    collections_indexes_stats: true
    database_autodiscovery:
      enabled: true
  - hosts:
      - <HOST_REPLICA_3>:<PORT>  # Secondary node
    username: datadog
    password: "ENC[datadog_user_database_password]"
    options:
      authSource: admin
    tls: true
    dbm: true
    cluster_name: <MONGO_CLUSTER_NAME>
    reported_database_hostname: <DATABASE_HOSTNAME_OVERRIDE>
    additional_metrics: ["metrics.commands", "tcmalloc", "top", "collection"]
    collections_indexes_stats: true
    database_autodiscovery:
      enabled: true

{% /tab %}

{% tab title="Sharded Cluster" %} MongoDB 샤딩 클러스터를 모니터링하려면 에이전트가 mongos 라우터와 모든 샤드 멤버에 연결해야 해요. mongos 라우터가 여러 개 있다면 로드 밸런싱을 위해 에이전트가 이들에 연결하도록 구성할 수 있어요.

Mongos 라우터에 연결하도록 에이전트를 구성하는 예시로 다음 구성 블록을 사용하세요.

init_config:
instances:
    ## @param hosts - required
    ## 샤딩 클러스터의 경우 각 샤드(configsvr 샤드 포함)의 각 mongod 인스턴스에 대해
    ## 점검 인스턴스 하나씩과, 최소 하나의 mongos 노드에 연결하는 추가 점검 인스턴스가 필요합니다.

    ## mongod 또는 mongos 인스턴스의 호스트 이름, IP 주소 또는 UNIX 도메인 소켓을 지정하세요.

    ## 포트 번호를 지정하지 않으면 기본 포트 27017이 사용됩니다.
  - hosts:
      - <HOST>:<PORT>

    ## @param username - string - optional
    ## 인증에 사용할 사용자 이름.
    #
    username: datadog

    ## @param password - string - optional
    ## 인증에 사용할 비밀번호.
    #
    password: "ENC[datadog_user_database_password]"

    ## @param options - mapping - optional
    ## 연결 옵션. 전체 목록은 다음을 참고하세요:
    ## https://docs.mongodb.com/manual/reference/connection-string/#connections-connection-options
    #
    options:
      authSource: admin

    ## @param tls - boolean - optional
    ## TLS로 MongoDB 인스턴스에 연결하려면 true로 설정하세요.
    #
    tls: true

    ## @param dbm - boolean - optional
    ## Database Monitoring을 활성화하려면 true로 설정하세요.
    #
    dbm: true

    ## @param cluster_name - string - optional
    ## 모니터링되는 MongoDB 인스턴스가 속한 클러스터의 고유 이름.
    ## MongoDB 클러스터에서 MongoDB 인스턴스를 그룹화하는 데 사용됩니다.
    ## cluster_name은 Datadog 태그 명명 규칙을 따라야 합니다. 다음을 참고하세요:
    ## https://docs.datadoghq.com/extend/guide/what-best-practices-are-recommended-for-naming-metrics-and-tags/#rules-and-best-practices-for-naming-tags
    ## `dbm`이 활성화되면 필수입니다.
    #
    cluster_name: <MONGO_CLUSTER_NAME>

    ## @param reported_database_hostname - string - optional
    ## 연결된 MongoDB 인스턴스의 보고된 데이터베이스 호스트 이름을 설정하세요.
    ## 이 값은 에이전트가 MongoDB admin 명령 serverStatus.host에서
    ## 감지한 MongoDB 호스트 이름을 재정의합니다.
    #
    reported_database_hostname: <DATABASE_HOSTNAME_OVERRIDE>

    ## @param additional_metrics - list of strings - optional
    ## 수집할 추가 메트릭 목록. 사용 가능한 옵션:
    ## - metrics.commands: 데이터베이스 명령 사용
    ## - tcmalloc: TCMalloc 메모리 할당자
    ## - top: 각 컬렉션의 사용 통계
    ## - collection: 지정된 컬렉션의 메트릭
    ## - jumbo_chunks: 점보 청크의 개수와 백분율. mongod 인스턴스에서는 무시됩니다.
    ## - sharded_data_distribution: 샤딩된 컬렉션의 데이터 분포.
    #
    additional_metrics: ["metrics.commands", "tcmalloc", "top", "collection", "jumbo_chunks", "sharded_data_distribution"]

    ## @param collections_indexes_stats - boolean - optional
    ## 지정된 컬렉션의 인덱스 통계를 수집하려면 true로 설정하세요.
    ## `collections`가 설정되어 있어야 합니다.
    #
    collections_indexes_stats: true

    ## @param database_autodiscovery - mapping - optional
    ## 데이터베이스 자동 탐지를 활성화해 모든 MongoDB 데이터베이스에서 메트릭을 자동으로 수집하세요.
    #
    database_autodiscovery:
      ## @param enabled - boolean - required
      ## 데이터베이스 자동 탐지를 활성화합니다.
      #
      enabled: true

      ## @param include - list of strings - optional
      ## 자동 탐지에 포함할 데이터베이스 목록. 여러 데이터베이스를 매칭하려면 정규식을 사용하세요.
      ## 예를 들어 "mydb"로 시작하는 모든 데이터베이스를 포함하려면 "^mydb.*"를 사용하세요.
      ## 기본적으로 include는 ".*"로 설정되어 모든 데이터베이스가 포함됩니다.
      #
      include:
        - "^mydb.*"

      ## @param exclude - list of strings - optional
      ## 자동 탐지에서 제외할 데이터베이스 목록. 여러 데이터베이스를 매칭하려면 정규식을 사용하세요.
      ## 예를 들어 "mydb"로 시작하는 모든 데이터베이스를 제외하려면 "^mydb.*"를 사용하세요.
      ## exclude 목록이 include 목록과 충돌하면 exclude 목록이 우선합니다.
      #
      exclude:
        - "^mydb2.*"
        - "admin$"

      ## @param max_databases - integer - optional
      ## 메트릭을 수집할 최대 데이터베이스 수. 기본값은 100입니다.
      #
      max_databases: 100

      ## @param refresh_interval - integer - optional
      ## 데이터베이스 목록을 새로고침하는 간격(초). 기본값은 600초입니다.
      #
      refresh_interval: 600

각 샤드와 config 서버의 멤버에 연결하는 예시 구성은 Replica Set 구성을 참고하세요.

mongos 라우터 1개와 샤드 2개가 있는 샤딩 클러스터의 예시 구성은 다음과 같아요.

init_config:
instances:
  ## mongos router
  - hosts:
      - <HOST_MONGOS>:<PORT>
    username: datadog
    password: "ENC[datadog_user_database_password]"
    options:
      authSource: admin
    tls: true
    dbm: true
    cluster_name: <MONGO_CLUSTER_NAME>
    reported_database_hostname: <DATABASE_HOSTNAME_OVERRIDE>
    additional_metrics: ["metrics.commands", "tcmalloc", "top", "collection", "jumbo_chunks", "sharded_data_distribution"]
    collections_indexes_stats: true
    database_autodiscovery:
      enabled: true
  ## Shard1
  - hosts:
      - <HOST_SHARD1_1>:<PORT>  # Primary node
    username: datadog
    password: "ENC[datadog_user_database_password]"
    options:
      authSource: admin
    tls: true
    dbm: true
    cluster_name: <MONGO_CLUSTER_NAME>
    reported_database_hostname: <DATABASE_HOSTNAME_OVERRIDE>
    additional_metrics: ["metrics.commands", "tcmalloc", "top", "collection"]
    collections_indexes_stats: true
    database_autodiscovery:
      enabled: true
  - hosts:
      - <HOST_SHARD1_2>:<PORT>  # Secondary node
    username: datadog
    password: "ENC[datadog_user_database_password]"
    options:
      authSource: admin
    tls: true
    dbm: true
    cluster_name: <MONGO_CLUSTER_NAME>
    reported_database_hostname: <DATABASE_HOSTNAME_OVERRIDE>
    additional_metrics: ["metrics.commands", "tcmalloc", "top", "collection"]
    collections_indexes_stats: true
    database_autodiscovery:
      enabled: true
  - hosts:
      - <HOST_SHARD1_3>:<PORT>  # Secondary node
    username: datadog
    password: "ENC[datadog_user_database_password]"
    options:
      authSource: admin
    tls: true
    dbm: true
    cluster_name: <MONGO_CLUSTER_NAME>
    reported_database_hostname: <DATABASE_HOSTNAME_OVERRIDE>
    additional_metrics: ["metrics.commands", "tcmalloc", "top", "collection"]
    collections_indexes_stats: true
    database_autodiscovery:
      enabled: true
  ## Shard 2
  - hosts:
      - <HOST_SHARD2_1>:<PORT>  # Primary node
    username: datadog
    password: "ENC[datadog_user_database_password]"
    options:
      authSource: admin
    tls: true
    dbm: true
    cluster_name: <MONGO_CLUSTER_NAME>
    reported_database_hostname: <DATABASE_HOSTNAME_OVERRIDE>
    additional_metrics: ["metrics.commands", "tcmalloc", "top", "collection"]
    collections_indexes_stats: true
    database_autodiscovery:
      enabled: true
  - hosts:
      - <HOST_SHARD2_2>:<PORT>  # Secondary node
    username: datadog
    password: "ENC[datadog_user_database_password]"
    options:
      authSource: admin
    tls: true
    dbm: true
    cluster_name: <MONGO_CLUSTER_NAME>
    reported_database_hostname: <DATABASE_HOSTNAME_OVERRIDE>
    additional_metrics: ["metrics.commands", "tcmalloc", "top", "collection"]
    collections_indexes_stats: true
    database_autodiscovery:
      enabled: true
  - hosts:
      - <HOST_SHARD2_3>:<PORT>  # Secondary node
    username: datadog
    password: "ENC[datadog_user_database_password]"
    options:
      authSource: admin
    tls: true
    dbm: true
    cluster_name: <MONGO_CLUSTER_NAME>
    reported_database_hostname: <DATABASE_HOSTNAME_OVERRIDE>
    additional_metrics: ["metrics.commands", "tcmalloc", "top", "collection"]
    collections_indexes_stats: true
    database_autodiscovery:
      enabled: true
  ## Config server
  - hosts:
      - <HOST_CONFIG_1>:<PORT>  # Primary node
    username: datadog
    password: "ENC[datadog_user_database_password]"
    database: config
    options:
      authSource: admin
    tls: true
    dbm: true
    cluster_name: <MONGO_CLUSTER_NAME>
    reported_database_hostname: <DATABASE_HOSTNAME_OVERRIDE>
  - hosts:
      - <HOST_CONFIG_2>:<PORT>  # Secondary node
    username: datadog
    password: "ENC[datadog_user_database_password]"
    database: config
    options:
      authSource: admin
    tls: true
    dbm: true
    cluster_name: <MONGO_CLUSTER_NAME>
    reported_database_hostname: <DATABASE_HOSTNAME_OVERRIDE>
  - hosts:
      - <HOST_CONFIG_3>:<PORT>  # Secondary node
    username: datadog
    password: "ENC[datadog_user_database_password]"
    database: config
    options:
      authSource: admin
    tls: true
    dbm: true
    cluster_name: <MONGO_CLUSTER_NAME>

{% /tab %}

에이전트 설정하기

{% tab title="Linux Host" %} 이전 단계에서 만든 MongoDB 에이전트 구성 파일을 /etc/datadog-agent/conf.d/mongo.d/conf.yaml에 배치하세요. 모든 구성 옵션은 샘플 conf 파일을 참고하세요.

모든 에이전트 구성이 완료되면 Datadog Agent를 재시작하세요.

검증 (Validate)

에이전트의 status 하위 명령을 실행해 Checks 섹션에서 mongo를 찾아보세요. Datadog의 MongoDB용 Database Monitoring 페이지로 이동해 시작하세요. {% /tab %}

{% tab title="Docker" %} Docker 컨테이너에서 실행되는 Database Monitoring Agent를 구성하려면 Autodiscovery 통합 템플릿을 에이전트 컨테이너의 Docker 라벨로 설정하세요.

MongoDB 점검은 Datadog Agent에 포함되어 있습니다. 추가 설치가 필요하지 않아요.

참고: 라벨 자동 탐지가 동작하려면 에이전트가 Docker 소켓에 대한 읽기 권한이 있어야 해요.

이전 단계의 MongoDB 점검 구성 세부 사항을 com.datadoghq.ad.checks 라벨에 추가하세요. 모든 구성 옵션은 샘플 conf 파일을 참고하세요.

export DD_API_KEY=<DD_API_KEY>
export DD_AGENT_VERSION=7.58.0

docker run -e "DD_API_KEY=${DD_API_KEY}" \
  -v /var/run/docker.sock:/var/run/docker.sock:ro \
  -l com.datadoghq.ad.checks='{
    "mongo": {
      "init_config": {},
      "instances": [{
        "hosts": ["<HOST>:<PORT>"],
        "username": "datadog",
        "password": "<UNIQUE_PASSWORD>",
        "options": {
          "authSource": "admin"
        },
        "dbm": true,
        "cluster_name": "<MONGO_CLUSTER_NAME>",
        "reported_database_hostname": "<DATABASE_HOSTNAME_OVERRIDE>",
        "additional_metrics": ["metrics.commands", "tcmalloc", "top", "collection"],
        "collections_indexes_stats": true,
        "database_autodiscovery": {
          "enabled": true
        }
      }]
    }
  }' \
  registry.datadoghq.com/agent:${DD_AGENT_VERSION}

검증 (Validate)

에이전트의 status 하위 명령을 실행해 Checks 섹션에서 mongo를 찾아보세요. Datadog의 MongoDB용 Database Monitoring 페이지로 이동해 시작하세요. {% /tab %}

{% tab title="Kubernetes" %} Kubernetes 클러스터가 있다면 Database Monitoring에 Datadog Cluster Agent를 사용하세요.

Kubernetes 클러스터에서 클러스터 점검을 아직 활성화하지 않았다면 클러스터 점검 활성화 지침을 따르세요. Cluster Agent를 Cluster Agent 컨테이너에 마운트된 정적 파일로 구성하거나 Kubernetes 서비스 어노테이션으로 구성할 수 있어요.

Helm 커맨드 라인

다음 Helm 명령을 실행해 Kubernetes 클러스터에 Datadog Cluster Agent를 설치하세요. 계정과 환경에 맞게 값을 바꾸세요.

helm repo add datadog https://helm.datadoghq.com
helm repo update

helm install <RELEASE_NAME> \
  --set 'datadog.apiKey=<DATADOG_API_KEY>' \
  --set 'clusterAgent.enabled=true' \
  --set 'clusterChecksRunner.enabled=true' \
  --set 'clusterAgent.confd.mongo\.yaml=cluster_check: true
init_config:
instances:
  - hosts:
      - <HOST>:<PORT>
    username: datadog
    password: <UNIQUE_PASSWORD>
    options:
      authSource: admin
    dbm: true
    cluster_name: <MONGO_CLUSTER_NAME>
    reported_database_hostname: <DATABASE_HOSTNAME_OVERRIDE>
    database_autodiscovery:
      enabled: true
    additional_metrics: ["metrics.commands", "tcmalloc", "top", "collection"]
    collections_indexes_stats: true' \
  datadog/datadog

마운트된 파일로 구성하기

마운트된 설정 파일로 클러스터 점검을 구성하려면 /conf.d/mongo.yaml 경로에 설정 파일을 Cluster Agent 컨테이너에 마운트하세요.

cluster_check: true  # 이 플래그를 포함해야 해요
init_config:
instances:
  - hosts:
      - <HOST>:<PORT>
    username: datadog
    password: "ENC[datadog_user_database_password]"
    options:
      authSource: admin
    dbm: true
    cluster_name: <MONGO_CLUSTER_NAME>
    reported_database_hostname: <DATABASE_HOSTNAME_OVERRIDE>
    database_autodiscovery:
      enabled: true
    additional_metrics: ["metrics.commands", "tcmalloc", "top", "collection"]
    collections_indexes_stats: true

Kubernetes 서비스 어노테이션으로 구성하기

파일을 마운트하는 대신 인스턴스 구성을 Kubernetes Service로 선언할 수 있어요. Kubernetes에서 실행되는 에이전트에 대해 이 점검을 구성하려면 Datadog Cluster Agent와 같은 네임스페이스에 Service를 만드세요.

apiVersion: v1
kind: Service
metadata:
  name: mongodb-datadog-check-instances
  annotations:
    ad.datadoghq.com/service.checks: |
    {
      "mongo": {
        "init_config": {},
        "instances": [{
          "hosts": ["<HOST>:<PORT>"],
          "username": "datadog",
          "password": "ENC[datadog_user_database_password]",
          "options": {
            "authSource": "admin"
          },
          "dbm": true,
          "cluster_name": "<MONGO_CLUSTER_NAME>",
          "reported_database_hostname": "<DATABASE_HOSTNAME_OVERRIDE>",
          "additional_metrics": ["metrics.commands", "tcmalloc", "top", "collection"],
          "collections_indexes_stats": true,
          "database_autodiscovery": {
            "enabled": true
          }
        }]
      }
    }
spec:
  ports:
  - port: 27017
    protocol: TCP
    targetPort: 27017
    name: mongodb

Cluster Agent는 이 구성을 자동으로 등록하고 MongoDB 통합을 실행하기 시작해요.

datadog 사용자의 비밀번호가 평문으로 노출되지 않게 하려면 에이전트의 비밀 관리 패키지를 사용하고 비밀번호를 ENC[] 구문으로 선언하세요.

검증 (Validate)

에이전트의 status 하위 명령을 실행해 Checks 섹션에서 mongo를 찾아보세요. Datadog의 MongoDB용 Database Monitoring 페이지로 이동해 시작하세요. {% /tab %}

쿼리 메트릭 (Query Metrics)

자체 호스팅 MongoDB의 쿼리 메트릭은 MongoDB 8.0 이상이 필요하며 $queryStats 집계 파이프라인에 의존합니다. 쿼리 통계 수집은 MongoDB 서버에서 기본적으로 꺼져 있어요. 각 mongod 또는 mongos 프로세스에서 활성화하세요. 필요한 서버 파라미터는 MongoDB 버전에 따라 달라요.

MongoDB 8.0.20 이상

internalQueryStatsSampleRate를 1.0(100% 샘플링)으로 설정하세요.

MongoDB 구성 파일에 파라미터를 추가하세요.

setParameter:
  internalQueryStatsSampleRate: 1.0

또는 커맨드 라인으로 전달하세요.

mongod --setParameter internalQueryStatsSampleRate=1.0

다음 재시작까지 런타임에 활성화하려면 다음을 실행하세요.

db.adminCommand({setParameter: 1, internalQueryStatsSampleRate: 1.0})

MongoDB 8.0.0 ~ 8.0.19

internalQueryStatsRateLimit을 -1(제한 없음)로 설정하세요.

MongoDB 구성 파일에 파라미터를 추가하세요.

setParameter:
  internalQueryStatsRateLimit: -1

또는 커맨드 라인으로 전달하세요.

mongod --setParameter internalQueryStatsRateLimit=-1

다음 재시작까지 런타임에 활성화하려면 다음을 실행하세요.

db.adminCommand({setParameter: 1, internalQueryStatsRateLimit: -1})

쿼리 통계 수집을 제어하는 서버 파라미터에 대한 자세한 내용은 MongoDB Query Stats 문서를 참고하세요.

수집되는 데이터 (Data Collected)

표준 메트릭 (Standard Metrics)

MongoDB 통합이 수집하는 포괄적인 메트릭 목록은 MongoDB 통합 문서를 참고하세요.

쿼리 메트릭 (Query Metrics)

{% alert level="info" %} 이 기능은 Datadog Agent v7.78 이상과 자체 호스팅용 MongoDB 8.0+가 필요해요. {% /alert %}

쿼리 메트릭은 MongoDB 작업 성능에 대한 인사이트를 제공합니다. 자세한 내용은 쿼리 메트릭 (Query Metrics)을 참고하세요.

쿼리 메트릭을 수집하려면 "에이전트에 액세스 권한 부여하기" 섹션에서 설명한 대로 필수 권한을 부여했는지 확인하세요.

conf.d/mongo.d/conf.yaml 설정 파일에서 쿼리 메트릭을 활성화하세요. 다음은 예시입니다.

init_config:
instances:
  - hosts:
      - <HOST>:<PORT>
    username: datadog
    password: "ENC[datadog_user_database_password]"
    options:
      authSource: admin
    tls: true
    dbm: true
    query_metrics:
      enabled: true
    cluster_name: <MONGO_CLUSTER_NAME>
    reported_database_hostname: <DATABASE_HOSTNAME_OVERRIDE>
    additional_metrics: ["metrics.commands", "tcmalloc", "top", "collection"]
    collections_indexes_stats: true
    database_autodiscovery:
      enabled: true

느린 작업 (Slow operations)

MongoDB용 Database Monitoring은 MongoDB 느린 쿼리 로그나 system.profile 컬렉션에서 느린 작업을 캡처합니다. 느린 작업은 MongoDB 구성에 설정된 slowms 임계값보다 오래 걸리는 작업으로 정의됩니다.

  • 데이터베이스 프로파일링 활성화됨: 레벨 1 또는 2로 프로파일링이 활성화되면 Database Monitoring은 system.profile 컬렉션에서 느린 작업을 수집합니다.
  • 데이터베이스 프로파일링 비활성화됨: 프로파일링이 꺼져 있으면 Database Monitoring은 MongoDB getLog 명령에 의존해 느린 쿼리 로그에서 느린 작업을 수집합니다.

참고: getLog 명령은 가장 최근의 1024개 mongod 이벤트를 가져옵니다. 느린 쿼리가 많은 바쁜 데이터베이스에서, 또는 느린 쿼리 수집 간격이 더 긴 간격으로 설정되어(수집 빈도가 낮아짐) 있을 때 일부 느린 쿼리는 캡처되지 않을 수 있어요.

작업 샘플과 explain plan

MongoDB용 Database Monitoring은 currentOp 명령으로 작업 샘플을 수집합니다. 이 명령은 MongoDB 인스턴스에서 현재 실행 중인 작업에 대한 정보를 제공합니다. 추가로 Database Monitoring은 explain 명령으로 읽기 작업 샘플의 explain plan을 수집해 쿼리 실행 계획에 대한 상세한 인사이트를 제공합니다.

복제 상태 변경

MongoDB용 Database Monitoring은 MongoDB 인스턴스 내 복제 상태에 변경이 있을 때마다 이벤트를 생성합니다. 이렇게 하면 복제의 어떤 변경도 신속하게 감지되고 보고됩니다.

스키마와 인덱스 수집

MongoDB용 Database Monitoring은 MongoDB 컬렉션의 추론된 스키마와 인덱스를 수집합니다. 이 정보는 컬렉션의 구조와 구성을 파악하는 데 사용됩니다.

MongoDB 컬렉션을 분석할 때 Datadog은 $sample 집계 단계로 문서를 샘플링해 추론된 스키마 정보를 수집합니다. 이 분석에서 필드 이름, 필드 보급률(각 필드가 나타나는 빈도), 각각의 데이터 타입 등 스키마에 대한 메타데이터만 수집되어 Datadog로 전송됩니다. Datadog은 문서의 실제 내용이나 고객 비즈니스 데이터는 수집하거나 전송하지 않아요. 이렇게 함으로써 민감한 데이터는 보호하면서도 컬렉션의 구조와 구성에 대한 유용한 인사이트는 제공할 수 있습니다.

더 알아보기 (Learn more)

추가로 도움이 되는 문서, 링크, 글: