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

Amazon RDS 관리형 Postgres용 데이터베이스 모니터링 설정

원문 보기 위키 갱신

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

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

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

{% alert level="info" %} RDS Quick Install은 작은 환경(예: 데이터베이스 호스트 20개) 또는 DBM을 처음 접해서 빨리 시도해보고 싶은 분들에게 권장하는 설치 방법이에요. UI로 Agent를 배포하는 방식이 확장성에 맞지 않는 대규모 데이터베이스 플릿을 운영하는 분들은 표준 설치를 권장해요. Agent를 직접 관리하거나 자동화 방식에 통합하는 방식이에요. {% /alert %}

출처: 문서

본문

시작하기 전에

{% dl %}

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

{% dd %} 9.6, 10, 11, 12, 13, 14, 15, 16, 17, 18 {% /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 %}

AWS 통합 설정

Amazon Web Services 통합 타일의 Resource Collection 섹션에서 Resource Collection을 활성화하세요.

Postgres 설정 구성

DB 파라미터 그룹에서 다음 파라미터를 설정하고 설정이 적용되도록 서버를 재시작하세요. 파라미터에 대한 자세한 내용은 Postgres 문서를 참고해요.

필수 파라미터

Parameter Value Description
shared_preload_libraries pg_stat_statements postgresql.queries.* 메트릭에 필요해요. pg_stat_statements 확장으로 쿼리 메트릭을 수집할 수 있게 해요.
track_activity_query_size 4096 더 큰 쿼리 수집에 필요해요. pg_stat_activity의 SQL 텍스트 크기를 늘려줘요. 기본값으로 두면 1024자보다 긴 쿼리는 수집되지 않아요.

선택 파라미터

Parameter Value Description
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 쿼리의 블록 읽기/쓰기 시간 수집을 활성화해요.

auto_explain 활성화 (선택 사항)

기본적으로 Agent는 실행 중인 쿼리 샘플에 대해서만 EXPLAIN 계획을 수집해요. 특히 애플리케이션 코드가 prepared statement를 사용할 때 이 계획은 다소 일반적인 성격을 띱니다.

모든 쿼리에서 전체 EXPLAIN ANALYZE 계획을 수집하려면 PostgreSQL에 번들로 제공되고 모든 주요 프로바이더에서 사용 가능한 퍼스트파티 확장인 auto_explain을 사용해야 해요. 로그 수집은 auto_explain 수집의 전제 조건이므로, 계속 진행하기 전에 로그 수집을 활성화하세요.

{% alert level="danger" %} 중요: auto_explain은 난독화되지 않은 SQL의 원시 값과 유사하게 민감한 애플리케이션 데이터를 포함할 수 있는 로그 줄을 생성해요. 결과 계획에 대한 접근을 제어하려면 dbm_parameterized_queries_read 권한을 사용하세요. 로그 줄 자체의 가시성을 제한하려면(기본적으로 Datadog 조직의 모든 사용자에게 보임) Logs용 RBAC도 구성하세요. Datadog는 민감한 정보를 효과적으로 보호하기 위해 두 권한을 모두 사용할 것을 권장해요. {% /alert %}

  1. auto_explain 설정을 구성하세요. 로그 형식 반드시 json이어야 하지만 다른 설정은 애플리케이션에 따라 달라질 수 있어요. 이 예제는 1초를 초과하는 모든 쿼리에 대해 버퍼 정보를 포함하되 타이밍(오버헤드가 있을 수 있음)은 제외한 EXPLAIN ANALYZE 계획을 로그로 기록해요.
Parameter Value Description
shared_preload_libraries pg_stat_statements,auto_explain 자동 EXPLAIN ANALYZE 활성화
auto_explain.log_format json 머신이 읽을 수 있는 계획 생성
auto_explain.log_min_duration 1000 쿼리가 1초를 초과하면 계획 로그 기록
auto_explain.log_analyze on EXPLAIN의 ANALYZE 형식 사용
auto_explain.log_buffers on 계획에 버퍼 사용 포함
auto_explain.log_timing off 타이밍 제외 (오버헤드 높음)
auto_explain.log_triggers on 트리거 문장에 대한 계획 포함
auto_explain.log_verbose on 상세 계획 유형 사용
auto_explain.log_nested_statements on 중첩 문장 포함
auto_explain.sample_rate 1 지속 시간을 초과하는 모든 쿼리 설명

