Skip to main content
セルフホスト環境は Team および Enterprise プランでパブリックベータ版です。OwnerCloud environments 管理ページAllow self-hosted environments をオンにすることで有効になります。このページはフラグとメトリクスのリファレンスです。セットアップについては クイックスタート を、フリート構成については 本番環境へのデプロイ をご覧ください。
このページは、セルフホスト環境 で実行する 2 つのプロセスのリファレンスです。ランナーはホスト上で Claude Code クラウドセッション を実行し、オプションのオートスケーリングオーケストレーターはセッションがキューに入ると同時にランナーを起動します。それぞれ独自のフラグテーブルを持っています。どちらも Linux または macOS ホスト上で実行され、/workspace~/.claude などのデフォルトを想定しています。インストール済みバージョンの権限あるリストについては、claude self-hosted-runner --help を実行してください。 メトリクスシリーズと一部の API フィールドは、これらのページが環境と呼ぶものに対して pool を使用しています。どちらの用語も同じものを指しています。環境 ID は pool_id フィールドで、形式は ccpool_... です。これらのページが pool 識別子を示す場所では、環境を指しています。CLI フラグと環境変数では environment と表記されます。例えば --environment-secret-file のように。非推奨の pool 表記はまだ機能します。--environment-secret-file で説明されているとおりです。

Runner CLI フラグ

ほとんどのフラグには対応する環境変数があります。両方が設定されている場合、フラグが優先されます。期間フラグは CLI では分または秒を取りますが、対応する環境変数は常にミリ秒単位で、_MS サフィックスで示され、デフォルト列はフラグの単位を示します。--exit-if-unused-min 10SELF_HOSTED_RUNNER_IDLE_SHUTDOWN_MS=600000 と同等であり、SELF_HOSTED_RUNNER_STARTUP_TIMEOUT_MS: "15" のような Helm 値は 15 分のデフォルトではなく 15 ミリ秒を意味します。 ほとんどの期間フラグには最大値があります。各タイムアウトをランタイムの 32 ビットタイマー上限(約 24.85 日)内に保つために選択されています。--*-min フラグは 10080 分(7 日)でキャップされます。--drain-grace-sec は 604800 秒(7 日)でもキャップされます。--drain-wait-sec は 86400 秒(24 時間)でキャップされます。--session-stop-grace-sec--post-session-hook-timeout-sec はキャップされていません。キャップを超過する動作は表面ごとに異なります。
  • フラグ: スタートアップはエラーで失敗します。
  • 環境変数: ランナーはそれを拒否するのではなく、値をタイマー上限にクランプします。

オーケストレーター CLI フラグ

self-hosted-runner orchestrator サブコマンド(オンデマンドランナー を生成)は、--api-url--environment-secret-file--hooks-dir--health-port--log-level をランナーと同じデフォルトで受け入れます。ランナーのフラグに 1 つある場合は同じ環境変数を使用します。ただし、--hooks-dir は必須で、spawn-runner フックを含む必要があります。また、独自のフラグも取ります。

SCM コネクタフラグ

オーケストレーターは Anthropic のコントロールプレーンへのスタンディング WebSocket 接続を保持できます。リポジトリピッカーやブランチまたは ref リゾルバーなどのホスト済みプリセッションフローが、ネットワーク内からのみルーティング可能な GitHub Enterprise Server ホストに到達できるようにします。--scm-connector-host を設定しない限り、コネクタはオフのままです。 コネクタはオーケストレーターの既存の環境シークレットで認証し、自動的に再接続します。ドロップされた接続で指数バックオフするか、別のオーケストレーターレプリカが既に保持しているため、コントロールプレーンが接続を閉じるときに固定 30 秒の遅延があります。

環境変数のみの設定

これらのランナー設定は環境からのみ読み取られ、ほとんどのデプロイメントがデフォルトのままにしておく動作をカバーしています。

テレメトリ

