Azure Log Analytics と Kusto (KQL) 入門 3 - Workbooks (ダッシュボード機能) の使い方 - Azure VM の可用性情報ダッシュボードを例に

# 本記事について

Log Analytics や Azure Resource Graph を Kusto (KQL) を使って検索できるようになった後、それらをダッシュボード化したいという希望が出てくることがよくあります。そのような際に利用できる Azure サービスが、[Azure Workbooks](https://learn.microsoft.com/ja-jp/azure/azure-monitor/visualize/workbooks-overview) になります。

Azure Workbooks を利用すると、下記のような色鮮やかなグラフや表を組み合わせた、便利なダッシュボードを簡単に作成することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276225/9d95b360-8c5e-ee1a-9438-8326fc4f2cd8.png)

Azure Workbooks はできることが非常に多く、[公式ドキュメント](https://learn.microsoft.com/ja-jp/azure/azure-monitor/visualize/workbooks-overview)にも各手法の詳細な説明が載っています。ただ、なかなかとっつきにくいという声も多いため、本記事では、簡単な例を基に Workbooks を作る際に良く利用される手法を見ていきたいと思います。

具体的には、パラメーターの設定、表（グリッド）・マップ・グラフの表示、変数のエクスポート、スタイルの設定などを行っていきます。

# 本記事の中で作成する Workbooks について

本記事では、Azure 仮想マシンが作成されているサブスクリプションで、その可用性を監視するためのダッシュボードを作っていきます。利用されるクエリの一部は、[Project Flash : Azure 仮想マシンの可用性の監視を高める](https://jpaztech.github.io/blog/vm/vm-availability-monitoring-with-project-flash/)というマイクロソフトのエンジニアが公開している記事の内容を基にしています。2022年から2023年にかけて、Azure Resource Graph や Azure Metric を利用して取得できる可用性情報が増えてきています。この内容を基に、仮想マシンの可用性を一元的に監視できるダッシュボードを作っていきます。

# 本記事に登場する Kusto クエリについて

本記事は、Kusto (KQL) にはある程度精通していることを前提としています。具体的には、以下の記事に登場するオペレーターが理解できていれば問題なく進める内容となっています。もし、KQL 自体を学習されたい方は下記の2記事も合わせてご参照ください。

* [Azure Log Analytics と Kusto (KQL) 入門 - 良く使われるオペレーターの使い方](https://qiita.com/YoshiakiOi/items/f2cb2b5626c2f7f71dba)
* [Azure Log Analytics と Kusto (KQL) 入門 2 - 主なスカラオペレーターの使い方](https://qiita.com/YoshiakiOi/items/9f649c9b9c97dc6e8e3d)

# Workbooks の作成

ここから順番に実際の Workbooks の作り方を見ていきます。

## Workbook の作成

Workbook 自体は、Azure Monitor や Microsoft Sentinel, Log Analytics の画面などから作成できます。今回は Azure Monitor から作成します。Monitor のブックをクリックし、「＋新規」からひとつ Workbook を作ります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276225/12e9ba91-30fb-8d2d-6c87-9a4a18a938ec.png)

上の「名前を付けて保存」をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276225/d9030129-66a9-c4a2-1b04-a556a25e0d9b.png)

タイトルやサブスクリプション情報、リソースグループ情報やリージョンを入力し、適用へ進みます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276225/718eb731-6526-5f4a-8fcd-9918f153ebd9.png)

Workbooks もひとつのリソースであるため、作成すると下記のようにリソースグループ内のリソースとして見えてきます。権限管理も Azure Resource Manager の IAM に依存します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276225/979fc085-f6ee-d1c3-4c72-7229efca1c43.png)

## テキストの追加

まず、Workbook を開き、「編集」をクリックします。これで諸々の編集ができるようになります。都度保存することを忘れないようにしましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276225/5f86ed50-33d5-87de-2686-7ca11559d0e3.png)

