Grafanaでダッシュボード作るときに使えるTips

#TL;DR
ここ半年Grafanaを頻繁に使ってきて、知ってると便利だなと感じたGrafanaの使い方をまとめました。主にデータソースがZabbixのときのTipsです。参考になれば嬉しいです。

#環境
- grafana6.16
- CentOS7.6

#Variables
使いこなすと一番便利なのが、variables機能です。パネルや画面を動的に作成することができるので、手作業を最小限にすることができます。

##パネルを動的に作る
###基本的なやり方
以前パネルを動的に作る方法の記事は書きました。下記の記事は、データソースがElasticsearchですが他のデータソースでも同様です。
[Grafanaの変数を使って複数パネルを楽に作成する](https://qiita.com/akgo/items/3868c3ce289c3aa6b7c7)

パネル内で変数が使えるのは、**タイトル**と**クエリ**の欄です。タイトルやクエリに変数を使い[Repeating]機能で対象の変数を選択すれば、同じパネルを自動的に複数作成することができます。[Max per Row]で1列に何パネル表示させるか選択することもできます。何も選択しなければ自動的に調節してくれます。

###クエリの一部を変数にする
基本的にホスト名やアイテム名をそのまま変数に入れるかと思いますが、正規表現を使ってホスト名やアイテム名の一部を変数化することもできます。
例えば、Zabbixエージェントでインターフェースの情報を取得しているときで説明すると、アイテム名が[incoming network traffic on interface_name],[outgoing network traffic on interface_name]のようになっていると思います。incoming network trafficとoutgoing network trafficに分けて変数化するのも手ではありますが、インターフェース名だけを抜き出して変数化すれば、変数を1つ定義するだけで済みます。その場合は、以下のように変数を定義します。

```
# インターフェース名だけを変数化する
name: netif
datasource: zabbix
query: Virtual machines.$host.Network interfaces.*
regex: /[Incoming|Outgoing] network traffic on (.*)/

# パネル内で上記の変数を使うとき
item: Incoming network traffic on $netif
```
###MySQLのクエリにも変数利用できる
例えば、データソースがZabbixでホスト名を変数定義した場合、MySQLのテーブル内で同じホスト名を格納したカラムがあれば、MySQLのクエリに定義した変数を含めることができます。

```
[例]
# CPU使用率をホスト別で時系列に表示する
select cpu_usage from table_a where host_name="$host";
```
上記のようにするとデータソースが違っても関連付けができるようになります。

##画面を動的に作る①
画面を動的に作るとは、以下のようなものを指します。ホスト一覧を表示したダッシュボードから各ホストのダッシュボード（表示項目は全て同一）に遷移するとします。下図のダッシュボードは全部で4枚あるように見えますが、実際は2枚(dashboard#1とHost dashboardx1)作成すれば良いです。
![pic](https://drive.google.com/uc?export=view&id=1Sm28xE3U4Fss4cNQxCOU9p3xYB0O_2Hs)
この画面の作り方は、まず2つのダッシュボードに同じ変数hostを定義します。variablesの設定で以下のようにします。

```
# ホストグループlinuxに属するホストを変数hostとして定義する
name:host
datasource:zabbix
query:linux.*
```
続いて、パネルの設定をしていきます。パネルの設定は下記と同様です。
[Grafanaの変数を使って複数パネルを楽に作成する](https://qiita.com/akgo/items/3868c3ce289c3aa6b7c7)
上記の設定に加えて、ドリルダウンの設定をしていきます。dashboard#1でパネル編集>[general]>[drilldown links]>[add link]で以下のように設定します。

```
Type: dashboard
Dashboard:遷移先のダッシュボード名（ここではHost dashboardを指す）
Title:Dashboardと同様
include variables:有効
```
ポイントは、[include variables]を有効にすることです。これは、dashboard#1で定義した変数をHost dashboardでも有効にするためのオプションです。もし、dashboard#1とHost dashboardの変数を異なる名前（但し変数の中身は同一）にした場合は、[Url params]で以下のように設定します。

```
var-[遷移先の変数名]=$[遷移元の変数名]
[例]
var-hostname=$host
```
上記のように設定すると、dashboard#1で選択したホスト情報を表示したhost dashboardに遷移するようになりますし、ダッシュボードを大量に作らなくてもよいのでとても楽になります。

##画面を動的に作る②
パート①では、ホスト名を変数にしてダッシュボードの作成を自動的にする設定をしました。次は応用編として、ホストグループとホストを変数化してよりダッシュボードの作成を楽にしてみます。画面構成は以下のようなものになります。
![pic2](https://drive.google.com/uc?export=view&id=1Nj8Py5C4BJ8h-fmdrZK81xFpBZiEPAUx)
上記のような画面構成にする場合、作成するダッシュボードは実質3枚になります。home dashboardでは、ホストグループを変数groupで定義し、ホストグループのサマリパネルを動的に作成しています。host group#1のパネルをクリックするとhost group#1に属するホスト一覧を表示するダッシュボードhost group#1 dashboardに遷移し、ホストパネルhost#1をクリックするとホストの詳細を表示するhost#1 dashboardに遷移する階層構造型の構成となっています。これらの3画面を作成するときに設定するのは以下の通りです。

```
# home dashboardに定義する変数
name: group
query: *

# home dashboardでホストグループのサマリパネルを作るとき
Query Mode:triggers
Group: $group
Host: /.*/
Application: /.*/
Min Severity: warning
Repeating: group

# host group dashboardに定義する変数
name:group
query: *

name: host
query: $group.*

# host group dashboardでホストのサマリパネルを作るとき
Query Mode:triggers
Group: $group
Host: $host
Application: /.*/
Min Severity: warning
Repeating: host

# host dashboardに定義する変数
name:group
query: *

name: host
query: $group.*

```
後はhome dashboardとhost group dashboardにdrilldown linksを設定すれば上図のような画面遷移をすることが可能になります。

#Function
Zabbix-grafanaでは、Function機能を使うことができます。これは、グラフパネルを使用する場合、時系列で表示するメトリクスに対してmoving averageを使って平滑化したり、timeshiftを使って現在値と前日の同時刻の値を重ねて表示したり、メトリクス名のエイリアスを設定したりと様々設定することができます。また、1メトリクスに対してfunctionを複数設定することもでき、variablesとfunctionを組み合わせることも可能です。例を以下に示します。
![pic3](https://drive.google.com/uc?export=view&id=1KLC1bEhkk8QPhHpueioSv-a1La1dPq6u)
これは、CPUの値(xxx time)を変数に入れて一度にmoving averageよって平滑化したパターンです。上図のように組み合わせることでクエリ1つ1つにfunctionを設定しなくてよいのでパネル作成が楽になります。

#その他

##パネルのクエリに正規表現を使う
variable機能だけではなく、パネルのクエリに正規表現を使うことができます。よく使われるのは**"/.*/"**です。

```例
# xxxホストグループに属する全ホストのxxxアプリケーションのxxxを表示させる
Query Mode:Metrics
Group: xxx
Host: /.*/
Application: xxx
Item: xxx
```
以下のように否定の正規表現等も使えます。

```
# xxxホストグループに属する全ホストのxxxアプリケーションの中で文字列abcを含まないものを表示させる
Query Mode:Metrics
Group: xxx
Host: xxx
Application: xxx
Item: /^(?!.*abc).*$/
```

# まとめ
ほとんどvariablesの使い方にはなってますが、うまく使えばかなりダッシュボードの作成が楽になるのではと思います。他にも便利な機能があれば追記します。

# 参考文献
- https://grafana.com/docs/reference/templating/
- https://alexanderzobnin.github.io/grafana-zabbix/reference/functions/