セッション子は、オフにしない限り、運用テレメトリを Anthropic に送信します。コードまたはリポジトリコンテンツは送信されません。ランナープロセスでテレメトリ変数を設定します。ランナーはサーバー提供の環境変数を適用した後、それらを再アサートするため、オペレーターの設定は常に優先されます。 1 つのコントロールはセルフホスト環境に固有です。CLAUDE_CODE_BYOC_ENABLE_DATADOG=1 は Datadog 運用メトリクスにオプトインします。これはセルフホスト環境ではデフォルトでオフです。一般的な Claude Code テレメトリコントロール DISABLE_TELEMETRYDO_NOT_TRACKDISABLE_ERROR_REPORTINGCLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC環境変数リファレンス に記載されているようにセッション子に適用されます。DISABLE_GROWTHBOOK は関連していますが異なります。DISABLE_GROWTHBOOK=1 を設定するとフィーチャーフラグフェッチが無効になり、DISABLE_TELEMETRY も設定されない限りテレメトリはオンのままです。 CLAUDE_CODE_ENABLE_TELEMETRY は無関係です。これは 監視 で説明されているように、独自のコレクターへの OpenTelemetry エクスポートを有効にし、Anthropic のアナリティクスを制御しません。

ヘルスエンドポイント

ランナーは設定されたヘルスポートで GET /healthz を提供します。レスポンスは、プロセスが生存している限り、ポーリングループがどの状態にあるかに関係なく 200 OK です。したがって、このエンドポイントの HTTP プローブはデッドプロセスのみを検出します。JSON ボディは現在の状態を説明します。
カスタムプローブでライブネスシグナルとして last_poll_age_ms を使用します。無限に増加する値は、ポーリングループがスタックしていることを示します。last_poll_atlast_poll_age_ms の両方は、最初のポーリングが完了するまで null です。 オーケストレーターはそのヘルスポートで独自の /healthz を提供します。そのエンドポイントは常に 200 を返し、ボディは最新のポーリングが成功したかどうかを報告する connected フィールドと、queue_counts のスポーン キュー数ごとの状態を持ちます。ステータスコードではなく connected でレディネスとアラートをゲートします。 SCM コネクタ が設定されている場合、オーケストレーターの /healthz ボディは scm_connector_connected と、connectedlast_connected_atlast_errorreconnectsrequests_forwarded を持つ scm_connector オブジェクトも持ちます。--scm-connector-host が設定されていない場合、両方のフィールドは null です。

Prometheus メトリクス

各ランナーは /healthz と同じポートで GET /metrics で Prometheus メトリクスを提供します。主要なシリーズ: オーケストレーターは /healthz と同じポートで GET /metrics で独自のシリーズを提供します。 オートスケーリングの場合、スケーリングスタイルに一致するシリーズを選択し、スケーラーに供給する前にゲートします。
  • キュー深度スケーリングqueue_pending_sessions ではなく claude_code_self_hosted_orchestrator_pool_pending_sessions を HPA または KEDA スケーラーに供給します。
  • 容量スケーリング:ランナーの active_sessionscapacity の比率でスケーリングします。
  • connected でゲート:インスタンスごとに claude_code_self_hosted_orchestrator_connected == 1 でクエリをフィルタリングします。切断されたレプリカの古い値がスケーラーに供給されないようにします。
完全なポーリング停止中、すべてのレプリカが切断されると、ゲートされたクエリはデータを返しません。HPA は欠落メトリクスで現在のレプリカ数を保持しますが、KEDA の Prometheus スケーラーはデフォルト ignoreNullValues: "true" で空の結果をゼロとして読み取り、スケールインします。ScaledObject で ignoreNullValues: "false" を設定し、オプションで fallback レプリカフロアを設定します。 次の Prometheus Operator PodMonitor は両方のプロセスをカバーしています。app.kubernetes.io/part-of: claude-code-self-hosted-runner ラベルと、Kubernetes レシピ が設定する名前付き health ポートでポッドを選択します。デプロイメントに合わせて名前空間を調整します。
これらのサンプルアラートルールは出発点です。フリートサイズのしきい値を調整します。

セッション子メトリクスをパススルーする