テキストは「＋追加」から「テキストの追加」を選択すると追加できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276225/4ecb684d-8d95-1584-835a-f67ff6587f22.png)

マークダウンで書いていくことができるので便利です。たとえば、リンクの追加もこのように行えます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276225/4103d31f-e79e-b3e1-aa6f-8df98f36b772.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276225/41f003e3-4494-d7d0-0e97-574984e03b5e.png)

## パラメーターの追加

ダッシュボードでは、パラメータを事前に設定しドリルダウンで選べるようにしておくことも重要です。Workbooks では「パラメーターの追加」からそれが行えます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276225/b84406d1-800f-0c17-f9f5-287ef63b2bc0.png)

「パラメーターの追加」を押すと様々な種類のパラメーターを入れることができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276225/15141e10-de50-2673-a2b8-4f0a4bf13882.png)

たとえば、Azure サブスクリプションのパラメーターを作成するには下記のように設定します。パラメーターの型が様々用意されているので、使いたいものを選びます。サブスクリプションの場合は、「サブスクリプションの選択」にします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276225/a186e257-7a84-dd11-63cd-fe98e603949b.png)

次に、Log Analytics Workspace もパラメーター化します。型はリソースの選択とし、データの取得元をクエリにします。そして、データソースを Azure Resource Graph, リソースの種類はサブスクリプション、サブスクリプションはさきほど設定したパラメーターである「Subscription」を選び、下記クエリを入れます。これにより選択されたサブスクリプションの中にある、Log Analytics Workspace をパラメーターとして選択できるようになります。クエリの中の、type を別のリソースの種類にすることで、別のリソースの種類も同じ方法でパラメーター化できます。

```
resources
| where type == "microsoft.operationalinsights/workspaces"
| project id
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276225/e47be0f8-9be1-db8c-9df6-7a19c7963fed.png)

また、時間もパラメーター化しておきます。型で時間の範囲の選択にすれば容易に設定ができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276225/d1863fb7-f16a-7d58-9759-a9ba0c590389.png)

すると、このような形でパラメーターを入れることができるようになります。その他のパラメーターの種類や使い方については、[こちらのドキュメント](https://learn.microsoft.com/ja-jp/azure/azure-monitor/visualize/workbooks-parameters)をご参照ください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276225/ffa18afc-3101-5a0c-94a9-5d785163637c.png)

## Resource Graph クエリの結果の表（グリッド）の追加

次に「クエリの追加」で表を追加していきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276225/5c1a71fc-884c-ea6a-3b36-f4960bd067e5.png)

まずは、Azure Resource Graph で仮想マシンの一覧を取りたいと思います。データソース ＝ Azure Resource Graph, リソースの種類 = サブスクリプション、サブスクリプション = Subscription (上のパラメーターで設定したもの)、視覚化 = グリッドにします。クエリは下記のものを入れます。

```
resources
| where type == "microsoft.compute/virtualmachines"
| project ResourceId = id, Region = location, Size = properties.hardwareProfile.vmSize, 
OS_Type = properties.storageProfile.osDisk.osType, OS_Offer = properties.storageProfile.imageReference.offer,
OS_SKU = properties.storageProfile.imageReference.sku, properties
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276225/6f10e14c-8ca4-30ba-b607-fdba2e366904.png)

次に詳細設定で、ステップ名やタイトルを入れます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276225/72c89895-18ca-66b5-b145-d076f0a05415.png)

また、設定の「列の設定」で列ごとの表示設定をいじれます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276225/31df280b-96aa-10ee-949c-ef15e1cb095e.png)

ResourceId 列の列レンダラーを「リソース」にしたり、Region 列の列レンダラーを「場所」にしたりします。そうすることで、リソースアイコン＆リソースリンク付きになったり、リージョン名がきれいに整形されたりします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276225/6d412f4d-52f9-33d1-f666-7163e53c19c2.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276225/96d6b8b0-fc00-6559-cf0a-e3abb22ac36b.png)

