はじめに

こんにちは!そしてこんばんは。
クラウドインテグレーション事業部の 大嵩です。
今回は、業務の中で、1つの Alert Conditionで複数のリソースに対して監視を行っている場合に
リソース名を指定してアラートを抑止する作業が発生した時の対応方法をご紹介します。

検証したこと

今回はALBとそれに関連付けるターゲットグループを2つ(以降TG)とEC2インスタンスを作成。
両方のTGのヘルスチェックをUnhealthy状態にさせてアラートを発報させるが、片方のTGについては発泡されないようにする検証を実施しました。

さらっとEC2を構築

今回はあくまで検証ですので、EC2にApacheをインストールして、サービスを起動。アクセスをできる状態にだけしておきます。
インスタンス作成時に下記のユーザーデータを流し込んでおきます。

#!/bin/bash
dnf -y install httpd

systemctl start httpd

systemctl status httpd

if [[ $? -eq 0 ]]; then
  echo "Apacheが正常に起動しました。"
else
  echo "Apacheの起動に失敗しました。"
fi

ALBとTGを作成

EC2インスタンスができたら、TG(x2)とALBを作成します。
こちらもとりあえず HTTP で受けるリスナーで作成します。
タグは下記を追加します

キー
cloudpack_newrelic enabled
Owner otake-hiroki

TGを2つ作成

どちらもヘルスチェックをUnhealthyの状態にしておきます。

ALBを作成

いざ、NewRelicと格闘!

今回は、TG「otake-NR-mute-test2」を指定してアラートを抑止したいと思います。

はじめに、MuteRuleを作成する

MuteRuleの設定画面を見ていると、「Build violation filter」のAttributeに「nrqlQuery」があったので
こちらを指定して、下記のNRQLを入力してみました。

SELECT * FROM LoadBalancerSample WHERE label.cloudpack_newrelic = 'enabled' AND label.Owner = 'otake-hiroki' AND  provider.targetGroupName = 'otake-NR-mute-test2'

抑止されておらず。。。

NRQLを使用できると思いましたが、調べたところ、Conditionに設定しているNRQLをベースに評価するもののようでした。
そのため、指定の仕方が間違っているようでした。
https://docs.newrelic.com/jp/docs/alerts/get-notified/muting-rules-suppress-notifications/#create
以下スクリーンショットのように、どちらのTGも発報されていました。

抑止できた方法

NRQLの指定として、前述のWHERE以降を記入すれば、期待した動作をすると思われますが、
さらに単純な方法で指定できないかということで、attributeの中にある「tags.」を使用することにしました!
下記ドキュメント内にもあるように、Condition側のNRQL上でFACET句を使用していれば、インシデントイベントにタグが付与されるため、そこからTG名を取得し、指定するものになります。
https://docs.newrelic.com/jp/docs/alerts/get-notified/muting-rules-suppress-notifications/#facet-muting

実際に設定してみる

Condition側に設定しているNRQLは以下です。

SELECT latest(provider.unHealthyHostCount.Average) FROM LoadBalancerSample FACET awsAccountId, awsRegion, provider.targetGroupName WHERE label.cloudpack_newrelic = 'enabled' AND label.Owner = 'otake-hiroki'

そのため、FACET句によって指定できるのは下記になります。

  • awsAccountId(AWSアカウントID)
  • awsRegion(AWSリージョン)
  • provider.targetGroupName(TG名)

この中から、「provider.targetGroupName」を使います!

MuteRule設定

まずは、attributeに tags.< NAME >という項目がありますので、こちらを選択します。

指定するタグに合わせて、下記のように修正します

tags.provider.targetGroupName

そして、Operator を equals へ。また、Valueを抑止したいTGである「otake-NR-mute-test2」に指定します。
(条件としてConditionのIDも一緒に指定します。)

ついに抑止成功!

次の閾値評価時間まで待機していたところ、無事にTG名が「otake-NR-mute-test2」のアラートがMuteされていました!(Muteマークがついている)

もちろん、片方のUnhealthyアラートは発報されている状態です。

注意!

無事にアラートを抑止できたわけですが、1つだけ注意点があります。
ずばり、MuteRule設定項目の「3. Select muting rule end behavior」です。

こちらの項目は、MuteRuleの適用期間が終わってから対象のアラートを発報し直すか、そのままMuteしたままとするかの項目になります。
前者の場合、「Notify」後者の場合「Suppress notification」になります。
そのため、私のようにNotificationに設定している場合、適用期間終了後に発報されてしまうのでご注意ください!
https://docs.newrelic.com/jp/docs/alerts/get-notified/muting-rules-suppress-notifications/#notify

この記事がどなたかの役に立ちますと幸いです。