はじめに
New Relicでは、NRQLを使うことでありとあらゆるデータを可視化することができます。同様に、ありとあらゆるデータからアラートをあげることもできます。この時、count
関数やuniqueCount
関数を用いてカウントをとり、その結果が0という値を取り得る場合、アラート設定を行う際はひと工夫が必要になります。
本Postでは、プロセスの死活監視などを行う際に0という値を判定条件として使う場合のアラート条件の設定方法について解説します。
そのWindow評価時にデータが存在しない場合は0ではなくNULLが返る
プロセス死活監視などを行う場合、そのプロセスが稼働していることを確認するため、以下のようにuniqueCount
関数を使って起動しているプロセス数をカウントすることが比較的多いです。
この時、クエリビルダーでは0が返されるのでこのクエリのままアラートを設定しようとしがちですが注意が必要です。

ドキュメントにも記載されている通り、クエリビルダーやダッシュボードで可視化を行う場合は、カウントをとる場合にデータがない場合は0を返しますが、アラート評価の場合はデータが存在しない場合はそのSELECT
句自体が実行されず、結果としてNULLが返ります。
つまり、このクエリでアラートのThresholdとして0の時にアラート、という条件を指定しても、該当のプロセスがダウンしたことを検知することができません。
アラートで0評価をしたい場合はfilter関数を使う
そこでご紹介したいのが、本Postのタイトルでもご紹介しているfilter
関数です。結論から言うと、先ほどのクエリを以下のように書き換えればOKです。
ドキュメントにも記載されていますが、filter
関数を使うことで関数内に定義しているサブ句を一旦実行し、その結果に対してフィルタをかける挙動になるため、一致するデータがない場合でも0を返すことができる、というわけです。
まとめ
New Relicアラートにおいて、明確な0という値のメトリクスではなく、count
関数などを用いてプロセス数などのカウントを求め、0の場合にアラート判定させたい場合は、単純なcount
関数で求めるのではなく、本Postのようにfilter
関数を使用して明確に0という値を返すようにしましょう。また、エラーログ検知のような、普段は0だがエラー発生時は1以上になるような条件を指定したい場合、アラート自体は検知できるがそのアラートが回復されないということがあります。この場合も、回復=0となりますが、0はNULL判定になり判定クエリ自体が実行されないことが原因ですので、このようなケースでもfilter
関数を使い、回復判定できるようにしてあげましょう(詳細はこちらのブログもご参照ください)。話はそれますが、そもそもエラーログ発生を検知してもアラート通知が来ないという場合はStreaming Method
をEvent Flow
からEvent Timer
に変更してみましょう(詳細はこちら)。
なお、データがない=0
ではなく、信号が喪失した
という判断を行うことでアラートを検知する方法(Set the loss of signal threshold)もありますので、要件に合わせて使い分けると良いでしょう。
それでは良いアラートライフを!
이 블로그에 표현된 견해는 저자의 견해이며 반드시 New Relic의 견해를 반영하는 것은 아닙니다. 저자가 제공하는 모든 솔루션은 환경에 따라 다르며 New Relic에서 제공하는 상용 솔루션이나 지원의 일부가 아닙니다. 이 블로그 게시물과 관련된 질문 및 지원이 필요한 경우 Explorers Hub(discuss.newrelic.com)에서만 참여하십시오. 이 블로그에는 타사 사이트의 콘텐츠에 대한 링크가 포함될 수 있습니다. 이러한 링크를 제공함으로써 New Relic은 해당 사이트에서 사용할 수 있는 정보, 보기 또는 제품을 채택, 보증, 승인 또는 보증하지 않습니다.