New Relic Insights: NRQL をいろいろ試しみよう（基本編）


Advent Calendar 8日目は、昨日に引き続き 3日連続で、New Relic Insights です。

今日は、具体的な NRQL の例と実行結果を見ていきたいと思います。

## NQRL の実行例

最初に、実際に NRQL を書いて、実行した際の動きを見てもらいたいと思います。以下は、直近１日の国別のページビューのタイムチャートと以下のサンプルの1つ目の直近 1時間の全アプリのスループットの2つを続けて実行しています。（NRQL で使っているキーワードはおいおい説明していきますので、ここでは気にしないでください）

![insights_image.gif](https://qiita-image-store.s3.amazonaws.com/0/46003/10c36fd9-8490-c239-fc6f-3247386a22e3.gif)

どうでしょうか。昨日は説明していませんでしたが、実行すると、結果はいくつか形式で表示されている（タブが３つあります）のがわかるかと思います。上の例では、折れ線グラフ、積み重ねチャート、JSON 形式の3つの形で出力されています。2つ目は、また違った形式（タブが4つ）なのが分かるかと思います。JSON は常にあります。それ以外は出力内容によって異なります。

## NQRL のサンプル（基本編）

New Relic Insights の Query 画面には、いくつか例がありますので、それを紹介していきます。Insights を使える方は、是非、一回アクセスして、試してみてください。実際に実行できるので、よりイメージがわくと思います。

![insights_query.png](https://qiita-image-store.s3.amazonaws.com/0/46003/cad452ce-f551-8858-8375-4cc0e7bbd1d2.png)



**直近 1時間の全アプリのスループットは？**

```sql
SELECT count(*) from Transaction
```

結果
![insights_query_01.png](https://qiita-image-store.s3.amazonaws.com/0/46003/971a42ba-ec1a-762d-f9c3-e239a778b5b2.png)


※ 時間を指定する必要はありません。デフォルトでは、直近1時間のデータが対象となります。

* * *

**直近 1 時間の特定のアプリに属する特定のホストのスループットは？**

```sql
SELECT count (*) from Transaction WHERE host='<ホスト名>' AND appName = '<アプリ名>'
```

結果
![insights_query_02.png](https://qiita-image-store.s3.amazonaws.com/0/46003/23578438-abd2-eb64-3287-37f9f4dc930c.png)

* * *

**直近 12 時間から 1時間前までのあるアプリの全スループットは？**

```sql
SELECT count(*) FROM Transaction WHERE appName = '<アプリ名>' SINCE 12 hours ago UNTIL 1 hour ago
```

結果
![insights_query_03.png](https://qiita-image-store.s3.amazonaws.com/0/46003/5a26e2f0-170c-362c-4dbf-080c4f29f301.png)


 `SINCE` の後の `hours` は、他にも、`days`, `weeks`, `months` が使えます。
`SINCE` や `UNTIL` を使うことで、毎回 Insights を表示したときに、現在時刻をベースとした最新のデータが見えるようになります。

* * *

**3 日前から現在までのあるアプリのスループットは？**

```sql
SELECT count(*) FROM Transaction WHERE appName = '<アプリ名>' SINCE '2015-12-06' UNTIL '2015-12-08' TIMESERIES AUTO
```

結果
![insights_query_04.png](https://qiita-image-store.s3.amazonaws.com/0/46003/9261b420-1894-c555-5366-46d32b036745.png)



ここでは、日付を指定する例ですね。`TIMESERIES` を使うことで、時系列データ返ってきます。そして、表示もそれに沿ったグラフが表示されています。最後の `AUTO` は時系列データの区切り幅を指定しています。AUTO は、自動で期間にあったみやすい値が適用されるようです。ここでは、1時間区切りになっています。これは、`30 minutes` や `2 hours` とか変えることもできます。

* * *

**コントローラー名別のスループットの内訳は？**

```sql
SELECT count(*) FROM Transaction FACET name
```

結果
![insights_query_05.png](https://qiita-image-store.s3.amazonaws.com/0/46003/730064a9-36e4-e392-99cf-c231c2347821.png)


NRQL では、`GROUP BY` の代わりに `FACET` というキーワードが用意されています。`GROUP BY` と同じ動き出そうです。逆に分かりづらい気がするんだよねこれ。

* * *

**アプリの昨日と今日のスループットの比較がしたい**

```sql
SELECT count(*) FROM Transaction SINCE 1 day ago TIMESERIES AUTO COMPARE WITH 1 day ago
```

結果
![insight_query_06.png](https://qiita-image-store.s3.amazonaws.com/0/46003/41221177-abf4-4a43-6b1a-35941875ae9b.png)


ここでは、`COMPARE WITH` を使って１日前と今日のデータを比較しています。これ両方とも 1 day ago って書いてあるから、アレ？ってなるんだよね。

* * *

**トップ50のトランザクションの平均、最大、最小処理時間がみたい**

```sql
SELECT count(*), average(duration), max(duration),  min(duration), sum(duration) FROM Transaction FACET name LIMIT 50
```

結果
![insights_query_07.png](https://qiita-image-store.s3.amazonaws.com/0/46003/55a15ae9-3c62-2a07-e2d5-ebac1ced4e32.png)


このように表形式にした場合、`SELECT` の最初の function （ここでは `count(*)`）でソートされるそうです。

* * *

**直近 1 日で受け付けたリクエストのユニークなコントローラーの数は？**

```sql
SELECT uniqueCount(name) FROM Transaction WHERE appName = '<アプリ名>' SINCE 1 day ago
```

結果
![insights_query_08.png](https://qiita-image-store.s3.amazonaws.com/0/46003/13dccb5f-a02c-8f24-8fec-f0d663a4955d.png)


`uniqueCount` は、SQL の `DISTINCT` と同じ動作をするようです。

* * *
* 
**直近 1 日間にリクエストを受け付けた全ホスト名前のリストは？**

```sql
SELECT uniques(host) FROM Transaction SINCE 1 day ago
```

結果
![insights_query_09.png](https://qiita-image-store.s3.amazonaws.com/0/46003/3a7eb397-3a6d-4c62-88ec-852e01cae4bb.png)


この `uniques` はいろいろな場面で使えます。例えば、カスタム属性で商品名などを収取していた場合、一日で売れた商品名のリストが簡単に取り出せます。

* * *

**直近 1 日間における特定のリクエストを利用した最後のホストは？**

```sql
SELECT latest(host) FROM Transaction FACET name SINCE 1 day ago
```

結果
![insights_query_10.png](https://qiita-image-store.s3.amazonaws.com/0/46003/706bf0ba-bfb5-fb9c-02dc-09614045fd96.png)


`latest` 関数は、特定の期間における属性の最新の値を返します。`FACET` 句と一緒に使うことで、指定した値（ここでは、`name` )でグループ化した結果に対して、最新の値を表示しています。

* * *

**リクエストの処理の何パーセントの時間が、データベース処理以外に費やされてる？**

```sql
SELECT (1-(average(duration)-average(databaseDuration))/average(duration))*100 AS '% of time in DB' FROM Transaction FACET name WHERE appName = '<アプリ名>'
```

結果
![insights_query_11.png](https://qiita-image-store.s3.amazonaws.com/0/46003/6db23eb8-21b2-9940-16f7-d6e286435b24.png)


```
(1 - (平均処理時間-DB平均処理時間)/平均処理時間) * 100 = DB 以外に費やした処理の時間の割合
```

ここでは、数値データに対して、Math関数を利用しています。SQL と同じ感じ。NQRL では、`+, -, /, *` をサポートしています。
また、ラベルとして、`AS` も利用しています。

# さいごに

どうでしたでしょうか？NRQL や　Insights のイメージが分かってきたでしょうか。ここにあるのは、あくまで例なので、ここの書いてある内容でイメージを膨らめていただいて、是非、お使いのアプリで有効に活用してください。

NQRL の詳しい文法やキーワードは、[NRQL リファレンス(英語)](https://docs.newrelic.com/docs/insights/new-relic-insights/using-new-relic-query-language/nrql-reference#sel-timeseries)に書いてありますので、是非活用してみてください。

ここでは、チュートリアルにある、基本のみなので、別の日に応用の方も紹介したいと思います。