Dash 2021: Datadog の最新発表 でアナウンスされました データベース モニタリング の SQL Server の Beta でのサポートですが、先日、Datadog を確認したら、私のアカウントでも使用できるようになっていましたので試してみました。
SQL Server の Database Monitroing
Datadog を使用した SQL Server / Azure SQL Database のモニタリングについては、従来からパフォーマンス関連の情報の取得がサポートされていました。
SQL Server については、Agent をインストールした環境から SQL Server の Config を使用して、SQL Server にアクセスして、情報を取得、Azure SQL Database であれば、インテグレーション経由 (ケースによっては、Agent 経由で取得することもあると思いますが) でパフォーマンスに関しての各種メトリクスの取得を行い、パフォーマンスの可視化を行うことができます。
この従来からの機能に加えて、Agent 経由での情報取得につては、Database Monitoring として「クエリ情報」の取得を行うことができます。
Database Monitoring については、次の情報で解説が行われています。
- Surface and optimize slow performing queries with Datadog Database Monitoring
- 高度なデータベースモニタリング
- Database Monitoring
Postgres / MySQL については、以前から機能が提供されていましたが、SQL Server については、Private Beta となっており、一般公開がされていませんでした。
その後、どうなったかを先日確認してみたところ、Private Beta に登録していなくても SQL Server の Database Monitroing を使用することができるようになっていました。
サポートされる環境
サポートされている SQL Server については、SQL Server の設定 に記載されており、次のようになっています。
セルフインストールタイプの SQL Server の他に、各クラウドで提供されている PaaS の SQL Server ベースの環境もサポートがされています。
前段で記載していますが、PaaS の環境の情報取得は、Agent 経由でのアクセスとなるため、基本的な Agent の利用方法 に記載されている何らかの方法でエージェントが動作する環境を用意する必要があります。
私の場合、PaaS は Azure がメインとなるのですが、Azure の場合は、Setting Up Database Monitoring for Azure SQL Server に記載されている次の環境の情報を取得することができます。
- Azure SQL Database
- Azure SQL Managed Instance
- SQL Server on Windows Azure VM
これらの環境に対しては、Grant the Agent access に記載されているログインを作成して、Agent から接続することで情報を取得することができます。
接続情報は Config に設定する必要があり、コンフィグのサンプルについては上述の情報や、conf.yaml.example のサンプルから確認することができます。
SQL Server の Database Monitroing 向けの構成があるのではなく、SQL Server のメトリクス情報取得を設定すると自動的に Database Monitoring の情報も取得されるようです。
取得される情報と仕組み
Database Monitoring で取得される情報については、次の情報で公開されています。
実際に Azure SQL Database を対象として取得した情報がこちらになります。
Database Monitoring の情報については「APM -> Databases」から確認することができます。
クエリのテキスト / 実行プランの XML 内のパラメーターについては正規化され、パラメーターは「?」に置き換えられて情報の収集が行われています。これにより、同一クエリとして集約するための柔軟性や PII 情報の秘匿につながるかと思います。
情報取得の仕組み
情報の取得の仕組みとしては「定期的に DMV から情報を取得する」(10 秒ぐらいの間隔?) ことで実現されているようで、大きく分けて次の 3 つの情報をベースとしているようです。
- sys.dm_exec_requests から実行中のクエリ (status !=’sleeping’) を全件取得
- sys.dm_exec_query_stats から last_execution_time が指定した秒数より前の、キャッシュされたクエリの情報を上位 10,000 件を取得
- sys.dm_exec_query_plan から指定された Plan Handle の実行プランを取得
実行中のクエリとキャッシュされたクエリを定期的に取得し、情報を組み合わせることで Database Monitoring のデータが生成されているようです。
どのようなクエリが実際に実行されているかについては https://github.com/MasayukiOzawa/SQLServer-Util/tree/master/Datadog%20Database%20Monitor を参考にしていただければと思います。
Datadog のポータルから確認できる各項目の意味についても実際に実行されているクエリを確認することでイメージができるかと。