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.classerror.messageにどういった文字列が入るかは言語に依るところがあるので、実際のデータをみるのはどちらにしても必要だろう。

ドキュメントにはなさそうだけど面白いカラムとしてaggregateFacetというものがある。NewRelicやこの手のエラートラッキングシステムでは、類似のエラーをまとめる機能がだいたいついているが、このキーとなるのがaggregateFacetというカラムのようだ。今回は使わなかったが、このカラムのユニークカウントの傾向で、新しいエラーが起きているかを検知できそう。

NRQLでAlertsを設定する

TransactionErrorの内容はわかったので、これをアラートに適用していく。今回は「PHPを使ったアプリケーションで、WARNINGもNewRelicに通知しているが、E_ERRORが一定数を超えたときにアラートにしたい」ということをやった。

「Alerts poricies」がなければ新しく作り、あるものに追加するのであればそれを選び、「add a Condition」を選ぶと「Categories」の中に「NRQL」があるので選ぶ。

今回設定したクエリは以下の通り。PHPアプリケーションの場合は、error.classにはE_ERRORE_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 Alertsのスクリーンショット

おわりに

NewRelic(NRQL)を使って、特定のエラーの発生を通知する仕組みについて紹介した。エラーのトリアージが必要な場合もあると思っていて「新しい機能をリリースしたのでその機能に関係するエラーについてのみ知りたい」「特定の画面は特に重要度が高いので、通知のポリシーを分けたい」といったような使い方にも応用できると思う。