各セッションは独自の子プロセスで実行され、独自の OpenTelemetry メトリクスを持ちます。--capacity が 1 を超える場合、ランナーはそれらの子メトリクスの公開方法を書き換えます。ランナーホストで OTEL_METRICS_EXPORTER=prometheus を設定し、セッションの環境で CLAUDE_CODE_ENABLE_TELEMETRY=1 を設定します。例えば、ラッパースクリプト またはセッションが継承するランナー独自の環境から、各子のカウンターとゲージ計器をランナー独自の /metrics エンドポイントで再公開します。ランナーのシリーズと並んで。ランナーは子のエクスポーターを書き換えて、ヘルスポートのループバックのみのレシーバーに OTLP 経由でプッシュし、各シリーズに session_id および client_platform ラベルでタグ付けし、セッションが終了するとセッションのシリーズを削除します。ヒストグラムはパススルーしません。ランナー独自のプレフィックスと衝突する子メトリクスの名前は削除されます。 デフォルトの --capacity 1 では、書き換えは適用されません。セッションの子は通常どおりポート 9464 で独自の Prometheus エンドポイントをバインドします。

セッションライフサイクルカウンターセマンティクス

sessions_started_totalsessions_completed_totalsessions_failed_totalsessions_interrupted_total カウンターは、各セッションがどのように終了したかで分類します。スポーンされたすべてのセッション子はスポーン時に sessions_started_total をインクリメントし、終了時に他の 3 つのうち正確に 1 つをインクリメントします。したがって、sessions_started_total から他の 3 つの合計を引いたものは、現在実行中のセッション子の数に等しくなります。
  • completed:セッションはクリーンに終了しました。これは子がコード 0 で独自に終了する場合、セッションが子がまだ接続されている間にアーカイブまたは削除される場合、およびランナーがスロットをクリーンハンドオフとしてリリースする場合をカバーします。アイドルリリース、スタートアップタイムアウト、またはポーリングループが子が終了する前に気付いたサーバー側の割り当て解除。sessions_completed_total をインクリメントします。
  • failed:子がゼロ以外のコードで独自に終了しました。クラッシュまたはスポーン後のセットアップ失敗のいずれか。sessions_failed_total をインクリメントします。
  • interrupted:ランナーがセッション成功またはランナー障害のいずれでもない運用上の理由で子を終了しました。ドレインまたは最大ライフタイムウォッチドッグ --kill-session-after-min など。Kubernetes ローリング再起動が SIGTERM を送信することは、ドレインの一例です。sessions_interrupted_total をインクリメントします。
post-session フックCLAUDE_RUNNER_EXIT_REASON はクリーンハンドオフにこの分類を使用しません。フックはアイドルリリース、スタートアップタイムアウト、サーバー割り当て解除をランナーの観点から子を強制終了したため interrupted として報告します。一方、上記のカウンターはそれらの同じイベントを completed として記録します。何も問題がなく、スロットがクリーンに返されたため。sessions_completed_total に対してフック受信を直接調整する場合、完了をアンダーカウントします。セッションごとの保証にはフックを使用し、集計レートにはカウンターを使用します。 ワンショット環境では、--capacity 1 とデフォルト --drain-grace-sec 0 で、各ランナープロセスは 1 つのセッションが終了した直後に終了します。sessions_completed_totalsessions_failed_totalsessions_interrupted_total はセッション終了時にのみインクリメントされます。その終了の直前に、Prometheus スクレイプが 15 ~ 60 秒ごとの場合、ランナーのシリーズが消える前にインクリメントをキャッチすることはめったにありません。これら 3 つのセッション終了カウンターは、このセクションの残りが参照するターミナルカウンターです。sessions_started_total はスポーン時にインクリメントされ、セッションの生存期間中は表示されたままなので、確実に表示されます。ただし、ワンショット環境では、累積カウントよりも「現在実行中のセッション」に近く読み取られます。 対応する目標の代わりにこのテーブルのシリーズを使用します。 orchestrator_* 行は オンデマンドオーケストレーター を実行している環境にのみ存在します。セッションを超えて生存するランナーを持つ固定フリートで、--drain-grace-sec0 を超える場合、スループットに sum(rate(claude_code_self_hosted_runner_sessions_started_total[5m])) を使用します。ワンショットフリートではそのシリーズは他のターミナルカウンターと同じスクレイプウィンドウ問題を持つため、キューに入ったセッション数に依存します。バックログを環境の Activity タブで確認します。Cloud environments 管理ページ:ランナーはキュー深度シリーズをエクスポートしません。 セッションごとの結果報告については、代わりに post-session フック を使用してください。VM プリエンプションなどの突然のランナー終了を除き、子プロセスがスポーンされたすべてのセッション終了で発火します。フック独自の契約 に従って。

次のステップ