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

Azure Database for PostgreSQL용 데이터베이스 모니터링 설정

원문 보기 위키 갱신

Database Monitoring은 Postgres 데이터베이스에 대한 깊은 가시성을 제공해요. 쿼리 메트릭, 쿼리 샘플, 실행 계획(explain plan), 데이터베이스 상태, 장애 조치(failover), 이벤트까지 한눈에 볼 수 있어요.

Agent가 읽기 전용 사용자로 데이터베이스에 로그인해서 텔레메트리(telemetry)를 직접 수집합니다. Postgres 데이터베이스에서 Database Monitoring을 활성화하려면 다음 설정을 순서대로 진행해요.

  1. 데이터베이스 파라미터 설정
  2. Agent에 데이터베이스 접근 권한 부여
  3. Agent 설치 및 설정
  4. Azure PostgreSQL 통합 설치

출처: 문서

본문

시작하기 전에

{% dl %}

{% dt %} 지원되는 PostgreSQL 버전 {% /dt %}

{% dd %} 9.6, 10, 11, 12, 13, 14, 15, 16, 17, 18 {% /dd %}

{% dt %} 지원되는 Azure PostgreSQL 배포 유형 {% /dt %}

{% dd %} PostgreSQL on Azure VMs, Single Server, Flexible Server {% /dd %}

{% dt %} 지원되는 Agent 버전 {% /dt %}

{% dd %} 7.36.1+ {% /dd %}

{% dt %} 성능 영향 {% /dt %}

{% dd %} Database Monitoring의 기본 Agent 설정은 보수적이지만, 수집 간격이나 쿼리 샘플링 비율 같은 설정은 필요에 맞게 조정할 수 있어요. 대부분의 워크로드에서 Agent는 데이터베이스의 쿼리 실행 시간의 1% 미만, CPU의 1% 미만을 차지합니다. Database Monitoring은 기본 Agent 위에서 통합(integration)으로 실행돼요 (벤치마크 참고). {% /dd %}

{% dt %} 프록시, 로드 밸런서, 커넥션 풀러 {% /dt %}

{% dd %} Datadog Agent는 모니터링 대상 호스트에 직접 연결해야 해요. 자체 호스팅 데이터베이스라면 127.0.0.1 또는 소켓을 사용해요. Agent는 프록시, 로드 밸런서, 또는 pgbouncer 같은 커넥션 풀러를 통해서 데이터베이스에 연결하면 안 됩니다. 실행 중에 Agent가 다른 호스트에 연결하면(장애 조치, 로드 밸런싱 등) 두 호스트 간의 통계 차이를 계산하므로 부정확한 메트릭이 만들어져요. {% /dd %}

{% dt %} 데이터 보안 고려 사항 {% /dt %}

{% dd %} Agent가 데이터베이스에서 수집하는 데이터와 안전하게 보호하는 방법에 대해서는 민감 정보를 참고해요. {% /dd %}

{% /dl %}

Postgres 설정 구성

서버 파라미터에서 다음 파라미터를 설정하고 설정이 적용되도록 서버를 재시작하세요.

{% tab title="Single Server" %}

Parameter Value Description
track_activity_query_size 4096 더 큰 쿼리 수집에 필요해요. pg_stat_activity의 SQL 텍스트 크기를 늘려줘요. 기본값으로 두면 1024자보다 긴 쿼리는 수집되지 않아요.
pg_stat_statements.track ALL 선택 사항. 저장 프로시저와 함수 내부의 문장 추적을 활성화해요.
pg_stat_statements.max 10000 선택 사항. pg_stat_statements에 추적되는 정규화된 쿼리 수를 늘려요. 다양한 클라이언트가 다양한 종류의 쿼리를 보내는 대용량 데이터베이스에 권장해요.
pg_stat_statements.track_utility off 선택 사항. PREPARE, EXPLAIN 같은 유틸리티 명령을 비활성화해요. off로 설정하면 SELECT, UPDATE, DELETE 같은 쿼리만 추적됩니다.
track_io_timing on 선택 사항. 쿼리의 블록 읽기/쓰기 시간 수집을 활성화해요.

{% /tab %}

{% tab title="Flexible Server" %}

