Datadog のエージェントには、標準で SQL Server のメトリクスを取得するための、Integration が含まれています。
- Collect SQL Server Custom Metrics
- SQL Server
- Key metrics for SQL Server monitoring
- Custom SQL Server metrics for detailed monitoring
- Monitor SQL Server performance with Datadog
軽く触ってみた際の覚書を。
「C:\ProgramData\Datadog\conf.d\sqlserver.d」に「conf.yaml」を配置することで、SQL Server のメトリクスの取得を行うことができ、次のような YAML を使うことで情報の取得が行えるかと。
# https://docs.datadoghq.com/integrations/guide/collect-sql-server-custom-metrics/ init_config: custom_metrics: - name: sqlserver.clr.execution counter_name: CLR Execution - name: sqlserver.buffer_manager.target_pages object_name: SQLServer:Buffer Manager counter_name: Target pages - name: sqlserver.db.commit_table_entries counter_name: Commit table entries instance_name: ALL tag_by: db - name: sqlserver.io_file_stats table: sys.dm_io_virtual_file_stats columns: - num_of_reads - num_of_writes - 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 - name: sqlserver.memory_clerks.MEMORYCLERK_SQLBUFFERPOOL table: sys.dm_os_memory_clerks counter_name: MEMORYCLERK_SQLBUFFERPOOL columns: - pages_kb instances: - host: localhost,1433 username: datadog password: xxxxxxxxx database: master command_timeout: 30 # stored_procedure: dbo.usp_DataDogMetric
Datadog の SQL Server intengartion では、3 種類の情報の取得方法があります。
(15 秒間隔での情報取得となるようです。)
- 標準メトリクスを取得
- カスタムメトリクスを追加で取得
- sys.dm_os_performance_counters から追加の情報を取得
- サポートされている DMV から追加の情報を取得
- sys.dm_os_wait_stats
- sys.dm_os_memory_clerks
- sys.dm_io_virtual_file_stats
- カスタムストアドプロシージャを実行し、情報を取得
では、それぞれの方法を見ていきたいと思います。
1. 標準メトリクスを取得
instances の項目でサーバーの接続情報を設定することで、標準的なメトリクスを取得することができます。
デフォルトで取得されているのは次のような項目となるようです。
- Buffer cache hit ratio
- Page life expectancy
- Batch Requests/sec
- SQL Compilations/sec
- SQL Re-Compilations/sec
- User Connections
- Lock Waits/sec
- Page Splits/sec
- Processes blocked
- Checkpoint pages/sec
項目としてはかなり限定的なものですね。
これ以外の項目を取得する場合には、YAML にカスタムメトリクスの設定を行います。
2. カスタムメトリクスを追加で取得
標準メトリクスで取得されていない項目については、「init_config」配下に「custom_metrics」を追加することで取得を行うことができます。
取得の方法は大きく分けて 2 種類あります。
2-1. sys.dm_os_performance_counters から追加の情報を取得
標準メトリクスの情報は「sys.dm_os_performance_counters」の DMV から取得されていますが、この DMV の情報から追加で情報取得したい場合には、YAML に定義を追加するだけで取得することができます。
冒頭で記載した YAML の次の個所が、追加の情報取得の個所になります。
- name: sqlserver.clr.execution counter_name: CLR Execution - name: sqlserver.buffer_manager.target_pages object_name: SQLServer:Buffer Manager counter_name: Target pages - name: sqlserver.db.commit_table_entries counter_name: Commit table entries instance_name: ALL tag_by: db
YAML に定義を追加すると、標準メトリクスで使用されているクエリの条件が変更され、指定した項目も併せて取得が行われるようになります。
追加した項目毎に実行されるクエリが増加するということではないようですので、項目追加によるオーバーヘッドは抑えられているようですね。
「instance_name」には「ALL」が指定できるようになっており、今指定を行った場合には、instance_name に設定されている値が「tag_by」に指定したタグとして設定されるようです。
項目の中には DB 単位や用途単位に instance_name が分かれているものがありますので、それらの情報を取得する際に使用できるようですね。
2-2. サポートされている DMV から追加の情報を取得
情報によっては、「sys.dm_os_performance_counters」以外の DMV から情報の取得が必要になることもあります。
Datadog の SQL Server Intengartion では、次の DMV からの情報取得をサポートしてます。
- sys.dm_os_wait_stats
- sys.dm_os_memory_clerks
- sys.dm_io_virtual_file_stats
これらの DMV からの情報取得であれば、YAML に定義を追加するだけで取得を行うことができます。
冒頭で記載した YAML では次の個所の指定ですね。
- name: sqlserver.io_file_stats table: sys.dm_io_virtual_file_stats columns: - num_of_reads - num_of_writes - 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 - name: sqlserver.memory_clerks.MEMORYCLERK_SQLBUFFERPOOL table: sys.dm_os_memory_clerks counter_name: MEMORYCLERK_SQLBUFFERPOOL columns: - pages_kb
「sys.dm_os_wait_stats」と「sys.dm_os_memory_clerks」については、複数の設定を行うと、指定した項目の取得が IN 句に含まれていくようで、複数の設定を行った場合も、1 クエリで実行を完結するようにしているようです。
これらの DMV は複数の項目を指定するのが一般的であり、項目も多岐にわたりますので、一つ一つ設定を行うのは少し厳しいかもしれませんね。
複数の項目を取得する場合は、カスタムストアドプロシージャを作成してみてもよいかもしれません。
3. カスタムストアドプロシージャを実行し、情報を取得
標準メトリクスや、追加で取得する項目を指定する以外に、カスタムストアドプロシージャを実行することも可能です。
カスタムストアドプロシージャの作成方法については Collecting metrics from a custom procedure に記載されています。
出力する情報を特定のフォーマットにすることでストアドプロシージャの実行結果を連携することができるようになります。
冒頭で記載した YAML であれば、「instances」内の「stored_procedure」の項目となります。
ストアドプロシージャを使用した場合、標準メトリクスや、追加で取得を設定した項目については、情報の取得が行われなくなるようですので、取得したい項目については、すべてこのストアドプロシージャで完結させる必要が出てきます。
YAML の記載内容を簡略化したい場合や取得項目が多岐にわたる場合、構成ファイルのメンテナンスが大変になりますので、そのような場合はカスタムストアドプロシージャの作成が望ましいのかもしれませんね。