GitLabのテストインスタンスでカオスを発生させます。

アマゾン・ウェブ・サービスのCTOであるヴェルナー・ヴォーゲルスが有名なように、「すべてのものは常に失敗する」のです。

開発者としては、通常オペレーションと同様に、ソフトウェアが動作する障害モードを考慮することが重要です。 そうすることで、ごく一部のユーザーが経験する500 エラーの散乱につながる小さな不具合と、長期間にわたってすべてのユーザーに影響を与える完全なサイト停止の違いを意味します。

トルストイの言葉を借りれば、_幸せなサーバーは皆同じですが、失敗するサーバーは皆、それぞれの方法で失敗して_いるのです。 幸いなことに、これらの失敗モードをシミュレートする方法があり、カオス・エンドポイントはこのプロセスを支援するツールです。

現在、以下の条件をシミュレートするための4つのエンドポイントがあります:

  • 遅いリクエスト
  • CPUバウンドリクエスト。
  • メモリリーク。
  • 予期せぬプロセスのクラッシュ。

カオスエンドポイントの有効化

production開発環境ではデフォルトで有効になっています。

危険:カオス・エンドポイントへのアクセスは、シークレットトークンを使用してセキュリティで保護する必要があります。 あなたが何をしているか絶対に分かっていない限り、本番環境では有効にしないでください。

シークレットトークンはGITLAB_CHAOS_SECRET 環境変数を通して設定することができます。 例えば、GDKを使用する場合、以下のコマンドで設定することができます:

GITLAB_CHAOS_SECRET=secret gdk run

secret をあなた自身の秘密のトークンに置き換えてください。

混沌を呼び起こす

カオス・エンドポイントを有効にしてアプリケーションを再起動したら、エンドポイントを使用したテストを開始できます。

デフォルトでは、chaosエンドポイントを呼び出すと、リクエストを受信したWebワーカープロセスがそれを処理します。 これは、例えば、Killオペレーションが呼び出された場合、リクエストを処理するPumaまたはUnicornワーカープロセスがkillされることを意味します。 Sidekiqでこれらのオペレーションをテストするには、各エンドポイントのasync パラメータをtrueに設定します。 これにより、Sidekiqワーカでchaosプロセスが実行されます。

メモリリーク

アプリケーションのメモリリークをシミュレートするには、/-/chaos/leakmem エンドポイントを使用します。

注意:リクエスト終了後、メモリは保持されません。 リクエストが終了すると、Rubyのガベージコレクタがメモリの回収を試みます。
GET /-/chaos/leakmem
GET /-/chaos/leakmem?memory_mb=1024
GET /-/chaos/leakmem?memory_mb=1024&duration_s=50
GET /-/chaos/leakmem?memory_mb=1024&duration_s=50&async=true
属性 タイプ 必須 説明
memory_mb 整数 いいえ リークするメモリの量(MB)。 デフォルトは100MB。
duration_s 整数 いいえ メモリを保持する最小時間_秒。 デフォルトは30秒。
async ブーリアン いいえ Sidekiqバックグラウンドワーカープロセスでメモリをリークするにはtrueに設定します。
curl http://localhost:3000/-/chaos/leakmem?memory_mb=1024&duration_s=10 --header 'X-Chaos-Secret: secret'
curl http://localhost:3000/-/chaos/leakmem?memory_mb=1024&duration_s=10&token=secret

CPUスピン

このエンドポイントは、指定された期間、1つのコアを100%フルに使用しようとします。

ラックサーバーの設定によっては、あらかじめ決められた時間(通常は60秒)が経過するとリクエストがタイムアウトすることがあります。 Unicornを使っている場合、これはワーカープロセスを kill することで行われます。

GET /-/chaos/cpu_spin
GET /-/chaos/cpu_spin?duration_s=50
GET /-/chaos/cpu_spin?duration_s=50&async=true
属性 タイプ 必須 説明
duration_s 整数 いいえ コアが使用される時間(秒)。 デフォルトは30秒。
async ブーリアン いいえ SidekiqバックグラウンドワーカープロセスでCPUを消費する場合はtrueに設定します。
curl http://localhost:3000/-/chaos/cpu_spin?duration_s=60 --header 'X-Chaos-Secret: secret'
curl http://localhost:3000/-/chaos/cpu_spin?duration_s=60&token=secret

DBスピン

このエンドポイントは、指定された期間、単一コアを完全に利用し、DBリクエストとインターリーブしようとします。 このエンドポイントは、同時実行時に他のスレッドに実行をゆだねるモデルとして使用できます。

ラックサーバーの設定によっては、あらかじめ決められた時間(通常は60秒)が経過するとリクエストがタイムアウトすることがあります。 Unicornを使っている場合、これはワーカープロセスを kill することで行われます。

GET /-/chaos/db_spin
GET /-/chaos/db_spin?duration_s=50
GET /-/chaos/db_spin?duration_s=50&async=true
属性 タイプ 必須 説明
interval_s フロート いいえ DBリクエストの間隔を秒単位で指定します。 デフォルトは1秒です。
duration_s 整数 いいえ コアが使用される時間(秒)。 デフォルトは30秒。
async ブーリアン いいえ Sidekiqバックグラウンドワーカープロセスでオペレーションを実行する場合はtrueに設定します。
curl http://localhost:3000/-/chaos/db_spin?interval_s=1&duration_s=60 --header 'X-Chaos-Secret: secret'
curl http://localhost:3000/-/chaos/db_spin?interval_s=1&duration_s=60&token=secret

睡眠

このエンドポイントは CPU Spin エンドポイントに似ていますが、バックエンド・サービスへのネットワーク呼び出しなど、プロセッサ外のアクティビティをシミュレートします。 指定された duration_s の間スリープします。

CPU Spinエンドポイントと同様に、duration_sが設定された制限を超えた場合、リクエストがタイムアウトする可能性があります。

GET /-/chaos/sleep
GET /-/chaos/sleep?duration_s=50
GET /-/chaos/sleep?duration_s=50&async=true
属性 タイプ 必須 説明
duration_s 整数 いいえ リクエストがスリープする時間(秒)。 デフォルトは30秒です。
async ブーリアン いいえ Sidekiqバックグラウンドワーカープロセスでスリープするにはtrueに設定します。
curl http://localhost:3000/-/chaos/sleep?duration_s=60 --header 'X-Chaos-Secret: secret'
curl http://localhost:3000/-/chaos/sleep?duration_s=60&token=secret

キル

このエンドポイントはkill シグナルを使って、ワーカープロセスの予期せぬ死をシミュレートします。

注意:このエンドポイントはKILL シグナルを使うので、ワーカーにはクリーンアップやシャットダウンの機会は与えられません。
GET /-/chaos/kill
GET /-/chaos/kill?async=true
属性 タイプ 必須 説明
async ブーリアン いいえ Sidekiqバックグラウンドワーカープロセスを強制終了するにはtrueを設定します。
curl http://localhost:3000/-/chaos/kill --header 'X-Chaos-Secret: secret'
curl http://localhost:3000/-/chaos/kill?token=secret