Parameter Value Description
azure.extensions pg_stat_statements postgresql.queries.* 메트릭에 필요해요. pg_stat_statements 확장으로 쿼리 메트릭을 수집할 수 있게 해요.
track_activity_query_size 4096 더 큰 쿼리 수집에 필요해요. pg_stat_activity의 SQL 텍스트 크기를 늘려줘요. 기본값으로 두면 1024자보다 긴 쿼리는 수집되지 않아요.
pg_stat_statements.track ALL Flexible Server에서 Database Monitoring이 쿼리 메트릭을 수집하는 데 필요해요. 저장 프로시저와 함수 내부의 문장 추적을 활성화해요.
pg_stat_statements.max 10000 선택 사항. pg_stat_statements에 추적되는 정규화된 쿼리 수를 늘려요. 다양한 클라이언트가 다양한 종류의 쿼리를 보내는 대용량 데이터베이스에 권장해요.
pg_stat_statements.track_utility off 선택 사항. PREPARE, EXPLAIN 같은 유틸리티 명령을 비활성화해요. off로 설정하면 SELECT, UPDATE, DELETE 같은 쿼리만 추적됩니다.
track_io_timing on 선택 사항. 쿼리의 블록 읽기/쓰기 시간 수집을 활성화해요.

{% /tab %}

Agent 접근 권한 부여

Datadog Agent는 통계와 쿼리를 수집하려면 데이터베이스 서버에 대한 읽기 전용 접근이 필요해요.

Postgres가 복제된 경우 기본(primary) 데이터베이스 서버(작성자/writer)에서 다음 SQL 명령을 실행하세요. Agent는 연결한 데이터베이스와 무관하게 서버의 모든 데이터베이스에서 텔레메트리를 수집할 수 있어요. Agent가 다른 데이터베이스에 고유한 데이터에 대한 커스텀 쿼리를 실행해야 하는 경우가 아니라면 기본 postgres 데이터베이스를 사용해요.

선택한 데이터베이스에 수퍼유저(또는 충분한 권한이 있는 사용자)로 연결하세요. 예를 들어 psql로 postgres 데이터베이스에 연결하려면:

psql -h mydb.example.com -d postgres -U postgres

datadog 사용자를 생성하세요:

CREATE USER datadog WITH password '<PASSWORD>';

참고: Microsoft Entra ID 관리 ID 인증도 지원돼요. Azure 인스턴스에 적용하는 방법은 가이드를 참고하세요.

{% tab title="Postgres ≥ 16" %} 모든 데이터베이스에 다음 스키마를 생성하세요:

CREATE SCHEMA datadog;
GRANT USAGE ON SCHEMA datadog TO datadog;
GRANT USAGE ON SCHEMA public TO datadog;
GRANT pg_read_all_settings TO datadog;
GRANT pg_read_all_stats TO datadog;
CREATE EXTENSION IF NOT EXISTS pg_stat_statements;

{% /tab %}

{% tab title="Postgres 15" %} 모든 데이터베이스에 다음 스키마를 생성하세요:

CREATE SCHEMA datadog;
GRANT USAGE ON SCHEMA datadog TO datadog;
GRANT USAGE ON SCHEMA public TO datadog;
GRANT pg_monitor TO datadog;
CREATE EXTENSION IF NOT EXISTS pg_stat_statements;

{% /tab %}

{% tab title="Postgres ≥ 10" %} 모든 데이터베이스에 다음 스키마를 생성하세요:

CREATE SCHEMA datadog;
GRANT USAGE ON SCHEMA datadog TO datadog;
GRANT USAGE ON SCHEMA public TO datadog;
GRANT pg_monitor TO datadog;

{% /tab %}

{% tab title="Postgres 9.6" %} 모든 데이터베이스에 다음 스키마를 생성하세요:

CREATE SCHEMA datadog;
GRANT USAGE ON SCHEMA datadog TO datadog;
GRANT USAGE ON SCHEMA public TO datadog;
GRANT SELECT ON pg_stat_database TO datadog;

Agent가 pg_stat_activity와 pg_stat_statements의 전체 내용을 읽을 수 있도록 모든 데이터베이스에 함수를 생성하세요:

