データを動的にフィルタリングできる再利用性の高いダッシュボードの作り方

# TL;DR
オブザーバビリティプラットフォーム New Relicには、収集したテレメトリーデータの可視化機能の一つとしてダッシュボード機能があります。普段よく見ている画面のチャートやNRQLと呼ばれるクエリ言語を使ってカスタムしたチャートを集めて固有のニーズにあったダッシュボードを作ることで、状況把握や意思決定、チーム間のコミュニケーションをより効率的に行うことができるようになります。

このブログではダッシュボードで利用できる「<font color="red"><b>テンプレート変数</b></font>」について紹介します。同じ種類のデータであっても状況によっては特定の条件に合致するものだけに絞ってみたり、見る観点を変えたりしたいケースがあります。例えば、特定のAPIのレスポンスタイムだけをみたいとか、特定のタグが付いたホストの情報だけをみたいとか。このような時にいちいちその用途専用のダッシュボードを作るのは骨が折れますし、管理も煩雑になります。

そんな時は、今回紹介する「<font color="red"><b>テンプレート変数</b></font>」が大活躍します。あらかじめダッシュボードにテンプレート変数を設定しておくと、その値を動的に変えてダッシュボードの表示内容を変えることができるようになります。

では早速試してみましょう！

:::note info
最新のアップデートの詳細はこちら
[New Relic アップデート一覧](https://newrelic.com/jp/blog/nerdlog/new-relic-update  "New Relic アップデート一覧")
[この記事に関するNew Relic アップデート(2022年11月)](https://newrelic.com/jp/blog/nerdlog/new-relic-update-202211 "New Relic アップデート(2022年11月)")
:::

:::note info
無料のアカウントで試してみよう！
[New Relic フリープランで始めるオブザーバビリティ！
](https://qiita.com/ktst79/items/5ee74b34e6adb8a7a6fa)
:::

# ダッシュボードとNRQLのおさらい
ダッシュボードについてはここでは細かく説明しませんが、ダッシュボードで利用するクエリ言語NRQLについて簡単におさらいします。ダッシュボードについては[公式ドキュメント](https://docs.newrelic.com/jp/docs/query-your-data/explore-query-data/dashboards/introduction-dashboards/)をご参考にしてください。ダッシュボードやNRQLについて既にご存知の方はこのセクションは飛ばしちゃってください。

[NRQL（New Relic Query Language）](https://docs.newrelic.com/jp/docs/nrql/get-started/introduction-nrql-how-nrql-works/)は、New Relicに収集したテレメトリーデータを検索・可視化するためのクエリ言語で柔軟性が高く、高速にデータを可視化できるので超強力なものです。

ダッシュボードに含まれるチャートは、ビルトインのUIにあるチャートをそのままコピーしてつくったり、ダッシュボードのテンプレートからサクッと作ったり、Data Explorerという辞書ツールをポチポチして作ったり、上記のNRQLをスクラッチで書いて作ったりと、初心者や非技術者からゴリゴリのエンジニアまで様々な人が色々な手段で作れるようになっていますが、いずれの場合も、作られたチャートの実体はNRQLというクエリ言語になっています。

NRQLは雑にいうとSQLのようなもので以下のようなフォーマットになっています。
<pre>SELECT <とりたい情報> FROM <対象イベント/メトリック> WHERE <絞り込み条件> .... </pre>


例えば、アプリケーション毎のレスポンスタイムを時系列で出す場合は以下のような感じになります。
<pre>FROM Transaction SELECT average(duration) FACET appName TIMESERIES</pre>

さて、上記のクエリでチャートを作った場合、条件を絞ったデータを見たいときはNRQLに条件を足す必要があります。例えば、特定の店舗だけとか、特定のページからきたリクエストだけに限定するとか、そういったケースです。

そのように絞り込んで見るケースが多いのであれば、予めテンプレート変数を使ってそれに備えたクエリにしておくと、クエリをいちいち変更することなく効率的にデータを分析することができます。

前置き長くなりましたが、テンプレート変数を使ったクエリについてみていきましょう！

# テンプレート変数を使ったクエリ
まず結論からいうと、テンプレート変数を使ったクエリは以下のようなものになります。下のクエリはAPMが導入された”WebPortal”という名前のアプリケーションのレスポンスタイムを、トランザクション名とホスト毎に一覧するクエリです。

<pre>FROM Transaction SELECT average(duration) facet name, host  where appName = 'WebPortal' and host in ({{var_host}})</pre>

ポイントは、<font color="red"><b>`host in ({{var_host}})`</b></font> の部分です。WHERE句に書いてあるのでホスト（host）を絞り込む条件になっています。テンプレート変数は <font color="red"><b>`{{var_host}}`</b></font> の部分です。変数であることが分かるように <b>`var_host`</b> という名前にしていますが名前は任意で構いません。この <b>`var_host`</b> に入ってくる値を動的に変えられるので、同じチャートでも全てのホストを対象にすることもできるし、特定のホストを対象にすることもできます。

では、上記のクエリと変数をどのように定義してチャートを作っていくのか説明します。


# ステップ1: 変数入りのクエリでチャートを作る
これは普段ダッシュボードにチャートを追加する手順と同じです。例として以下のクエリを使ったチャートを追加してみます。<b>`var_host`</b> という変数はまだ定義していないので下にエラーメッセージが出ていますが今は無視します。

<pre>FROM Transaction SELECT average(duration) facet name, host  where appName = 'WebPortal' and host in ({{var_host}})</pre>


![01_NRQL.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535230/62a74a28-a3dd-1f52-c4b3-941a111c5699.png)


# ステップ2: 変数を定義
ダッシュボードの上部に「+ Add variable」というボタンがあるので押してみます。

![02_add_variable.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535230/900020f5-63b2-b68b-2c87-865b66347738.png)


変数を定義する画面が出てくるので必要事項を入力します。

![03_create_variable.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535230/8b916a54-d743-9039-ba9f-32566c560b5e.png)


特に重要なのは以下の項目です。詳細は[公式ドキュメント](https://docs.newrelic.com/jp/docs/query-your-data/explore-query-data/dashboards/dashboard-template-variables/)を参照してください。

<b>Name to use in this queries: </b>
クエリの中で利用する変数名です。これはステップ1と一致している必要があります。今回の例だとvar_hostです。

<b>Type:</b>
変数の値をどう決めるかです。ハードコードでよければTextで良いですが、値自体も動的に取りたい場合はQueryにし、後述のQueryを指定します。

<b>Query: </b>
変数の値を動的に決める場合のNRQLです。
例えば、今回の例の場合、ホストを変数で動的に絞りたいので、存在するホストの一覧を以下のようなクエリで取ります。今回はappNameでアプリケーションを固定で絞っていますが、環境によってよしなに変えてください。
<pre>SELECT uniques(host) FROM Transaction WHERE appName='WebPortal'</pre>

<b>Multi-value:</b>
複数の値を対象とするかどうかです。複数のものを一度に選択したい場合はONにします。

あとは、デフォルト値や値の型を指定し、保存して終了です。簡単ですね。


# ステップ3: 変数が機能していることを確認
テンプレート変数が定義し終わると、チャートが表示されるようになります。
赤枠のようにテンプレー定義した変数が現れてきます。今回デフォルト値は全てのホストを対象にしてあるので「All values」となっています。
また、全てのホストが対象なので、チャートに表示されているデータも青枠の通り全ホストになっています。

![04_chart1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535230/842cbe10-2bf4-4f8a-39f7-2c1d2f65a4ca.png)


# ステップ4: 変数で絞り込んでみる
テンプレート変数が上手く動いていそうなことがわかったので、最後に作ったテンプレート変数で絞りこんでみましょう。赤枠の通り、自動的に検出されたホストのうち1つを選んでみます。
結果、青枠の通り選択したものだけで自動的に絞り込みがかかりました。図は値を一つだけ選んだケースですが、複数の値を選ぶこともできます。

![05_chart2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535230/719b4e28-30f0-2d63-7f1f-d8af8e32e50b.png)


# まとめ
ダッシュボードのテンプレート変数を使うことで柔軟に動的にデータをフィルタリングできることをご紹介しました。

今回の例では、テンプレート変数が一つだけでしたが複数定義することでより複雑な条件でフィルタすることもできます。また、ホストでデータを絞る例を説明しましたが、絞り込む属性に制限はないので例えばタグ、リクエスト元のユーザー属性、アプリケーション特化の属性など様々な情報で絞り込むことができます。

変数を上手に活用することで再利用性の高いダッシュボードが作れますのでぜひお試しください！

ダッシュボードのテンプレート変数の詳細については[公式ドキュメント](https://docs.newrelic.com/jp/docs/query-your-data/explore-query-data/dashboards/dashboard-template-variables/)を参照ください。

:::note info
最新のアップデートの詳細はこちら
[New Relic アップデート一覧](https://newrelic.com/jp/blog/nerdlog/new-relic-update  "New Relic アップデート一覧")
[この記事に関するNew Relic アップデート(2022年11月)](https://newrelic.com/jp/blog/nerdlog/new-relic-update-202211 "New Relic アップデート(2022年11月)")
:::

:::note info
無料のアカウントで試してみよう！
[New Relic フリープランで始めるオブザーバビリティ！
](https://qiita.com/ktst79/items/5ee74b34e6adb8a7a6fa)
:::

:::note info
[New Relic株式会社のQiita Organization](https://qiita.com/organizations/newrelic)では、
新機能を含む活用方法を公開していますので、ぜひフォローをお願いします。
:::