はじめに
Azure ブックからダッシュボードにグラフをピン留めし、描画するのに引っかかったのでまとめ。
目次
起こったこと
パフォーマンス系のメトリックについて可視化するため、ブックからダッシュボードにグラフをピン留めしましたが、 時間の範囲がある程度以上になると "表示するポイント (10001) が多すぎます" という表示になりグラフが描画されない、ということが起こりました。
粒度を変えても描画できず、時間の範囲をある程度小さくすれば描画されます。
クエリの書き方がよくなかった部分もあるのですが、ここに至る原因 (仕様) と解決策を以下にまとめました。
ポイント
今回の記事を書くに至ったポイントとなる仕様が 2 つあります。
ワークブックのグラフ描画における制限、上限
ワークブックでクエリを基にグラフを描画することができますが、制限や上限があります。
いろいろあるのですが、今回ひっかかったのは "視覚化の制限" にあるグラフのデータ ポイントの制限です。
グラフ グラフの系列は、100 個に制限されます。 グラフのデータ ポイントは、10,000 個に制限されます。
このデータ ポイントが、長期間のグラフ描画で達しやすいです。
グラフ内に描画するデータ (点) の数と考えればわかりやすいですが、1 分に 1 回取得している 1 つのメトリックを 24 時間の範囲でグラフに描画すると
1 回/m * 60m * 24h = 1,440 ポイント 必要です。
1 つのグラフに複数のメトリックを含めれば個数に応じて 2 倍, 3 倍のポイントが必要になりますし、時間の範囲が広がればその分増えます。
例として
1 回/m * 60m * 24h * 7d = 10,080 ポイント > 10,000
1 回/m * 60m * 24h * 2d * 3 メトリック = 8640 ポイント < 10,000
なので、1 分間に 1 回取得しているメトリック 1 つを 7 日以上の範囲では描画できないですし、同条件のメトリックを 3 つでも、2 日までなら描画できます。
実際に上限に達すると、こんな感じになります。
"では 7 日以上のグラフや多数のメトリックは一切描画できないのか?" というと当然そんなことはなく、ここで必要になるのが "時間の粒度" です。
取得しているデータは 1 分単位でも、グラフへの描画を 5 分単位や 15 分単位のデータに丸めることで、グラフは多少荒くなりますが描画に必要なポイントが減ります。
粒度が 1 分単位の場合は
1 回/m * 60m * 24h * 30d = 43,200 ポイント > 10,000
ですが、 5 分単位 (1/5 回/m) とすることで
1/5 回/m * 60m * 24h * 30d = 8,640 ポイント < 10,000
となり、描画可能な範囲に収めることができます。
前述のデータ ポイントの上限があるため、複数のメトリックや長期間の描画をする際にはこの粒度が重要になります。
ブックからダッシュボードへのピン留めにおける制限
通常、ダッシュボードのタイル ギャラリーやメトリック エクスプローラーから貼ったグラフやなどは、ダッシュボード上部の時間設定に連動して時間の範囲と粒度が変更されます。
しかし、ブックからダッシュボードへピン留めしたグラフの場合、時間の範囲は連動してくれますが、時間の "粒度" はダッシュボード上部の "時刻の設定" に連動しません。
(確認してませんが、Log Analytics ワークスペースでクエリから作成、ピン止めしたグラフも同じになるかも?)
そのため、時間の範囲を広げた際にデータ ポイントの上限に達してしまうと、粒度を変えても描画できなくなってしまいます。
解決策
ではどのように解決するかですが、クエリの書き方に気を付けてあげれば OK です。
まず、時間の範囲については以下のように {TimeRange} で記述すると、ダッシュボード上部の時間設定に連動させることができます。
| where TimeGenerated {TimeRange}
肝心の時間の粒度についてですが、summarize の bin など、粒度指定が必要なところで以下のように {TimeRange:grain} で記述すると対処できます。
| summarize xxx by bin(TimeGenerated, totimespan('{TimeRange:grain}'))
ただし、時間の範囲はダッシュボード側の選択と完全に連動するのですが、粒度についてはダッシュボード側の選択によらず、 "自動" と同じような動きになります。
これは時間の範囲に応じて、グラフが描画できるよう適切な粒度が自動的に選択されます。 (数字は適当ですが、範囲 1 日なら 1 分毎、7 日なら 5 分毎、みたいなイメージ)
この 2 点を盛り込んでクエリを作ってあげれば、
・時間の範囲はダッシュボードに連動 ・時間の粒度は時間の範囲に応じて自動調整
というグラフが構成できるため、冒頭で記載した、データ ポイントが多すぎるため描画できないという状態を回避できます。
実際のクエリ例としては以下です。
InsightsMetrics | where TimeGenerated {TimeRange} | where Namespace == 'LogicalDisk' and Name == 'FreeSpacePercentage' | extend MountId = tostring(split(Tags, '"')[3]) | summarize 100-round(avg(Val),2) by bin(TimeGenerated, totimespan('{TimeRange:grain}')), MountId
※VM Insights のメトリックから、マウント ID 毎にディスク空き容量のパーセンテージを表示するクエリ
終わりに
ブックだけ使ってる、とかであればあまり引っかかることはないと思うのですが、たまたまダッシュボードにグラフを張りたい、 そのグラフは VM Insights のブック内のグラフをベースに持ってくるのが楽そう、ということがあったので遭遇しました。
わかってしまえば書き方だけでどうということはないのですが、{TimeRange:grain} やデータ ポイントの上限など、あまり考えたことがなかったのでまとめてみました。今後連動するようになると嬉しいですね。