Gremlinの攻撃の状態をNew Relicに送信する

2020.07.28

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

GremlinにはWebhookの機能があり、攻撃の実行時にカスタムHTTPエンドポイントを呼び出すことができます。 攻撃の状態を監視サービスやインシデント管理サービスに送信することにより、攻撃をシステムの動作の変化と相関させることができます。 これによりカオス実験中に観察された問題にすばやく対処していくことが可能になっていきます。

Gremlin: Webhook

今回は監視サービスにNew Relicを用いてGremlinからデータを送信してみます。 New Relicにはカスタムイベントデータを送信できるAPIがありますので、それを使います。

New Relic: Report custom event data

必要なもの

New RelicでEC2のメトリクスが可視化できている状態にしておきます。

New Relic

Insert Keysの生成

カスタムイベントデータを送信するために Insert Keys というAPI Keyを作成します。

ダッシュボードにログインし、Insightsのぺーじに遷移しましょう。

左メニューの Manage dataをクリックし、そのページのInsert Keys +をクリックします。

Keyが生成されるのでSaveします。

動作確認

keyの生成画面にcURLコマンドが表示されているので、そのコマンドを実行してデータが送信されるか、送信したデータが参照できるか確認します。

$ wget https://insights.newrelic.com/example_events.json
$ gzip -c example_events.json | curl --data-binary @- -X POST -H "Content-Type: application/json" -H "X-Insert-Key: <your key>" -H "Content-Encoding: gzip" https://insights-collector.newrelic.com/v1/accounts/2797057/events

※ example_events.jsonのなかみ

[
  {
    "eventType": "Purchase",
    "account": 3,
    "amount": 259.54
  },
  {
    "eventType": "Purchase",
    "account": 5,
    "amount": 12309,
    "product": "Item"
  }
]

実行後、

{"success":true, "uuid":"bb6588e6-003a-b000-0000-01739473fe46"}

という結果が返って来ればリクエストは成功です。

データを参照するには、InsightsでNRQLを実行します。

eventTypePurchaseと指定してデータを送信したので、クエリは

SELECT * FROM Purchase

となります。

上記画像のようにきちんとデータが表示できているか確認します。

Gremlin

Webhookを設定していきます。Webhookはチーム単位で設定します。

ダッシュボードにログインし、右上の方にある人のマークからTeam Settingsをクリックします.

Webhookタブをクリックし、New Webhookを押して作っていきます。

設定項目 説明
Name Webhookの名前
Description Webhookの説明
Request URL Newrelic の APIエンドポイント (https://insights-collector.newrelic.com/v1/accounts//events)
Custom Headers Key: X-Insert-Key, Value: New Relicで生成したInsert Keys
Request Method POST
Events Webhookが実行されるトリガーとなるイベントを選択
Active チェックがついているとWebhookが有効になります
Payload New Relicに送信するjson形式の情報

PayloadにはeventTypeを必ず設定します。例えば、

{
  "eventType":"GremlinAttack",
  "teamId": "${TEAM_ID}",
  "attackId": "${ATTACK_ID}",
  "attackType": "${ATTACK_TYPE}",
  "attackStatus": "${STATUS}",
  "finalStage": "${STAGE}",
  "source": "${SOURCE}",
  "time": "${TIME}"
}

Webhookの出力形式は、統合するツールの必要な入力形式と一致するようにトークンを使用してカスタマイズできます。 リクエストで提供される情報には、次のものが含まれます。

デフォルトのキー 説明 トークン
teamId 攻撃を実行したチームの一意のチーム識別子。 ${TEAM_ID}
attackId 攻撃の一意の識別子。 ${ATTACK_ID}
attackType グレムリン攻撃タイプ。 ${ATTACK_TYPE}
stage 攻撃によって実現した最も遠いステージ。 ${STAGE}
attackStatus 要求のトリガーイベント(初期化、実行中、終了)。 ${STATUS}
source 攻撃のソース(API、手動、スケジュール、Spinnaker、WebApp)。 ${SOURCE}
time トリガーされたイベントのタイムスタンプ。 ${TIME}

全て入力し終えたらSaveを押して完了です。

攻撃を実行して攻撃の状態を確認する

実行

設定が終わったので、実際に攻撃してNew Relicでデータを参照できるか確認します。 本記事ではCPU攻撃を仕掛けてみます。

Gremlinの左メニューからAttacksを選択し、攻撃するホストを選択します。

Category: Resource, Attacks: CPUにします。 全てのコアを120秒間攻撃し、CPUリソースを80%に設定します。

設定が終わったら、Unleash Gremlinを押して解き放ちます。

実行時の画面です。

実験終了後の画面です。CPU使用率が元に戻って行っていることがわかります。

New RelicのHost情報を見ても、80%までゲキ上がりしていることがわかります。

Webhookの確認

WebhookからNew Relicにデータを送信する設定を行いました。 実験が終わったので送信されたデータを参照できるか確認してみます.

New RelicのInsightsの画面に行き、以下のクエリを実行します。

SELECT * FROM GremlinAttack

GremlinAttackというのは、Webhookの設定時にPayloadに指定したeventTypeです。

実験の結果が取得できましたっ。

クエリから得られた情報をダッシュボードに追加することも可能です。 毎回確認するより、常に表示させておいた方が良いと思います。

NRQLを使って折れ線グラフにすることも可能です。

SELECT uniqueCount(attackStatus) from GremlinAttack FACET attackStatus SINCE 1 hour ago TIMESERIES 1 minute

作成したグラフで攻撃の開始と終了、CPU使用率グラフで増加したCPU負荷を確認することが可能です。

GremlinのWebhookを使い他のシステムと統合することにより、様々な洞察を得ることができます。 例えば、過去のインシデントを再現し、監視ツールを使用して問題を突き止めたりすることに利用したり、まだ経験していない事象を発見したりとか。 Gremlinと監視サービスを使い、適切なメトリクスを収集、サービスの健全性を可視化し、SLOを満たしていることを確認できるようにしていくことが重要ではないでしょうか。