はじめに

New Relicでは、NRQLを使うことでありとあらゆるデータを可視化することができます。同様に、ありとあらゆるデータからアラートをあげることもできます。この時、count関数やuniqueCount関数を用いてカウントをとり、その結果が0という値を取り得る場合、アラート設定を行う際はひと工夫が必要になります。

本Postでは、プロセスの死活監視などを行う際に0という値を判定条件として使う場合のアラート条件の設定方法について解説します。

そのWindow評価時にデータが存在しない場合は0ではなくNULLが返る

プロセス死活監視などを行う場合、そのプロセスが稼働していることを確認するため、以下のようにuniqueCount関数を使って起動しているプロセス数をカウントすることが比較的多いです。

FROM ProcessSample SELECT uniqueCount(entityAndPid) WHERE processDisplayName = `プロセス名` and hostname = `対象ホスト`

この時、クエリビルダーでは0が返されるのでこのクエリのままアラートを設定しようとしがちですが注意が必要です。

0が返るイメージ

ドキュメントにも記載されている通り、クエリビルダーやダッシュボードで可視化を行う場合は、カウントをとる場合にデータがない場合は0を返しますが、アラート評価の場合はデータが存在しない場合はそのSELECT句自体が実行されず、結果としてNULLが返ります。

つまり、このクエリでアラートのThresholdとして0の時にアラート、という条件を指定しても、該当のプロセスがダウンしたことを検知することができません。

アラートで0評価をしたい場合はfilter関数を使う

そこでご紹介したいのが、本Postのタイトルでもご紹介しているfilter関数です。結論から言うと、先ほどのクエリを以下のように書き換えればOKです。

SELECT filter(uniqueCount(entityAndPid), WHERE processDisplayName = 'プロセス名') as 'プロセス数' FROM ProcessSample WHERE hostname = '対象ホスト'

ドキュメントにも記載されていますが、filter関数を使うことで関数内に定義しているサブ句を一旦実行し、その結果に対してフィルタをかける挙動になるため、一致するデータがない場合でも0を返すことができる、というわけです。

まとめ

New Relicアラートにおいて、明確な0という値のメトリクスではなく、count関数などを用いてプロセス数などのカウントを求め、0の場合にアラート判定させたい場合は、単純なcount関数で求めるのではなく、本Postのようにfilter関数を使用して明確に0という値を返すようにしましょう。また、エラーログ検知のような、普段は0だがエラー発生時は1以上になるような条件を指定したい場合、アラート自体は検知できるがそのアラートが回復されないということがあります。この場合も、回復=0となりますが、0はNULL判定になり判定クエリ自体が実行されないことが原因ですので、このようなケースでもfilter関数を使い、回復判定できるようにしてあげましょう(詳細はこちらのブログもご参照ください)。話はそれますが、そもそもエラーログ発生を検知してもアラート通知が来ないという場合はStreaming MethodEvent FlowからEvent Timerに変更してみましょう(詳細はこちら)。

なお、データがない=0ではなく、信号が喪失したという判断を行うことでアラートを検知する方法(Set the loss of signal threshold)もありますので、要件に合わせて使い分けると良いでしょう。

それでは良いアラートライフを!