New RelicでNetflow監視用のダッシュボードを作ってみた

# はじめに
New RelicでNetflowを収集してみましたが、標準の監視画面では少し使いづらい部分[^1]がありました。ただ、ダッシュボードで好みの監視画面を作れるということは聞いていたので作成してみることにしました。
[^1]: トラフィックグラフが表示されるものの、単位がTotal Bytes (bps)となっており、Byteなのかbitなのか不明瞭だったり（ダッシュボードを作る中で、Byteが正しいことが分かりましたが）、Top talkersの確認でポート番号を絞り込まずに確認したい、などです。


ところが、ダッシュボードを作ろうとすると、SQLと似たNRQLでQueryを記述しなければならないことがわかり、一度は挫折しました。。ですが、トライアンドエラーで意外と簡単に作れることがわかったのでご紹介します。

実際に作った画面がこちらです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3932429/c34ef4b6-13ca-ee60-f019-121f21990a40.png)

![スクリーンショット 2024-11-13 23.31.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3932429/960db1d2-ff5d-8f55-28d9-1d4fb5750f59.png)

これくらいシンプルなものが欲しかったんです。

Queryを記述するのが大変に思われましたが、標準で用意されている監視用ページでView Queryを行うと標準ページで使われているQueryを取得することができます。それを元にカスタマイズしていけば簡単にQueryを作成することができます。

具体的な手順は以下の通りです。

# 1.Netflow監視ページのQueryを取得する
メニューより、Infrastructure->Network->Network flow logs を開きます。
...をクリックしてView Queryを選択するとブラウザの下部にQueryが表示されます。以下は私の環境の例です。長いですね...

```SQL
SELECT sum(in_bytes * numeric(sample_rate)) AS 'rate' FROM KFlow WHERE (provider = 'kentik-flow-device') AND (((src_addr IS NOT NULL AND src_addr != 'undefined') OR (device_name IS NOT NULL AND device_name != 'undefined') OR (application IS NOT NULL AND application != 'undefined') OR (dst_addr IS NOT NULL AND dst_addr != 'undefined'))) FACET `src_addr`, `device_name`, `application`, `dst_addr` LIMIT 10 SINCE '2024-07-16 23:09:00+0900' UNTIL '2024-07-19 23:14:00+0900'
```
# 2.最小構成のQueryを作る
1の結果を見てもさっぱり分からないので、単純化してみます。表示されたQueryをRunしながら、後ろから少しずつ削除をしていくと、以下の箇所まで削除してもQueryとして動くことが分かります。このクエリはKFlowから in_bytesにnumeric(sample_rate)を掛けた合計値をrateとして表示するという意味になっています。
```SQL
SELECT sum(in_bytes * numeric(sample_rate)) AS 'rate' FROM KFlow
```
表示例
![スクリーンショット 2024-11-15 18.55.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3932429/6a2501a6-e142-14dc-0852-af32ceec93f1.png)

# 3.時系列グラフをbit単位で表示するQueryを作成する
時系列グラフで表示させたい場合は、末尾にTIMESERIES句を追加します。この情報を見つけるのが一番大変だったかもしれません。また、byteをbitに変換したいので、bytesに8を掛け、AS句の後ろも分かりやすくrateではなくbitsに変更します。
```SQL
SELECT sum(in_bytes * numeric(sample_rate) * 8) AS 'bits' FROM KFlow TIMESERIES
```

これだけで、bit単位の時系列グラフを作ることができました。

# 4.ダッシュボードの作成
クエリが作成できたので、ダッシュボードを作成します。メニューからDashboardsを開き、Create a Dashboardをクリックし、ダッシュボードの名前とアカウント、パーミッションを設定してCreateします。
すると、空白のパネルが表示されますのでグラフを追加したい場所をクリックして、Add a chartを選択します。先ほどと同様にクエリを入力する画面が現れますので、3で作成したクエリを入力してRunをクリックするとグラフが表示されます。問題なければAdd to Dashboardをクリックします。最後にDone editingをクリックすると、ダッシュボードが保存されます。
これでダッシュボードの完成です。

# 5.円グラフも作成してみる
3のクエリを少し変更すれば円グラフも簡単に作ることができます。円グラフは時系列のデータではないので、TIMESERIES句を削除して代わりにFACET句を追加します。通常のSQLのGROUP BYと同様で指定した属性でグループ化をします。ここでは、送信元IPと宛先IPの組みでグループ化したいので、``FACET `src_addr`, `dst_addr` ``とします。また、上位20個までを確認したいためLIMIT句で`LIMIT 20`も追加しておきます。

```SQL
SELECT sum(in_bytes * numeric(sample_rate) * 8) AS 'bits' FROM KFlow FACET `src_addr`, `dst_addr` LIMIT 20
```

あとは、4で作成したダッシュボードを開いて鉛筆マークで編集モードに入り、+Add Widgetを選択、あとは4と同様にこのQueryを登録するだけです。

# 補足
New Relicのダッシュボードには標準で便利なフィルタ機能が搭載されているため、ここまでの手順だけでも十分に活用できるダッシュボードを作成できます。
ですが、頻繁に使用するフィルタ操作を楽に行いたい場合はテンプレート変数を使用することで、さらに使い勝手の良いダッシュボードを作成することができます。テンプレート変数の使用方法については、公式ドキュメントで解説されていますので、リンクを掲載しておきます。ここまで作成できた方であれば使いこなせると思います。

https://docs.newrelic.com/docs/query-your-data/explore-query-data/dashboards/dashboard-template-variables/

# まとめ
ほとんどSQLを使ったことのない私でしたが、NRQLを使って簡単にダッシュボードを作成することができました。むしろ、ダッシュボードを作成する過程でこう記述するとこんな結果が出てくる、ということを確認できたためSQLの勉強にもなり一石二鳥でした。New Relicの監視画面がしっくりこないという方は、是非お試しください。