CREATE OR REPLACE FUNCTION datadog.pg_stat_activity() RETURNS SETOF pg_stat_activity AS
  $$ SELECT * FROM pg_catalog.pg_stat_activity; $$
LANGUAGE sql
SECURITY DEFINER;
CREATE OR REPLACE FUNCTION datadog.pg_stat_statements() RETURNS SETOF pg_stat_statements AS
    $$ SELECT * FROM pg_stat_statements; $$
LANGUAGE sql
SECURITY DEFINER;

{% /tab %}

{% alert level="info" %} 추가 테이블을 쿼리해야 하는 데이터 수집이나 커스텀 메트릭의 경우, 해당 테이블에 대한 SELECT 권한을 datadog 사용자에게 부여해야 할 수 있어요. 예: grant SELECT on <TABLE_NAME> to datadog;. 자세한 내용은 PostgreSQL 커스텀 메트릭 수집을 참고해요. {% /alert %}

실행 계획 함수 생성

Agent가 실행 계획을 수집할 수 있도록 모든 데이터베이스에 다음 함수를 생성하세요:

CREATE OR REPLACE FUNCTION datadog.explain_statement(
   l_query TEXT,
   OUT explain JSON
)
RETURNS SETOF JSON AS
$$
DECLARE
curs REFCURSOR;
plan JSON;

BEGIN
   SET TRANSACTION READ ONLY;

   OPEN curs FOR EXECUTE pg_catalog.concat('EXPLAIN (FORMAT JSON) ', l_query);
   FETCH curs INTO plan;
   CLOSE curs;
   RETURN QUERY SELECT plan;
END;
$$
LANGUAGE 'plpgsql'
RETURNS NULL ON NULL INPUT
SECURITY DEFINER;

컬럼 통계 함수 생성

Agent가 pg_stats에서 컬럼 수준 테이블 통계를 수집할 수 있도록 모든 데이터베이스에 다음 함수를 생성하세요:

CREATE OR REPLACE FUNCTION datadog.column_statistics()
RETURNS TABLE (
    schemaname name, tablename name, attname name,
    n_distinct real, avg_width integer, null_frac real,
    inherited boolean, correlation real, most_common_freqs real[]
) AS
$$ SELECT schemaname, tablename, attname, n_distinct, avg_width, null_frac,
          inherited, correlation, most_common_freqs
          FROM pg_catalog.pg_stats
          WHERE schemaname NOT IN ('pg_catalog', 'information_schema'); $$
LANGUAGE sql
SECURITY DEFINER
SET search_path = pg_catalog, pg_temp;

함수가 생기면 Postgres 인스턴스 설정에서 수집을 활성화하세요:

instances:
  - dbm: true
    ...
    collect_column_statistics:
      enabled: true

튜닝 옵션은 고급 설정을 참고해요.

비밀번호 안전하게 보관

Vault 같은 시크릿 관리 소프트웨어로 비밀번호를 보관하세요. 그러면 Agent 설정 파일에서 ENC[<SECRET_NAME>] 형식으로 참조할 수 있어요. 예를 들어 ENC[datadog_user_database_password]처럼요. 자세한 내용은 Secrets Management를 참고해요.

이 페이지의 예제는 비밀번호가 저장된 시크릿 이름으로 datadog_user_database_password를 사용해요. 비밀번호를 평문으로도 참조할 수 있지만 권장하지 않아요.

데이터베이스 권한 확인

권한이 올바른지 확인하려면 다음 명령으로 Agent 사용자가 데이터베이스에 연결하고 핵심 테이블을 읽을 수 있는지 확인하세요:

{% tab title="Postgres ≥ 10" %}

psql -h mydb.example.com -U datadog postgres -A \
  -c "select * from pg_stat_database limit 1;" \
  && echo -e "\e[0;32mPostgres connection - OK\e[0m" \
  || echo -e "\e[0;31mCannot connect to Postgres\e[0m"
psql -h mydb.example.com -U datadog postgres -A \
  -c "select * from pg_stat_activity limit 1;" \
  && echo -e "\e[0;32mPostgres pg_stat_activity read OK\e[0m" \
  || echo -e "\e[0;31mCannot read from pg_stat_activity\e[0m"
