Database Monitoring으로 SQL 쿼리 파라미터 값 캡처하기
Database Monitoring 통합은 데이터베이스 전반에서 집계된 쿼리 메트릭, 실행 중인 쿼리 실행(in-flight query executions), 쿼리 실행 계획(explain plans)을 수집해요. 기본적으로 쿼리 SQL 텍스트와 실행 계획은 민감한 데이터(쿼리 파라미터에 노출될 수 있음)를 보호하기 위해 Datadog로 보내기 전에 에이전트에서 난독화되고 정규화돼요.
출처: 문서
본문
그러나 실제 파라미터 값이 포함된 쿼리 문장을 노출하면 향상된 관측 가능성과 디버깅 기능을 제공해요. Database Monitoring은 현재 PostgreSQL과 SQL Server 통합에서 파라미터 값이 포함된 쿼리 캡처를 지원해요.
쿼리 파라미터에 접근할 수 있으면 다음이 가능해져요:
- 성능 분석: 실행 계획을 특정 파라미터 값에 매핑해 특정 실행 계획이 선택되는 이유를 이해하기
- 근본 원인 식별: 어떤 파라미터 값이나 쿼리 패턴이 성능 회귀를 유발하는지 식별하기
- 핫스팟 감지: 문제가 되는 파라미터 발견하기(예: 느린 쿼리의 90%가
org_id:12345로 인해 발생) - 쿼리 최적화: 실제 파라미터로 실제 실행 계획을 조사해 실행 통계를 얻고 최적화 기회를 식별하기
- 인덱스 튜닝: 실제 파라미터 값을 기반으로 인덱스를 미세 조정하거나, 쿼리를 다시 쓰거나, 쿼리 힌트를 조정하기
시작하기 전에
경고: 파라미터화된 값이 포함된 쿼리 문장과 실행 계획에는 민감한 정보(예: 쿼리 파라미터의 비밀번호)나 개인 식별 정보가 포함될 수 있어요. 이 옵션을 활성화하면 Datadog가 쿼리 샘플이나 실행 계획에 나타나는 원시 쿼리 문장과 실행 계획을 수집하고 인제스트(ingest)할 수 있게 돼요. 이 옵션은 기본적으로 비활성화되어 있어요.
이 가이드를 계속하기 전에 데이터베이스 인스턴스에 Database Monitoring을 구성해야 해요.
지원되는 데이터베이스: PostgreSQL, SQL Server
지원되는 배포 유형: 모든 배포 유형.
권한 (Permissions)
Database Monitoring UI에서 쿼리 파라미터 값을 보려면 사용자에게 Database Monitoring Parameterized Queries Read 권한이 필요해요. 이 권한은 Roles 페이지의 Database Monitoring 섹션 아래에 있어요. 이 권한은 Datadog Admin Role, Datadog Standard Role, Datadog Read Only Role에서 기본적으로 활성화되어 있어요. 조직이 사용자 정의 역할을 사용한다면 적절한 역할에 이 권한을 추가하세요. 권한 관리에 대한 자세한 내용은 RBAC 문서를 참고하세요.
설정 (Setup)
파라미터 값이 포함된 SQL 쿼리 텍스트와 실행 계획을 캡처하려면 데이터베이스 유형에 따라 해당 통합 conf.yaml 파일을 업데이트하세요:
- PostgreSQL:
postgres.d/conf.yaml편집 - SQL Server:
sqlserver.d/conf.yaml편집
collect_raw_query_statement:
enabled: true
참고: SQL Server에서 준비된 문장(prepared statements)의 파라미터 값을 캡처하려면 Extended Events를 통한 쿼리 완료 캡처가 필요해요. 데이터베이스 설정을 완료하려면 쿼리 완료를 캡처하도록 SQL Server 인스턴스와 통합 구성하기를 참고하세요.
collect_xe:
query_completions:
enabled: true
query_errors:
enabled: true
준비된 문장 지원은 현재 SQL Server에서만 사용할 수 있어요. 자세한 내용은 "준비된 문장 파라미터 값이 제한되는 이유"를 참고하세요.
DBMS 유형별 쿼리 파라미터 값 캡처
PostgreSQL
| 쿼리 실행 방법 | 지원 | 설명 | 예시 | 지원되는 Agent 버전 |
|---|---|---|---|---|
| Direct Executions | yes | 쿼리 텍스트에 리터럴 값을 포함해 직접 실행되는 애드혹(ad-hoc) SQL 문장. | SELECT * FROM users WHERE id = 123 |
7.64.0+ |
| Functions | yes | SELECT로 호출되는 스칼라 또는 테이블 반환 함수. | SELECT get_user_name(123); |
7.64.0+ |
| Stored Procedures | yes | CALL로 호출되는 프로시저. | CALL procname(123) |
7.64.0+ |
| Prepared Statements | 현재 지원되지 않음. "준비된 문장 파라미터 값이 제한되는 이유"를 참고하세요. 준비된 문장을 통해 실행되는 파라미터화된 쿼리. 명시적으로 또는 드라이버를 통해 만들 수 있음. | PREPARE stmt AS SELECT * FROM users WHERE id = $1; EXECUTE stmt(123); |
SQL Server
| 쿼리 실행 방법 | 지원 | 설명 | 예시 | Agent 버전 |
|---|---|---|---|---|
| Direct Executions | yes | 쿼리 텍스트에 리터럴 값을 포함해 직접 실행되는 애드혹(ad-hoc) SQL 문장. | SELECT * FROM users WHERE id = 123 |
7.64.0+ |
| Functions | yes | SELECT로 호출되는 스칼라 또는 테이블 반환 함수. | SELECT dbo.GetUserName(123); |
7.64.0+ |
| Stored Procedures | yes | EXEC로 호출되는 프로시저. | EXEC GetUser @id = 123; |
7.64.0+ |
| Prepared Statements | yes | 지원하려면 쿼리 완료 구성이 필요해요. 준비된 문장을 통해 실행되는 파라미터화된 쿼리. 명시적으로 또는 드라이버를 통해 만들 수 있음. | sp_prepare @handle, N'SELECT * FROM users WHERE id = @id'; sp_execute @handle, @id = 123; |
7.67.0+ |
준비된 문장 파라미터 값이 제한되는 이유
Datadog는 활동 샘플링(activity sampling)을 사용해 현재 실행 중인 SQL 쿼리를 캡처해요. 그러나 준비된 문장의 경우 Database Management System이 실행 시점에 파라미터 값을 플레이스홀더로 대체해요. 그 결과 활동 샘플링이 실제 값을 관찰할 수 없어요.
SQL Server에서 파라미터 값이 포함된 준비된 문장을 캡처하려면 쿼리 완료를 캡처하도록 SQL Server 인스턴스와 통합 구성하기를 해야 해요. 이렇게 하면 Datadog Agent가 준비된 문장 실행에 대한 풍부한 가시성을 확보할 수 있어요.
PostgreSQL 준비된 문장 파라미터 값 캡처 지원은 현재 제공되지 않아요.