SE の雑記

SQL Server の情報をメインに Microsoft 製品の勉強内容を日々投稿

Azure Functions と Log Analytics による SQL Database のメトリック収集 (EZMonitor)

without comments

Azure Functions が PowerShell 7.0 をサポートしたこで、PowerShell をランタイムとして使用した関数で、ForEach-Object の Parallel が使用できるようになり、スクリプトブロックを並列で実行することができるようになりました。

以前は Runspace を作成して、並列処理を自分で組む必要がありましたが、ForEach-Object でシンプルな記述で並列に実行できるようになったのはうれしいですね。

このような並列処理は、DB のメトリックを取得するときの収集処理で活用することができ、メトリック収集用のクエリを一つ順次実行するのではなく、いくつかのクエリを並列で実行することで、処理時間を短縮することができ、鮮度の良い情報の取得を行うことができます。

SQL Database では、標準でいくつかの方法で情報が取得されています。

これらの標準機能を使用しても、情報の収集を行うことも、もちろん可能ですが、特定の状況かで必要となる情報が不足していることがあり、SQL Database の状態を確認するためは、追加でメトリックの収集を行う必要が出るケースがあります。

そのような場合、私は PowerShell で SQL Database に対してクエリ実行を行いメトリックの収集を行い、そのメトリックを Log Analytics に格納することで確認をしているのですが、情報を取得 / 可視化を毎回一から作るのも面倒ですので、ある程度まとまった仕組みを EZMonitor (Easy Monitor) として作成してみました。
(情報収取のクエリについては、ざっくりしたもののみ追加しているため、まだ修正の必要がありますが)

↓ GitHub のリポジトリからも、こちらのアイコンからもデプロイできます。

 

展開時に情報の取得を行う、SQL Database を指定することで、Log Analytics に取得を行ったデータを、次の画像のように可視化することができます。

image

標準では、5 秒間隔で 4 スレッドで情報を取得しており、Basic / S0 のような低い性能のサービスレベルでは、CPU の使用率を上昇させる要因になります。

CPU 使用率を上昇させた場合は、取得間隔や並列度数を調整してください。

情報収集の仕組み

Log Analytics には、HTTP データコレクター という API があります。

この API を使用することで、Log Analytics に、任意の情報をカスタムログ (~_CL というログ) として、取得できるようになります。

image

この API は PowerShell からも実行することができますので、Azure Functions の PowerShell 開発者向けガイド を参考にして、Azure Functions で HTTP データコレクター API 経由で SQL Database の情報を取得するための関数を作成します。

これで、Log Analytics に SQL DB のメトリックを収集することができます。

Azure Functions については、パッケージファイルからデプロイ しており、GitHub Actions でプッシュ時に Release に zip ファイルを作成するようにして、作成されているアセットでデプロイされるようにしています。
(個人の開発なので、ブランチとかリリース管理適当ですが…。)

 

ARM テンプレートを使用した展開

いくつかの Azure のリソースでメトリックの収集を行っていますので、GitHubのリポジトリから、Deploy to Azure で展開を行うことができます。

今回、Log Analytics のログの可視化には、Workbook を使用しているのですが、Workbook のリソースを含めて、ARM テンプレートでデプロイができるようにしています。

README にも簡単な情報は記載しましたが、展開時には次の情報を指定します。

image

SQL Server Name には、SQL Database の場合は「~.database.windows.net」と database.windows.net の部分まで指定してください。

接続に使用するログインですが、Premium / Business Critical のようなサービスレベルであれば、次のようなログインで、収集用のログインを作成することがでます。

CREATE USER <ログイン名> WITH PASSWORD='<パスワード>'
GRANT VIEW DATABASE STATE TO <ログイン名>

 

それ以外のサービスレベル (Basic / Standard / General Purpose) では、VIEW DATABASE STATE を付与しても必要な権限が付与されないはずですので、上記のログインで情報の収集ができないサービスレベルについては、SQL Database の管理者権限のログインで接続を行う必要が出てきます。

展開を行うと、次のようなリソースが指定したリソースグループに作成され、情報の収集が行われます。

image

「Azure ブック」のリソースをクリックすると、EZMonitor で収集された情報を確認することができます。

初回デプロイ後の情報収集と確認できるようになるまでには、少し時間がかかりますので、デプロイが完了してから 5 分ぐらい様子を見てから、情報の収集が実行できているかを確認してみてください。

正常に情報が取得できると、本投稿の冒頭で紹介した画像のようなレポートが表示できます。

 

Log Analytic のデータの可視化

Log Analytics のログから、アドホックにクエリを実行してメトリックを確認することもできますが、Log Analytics には Workbook (ブック) の機能があり、この機能を使用することで、ログの可視化を効率よく実施することができます。

image

標準で、いくつかのテンプレートが提供されており、これらの標準テンプレートの内容を確認、Azure Monitor ブック のドキュメントから、Workbook の作成方法を学習することができます。

 

EZMonitor で使用している機能としては、次のようなものがあります。

 

パラメーター化

image

収集しているログの特定の項目を使用して、プルダウンのパラメーターを作成し、選択された環境についての情報を可視化します。

複数の DB の情報を単一の Log Analytics に格納したい場合などはパラメーターで表示対象のデータを制御します。

また、Workbook 内の各要素で表示する時間の範囲を指定するためのプルダウンを作成し、この時間範囲の情報の表示が行われます。

 

タブによる表示情報の切り替え

image

ブック内にはタブを作成することができ、タブにより表示内容を切り替えることができます。

タブをクリックした際にパラメーターを設定し、そのパラメーターの設定状況によって、表示する要素を切り替えることでタブと表示内容を連動させるというものになりますが、操作により表示内容の切り替えを行うことができます。

 

複数グラフを並べて表示

image

ブック内に要素を追加すると、標準では「スタイル」が「100% 幅」となっています。

これを「この項目をユーザー設定の幅にします」を設定し、パーセント幅を小さくした要素を複数作成することで、上記の画像のように複数のグラフを並べたり、グリッドとグラフを同一行で併記することができます。

image

 

グリッド内のクリックした情報を使用

image

SQL Server / SQL Database の待機事象については、待機のチェーンができる可能性があります。

Workbook では、プレビューの機能ですが、Graph データとして表示を可視化することができ、この表現方法は、待機のつながりを把握するときに便利です。

待機の発生状況については、グリッドで一覧表示し、グリッド内の行をクリックした際には、その時間軸で待機のチェーンを可視化するということも可能です。

グリッドの「詳細設定」では、「項目が選択されている場合、パラメーターをエクスポートする」という設定を行うことができ、この設定を追加すると、グリッドのクリックした行の情報をパラメーターとして設定することができます。

image

このパラメーターを使用した、クエリを実行することで、グリッドでクリックされた情報を元にして、情報のブレークダウンなどを行うことができるようになります。

image

今回は、グリッドに表示した待機情報に対して、セッション ID とブロッキングの原因となったセッション ID を Graph で表現して、ブロッキングチェーンを可視化するときに使用しています。

image

 

 

荒いところは多々ありますが、メトリック収集と可視化の基本的な仕組みとして活用できるのかなと。

Written by Masayuki.Ozawa

8月 4th, 2020 at 9:08 am

Leave a Reply