SQL 서버 커스텀 메트릭 수집

To find out if this integration is available in your organization, see your Datadog Integrations page or ask your organization administrator.

To initiate an exception request to enable this integration for your organization, email support@ddog-gov.com.

본 지침에서는 SQL Server에서 커스텀 메트릭을 수집하는 방법을 설명합니다.

커스텀 쿼리

SQL Server 통합 서비스로 더 복잡한 커스텀 메트릭을 수집하려면 에이전트 설정 디렉토리의 루트에 있는 conf.d/sqlserver.d/conf.yaml 파일의 custom_queries 옵션을 사용하세요. 자세한 내용은 확인하려면 샘플 sqlserver.d/conf.yaml을 참조하세요.

설정

custom_queries에는 다음과 같은 옵션이 있습니다:

옵션필수설명
쿼리실행할 SQL입니다. 간단한 구문이나 여러 줄의 스크립트일 수 있습니다. 결과의 모든 행이 평가됩니다. 여러 줄 스크립트일 경우 파이프 문자(`|’)를 사용하세요.
컬럼각 컬럼을 나타내는 목록이 왼쪽에서 오른쪽으로 순차적으로 정렬되어 있습니다.

다음과 같은 두 가지 필수 데이터가 있습니다:
-name: metric_prefix에 추가하여 전체 메트릭 이름을 구성하는 접미사입니다. typetag으로 지정하면 해당 컬럼은 이 쿼리에서 수집한 모든 메트릭에 태그로 적용됩니다.
-type
: 제출 방법입니다(gauge, count, rate 등). tag로 설정하여 행의 각 메트릭에 이 컬럼에 있는 항목의 이름과 값(<name>:<row_value>)을 태그로 지정할 수도 있습니다.
태그아니요각 메트릭에 적용할 정적 태그 목록입니다.
  • 정의된 columns의 항목 중 최소 하나 이상은 메트릭 유형(gauge, count, rate 등)이어야 합니다.

  • columns에 정의된 항목의 수는 쿼리가 반환한 컬럼의 수와 반드시 동일해야 합니다.

  • columns에 정의된 항목의 순서는 쿼리가 반환한 순서와 반드시 동일해야 합니다.

    custom_queries:
      - query: Select F3, F2, F1 from Table;
        columns:
          - {name: f3_metric_alias, type: gauge}
          - {name: f2_tagkey      , type: tag  }
          - {name: f1_metric_alias, type: count}
        [...]
    

예시

다음은 testdb 데이터베이스의 company 테이블입니다. 해당 테이블에는 직원 기록 세 개가 포함되어 있습니다:

testdb=# SELECT * FROM company;

id| name  | age| address    |salary | entry_date | last_raise_time
-------------------------------------------------------------------
1 | Paul  | 32 | California | 20000 | 1457570000 | 1457570300
2 | Allen | 25 | Texas      | 30000 | 1457570060 | 1457570300
3 | Teddy | 23 | Norway     | 45000 | 1457570120 | 1457570300

아래의 SQL 쿼리는 Paul의 이름과 주소를 태그로 사용하여 Paul의 나이와 급여를 메트릭 값으로 캡처합니다.

SELECT age,salary,name,address FROM company WHERE name = 'Paul'

해당 custom_queries YAML 구성:

custom_queries:
  - query: SELECT age,salary,name,address FROM company WHERE name = 'Paul'
    columns:
      - name: employee_age
        type: gauge
      - name: employee_salary
        type: gauge
      - name: name
        type: tag
      - name: localisation
        type: tag
    tags:
      - 'query:custom'

SQL Server YAML 파일을 업데이트한 후, Datadog 에이전트를 재시작합니다.

검증

결과를 확인하려면 메트릭 탐색기를 사용하여 메트릭을 검색하세요.

디버깅

에이전트의 상태 하위 명령어를 실행하고 검사 섹션에서 sqlserver를 찾습니다.

sqlserver
--------
  - instance #0 [ERROR]: 'Missing query parameter in custom_queries'
  - Collected 0 metrics, 0 events & 0 service checks

아울러, 에이전트 로그에서 유용한 정보를 얻을 수 있습니다.

성능 카운터에서 메트릭 수집

기본적으로 Datadog-SQL 서버 점검 기능은 sys.dm_os_performance_counters 테이블에서 사용 가능한 메트릭 중 일부만 캡처합니다.

하단에서 성능 카운터의 기본 메트릭 수집 예시를 확인하세요. 참고: 옵션으로 tags을 지정하여 메트릭과 함께 전송할 수 있습니다:

custom_metrics:
  - name: sqlserver.clr.execution
    counter_name: CLR Execution
    tags:
      - tag_name:value

파라미터 설명:

매개 변수설명
nameDatadog 내부 메트릭의 이름입니다.
counter_nameSQL 서버 데이터베이스 개체의 카운터 이름입니다.
tags키 목록: 값 태그 쌍의 목록입니다.

카운터에 여러 인스턴스가 연결된 경우, instance_name 파라미터 이름으로 단일 인스턴스를 가져오도록 선택할 수 있습니다:

custom_metrics:
  - name: sqlserver.exec.in_progress
    counter_name: OLEDB calls
    instance_name: Cumulative execution time (ms) per second

더 세분화하고 싶다면 object_name으로 쿼리를 설정합니다:

custom_metrics:
- name: sqlserver.cache.hit_ratio
  counter_name: Cache Hit Ratio
  instance_name: SQL Plans
  object_name: SQLServer:Plan Cache

여러 인스턴스가 존재하는 카운터의 모든 인스턴스를 수집하려면, instance_name 파라미터의 대소문자를 구분하는 특수 값 ALL을 사용합니다. 해당 파라미터는 tag_by 값을 요청합니다. 본 예시에서는 db:mydb1, db:mydb2로 태그한 메트릭을 가져옵니다:

custom_metrics:
  - name: sqlserver.db.commit_table_entries
    counter_name: Commit table entries
    instance_name: ALL
    tag_by: db

카운터를 가져오는 기본 테이블은 sys.dm_os_performance_counters 테이블입니다. Datadog-SQL 서버 점검은 sys.dm_os_wait_stats, sys.dm_os_memory_clerks, sys.dm_io_virtual_file_stats 도 지원합니다.

추가 테이블 중 하나에서 가져온 메트릭을 보고하려면 table 파라미터로 카운터 정의 테이블을 지정하고 columns 파라미터로 보고할 카운터 컬럼을 지정합니다:

custom_metrics:
  - name: sqlserver.LCK_M_S
    table: sys.dm_os_wait_stats
    counter_name: LCK_M_S
    columns:
      - max_wait_time_ms
      - signal_wait_time_ms

상기 예시에서는 sqlserver.LCK_M_S.max_wait_time.ms, sqlserver.LCK_M_S.signal_wait_time_ms 메트릭 두 개를 보고합니다.

참고: sys.dm_io_virtual_file_stats, sys.dm_os_memory_clerks 같은 메트릭이 counter_name에 연결되어 있지 않은 경우 컬럼만 지정하면 됩니다:

custom_metrics:
  - name: sqlserver.io_file_stats
    table: sys.dm_io_virtual_file_stats
    columns:
      - num_of_reads
      - num_of_writes

상기 예시에서는 각 데이터베이스 ID 및 파일 ID로 태그된 sqlserver.io_file_stats.num_of_reads, sqlserver.io_file_stats.num_of_writes 메트릭 두 개를 보고합니다.

커스텀 프로시저에서 메트릭 수집 (레거시)

데이터베이스에서 커스텀 메트릭을 수집하는 레거시 방법입니다. 약간의 설정만으로 사용할 수 있고, 실행할 수 있는 T-SQL 유형이 더 많으며 디버깅이 더 쉬운 custom_queries 파라미터를 사용할 것을 권장합니다. 커스텀 프로시저에서 메트릭을 수집하면 빌링에 영향을 줄 수 있는 대량의 커스텀 메트릭이 생성됩니다.

저장 프로시저 설정

Datadog 보고용 커스텀 메트릭을 수집하려면 임시 테이블을 설정해야 합니다. 해당 테이블에는 다음 컬럼이 있어야 합니다:

설명
metricDatadog에 표시되는 메트릭의 이름입니다.
type메트릭 유형(게이지, 속도 또는 히스토그램)입니다.
value메트릭의 값(반드시 실수로 변환 가능해야 함)입니다.
tagsDatadog에 표시되는 태그이며, 쉼표로 구분됩니다.

마스터 데이터베이스 내에 다음과 같은 저장 프로시저가 생성됩니다:

-- <PROCEDURE_NAME> 이름으로 저장 프로시저 생성
CREATE PROCEDURE [dbo].[<PROCEDURE_NAME>]
AS
BEGIN

  -- 임시 테이블 생성
  CREATE TABLE #DataDog
  (
    [metric] varchar(255) not null,
    [type] varchar(50) not null,
    [value] float not null,
    [tags] varchar(255)
  )

  -- 결과 세트에서 행 개수 삭제
  SET NOCOUNT ON;

  -- 변수 카운트를 생성하고 사용자 연결 수와 같게 설정 
  DECLARE @count float;
  SET @count = (select cntr_value from sys.dm_os_performance_counters where counter_name = 'User Connections');

  -- #Datadog 테이블에 커스텀 메트릭 삽입
  INSERT INTO #Datadog (metric, type, value, tags)
  VALUES ('sql.test.test', 'gauge', @count, 'db:master,env:staging')
        ,('sql.test.gauge', 'gauge', FLOOR(RAND()*20), 'tag:test')
        ,('sql.test.rate', 'rate', FLOOR(RAND()*20), 'metric:gauge')
        ,('sql.test.histogram', 'histogram', FLOOR(RAND()*20), 'metric:histogram')
  SELECT * from #DataDog
END
GO

-- 저장 프로시저 실행 권한 부여
GRANT EXECUTE ON [dbo].[<PROCEDURE_NAME>] To Public
GO

저장 프로시저는 다음과 같은 커스텀 메트릭을 출력합니다:

  • sql.test.test
  • sql.test.gauge
  • sql.test.rate
  • sql.test.histogram.95percentile
  • sql.test.histogram.avg
  • sql.test.histogram.count
  • sql.test.histogram.max
  • sql.test.histogram.median

SQL Server 통합 설정 업데이트

커스텀 프로시저에서 메트릭을 수집하려면 실행할 프로시저로 sqlserver.d/conf.yaml 파일 내에 새 인스턴스 정의를 생성합니다. 기존 구성을 위해서는 별도의 인스턴스가 필요합니다. 저장 프로시저가 있는 인스턴스는 저장 프로시저 외에는 아무것도 처리하지 않습니다. 예시:

  - host: 127.0.0.1,1433
    username: datadog
    password: "<PASSWORD>"
    database: master
  - host: 127.0.0.1,1433
    username: datadog
    password: "<PASSWORD>"
    stored_procedure: "<PROCEDURE_NAME>"
    database: master

다음과 같이 지정할 수도 있습니다:

매개 변수설명기본
ignore_missing_database지정한 DB가 서버에 존재하지 않는 경우 점검을 수행하지 않습니다.False
proc_only_ifstored_procedure에 대한 호출을 실행하기 전에 본 SQL을 실행합니다. 1이 반환되면 프로시저를 호출합니다.
proc_only_if_databaseproc_only_if SQL을 실행할 데이터베이스입니다.데이터베이스 속성

참고: proc_only_if 보호 조건은 데이터베이스가 서버 간 이동 가능한 고가용성 시나리오에 유용합니다.

문제 해결

커스텀 메트릭 메트릭이 Datadog에 표지되지 않으면 에이전트 로그 파일을 확인하세요. 다음 오류가 표시된다면 Could not call procedure <PROCEDURE_NAME>: You must supply -1 parameters for this stored procedure 아래와 같은 문제 중 하나일 수 있습니다:

  • <PROCEDURE_NAME>을 잘못 입력하셨습니다.
  • 설정에서 지정한 데이터베이스 사용자 이름에 저장 프로시저를 실행할 수 있는 권한이 없을 수 있습니다.

참고 자료

추가 유용한 문서, 링크 및 기사: