Amazon RDS 관리형 Postgres용 데이터베이스 모니터링 설정
Database Monitoring은 Postgres 데이터베이스에 대한 깊은 가시성을 제공해요. 쿼리 메트릭, 쿼리 샘플, 실행 계획(explain plan), 데이터베이스 상태, 장애 조치(failover), 이벤트까지 한눈에 볼 수 있어요.
Agent가 읽기 전용 사용자로 데이터베이스에 로그인해서 텔레메트리(telemetry)를 직접 수집합니다. Postgres 데이터베이스에서 Database Monitoring을 활성화하려면 다음 설정을 순서대로 진행해요.
- AWS 통합 설정
- 데이터베이스 파라미터 설정
- Agent에 데이터베이스 접근 권한 부여
- Agent 설치 및 설정
- 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 %}
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 인스턴스를 준비한 경우):
-
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 인증을 구성하는 방법은 관리형 인증으로 연결을 참고해요.
- 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 통합을 설정해요:
-
다음 설정으로
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()
-
다음 명령으로 Datadog Operator에 변경 사항을 적용하세요:
kubectl apply -f datadog-agent.yaml
Helm
Kubernetes 및 통합의 Helm 안내를 참고하면서 아래 단계로 Postgres 통합을 설정해요:
-
(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()
-
위 설정 파일로 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)
추가로 도움이 되는 문서, 링크, 아티클: