特定の日や特定の曜日のみアラート判定から除外したい場合があります。そういった場合、1つの手段としてMutingルールが利用できます。ただし、例えば第2金曜日といった指定はMutingルールではできません。またMuteしたいわけではなく、しきい値を少し緩めたいなどもあります。そういった場合にアノマリーを使って自動的にしきい値を調整してくれる機能もあります。自動ではなく自身で調整したい場合、NRQLアラートコンディションに記載するクエリーを工夫することで対応していただける方法をご紹介します。
例1)第2及び第3週目金曜日(日本時間)は集計対象外にする。
こちらは、具体的にはtimestampの値をみてその日付が第2あるいは第3週金曜日のデータは除外するという方法になります。
まず、曜日の取得にはweekdayOf()という関数が利用できます。weekdayOf(timestamp)
とするとそのtimestampの曜日を文字列で取得できます。金曜日の場合はFridayという文字列が返却されます。
続いてその日が何週目かという情報を取得します。日付としては1〜7の場合が1週目、8〜14の場合は2週目となります。また、timestampに対応する日付は、dayOfMonthOf()という関数で取得できます。また、デフォルトでは文字列の値が返るので第2引数で、numericを指定して、dayOfMonthOf(timestamp, numeric)
で日付を数値で取得します。また、1〜7の場合に1(週目)という結果を得るためには、以下のような数式になります。
floor((dayOfMonthOf(timestamp, numeric) - 1) / 7) + 1
上記2つの結果を簡単に利用するため、NRQL環境変数(WITH ... AS)として利用する場合以下のように記載ができます。
WITH
weekdayOf(timestamp) AS weekday, //曜日
floor((dayOfMonthOf(timestamp, numeric) - 1) / 7) + 1 AS week_no //その月の◯週目
weekdayという変数に曜日が文字列で入り、week_noという変数に◯週目の情報が数値で入ります。
これらの変数を使って、第2、第3週目の金曜日を除外して、Transactionの数を集計する場合、以下のように記載することができます。
WITH
weekdayOf(timestamp) AS weekday, //曜日
floor((dayOfMonthOf(timestamp, numeric) - 1) / 7) + 1 AS week_no //その月の◯週目
SELECT count(*) FROM Transaction
WHERE NOT (weekday = 'Friday' AND week_no in (2,3))
WITH TIMEZONE 'Asia/Tokyo'
具体的には、WHERE句の以下の箇所で第2週、第3週目の金曜日を集計対象から除外するようになっています。
NOT (weekday = 'Friday' AND week_no in (2,3))
なお、必ず意識して欲しいこととして、以下のようにWITH TIMEZONEをクエリーに追加することです。
WITH TIMEZONE 'Asia/Tokyo'
タイムゾーン情報がない場合、デフォルトではUTCで算出されます。UTCのままだと、日本時間で午前9時以前は前の日として扱われるなどあるので、忘れないようにしてください。
例2) 毎日深夜0時前後はしきい値を2倍にする
NRQLアラートコンディションでは、時間ごとにしきい値を変えるといった設定はできません。その代わりクエリーを工夫していただくことで、特定の時間のみ集計結果を半分とするといったことはできます。
この例では、対象の時間帯の集計結果を半分とすることで、しきい値が2倍になったのと同等の判定を行う例を記載します。
「毎日深夜0時前後はしきい値を2倍にする」の場合、具体的には以下のようになります。なお、0時前後というのは曖昧なので、0時ちょうどの前後15分を0時前後とします。
WITH hourOf(timestamp, numeric) AS h, minuteOf(timestamp, numeric) AS m
FROM Transaction
SELECT average(duration * if ((h = 23 AND m >=45) OR (h = 0 AND m < 15), 0.5, 1))
WITH TIMEZONE 'Asia/Tokyo'
まず、1行目のWITH … ASにて環境変数のh
, m
にtimestampの時及び分の値を数値で入れています。
また、3行目のSELECT文にて、if文を使って、23時45分以降あるいは0時15分未満の場合は0.5倍、それ以外は1倍をdurationにかけることで、対象の期間のみ集計結果が半分になるようにしています。
以上です。また、こちらに記載されているその他の時間関係の関数も利用できますので、お客様のニーズに応じてご利用ください。
本ブログに掲載されている見解は著者に所属するものであり、必ずしも New Relic 株式会社の公式見解であるわけではありません。また、本ブログには、外部サイトにアクセスするリンクが含まれる場合があります。それらリンク先の内容について、New Relic がいかなる保証も提供することはありません。