psql -h mydb.example.com -U datadog postgres -A \
  -c "select * from pg_stat_statements limit 1;" \
  && echo -e "\e[0;32mPostgres pg_stat_statements read OK\e[0m" \
  || echo -e "\e[0;31mCannot read from pg_stat_statements\e[0m"

{% /tab %}

{% tab title="Postgres 9.6" %}

psql -h mydb.example.com -U datadog postgres -A \
  -c "select * from pg_stat_database limit 1;" \
  && echo -e "\e[0;32mPostgres connection - OK\e[0m" \
  || echo -e "\e[0;31mCannot connect to Postgres\e[0m"
psql -h mydb.example.com -U datadog postgres -A \
  -c "select * from datadog.pg_stat_activity() limit 1;" \
  && echo -e "\e[0;32mPostgres pg_stat_activity read OK\e[0m" \
  || echo -e "\e[0;31mCannot read from pg_stat_activity\e[0m"
psql -h mydb.example.com -U datadog postgres -A \
  -c "select * from datadog.pg_stat_statements() limit 1;" \
  && echo -e "\e[0;32mPostgres pg_stat_statements read OK\e[0m" \
  || echo -e "\e[0;31mCannot read from pg_stat_statements\e[0m"

{% /tab %}

비밀번호를 묻는 메시지가 나오면 datadog 사용자를 만들 때 입력했던 비밀번호를 사용하세요.

Agent 설치 및 설정

Azure Postgres 데이터베이스를 모니터링하려면 인프라에 Datadog Agent를 설치하고 각 인스턴스 엔드포인트에 원격으로 연결하도록 설정하세요. Agent가 데이터베이스에서 실행될 필요는 없고 연결만 하면 돼요. 여기 언급되지 않은 추가 Agent 설치 방법은 Agent 설치 안내를 참고해요.

{% tab title="Host" %} 호스트에서 실행 중인 Agent로 Database Monitoring 메트릭을 수집하도록 설정하려면(예: Azure 데이터베이스에서 수집할 작은 가상 머신을 준비한 경우):

  1. postgres.d/conf.yaml 파일을 편집해 host / port를 지정하고 모니터링할 마스터를 설정하세요. 사용 가능한 모든 설정 옵션은 샘플 postgres.d/conf.yaml을 참고해요.
    init_config:
    instances:
      - dbm: true
        host: '<AZURE_INSTANCE_ENDPOINT>'
        port: 5432
        username: 'datadog@<AZURE_INSTANCE_ENDPOINT>'
        password: 'ENC[datadog_user_database_password]'
        ssl: 'require'
    
        ## Optional: Connect to a different database if needed for `custom_queries`
        # dbname: '<DB_NAME>'
    
        # After adding your project and instance, configure the Datadog Azure integration to pull additional cloud data such as CPU, Memory, etc.
        azure:
         deployment_type: '<DEPLOYMENT_TYPE>'
         fully_qualified_domain_name: '<AZURE_INSTANCE_ENDPOINT>'
    
  2. Agent를 재시작하세요.

{% /tab %}

{% tab title="Docker" %} Docker 컨테이너에서 실행 중인 Database Monitoring Agent를 설정하려면 Autodiscovery 통합 템플릿을 Agent 컨테이너의 Docker 라벨로 설정할 수 있어요.

참고: 라벨 Autodiscovery가 동작하려면 Agent가 Docker 소켓에 읽기 권한이 있어야 해요.

명령줄

커맨드 라인에서 Agent를 실행하려면 다음 명령을 실행하세요. 값은 계정과 환경에 맞게 바꿔요:

export DD_API_KEY=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
export DD_AGENT_VERSION=<AGENT_VERSION>

docker run -e "DD_API_KEY=${DD_API_KEY}" \
  -v /var/run/docker.sock:/var/run/docker.sock:ro \
  -l com.datadoghq.ad.check_names='["postgres"]' \
  -l com.datadoghq.ad.init_configs='[{}]' \
  -l com.datadoghq.ad.instances='[{
    "dbm": true,
    "host": "<AZURE_INSTANCE_ENDPOINT>",
    "port": 5432,
    "username": "datadog@<AZURE_INSTANCE_ENDPOINT>",
    "password": "<UNIQUEPASSWORD>",
    "ssl": "require",
    "azure": {
      "deployment_type": "<DEPLOYMENT_TYPE>",
      "name": "<AZURE_INSTANCE_ENDPOINT>"
    }
  }]' \
  registry.datadoghq.com/agent:${DD_AGENT_VERSION}

