インフラ・DevOps
Jev駆動SRE診断:成功した点と失敗した点
Jev-Driven SRE Diagnosis: What Worked and What Failed (sregym.com)
要約
この記事では、LLMエージェントを使用せず、Jevというツールを主導的な役割で用いたSREインシデント診断パイプラインについて解説しています。このパイプラインは、クラスターの証拠をプログラムで収集・整理し、Jevに与えることで、根本原因の特定と診断レポートの作成を行います。21件のSREGym-Lite障害に対するテストでは、76.2%の診断成功率と14.6秒の中央値診断時間を達成しました。
全文翻訳
最初の研究では、LLMエージェントの意思決定支援としてJevを実験しました。エージェントはインシデントを診断・修復し、Jevはエージェントが提案するテストのランク付けを助け、提出前に証拠をレビューしました。その投稿は、より野心的なアイデアで締めくくられました。それは、Jevにクラスターの広範なビューを与え、その高速で安価な判断で調査を導くというものです。この記事では、LLMエージェントを一切使用しないJev駆動の診断パイプラインを紹介します。このパイプラインは、クラスター証拠をプログラムで収集・整理し、それをJevに供給します。Jevは、可能性のある根本原因とそれを裏付ける観察結果を選択し、パイプラインはそれらを使用して診断レポートを組み立てます。21件のSREGym-Lite障害にわたるJev駆動パイプラインは、105件の診断のうち80件(76.2%)をパスし、中央値診断時間は14.6秒でした。
Jevはどのように診断を主導するのでしょうか? Jevは、供給された選択肢の中から選ぶことで質問に答えます。診断に使用するには、証拠と可能な回答の両方を提供する必要があります。クラスターの状態をこれらの入力に変換するプログラムコレクターを追加しました。まず、コレクターはKubernetesオブジェクト、イベント、最近のPodログ、およびリソース使用量を読み取ります。観察結果をデプロイメントなどのコンポーネントごとにグループ化し、障害の兆候を要約します。Jevはこれらの要約を受け取り、調査すべき可能性のあるソースを選択します。次に、コレクターはそのコンポーネントに関する詳細情報を収集し、番号付きの証拠項目を準備します。Jevは、そのコンポーネントが原因であるか、下流の被害者であるか、または無関係であるかを判断し、その回答を最もよく裏付ける証拠を選択します。パイプラインはこれらの選択を使用して、診断を組み立てて提出します。証拠が仮説を裏付けられない場合、別の候補を調査します。このバージョンは、候補を一度に1つずつ調査します。Jevはプロセス全体を通じて供給された選択肢の中から選びます。コマンドを生成したり、最終レポートを作成したりはしません。パイプラインの実装はGitHubで利用可能です。
図を拡大してください
図1. 診断パイプラインは、プログラムによる証拠収集とJevの集中した決定を交互に行います。
パイプラインの動作
Social NetworkアプリケーションのSREGym-Liteのmutating_webhook_resource_limits_social_network障害を見てみましょう。この障害では、nginx-thrift用に作成されたPodがメモリ不足で停止し続けていました。そのデプロイメントテンプレートは256Miのメモリ制限を指定していましたが、新しいPodは16Miしかありませんでした。Podが作成される際に、 mutating admission webhookがそれらの制限を書き換えていました。他の4つのwebhook構成も存在したため、名前だけでwebhookを特定しても原因を特定することはできませんでした。
コレクターはsocial-network内で27のデプロイメントを見つけ、それぞれをコンポーネントとして要約しました。nginx-thriftについては、Podとテンプレートの間の違いを見つけ、一致するwebhookを特定しました。Jevが最初の呼び出しで見たnginx-thriftの要約の抜粋を以下に示します。
コンポーネント:deployment/nginx-thrift
シグナル:PodはOOMKilledされ、再起動しました。ライブPodメモリ制限:16Mi(デプロイメントテンプレート:256Mi)。一致するPod作成webhook:gatekeeper-mutating-webhook-configuration。
Jevは次に、パイプラインによって供給された選択肢を使用して2つの選択質問に答えました。
質問:原因として可能性が高いコンポーネントはどれですか?
Jev:deployment/nginx-thrift
質問:障害を伝えるオブジェクトの種類は何ですか?
Jev:admission_webhook
要約内の不一致と一致するwebhookは、2番目の選択を裏付けました。パイプラインは次にnginx-thriftに関する詳細情報を収集し、Jevに以下の2つを含む26の証拠項目を提供しました。
E6:nginx-thrift PodはOOMKilledされました。
E10:Podは、テンプレートでは256Miとされていますが、16Miのメモリ制限を持っています。gatekeeper-mutating-webhook-configurationはこのPodと一致します。
フォローアップの質問の中で、Jevは次のように答えました。
質問:nginx-thriftは原因、被害者、または無関係ですか?
Jev:origin
質問:原因を示すカテゴリ名はどれですか?
Jev:admission_or_namespace_policy
質問:どの証拠項目がメカニズムを最もよく示していますか?
Jev:E10
JevはE10を主要な証拠として選択しました。パイプラインは、一致するwebhookがメモリ制限の変更を引き起こしたと推測し、それを提出物に記載しました。収集された証拠は、メモリの不一致とwebhookの一致を示しました。提出された診断は次のように述べました。
根本原因オブジェクト:MutatingWebhookConfiguration gatekeeper-mutating-webhook-configuration、Deployment nginx-thriftに作用。
メカニズム:新しいPodは、テンプレートの256Miではなく16Miのメモリ制限を持っています。一致するwebhookは、アドミッション時にPodを書き換えます。
観測:nginx-thriftはOOMKilledされ、再起動しました。
この障害に対する5回の試行すべてで、診断はパスしました。コレクターは実質的な診断作業を行いました。Podテンプレートの違いを見つけ、webhookの候補を絞り込みました。Jevは影響を受けたコンポーネントと提出する証拠を選択しました。
105件の診断全体の結果
9月4日のSREGym-Liteコホートの21件の障害シナリオを、jev-1.13.0を使用して5回実行しました。各実行で診断が提出されました。SREGymの9つの質問からなる診断ルーブリックと0.70のパスしきい値を使用して、gpt-6-astraでそれらの診断を評価しました。これは現在のリーダーボードコホートではなく、過去の21件の障害コホートです。
測定結果
判断された診断パス:80/105(76.2%)
5回の試行すべてでパスした障害:16/21
5回の試行すべてで失敗した障害:5/21
中央値診断時間:14.6秒
Jev呼び出し:合計252回;試行あたり2.4回
試行あたりの中央値合計Jev APIレイテンシ:0.53秒
Jev入力トークン:3.48百万
推定Jev推論コスト:0.15ドル(TypeSafeの公開価格)
結果は異常に一貫していました。障害ごとに、5回の試行すべてがパスするか、または5回の試行すべてが失敗しました。21件の障害のうち18件では、5回の試行すべてが同じ診断スコアを受け取りました。これらは別々の実行であり、同じスコアを受け取ったからといって、Jevが毎回同じパスをたどったとは限りません。
障害ごとの結果
21件の障害・105件の診断
admission webhook outage hotel reservation 5/5
admission_webhook_outage_hotel_reservation:gpt-6-astraが高推論努力で判断した5回の独立した試行
試行 診断 スコア 時間 Jev呼び出し
1 パス 1.00 12.0秒 3
2 パス 1.00 12.0秒 3
3 パス 1.00 12.6秒 3
4 パス 1.00 12.2秒 3
5 パス 1.00 12.3秒 3
cronjob sidecar blocks completion hotel reservation 5/5
cronjob_sidecar_blocks_completion_hotel_reservation:gpt-6-astraが高推論努力で判断した5回の独立した試行
試行 診断 スコア 時間 Jev呼び出し
1 パス 1.00 14.0秒 2
2 パス 1.00 13.6秒 2
3 パス 1.00 13.5秒 2
4 パス 1.00 13.5秒 2
5 パス 1.00 13.8秒 2
duplicate pvc mounts social network 5/5
duplicate_pvc_mounts_social_network:gpt-6-astraが高推論努力で判断した5回の独立した試行
試行 診断 スコア 時間 Jev呼び出し
1 パス 1.00 14.6秒 2
2 パス 1.00 14.4秒 2
3 パス 1.00 14.5秒 2
4 パス 1.00 14.5秒 2
5 パス 1.00 14.5秒 2
edge request filter cpu saturation 0/5
edge_request_filter_cpu_saturation:gpt-6-astraが高推論努力で判断した5回の独立した試行
試行 診断 スコア 時間 Jev呼び出し
1 失敗 0.67 15.8秒 2
2 失敗 0.67 15.8秒 2
3 失敗 0.67 15.6秒 2
4 失敗 0.67 15.7秒 2
5 失敗 0.67 15.8秒 2
env variable shadowing astronomy shop 5/5
env_variable_shadowing_astronomy_shop:gpt-6-astraが高推論努力で判断した5回の独立した試行
試行 診断 スコア 時間 Jev呼び出し
1 パス 0.89 15.7秒 2
2 パス 0.89 15.9秒 2
3 パス 0.89 15.5秒 2
4 パス 0.89 15.5秒 2
5 パス 0.89 15.8秒 2
finalizer deadlock controller hotel reservation 5/5
finalizer_deadlock_controller_hotel_reservation:gpt-6-astraが高推論努力で判断した5回の独立した試行
試行 診断 スコア 時間 Jev呼び出し
1 パス 1.00 13.7秒 2
2 パス 1.00 13.5秒 2
3 パス 1.00 13.5秒 2
4 パス 1.00 13.4秒 2
5 パス 1.00 13.5秒 2
internal traffic policy local astronomy shop 5/5
internal_traffic_policy_local_astronomy_shop:gpt-6-astraが高推論努力で判断した5回の独立した試行
試行 診断 スコア 時間 Jev呼び出し
1 パス 0.89 15.6秒 2
2 パス 0.89 15.6秒 2
3 パス 0.89 15.8秒 2
4 パス 0.89 15.8秒 2
5 パス 1.00 15.9秒 2
kafka poison pill hol block 0/5
kafka_poison_pill_hol_block:gpt-6-astraが高推論努力で判断した5回の独立した試行
試行 診断 スコア 時間 Jev呼び出し
1 失敗 0.67 16.1秒 2
2 失敗 0.67 22.0秒 5
3 失敗 0.67 15.8秒 2
4 失敗 0.67 24.5秒 6
5 失敗 0.67 16.1秒 2
mutating webhook resource limits social network 5/5
mutating_webhook_resource_limits_social_network:gpt-6-astraが高推論努力で判断した5回の独立した試行