New Relicのインシデント/イシューをNRQLでクエリしてみる

New Relicでアラートを通知するときに作成される「インシデント」「イシュー」はNRQLでクエリーすることができるので試してみました。

この記事の目次は以下です。

- インシデント、イシューとは？
- データ定義とクエリ
- 活用例

# インシデント、イシューとは？

[アラートの概念と用語](https://docs.newrelic.com/jp/docs/alerts-applied-intelligence/applied-intelligence/incident-intelligence/basic-alerting-concepts/)の図を引用します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43631/68b9a7d9-8a6f-ba71-fef7-656d2e78438c.png)

- ① アラート条件を満たすと、インシデントが生成される。
- ② インシデントからイシューが生成される
    - 発生したインシデントはアラートポリシーの設定に従い「新たなイシューが生成される」または「未解決イシューにグルーピングされる」
- ③ イシュー毎にワークフローが動き、通知などの出力が行われる。

## 用語

| 用語 | 概要 |
|:-|:-|
| アラートポリシー | アラート条件のグループ。イシューのグルーピングやワークフローとの紐付け設定はここで行う|
| アラート条件   | インシデントを生成する条件 (例. CPU使用率80%を超過時にアラートとする) |
| インシデント   |  アラート条件によって生成されたイベント  |
| イシュー      | グルーピングされたインシデント。ワークフローはこの単位で実行される |
| ワークフロー   | 別のサービスへの通知やチケット発行などの挙動を定義する  |



## イシューのグルーピング

ポリシーの設定で、以下のいずれかからグルーピング法則を選択します。

![スクリーンショット 2023-02-28 0.27.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43631/605dc77c-2b7e-00c0-6f31-90f10e7ac8e1.png)

- アラートポリシー毎に1つ
- アラート条件毎に１つ
- インシデント毎に１つ


[イシューが作成されるタイミングを決定する](https://docs.newrelic.com/jp/docs/alerts-applied-intelligence/new-relic-alerts/alert-policies/specify-when-alerts-create-incidents/)にも詳しく記載されています。

# データ定義とクエリ

補足：以降に出てくるデータは、意図的にアラートを発生させ続けている環境でサンプル取得したので、インシデントやイシューの数が多いですがご了承ください。

## インシデント
### UI上で確認
![スクリーンショット 2023-02-28 1.07.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43631/a3824736-e2ce-0615-7795-eb28273974fe.png)

### データ定義
インシデントはNRDB(New Relic上のデータ)に格納されておりNRQLでクエリをかけることができます。
「NrAiIncident」というデータです。

データ定義は[New Relic data dictionary](https://docs.newrelic.com/attribute-dictionary)に記載されています。
UI上から１つ１つのインシデントの「View incident payload」をクリックして確認できる属性と若干違うものもあります。(この違いについては検証できていません)

### クエリしてみる
```
SELECT * FROM NrAiIssue
```
![Query_your_data___New_Relic_One.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43631/c9464fa5-2891-d432-186a-a74a23d06b25.png)

「Condition Name」のところにインシデント発生の元となったアラート条件が記載されています。
キャプチャには表示されていないですが「Event」というフィールドをみると１つの発生に対して「open」「close」別々でインシデントデータが存在しました。発生数を集計したい場合は「open」に絞ってクエリするとよさそうです。


## イシュー
### UI上で確認

![Alerts___AI___Feed___New_Relic_One.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43631/f48f2bd1-52c7-a70b-bbfe-b23b251d9852.png)


### データ定義

NRDB上では「NrAiIssue」というデータで格納されているようで、NRQLからもクエリできました。
ただNew Relic data dictionary上にNrAiIssueの項目は見当たりません(フィードバックを送信済)
https://docs.newrelic.com/attribute-dictionary/?event=NrAiIncident

### クエリしてみる
```
SELECT * FROM NrAiIssue
```

![Query_your_data___New_Relic_One.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43631/0b421294-c041-479e-8828-70a119823552.png)

「Entity Names」のところにあーラーと条件名が入っています。['〜']という表記になっておりリスト形式で複数のインシデントがまとめられることうかがえます。「Incident Ids」もリストになっています。
「Event」の項目は「create」「activate」「close」の３種類が確認できます。

# 活用例
ポリシーを横断したイシューの傾向分析、細かく条件をチューニングしたクエリでダッシュボードを作成し状況把握などに使えそうです。
私の所属するチームではNew Relicのモニタリングの傾向や挙動そのものを確認するものも作ったりもしています。→[記事](https://qiita.com/MakiMatsu/items/6141f516bd32d5054f07)


New Relic上で扱うデータはNRDBに格納されNRQLでクエリできるので、監視対象のサイト、アプリケーション、インフラだけでなくNew Relic上のデータも同じ方式で扱えるのが気に入っています。
他にもさまざまな使い方をしているので、また記事にできたらと考えています。