Postgres 9.6이라면 host와 port를 지정하는 인스턴스 설정에 다음 항목을 추가하세요:

"pg_stat_statements_view": "datadog.pg_stat_statements()",
"pg_stat_activity_view": "datadog.pg_stat_activity()"

Dockerfile

Dockerfile에서 라벨을 지정할 수도 있어요. 그러면 인프라 설정을 변경하지 않고 커스텀 Agent를 빌드·배포할 수 있어요:

FROM registry.datadoghq.com/agent:<AGENT_VERSION>

LABEL "com.datadoghq.ad.check_names"='["postgres"]'
LABEL "com.datadoghq.ad.init_configs"='[{}]'
LABEL "com.datadoghq.ad.instances"='[{"dbm": true, "host": "<AZURE_INSTANCE_ENDPOINT>", "port": 3306,"username": "datadog@<AZURE_INSTANCE_ENDPOINT>","password": "ENC[datadog_user_database_password]", "ssl": "require", "azure": {"deployment_type": "<DEPLOYMENT_TYPE>", "name": "<AZURE_INSTANCE_ENDPOINT>"}}]'

Postgres 9.6이라면 host와 port를 지정하는 인스턴스 설정에 다음 항목을 추가하세요:

"pg_stat_statements_view": "datadog.pg_stat_statements()",
"pg_stat_activity_view": "datadog.pg_stat_activity()"

{% /tab %}

{% tab title="Kubernetes" %} Kubernetes 클러스터를 운영 중이라면 Datadog Cluster Agent를 사용해 Database Monitoring을 활성화하세요.

참고: 진행 전에 Datadog Cluster Agent에서 클러스터 체크가 활성화되어 있는지 확인하세요.

아래는 다양한 Datadog Cluster Agent 배포 방식으로 Postgres 통합을 설정하는 단계별 안내예요.

Operator

Kubernetes 및 통합의 Operator 안내를 참고하면서 아래 단계로 Postgres 통합을 설정해요:

  1. 다음 설정으로 datadog-agent.yaml 파일을 생성하거나 업데이트하세요:

    apiVersion: datadoghq.com/v2alpha1
    kind: DatadogAgent
    metadata:
      name: datadog
    spec:
      global:
        clusterName: <CLUSTER_NAME>
        site: <DD_SITE>
        credentials:
          apiSecret:
            secretName: datadog-agent-secret
            keyName: api-key
    
      features:
        clusterChecks:
          enabled: true
    
      override:
        nodeAgent:
          image:
            name: agent
            tag: <AGENT_VERSION>
    
        clusterAgent:
          extraConfd:
            configDataMap:
              postgres.yaml: |-
                cluster_check: true
                init_config:
                instances:
                  - host: <AZURE_INSTANCE_ENDPOINT>
                    port: 5432
                    username: 'datadog@<AZURE_INSTANCE_ENDPOINT>'
                    password: 'ENC[datadog_user_database_password]'
                    ssl: 'require'
                    dbm: true
                    azure:
                      deployment_type: '<DEPLOYMENT_TYPE>'
                      fully_qualified_domain_name: '<AZURE_INSTANCE_ENDPOINT>'
                    tags:
                      - "dbinstanceidentifier:<DB_INSTANCE_NAME>"
    

참고: Postgres 9.6이라면 host와 port를 지정하는 인스턴스 설정에 다음 줄을 추가하세요:

pg_stat_statements_view: datadog.pg_stat_statements()
pg_stat_activity_view: datadog.pg_stat_activity()
  1. 다음 명령으로 Datadog Operator에 변경 사항을 적용하세요:

    kubectl apply -f datadog-agent.yaml
    

Helm