더 풍부한 이벤트 상관관계를 위해 log_line_prefix를 변경하세요. 자세한 내용은 RDS DB 파라미터 그룹 문서를 참고해요. auto_explain 수집에는 이 값을 %m:%r:%u@%d:[%p]:%l:%e:%s:%v:%x:%c:%q%a로 설정해야 해요.

RDS 인스턴스가 CloudWatch와 Datadog에 로그를 전달하도록 하려면 Amazon RDS 로그 수집 안내를 따라가세요.

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>';

참고: IAM 인증도 지원돼요. RDS 인스턴스에 적용하는 방법은 가이드를 참고하세요.

{% tab title="Postgres ≥ 15" %} datadog 사용자에게 관련 테이블 권한을 부여하세요:

ALTER ROLE datadog INHERIT;

모든 데이터베이스에 다음 스키마를 생성하세요:

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 schema public;

{% /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;
CREATE EXTENSION IF NOT EXISTS pg_stat_statements schema public;

{% /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;
CREATE EXTENSION IF NOT EXISTS pg_stat_statements;

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 localhost -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 localhost -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 localhost -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 localhost -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 localhost -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 localhost -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 설치 및 설정

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

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

  1. postgres.d/conf.yaml 파일을 편집해 host / port를 지정하고 모니터링할 마스터를 설정하세요. 사용 가능한 모든 설정 옵션은 샘플 postgres.d/conf.yaml을 참고해요.

    init_config:
    instances:
      - dbm: true
        host: '<AWS_INSTANCE_ENDPOINT>'
        port: 5432
        username: datadog
        password: 'ENC[datadog_user_database_password]'
        aws:
          instance_endpoint: '<AWS_INSTANCE_ENDPOINT>'
          region: '<REGION>'
        tags:
          - "dbinstanceidentifier:<DB_INSTANCE_NAME>"
    
        ## Required for Postgres 9.6: Uncomment these lines to use the functions created in the setup
        # pg_stat_statements_view: datadog.pg_stat_statements()
        # pg_stat_activity_view: datadog.pg_stat_activity()
    
        ## Optional: Connect to a different database if needed for `custom_queries`
        # dbname: '<DB_NAME>'
    

Agent 버전 ≤ 7.49라면 host와 port를 지정하는 인스턴스 설정에 다음 항목을 추가하세요:

ssl: allow

IAM으로 인증하려면 region과 instance_endpoint 파라미터를 지정하고 managed_authentication.enabled를 true로 설정하세요.

참고: managed_authentication은 IAM 인증을 사용하려는 경우에만 활성화하세요. IAM 인증은 password 필드보다 우선합니다.

init_config:
instances:
  - dbm: true
    host: '<AWS_INSTANCE_ENDPOINT>'
    port: 5432
    username: datadog
    aws:
      instance_endpoint: '<AWS_INSTANCE_ENDPOINT>'
      region: '<REGION>'
      managed_authentication:
        enabled: true
    tags:
      - "dbinstanceidentifier:<DB_INSTANCE_NAME>"

    ## Required for Postgres 9.6: Uncomment these lines to use the functions created in the setup
    # pg_stat_statements_view: datadog.pg_stat_statements()
    # pg_stat_activity_view: datadog.pg_stat_activity()

    ## Optional: Connect to a different database if needed for `custom_queries`
    # dbname: '<DB_NAME>'

RDS 인스턴스에서 IAM 인증을 구성하는 방법은 관리형 인증으로 연결을 참고해요.

  1. Agent를 재시작하세요.

{% /tab %}

{% tab title="Docker" %} ECS나 Fargate 같은 Docker 컨테이너에서 실행 중인 Agent로 통합을 설정하려면 몇 가지 방법이 있어요. 모두 Docker 설정 문서에 자세히 나와 있으니 참고해요.

아래 예제는 Docker 라벨과 Autodiscovery 템플릿으로 Postgres 통합을 설정하는 방법을 보여줘요.

참고: 라벨 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.checks='{"postgres": {
    "init_config": {},
    "instances": [{
      "dbm": true,
      "host": "<AWS_INSTANCE_ENDPOINT>",
      "port": 5432,
      "username": "datadog",
      "password": "<UNIQUEPASSWORD>",
       "aws": {
         "instance_endpoint": "<AWS_INSTANCE_ENDPOINT>",
         "region": "<REGION>"
       },
      "tags": ["dbinstanceidentifier:<DB_INSTANCE_NAME>"]
    }]
  }}' \
  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": "<AWS_INSTANCE_ENDPOINT>", "port": 5432,"username": "datadog","password": "ENC[datadog_user_database_password]","aws": {"instance_endpoint": "<AWS_INSTANCE_ENDPOINT>", "region": "<REGION>"}, "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()"