## Resource Graph クエリの結果のマップ（地図）の表示

地図を使ったビジュアルな表示も Workbooks の得意とするところです。[国名や緯度・経度による表示もできますが、Azure のリージョン名も使えます。](https://learn.microsoft.com/ja-jp/azure/azure-monitor/visualize/workbooks-map-visualizations)今回は、Azure リージョンの情報を使って地図上に可視化します。

クエリの追加で、基本的にはさきほどと同じ手順を行っていきます。今回は視覚化 = マップにして、下記のクエリを入れます。するとリージョンごとの仮想マシンの数が地図上に可視化されます。

```
resources
| where type == "microsoft.compute/virtualmachines"
| summarize count() by location
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276225/64068c5f-2caa-d486-c92f-c977da403cde.png)

## 表１で選択したリソースに絞って、表２を表示する

ダッシュボードでは、対話的にリソースを選びながら詳細を見ていくということをしたくなる時があるかと思います。たとえば、さきほどの仮想マシン一覧でひとつ仮想マシンを選択（表１）し、その仮想マシンについて可用性状態や電源状態を調べる（表２）というシナリオを考えます。

まず、さきほどの仮想マシン一覧の表から、選択されたリソースのリソースIDを変数としてエクスポートする設定を入れます。詳細設定を開き、「項目が選択されている場合、パラメーターをエクスポートする」をクリックし、「＋パラメーターの追加」をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276225/d33336d2-e12e-72fc-dbc1-b908fd747cad.png)

そして、エクスポートしたい列名とエクスポートされた後の変数名を入れます。ここでは型は「リソースの選択」としておきます。これで変数のエクスポート側の準備は完了です。今回はそれぞれ、エクスポートしたい列名 = ResourceId, エクスポートされた後の変数名 = exportResourceId としました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276225/0d4361c3-7a89-7fab-f4bc-6e154691f843.png)

次に表２として、可用性や電源状態を表示するグリッドを準備します。同じく「クエリの追加」からクエリを入れていきます。Resource Graph クエリの下記クエリを入れます。ここで、 where Id == tolower('{exportResourceId}') という句で上記でエクスポートした変数を利用し、選択されたリソースIDに一致する場合として絞り込みをしています。

```
Resources
| where type =~ 'microsoft.compute/virtualmachines'
| project resourceGroup, Id = tolower(id), PowerState = tostring( properties.extended.instanceView.powerState.code)
| join kind=leftouter (
    HealthResources
    | where type =~ 'microsoft.resourcehealth/availabilitystatuses'
    | where tostring(properties.targetResourceType) =~ 'microsoft.compute/virtualmachines'
    | project targetResourceId = tolower(tostring(properties.targetResourceId)), AvailabilityState = tostring(properties.availabilityState))
    on $left.Id == $right.targetResourceId
| project-away targetResourceId
| parse PowerState with "PowerState/" PowerState2
//| extend idString = tostring(id) 
| where Id == tolower('{exportResourceId}')
| project ResourceId = Id, PowerState=PowerState2, AvailabilityState
```

クエリの結果、上の表で特定のマシンを選択状態にした時だけ結果が表示されます。詳細設定で、「データがないことを示すメッセージ」を入れておくとより親切でしょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276225/211826a8-571f-2360-c8e1-240753d66d7e.png)

さらに今回は列の設定で、AvailabilityState の列をアイコンにしてみました。そうするとアイコンが自動的に表示されます。アイコンが用意されたテキストについては[公式ドキュメント](https://learn.microsoft.com/ja-jp/azure/azure-monitor/visualize/workbooks-grid-visualizations#icons-to-represent-status)をご参照ください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276225/e86a543f-2a27-bad8-4e3e-cd2ae41613fb.png)

## スタイルの変更 - 複数のコンポーネントを横並びにする

さきほどのマップや今のグリッドは小さい枠での表示でも十分かと思います。そのような際は、スタイルでユーザー設定の幅にしますにチェックを入れてサイズを調整できます。たとえば、それぞれパーセント幅を50%にしておくと横並びになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276225/a7f91438-2828-f1d8-9af5-0466a2290f62.png)

結果、下記のようになりダッシュボードがコンパクトになりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276225/a2d08239-b1db-3ca3-32bd-f0b78f27eb30.png)

## 別の表の追加

このダッシュボードの目的は可用性の監視なので、それに適した表（グリッド）を追加します。Workbook 作成手順としてはさきほどと同じです。下記のクエリで、計画外のメンテナンスの実施状態を取ることができます。詳細設定のデータがない時のメッセージには「直近で計画外の正常性イベントはありませんでした。」と入れておきましょう。

```
HealthResources
	| where type == "microsoft.resourcehealth/resourceannotations"
	| where  properties.category == 'Unplanned' and  properties.context != 'Customer Initiated'
	//| extend ResourceId = tolower(tostring(properties.targetResourceId))
	| project ResourceId = properties.targetResourceId, Region = location, 
	    Category = tostring(properties.category), 
	    Annotation = tostring(properties.reason), 
	    todatetime(OccurredTime = properties.occurredTime), 
	    Summary = tostring(properties.summary)
```

するとイベントが無い時は下記のように表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276225/2f11bdba-0e01-fcda-41a7-6ecf142207e1.png)

一方、特定のマシンで Live Migration が行われたときは、下記のようにイベントが取れます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276225/79b1132e-edac-8982-408b-d80b2269e990.png)

## メトリックのグラフの追加

データソースとして Azure Metric を使うこともできます。今回は、Project Flash で追加された仮想マシンの可用性メトリックを使ったグラフを追加します。追加から「メトリックの追加」を選びます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276225/9e64bc20-e6c8-b2f6-0f21-8a95c2ad7a81.png)

設定値は以下のようにします。メトリックは、VM Avaiability Metric (Preview) の平均値をとります。これは、正常であれば1、異常であれば0をとるメトリックです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276225/9506474b-ce33-8bcf-d7d8-3e13aaf3d8cf.png)

正しく設定できれば、下記のように表示されるはずです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276225/30fc8eea-7a43-ef4f-b05f-df18d3889f9a.png)

## Log Analytics ログクエリのグラフの追加

Azure Monitor エージェントを導入すると、各マシンから様々なログやメトリックを取得できます。（特に VM Insights (Azure Monitor for VMs) の利用がおすすめです。）今回は、シンプルなハートビートログのグラフを入れたいと思います。クエリを追加し、今回はデータソースをログにします。ワークスペースや時間の範囲は、上記で設定したパラメーターを使いたいと思います。
（該当の Log Analytics ワークスペースに仮想マシンのハートビート情報が入っていることが前提です。）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276225/62444735-17a3-930b-6bfb-3bacdbce2f14.png)

クエリはこちらで、5分間で一度でもハートビートがあったかどうか（ある場合は1, ない場合は0）で時系列の折れ線グラフとします。

```
Heartbeat 
| summarize count() by bin(TimeGenerated, 5m), Computer
| extend HB_count = iff(count_ >= 1, 1, 0)
| project TimeGenerated, Computer, HB_count
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276225/935e98c7-8023-cc93-0c66-9a135c813b64.png)

# 最後に

本記事では、仮想マシンの可用性の情報を例に、Azure Workbook を使ったダッシュボードの作成のやり方を見ていきました。本内容が Azure で監視のダッシュボード作成や活用の一助になれば幸いです。

＊本稿は、個人の見解に基づいた内容であり、所属する会社の公式見解ではありません。また、いかなる保証を与えるものでもありません。正式な情報は、各製品の販売元にご確認ください。