Kubernetes 및 통합의 Helm 안내를 참고하면서 아래 단계로 Postgres 통합을 설정해요:

  1. (Cluster Agent 설치 안내에서 사용한) datadog-values.yaml 파일을 다음 설정으로 업데이트하세요:

    clusterAgent:
      confd:
        postgres.yaml: |-
          cluster_check: true
          init_config:
          instances:
            - dbm: true
              host: <AZURE_INSTANCE_ENDPOINT>
              port: 5432
              username: 'datadog@<AZURE_INSTANCE_ENDPOINT>'
              password: 'ENC[datadog_user_database_password]'
              ssl: 'require'
              azure:
                deployment_type: '<DEPLOYMENT_TYPE>'
                fully_qualified_domain_name: '<AZURE_INSTANCE_ENDPOINT>'
    
    clusterChecksRunner:
      enabled: true
    

Postgres 9.6이라면 host와 port를 지정하는 인스턴스 설정에 다음 항목을 추가하세요:

pg_stat_statements_view: datadog.pg_stat_statements()
pg_stat_activity_view: datadog.pg_stat_activity()
  1. 위 설정 파일로 Agent를 다음 명령으로 배포하세요:

    helm install datadog-agent -f datadog-values.yaml datadog/datadog
    

{% alert level="info" %} Windows라면 helm install 명령에 --set targetSystem=windows를 추가하세요. {% /alert %}

마운트된 파일로 설정

마운트된 설정 파일로 클러스터 체크를 설정하려면, 설정 파일을 Cluster Agent 컨테이너의 /conf.d/postgres.yaml 경로에 마운트하세요:

cluster_check: true  # Make sure to include this flag
init_config:
instances:
  - dbm: true
    host: '<AZURE_INSTANCE_ENDPOINT>'
    port: 5432
    username: 'datadog@<AZURE_INSTANCE_ENDPOINT>'
    password: 'ENC[datadog_user_database_password]'
    ssl: "require"
    # After adding your project and instance, configure the Datadog Azure integration to pull additional cloud data such as CPU, Memory, etc.
    azure:
      deployment_type: '<DEPLOYMENT_TYPE>'
      fully_qualified_domain_name: '<AZURE_INSTANCE_ENDPOINT>'

Kubernetes 서비스 어노테이션으로 설정

파일을 마운트하는 대신 인스턴스 설정을 Kubernetes 서비스로 선언할 수도 있어요. Kubernetes에서 실행 중인 Agent에 이 체크를 설정하려면 다음 구문으로 서비스를 생성하세요:

Autodiscovery 어노테이션 v2

apiVersion: v1
kind: Service
metadata:
  name: postgres
  labels:
    tags.datadoghq.com/env: '<ENV>'
    tags.datadoghq.com/service: '<SERVICE>'
  annotations:
    ad.datadoghq.com/service.check_names: '["postgres"]'
    ad.datadoghq.com/service.init_configs: '[{}]'
    ad.datadoghq.com/service.instances: |
      [
        {
          "dbm": true,
          "host": "<AZURE_INSTANCE_ENDPOINT>",
          "port": 5432,
          "username": "datadog@<AZURE_INSTANCE_ENDPOINT>",
          "password": "ENC[datadog_user_database_password]",
          "ssl": "require",
          "azure": {
            "deployment_type": "<DEPLOYMENT_TYPE>",
            "fully_qualified_domain_name": "<AZURE_INSTANCE_ENDPOINT>"
          }
        }
      ]
spec:
  ports:
  - port: 5432
    protocol: TCP
    targetPort: 5432
    name: postgres

Postgres 9.6이라면 host와 port를 지정하는 인스턴스 설정에 다음 항목을 추가하세요:

"pg_stat_statements_view": "datadog.pg_stat_statements()",
"pg_stat_activity_view": "datadog.pg_stat_activity()"

자세한 내용은 Autodiscovery 어노테이션을 참고해요.

Cluster Agent가 이 설정을 자동으로 등록하고 Postgres 체크를 실행하기 시작해요.

datadog 사용자의 비밀번호를 평문으로 노출하지 않으려면 Agent의 시크릿 관리 패키지를 사용하고 ENC[] 구문으로 비밀번호를 선언하세요. {% /tab %}

deployment_type과 name 필드 설정에 대한 추가 정보는 Postgres 통합 스펙을 참고해요.

Agent 설정 확인

Agent의 status 하위 명령을 실행하고 Checks 섹션에서 postgres를 찾아보세요. 또는 Databases 페이지를 방문해 바로 시작해도 돼요!