datadog 사용자의 비밀번호를 평문으로 노출하지 않으려면 Agent의 시크릿 관리 패키지를 사용하고 ENC[] 구문으로 비밀번호를 선언하세요. 또는 Autodiscovery 템플릿 변수 문서를 참고해 비밀번호를 환경 변수로 제공할 수도 있어요. {% /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: <AWS_INSTANCE_ENDPOINT>
                  port: 5432
                  username: datadog
                  password: 'ENC[datadog_user_database_password]'
                  dbm: true
                  aws:
                    instance_endpoint: <AWS_INSTANCE_ENDPOINT>
                    region: <REGION>
                  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 파일을 다음 설정으로 업데이트하세요:

    datadog:
      clusterChecks:
        enabled: true
    
    clusterChecksRunner:
      enabled: true
    
    clusterAgent:
      enabled: true
      confd:
        postgres.yaml: |-
          cluster_check: true
          init_config:
          instances:
          - dbm: true
            host: <AWS_INSTANCE_ENDPOINT>
            port: 5432
            username: datadog
            password: 'ENC[datadog_user_database_password]'
            aws:
              instance_endpoint: <AWS_INSTANCE_ENDPOINT>
              region: <REGION>
            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. 위 설정 파일로 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: '<AWS_INSTANCE_ENDPOINT>'
    port: 5432
    username: datadog
    password: 'ENC[datadog_user_database_password]'
    aws:
      instance_endpoint: <AWS_INSTANCE_ENDPOINT>
      region: <REGION>
    tags:
    - "dbinstanceidentifier:<DB_INSTANCE_NAME>"

    ## Required: For Postgres 9.6, uncomment these lines to use the functions created in the setup
    # pg_stat_statements_view: datadog.pg_stat_statements()
    # pg_stat_activity_view: datadog.pg_stat_activity()

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.checks: |
      {
        "postgres": {
          "init_config": <INIT_CONFIG>,
          "instances": [
            {
              "dbm": true,
              "host": "<AWS_INSTANCE_ENDPOINT>",
              "port": 5432,
              "username": "datadog",
              "password": "ENC[datadog_user_database_password]",
              "aws": {
                "instance_endpoint": "<AWS_INSTANCE_ENDPOINT>",
                "region": "<REGION>"
              },
              "tags": [
                "dbinstanceidentifier:<DB_INSTANCE_NAME>"
              ]
            }
          ]
        }
      }
spec:
  ports:
  - port: 5432
    protocol: TCP
    targetPort: 5432
    name: postgres

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

Postgres 9.6을 사용한다면 인스턴스 설정에 다음을 추가하세요:

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

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

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

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

RDS 통합 설치

DBM에서 데이터베이스 텔레메트리와 함께 AWS의 CPU 같은 인프라 메트릭을 보려면 RDS 통합을 설치하세요 (선택 사항).

문제 해결

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

더 알아보기 (Learn more)

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