NRQL アラート: どんな項目もアラート条件として扱える最強のアラート設定


New Relic Advent Calendar 6日目。昨日に引き続き、New Relic APM のアラートに今年追加された設定 NRQL(エヌアールキューエル) アラート の紹介。

これは、アラート条件の項目自体を任意の項目で設定できるし、その条件も変更することができるという。いうなれば、なんでもアラート条件の設定項目にできるというすぐれもの。

例えば、EC ストアを運営していたら、あるストア専用のアラート設定を作れたりする。ストア123のレスポンスタイムが0.5秒を越えたらアラート通知とか。

昨日紹介したこれまでのアラート設定では、レスポンスタイムやパーセンタイルなど設定項目自体は用意されていて、そこから選ぶという方式。NRQL はそれが自由ってこと。
自由とは何かというと、NRQL が数字を返す問い合わせなら、その項目を使って設定できる。これを説明するには、NRQL が何かというのを説明する必要があるのでそこから始めていきます。

NRQL とは

NRQL (New Relic Query Language) は、New Relic Insights という New Relic の各製品が集めたデータをテーブルとして NRQL という SQL ライクな構文で、問い合わせ文を作って、その結果をダッシュボードにぱしぱし貼って構築していくサービス。(ぱしぱし張ると以下のような感じにできる)

これを使うと、APM や Browser、Infrastructure のデータを1つのダッシュボードで見えたり、APM だけでも APM の UI より細かいデータを好きな条件でデータを抽出できる。

例えば、直近1時間の全トランザクションの内、レスポンスタイムが2秒を越えたトランザクションの割合を求める NRQL はこんな感じ。fromTransaction は APM が収集したデータの入っている DB のテーブル名。

SELECT percentage(count(*), WHERE duration > 2) FROM Transaction

この場合、結果は上にあるように 0.77%。

このように好きな期間/条件でデータ分析ができる。

New Relic Insights は、New Relic APM などの製品の有料版を使っていれば無料で利用できる。APM の Essentials であれば3日、Pro の場合は過去8日分にデータに対して問い合わせができる。

今回は、NRQL 自体の説明はしないので NRQL を知りたい方は以下の記事を見て下さい。

NRQL アラート

なんとなく NRQL が分かってもらえたと思うので、本題に入る。

NRQL アラートとは、NRQL が返した結果に対して、アラート設定が行えるものです。

先ほどの NRQL をアラートとして設定してみよう。先ほどの NRQL は「直近1時間のトランザクションの内、レスポンスタイムが2秒を越えたトランザクションの割合」を求める問い合わせ文。なので、閾値として設定するのは、割合である。何%以上を越えたら、アラート通知したいかを設定する。

閾値の設定方法として、以下の2つから選べる。静的(固定)な値か、動的な値。動的な方は前回説明したベースラインアラートを使って設定する。

静的な閾値で設定する方法 (Query)

設定方法は、前回紹介した設定方法とほぼおなじ。前回同様手順5から示す。

  1. カテゴリ: product として NRQL を選択する(デフォルト)、type of condition として "Query" を選択する。"Next, define threshold" をクリック。(NRQL の場合は、エンティティはここでは指定しない)
  2. NRQL 入力欄が表示されるので、そこに NRQL を打ち込み、Enter を押すと右下に過去6時間での結果がチャートに表示される。この結果を参考に閾値を決めると良い。
  3. Critical の閾値を設定する
  4. Warning も設定したい場合は "Add a warning threshold" をクリックし、Warning の閾値を設定する。
  5. 画面左下の "Name this condition" にこのアラート条件の名前を付けて、"Create condition" を押す。

Essentials ユーザーでも重要なトランザクションに対してアラート設定ができる

ふと思ったんだけど、これ使えば PRO でしか使えないキートランザクションのように、特定のトランザクションに対してアラート条件を設定できる。Essentials ユーザーの方は是非、これを使って、重要なトランザクションに対してアラート設定してもらえれば重要なトランザクションが異常な状態になった場合にすぐに気付くことができる。

特定のトランザクションの平均レスポンスタイムが 0.5秒以上なった場合にアラート通知する NRQL

SELECT percentile(duration, 75) FROM Transaction WHERE name LIKE 'Controller/checkout/%'

動的な閾値で設定する方法(Baseline query)

前回説明したダイナミックベースラインアラートの NRQL 版。ダイナミックベースラインアラートに関して知りたい方は前回の記事を見てください。

設定方法は、前回紹介した設定方法とほぼおなじ。前回同様手順5から示す。

  1. カテゴリ: product として NRQL を選択する(デフォルト)、type of condition として "Baseline query" を選択する。"Next, define threshold" をクリック。
  2. NRQL 入力欄が表示されるので、そこに NRQL を打ち込み、Enter を押すと、右下に過去6時間での結果がチャートに表示される。
  3. 閾値はスライダーを調節し、Critical の許容範囲を設定する。左に動かせば、より狭く(基準からはずれれば、アラートが出やすくなる)。右に動かせば、少しくらいいつもと違ってもアラートは出なくなる。どれくらいで、アラートが出やすくなるかは、スライダーを動かしていけば、チャートに赤い垂直線が出たところが今の設定でアラートが出たところ。これでどれくらいがベストかを調整していく。
  4. Warning も設定したい場合は "Add a warning threshold" をクリックし、Warning の閾値を設定する。Warning の許容範囲は、薄いグレーで表示され、Warning が出た箇所は、黄色の垂直線がでる。
  5. "Create condition" を押す。

※ 前回同様、ベースラインアラート機能は、APM PRO ユーザー専用機能。

NRQL アラートのすごいとこ

カスタム属性

NRQL アラートがすごいのは、ここから。New Relic APM には、カスタム属性という任意のパラメーターを APM エージェントが収集するデータに載っけて収集してくれる機能がある。先ほど説明したように、APM のデータは、Insights では、Transaction というテーブルに入っている。で、以下のような感じのコードをプロジェクトに埋め込んでおくと、そのキーがカラムになって、その値を Insights 上で見えるようになる。

NewRelic::Agent.add_custom_attributes({ user_id: "xxx", store_id: "xxxx" })

このような情報をプロジェクトの処理内に埋め込んでおくと、以下のような NRQL が使える。

過去1時間の store_id: 456 の平均処理時間:

Select average(duration) from Transaction where store_id = '456' 

過去1時間に user_id: 123 の 95パーセンタイルの処理時間:

SELECT percentile(duration, 95) from Transaction where user_id = '123' 

NQRL アラートで、カスタム属性を使ってサービスに有用なアラートを作成しよう

上記で紹介したような NRQL がそのままアラートにも使える。これは、事実上どんな項目に対してもアラートが設定できるようになったといっていい。

これを使うことで、EC ショップを複数運営するサービスの場合、非常に大きな(ビジネス上)サイトを重点的に監視したい場合に、上記のように、カスタム属性を送るようにし、そのストアIDを指定して NRQL アラートを設定することができる。

これは非常に柔軟性のある設定項目なので、是非、みなさんが使っているサービス固有の情報を軸にアラートの設定をしてみてもらえば、より効率的なアラート管理ができるのではないかと思う。この機会に是非、New Relic Insights も使ってみてください。

参考情報

本記事でちょっとだけ NRQL で使うアラートを紹介したけど、以下の記事でもサンプルの NRQL を紹介しているので、是非、アクセスして、参考にしてください。