예제 Agent 설정

하나의 Agent가 여러 호스트에 연결

단일 Agent 호스트가 여러 원격 데이터베이스 인스턴스에 연결하도록 설정하는 건 흔한 일이에요 (DBM의 Agent 설치 아키텍처 참조). 여러 호스트에 연결하려면 Postgres 통합 설정에서 호스트마다 항목을 만들어요.

{% alert level="info" %} Datadog는 하나의 Agent로 최대 30개의 데이터베이스 인스턴스를 모니터링할 것을 권장해요. 벤치마크에 따르면 t4g.medium EC2 인스턴스(2 CPU, 4GB RAM)에서 실행 중인 Agent 하나가 RDS db.t3.medium 인스턴스(2 CPU, 4GB RAM) 30개를 성공적으로 모니터링할 수 있어요. {% /alert %}

init_config:
instances:
  - dbm: true
    host: example-service-primary.example-host.com
    port: 5432
    username: datadog
    password: 'ENC[datadog_user_database_password]'
    tags:
      - 'env:prod'
      - 'team:team-discovery'
      - 'service:example-service'
  - dbm: true
    host: example-service–replica-1.example-host.com
    port: 5432
    username: datadog
    password: 'ENC[datadog_user_database_password]'
    tags:
      - 'env:prod'
      - 'team:team-discovery'
      - 'service:example-service'
  - dbm: true
    host: example-service–replica-2.example-host.com
    port: 5432
    username: datadog
    password: 'ENC[datadog_user_database_password]'
    tags:
      - 'env:prod'
      - 'team:team-discovery'
      - 'service:example-service'
    [...]

데이터베이스 호스트의 여러 데이터베이스 모니터링

database_autodiscovery 옵션을 사용하면 Agent가 호스트의 모든 데이터베이스를 발견해 모니터링할 수 있어요. include 또는 exclude 필드로 발견할 데이터베이스 범위를 좁힐 수 있어요. 자세한 내용은 postgres.d/conf.yaml 샘플을 참고해요.

init_config:
instances:
  - dbm: true
    host: example-service-primary.example-host.com
    port: 5432
    username: datadog
    password: 'ENC[datadog_user_database_password]'
    database_autodiscovery:
      enabled: true
      # Optionally, set the include field to specify
      # a set of databases you are interested in discovering
      include:
        - mydb.*
        - example.*
    tags:
      - 'env:prod'
      - 'team:team-discovery'
      - 'service:example-service'

커스텀 쿼리 실행

커스텀 메트릭을 수집하려면 custom_queries 옵션을 사용해요. 자세한 내용은 postgres.d/conf.yaml 샘플을 참고해요.

init_config:
instances:
  - dbm: true
    host: localhost
    port: 5432
    username: datadog
    password: 'ENC[datadog_user_database_password]'
    custom_queries:
    - metric_prefix: employee
      query: SELECT age, salary, hours_worked, name FROM hr.employees;
      columns:
        - name: custom.employee_age
          type: gauge
        - name: custom.employee_salary
           type: gauge
        - name: custom.employee_hours
           type: count
        - name: name
           type: tag
      tags:
        - 'table:employees'

여러 데이터베이스의 relation 메트릭 모니터링

relation 메트릭(예: postgresql.seq_scans, postgresql.dead_rows, postgresql.index_rows_read, postgresql.table_size)을 수집하려면 Agent가 각 데이터베이스에 연결하도록 설정해야 해요 (기본적으로 Agent는 postgres 데이터베이스에만 연결해요).

모든 데이터베이스에서 DBM 텔레메트리를 수집하도록 단일 "DBM" 인스턴스를 지정하세요. 각 데이터베이스 이름을 지정하지 않으려면 database_autodiscovery 옵션을 사용해요.

