(こちらは Public IR Gateway latency due to tracing unavailability 2022-04-20 の参考訳です)
概要:
2022 年 4 月 20 日 21 時 50 分 (UTC) から 23 時 27 分 (UTC) までの間、キャッシュ、アーティファクト、およびワークスペースをロードする際にタイムアウトとエラーが増加し、 app.circleci.com または app.circleci.com/dashboards を使用してサイトにアクセスできない状態になりました。 これは、分散型トレースインフラストラクチャの変更により、API Gateway に予期せぬ影響が及んだことが原因です。
この問題の解決にあたり、お客様にはご理解とご協力をいただき感謝いたします。
インシデントの詳細
時刻はすべて UTC (世界協定時間) で表示されています。
弊社では、分散型トレースインフラストラクチャの OpenCensus (サポート終了) から OpenTelemetry への移行を行なっていました。 21 時 50 分に、段階的なロールアウトが完了しました。 21 時 52 分に監視システムから API レスポンスの遅延が増加したとアラートがありました。
API Gateway の可用性
原因は、OpenTelemetry の設定ミスにより、API Gateway がトレースデータを報告できなくなっていたためでした。 トレースを担うゲートウェイコンポーネントを制限すると、トレースデータを報告する弊社の他のサービスとは異なるプロトコルとルーティングが使用されます。 このプロトコルとルーティングが、OpenTelemetry では設定されていませんでした。
トレースコンポーネントは、リクエスト処理とは非同期にデータを報告しますが、その際のタイムアウトが不十分で、トレース送信が失敗するのを待つ間非常に多くのリソースを使用し、最終的にリクエスト処理に影響を与えました。
遅延 (内部サービスによる)
特に弊社の、タイムアウトの短いクライアントで、中断が発生しエラーが報告されました。
クライアントのタイムアウト (内部サービスによる)
また、リソースの枯渇により、認証など他のゲートウェイコンポーネントにも影響が及び、クライアントにエラーが報告されました。
5xx バックエンドエラー (ステータスコードと内部サービスによる)
22 時 29 分 に古いルーティングを削除し、OpenTelemetry 用に新しいルーティングを作成しました。 負荷を軽減するために、OpenTelemetry にトレースを送信するゲートウェイコンポーネントを手動で変更しました。 設定が省略されたため、タイムアウトが減少しましたが、接続エラーはまだ発生しており、トレースは送信されていませんでした。
22 時 55 分 に、OpenTelemetry の適切なレシーバーを有効にする設定を追加し、接続エラーが解決されました。 これらの変更により、良い結果が見られるようになりました。 ゲートウェイサービスの一部が長期間飽和状態にあったため、復旧が思うように進みませんでした。
23 時 04 分 に PR を作成し、手動で行った変更を恒久化し、API Gateway のデプロイが強制的に飽和状態のインスタンスを削除し、新しいインスタンスを作成するようにしました。 23 時 21 分 には、ゲートウェイの新しいインスタンスがトラフィックを提供し始め、システムのヘルス状態が改善しました。
23 時 27 分 に、監視を続けつつ平常運用する状態に移行しました。 20 分ほど監視を続け、問題がないことを確認しました。
23 時 48 分 に、このインシデントは解決済みと表示されました。
今後の予防とプロセスの改善
弊社では、今後同じ問題が発生しないよう非同期ネットワークの呼び出しを使用するすべてのゲートウェイコンポーネントにタイムアウトを設定しました。 トレースプロトコルを変更することはできませんが、トレースデータを報告する他のサービスと同じように動作するようルーティングを変更する予定です。 また、今回のインシデントの際やインシデント後に役立ったと考えられるテストや可観測性の向上にも注力していきます。