NewRelicを使って特定のエラーの発生を検知する
NewRelicには、NRQL(New Relic Query Language)というクエリ言語を使って、NewRelicに溜まっている様々なデータを検索したりする仕組みがある。
NRQLについては、社内でもたまに勉強会が行われていて(New Relic勉強会をペパボ社内で開催しました - ペパボテックブログ)、うまく活用しているサービスも多い。
これとAlertsを組み合わせると、特定のエラーの発生や、エラーの傾向の変化でアラートを発生させることができるようになる。
NRQLとデータ構造
NRQLで扱うことのできるデータは NRQL入門 | New Relicのドキュメント あたりにまとまっており、アプリケーションのエラー情報は TransactionError
に入っている。
さて、次はこのデータ構造がどうなっているかを調べる必要があるのだけど、それは New Relic data dictionary | New Relic Documentation を見るとわかる。もしくは、Insightsという機能で
SELECT * FROM TransactionError
といったクエリを流してみると、具体的にどういう情報が入っているかわかると思う。error.class
やerror.message
にどういった文字列が入るかは言語に依るところがあるので、実際のデータをみるのはどちらにしても必要だろう。
ドキュメントにはなさそうだけど面白いカラムとしてaggregateFacet
というものがある。NewRelicやこの手のエラートラッキングシステムでは、類似のエラーをまとめる機能がだいたいついているが、このキーとなるのがaggregateFacet
というカラムのようだ。今回は使わなかったが、このカラムのユニークカウントの傾向で、新しいエラーが起きているかを検知できそう。
NRQLでAlertsを設定する
TransactionError
の内容はわかったので、これをアラートに適用していく。今回は「PHPを使ったアプリケーションで、WARNINGもNewRelicに通知しているが、E_ERRORが一定数を超えたときにアラートにしたい」ということをやった。
「Alerts poricies」がなければ新しく作り、あるものに追加するのであればそれを選び、「add a Condition」を選ぶと「Categories」の中に「NRQL」があるので選ぶ。
今回設定したクエリは以下の通り。PHPアプリケーションの場合は、error.class
にはE_ERROR
やE_WARNING
といった文字列が入っていることがわかったので、これをつかってWARNINGを除いた単位時間あたりの数をアラートのしきい値にすることにした。
select count(*)
from TransactionError
where appName = 'your-app-name' and error.class not in ('E_USER_WARNING', 'E_WARNING')
アラートのしきい値の設定方法は以下の3つがあり、今回は「Static」を選んだが、他2つも便利そうなのでいつか使ってみようと思う。
- 固定値の「Static」
- 傾向を見る「Baseline」
- 2つの値の関係をみる「Outliner」
実際に設定したのは画面はこんな感じ。時間や縦軸はぼかしてある。
おわりに
NewRelic(NRQL)を使って、特定のエラーの発生を通知する仕組みについて紹介した。エラーのトリアージが必要な場合もあると思っていて「新しい機能をリリースしたのでその機能に関係するエラーについてのみ知りたい」「特定の画面は特に重要度が高いので、通知のポリシーを分けたい」といったような使い方にも応用できると思う。