init_config:
instances:
  # This instance is the "DBM" instance. It will connect to the
  # all logical databases, and send DBM telemetry from all databases
  - dbm: true
    host: example-service-primary.example-host.com
    port: 5432
    username: datadog
    password: 'ENC[datadog_user_database_password]'
    database_autodiscovery:
      enabled: true
      exclude:
        - ^users$
        - ^inventory$
    relations:
      - relation_regex: .*
  # This instance only collects data from the `users` database
  # and collects relation metrics from tables prefixed by "2022_"
  - host: example-service-primary.example-host.com
    port: 5432
    username: datadog
    password: 'ENC[datadog_user_database_password]'
    dbname: users
    dbstrict: true
    relations:
      - relation_regex: 2022_.*
        relkind:
          - r
          - i
  # This instance only collects data from the `inventory` database
  # and collects relation metrics only from the specified tables
  - host: example-service-primary.example-host.com
    port: 5432
    username: datadog
    password: 'ENC[datadog_user_database_password]'
    dbname: inventory
    dbstrict: true
    relations:
      - relation_name: products
      - relation_name: external_seller_products

스키마 수집

이 기능을 활성화하려면 collect_schemas 옵션을 사용해요. 각 논리적 데이터베이스에 연결하도록 Agent도 설정해야 해요.

각 논리적 데이터베이스를 지정하지 않으려면 database_autodiscovery 옵션을 사용해요. 자세한 내용은 postgres.d/conf.yaml 샘플을 참고해요.

init_config:
# This instance only collects data from the `users` database
# and collects relation metrics only from the specified tables
instances:
  - dbm: true
    host: example-service-primary.example-host.com
    port: 5432
    username: datadog
    password: 'ENC[datadog_user_database_password]'
    dbname: users
    dbstrict: true
    collect_schemas:
      enabled: true
    relations:
      - products
      - external_seller_products
  # This instance detects every logical database automatically
  # and collects relation metrics from every table
  - dbm: true
    host: example-service–replica-1.example-host.com
    port: 5432
    username: datadog
    password: 'ENC[datadog_user_database_password]'
    database_autodiscovery:
      enabled: true
    collect_schemas:
      enabled: true
    relations:
      - relation_regex: .*

프록시를 통한 호스트 연결

Cloud SQL Auth proxy 같은 프록시를 통해 Agent가 연결해야 한다면 모든 텔레메트리의 호스트네임이 데이터베이스 인스턴스가 아닌 프록시로 태그돼요. reported_hostname 옵션으로 Agent가 감지하는 호스트네임을 커스텀 오버라이드하세요.

init_config:
instances:
  - dbm: true
    host: localhost
    port: 5000
    username: datadog
    password: 'ENC[datadog_user_database_password]'
    reported_hostname: example-service-primary
  - dbm: true
    host: localhost
    port: 5001
    username: datadog
    password: 'ENC[datadog_user_database_password]'
    reported_hostname: example-service-replica-1

Azure PostgreSQL 통합 설치

Azure에서 더 포괄적인 데이터베이스 메트릭을 수집하려면 Azure PostgreSQL 통합을 설치하세요 (선택 사항).

알려진 문제

Postgres 16 데이터베이스의 경우 로그 파일에 다음 오류 메시지가 기록돼요:

psycopg2.errors.InsufficientPrivilege: permission denied for function pg_ls_waldir
2024-03-05 12:36:16 CET | CORE | ERROR | (pkg/collector/python/datadog_agent.go:129 in LogMessage) | - | (core.py:94) | Error querying wal_metrics: permission denied for function pg_ls_waldir
2024-03-05 12:36:30 CET | CORE | ERROR | (pkg/collector/python/datadog_agent.go:129 in LogMessage) | postgres:cc861f821fbbc2ae | (postgres.py:239) | Unhandled exception while using database connection postgres
Traceback (most recent call last):
  File "/opt/datadog-agent/embedded/lib/python3.11/site-packages/datadog_checks/postgres/postgres.py", line 224, in db
    yield self._db
  File "/opt/datadog-agent/embedded/lib/python3.11/site-packages/datadog_checks/postgres/postgres.py", line 207, in execute_query_raw
    cursor.execute(query)
psycopg2.errors.InsufficientPrivilege: permission denied for function pg_ls_waldir

그 결과 Postgres 16에서는 postgresql.wal_count, postgresql.wal_size, postgresql.wal_age 메트릭이 수집되지 않아요.

문제 해결

통합과 Agent를 설명한 대로 설치·설정했는데도 예상대로 동작하지 않는다면 문제 해결을 참고해요.

더 알아보기 (Learn more)

추가로 도움이 되는 문서, 링크, 아티클: