NRQL によるアラートをリアルタイムに Slack 通知した話

株式会社オズビジョンのユッコ (@terra_yucco) です。
技術的負債を返済する取り組みを行っていますが、その中で、利用されていない (と思われる) コードの削除なども行っています。ただ、コールトレースが全て実装されているわけでもないので、呼び出し元が無いと思っていても実際は呼ばれていることがあったりしました。

特に PHP の場合こんなことができたりするので、IDE でも探しきれないことが多々。

```php:sample.php
<?php
class Main {
    public function index()
    {
        echo 'I am index.' . PHP_EOL;
    }

    public function sub()
    {
        echo 'I am sub.' . PHP_EOL;
    }
}

$class = new Main();
$class->index();

$function = 'sub';
$class->{$function}();
```

```terminal
$ php sample.php
I am index.
I am sub.
```

幸いなことに今触っているサーバには New Relic の APM が入っているので、もしコードを消しすぎた場合などに気づけるようにしたいと思って通知を導入しました。

# NRQL によるアラートをリアルタイムに Slack 通知した話

今回は Transaction Error の発生をリアルタイムに通知するのを目的としました。

## 事前準備

- Slack で通知用の webhook を対象チャンネルに対して発行していること
- New Relic にはログインできる状態であること

## 実際にやること
### Slack 連携追加

1. New Relic にログインし Notification channels を選び、右上の New notification channel をクリック
2. Select a channel type で `Slack` を選ぶ
3. Channel name に表示用名称を入力 (「アラート通知」など、日本語も使えます) [^1]
4. URL に事前に発行した webhook の URL を設定
5. Create Channel を押して完了

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95030/3994a4a8-f309-5ad8-716c-3104bb7ed8fb.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95030/7d71793e-0ed1-de8d-fc0d-c4a2484f8fdb.png)


### Alert policy の追加

1. Alert policies をクリック (タブではなく上の画像で赤丸がついているところ)
2. New alert policy をクリック
3. ALERT POLICY NAME を入力 (表示用名称なので自由に)
4. By Condition を選択
5. 通知先 (NOTIFICATION CHANNELS) はこの段階では変更できないので、そのままで Create alert policy

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95030/233dbe74-14a6-4df5-71a3-1b8fc5d6096a.png)

### 内容の修正

1. Create a condition をクリック
2. NRQL を選択
3. Next, define thresholds をクリック

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95030/059bf492-9509-82d6-244f-66173758ec63.png)

1. Query 入力欄に以下のように入力
    - `SELECT count(1) FROM TransactionError WHERE appName = '{appName}'`
2. チャートのプレビューを確認
3. エラーが出たら気づきたいので THRESHOLDS > Threshold Type を `Static (固定値)` に設定
4. 1 件でも出たら気づきたいので `query returns a value` `above` `0` `at least one in` `1` minutes と設定
5. CONDITION SETTINGS > Condition name を設定
6. Create condition をクリック

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95030/2a49d12b-de7f-f102-4303-c319093b028f.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95030/5ec803bd-744d-c4f2-5e2c-06186bf6afcc.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95030/9e4767d5-d24b-2e69-7429-aa7ae2aa7914.png)

### 通知を追加

1. Notification channels から通知したいチャンネルを選択
2. Alert policies を選択
3. Add alert policies をクリック
4. 対象のアラートにチェックを入れて Save changes

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95030/977a27a4-bb5a-9495-db57-aff5c7e070cc.png)

### デフォルト通知先の除外

1. ヘッダナビの Alert policies クリック
2. 対象の Policy をクリック
3. 2 Notification channels となっているタブをクリック
4. 要らないデフォルトの設定をゴミ箱アイコンから消す (Users がデフォルトにあると思います)

## 実際の通知

この設定により、New Relic 上での NRQL の結果により Incident の発生と解消が以下のように Slack 通知されるようになりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95030/c355fb81-c3ab-7db7-091e-fd54eb75b317.png)

## Conclusion

New Relic は直感的に使いやすいインターフェースになっているため、ある程度試行錯誤することでこのような設定も簡単に行えました。
NRQL を使わなくてもいろいろなアラートが設定できそうなので、AWS CloudWatch などで手が届かないところに、積極的に使っていこうと思います。

[^1]: Channel name が指定できますが、これは New Relic の画面上で表示する名称であり、通知先の Slack のチャンネルを変更する機能ではありません。