Référence des environnements auto-hébergés
Référence complète pour le runner et l'orchestrateur auto-hébergés : drapeaux CLI, variables d'environnement et métriques Prometheus.
[!NOTE]
Les environnements auto-hébergés sont en bêta publique sur les plans Team et Enterprise ; un Propriétaire les active en activant Autoriser les environnements auto-hébergés sur la page d'administration Environnements cloud. Cette page est la référence des drapeaux et des métriques ; consultez le guide de démarrage rapide pour la configuration et Déployer en production pour les recettes de flotte.
Cette page est la référence pour les deux processus que vous exécutez dans un environnement auto-hébergé : le runner, qui exécute les sessions cloud Claude Code sur vos hôtes, et l'orchestrateur d'autoscaling optionnel, qui démarre les runners à mesure que les sessions s'accumulent. Chacun a sa propre table de drapeaux. Les deux s'exécutent sur des hôtes Linux ou macOS, pour lesquels les valeurs par défaut telles que /workspace et ~/.claude s'appliquent. Exécutez claude self-hosted-runner --help pour la liste faisant autorité sur votre version installée.
Les séries de métriques et quelques champs API utilisent toujours pool pour ce que ces pages appellent un environnement ; les deux termes désignent la même chose. L'ID d'environnement est le champ pool_id, avec la forme ccpool_... : partout où ces pages affichent un identifiant pool, il désigne l'environnement. Les drapeaux CLI et les variables d'environnement l'écrivent environment, comme --environment-secret-file ; les orthographes pool dépréciées fonctionnent toujours, comme la ligne --environment-secret-file le décrit.
Drapeaux CLI du runner
La plupart des drapeaux ont une variable d'environnement correspondante. Quand les deux sont définis, le drapeau a la priorité. Les drapeaux de durée prennent des minutes ou des secondes sur la CLI, mais la variable d'environnement appariée est toujours en millisecondes, indiquée par le suffixe _MS, et la colonne Par défaut affiche l'unité du drapeau : --exit-if-unused-min 10 équivaut à SELF_HOSTED_RUNNER_IDLE_SHUTDOWN_MS=600000, et une valeur Helm comme SELF_HOSTED_RUNNER_STARTUP_TIMEOUT_MS: "15" signifie 15 millisecondes, pas la valeur par défaut de 15 minutes.
| Drapeau | Variable d'env | Par défaut | Description |
|---|---|---|---|
--api-url <url> |
aucune | https://api.anthropic.com |
URL de base de l'API. À remplacer uniquement pour les tests. |
--base-dir <path> |
SELF_HOSTED_RUNNER_BASE_DIR |
/workspace ; aucune sur Windows |
Répertoire pour les clones de dépôts et les répertoires de travail par session. Le runner a besoin d'un accès en écriture à ce chemin ou à son parent. Le runner crée le répertoire au démarrage et se termine avec cannot create or write to base directory quand il ne peut pas le créer ou y écrire. Avant v2.1.225, le runner créait le répertoire au démarrage de la première session, donc un chemin inutilisable échouait les sessions plutôt que le démarrage. Sur Windows, qui n'est pas un hôte runner supporté, il n'y a pas de valeur par défaut : le runner se termine au démarrage sauf si vous passez le drapeau ou définissez la variable. Utilisez la même valeur sur chaque runner dans un environnement. Voir Garder le répertoire de base et la capacité identiques sur tous les runners. |
--capacity <n> |
aucune | 1 |
Nombre maximum de sessions simultanées que ce runner gère. Toutes les sessions appartiennent au même propriétaire verrouillé. Utilisez la même valeur sur chaque runner dans un environnement ; voir Garder le répertoire de base et la capacité identiques sur tous les runners. |
--client-label <label> |
SELF_HOSTED_RUNNER_CLIENT_LABEL |
le nom d'hôte de l'hôte | Étiquette que le runner envoie lors de son enregistrement. Le runner la signale également comme l'étiquette client_label de claude_code_self_hosted_runner_info. Nécessite Claude Code v2.1.248 ou ultérieur. |
--configure-git |
SELF_HOSTED_RUNNER_CONFIGURE_GIT=1 |
désactivé | Au démarrage, écrire l'identité git globale, activer la signature de commit Anthropic, activer la négociation de push git, et installer des hooks de commit qui ajoutent une remorque Co-authored-by:. La négociation de push nécessite Claude Code v2.1.257 ou ultérieur. Voir Configurer git. |
--confine-repo-settings <mode> |
SELF_HOSTED_RUNNER_CONFINE_REPO_SETTINGS |
warn |
Définit le mode de la garde qui signale une session quand les paramètres validés d'un dépôt tentent d'accorder un accès en écriture ou en lecture en dehors de l'espace de travail de cette session, de définir des variables d'environnement ou de remplacer la posture sandbox ou hooks de l'opérateur, comme sandbox.enabled: false ou disableAllHooks. Le warn par défaut enregistre la violation et démarre quand même la session, enforce refuse la session, et off désactive l'analyse. Voir Renforcer votre déploiement. |
--debug-token-dir <path> |
SELF_HOSTED_RUNNER_DEBUG_TOKEN_DIR |
non défini | Écrire les tokens en direct sur le disque pour inspection. Débogage uniquement ; ne pas utiliser en production. |
--defer-shutdown-max-min <n> |
SELF_HOSTED_RUNNER_DEFER_SHUTDOWN_MAX_MS |
0 |
Au premier SIGTERM ou SIGINT, continuer à servir les sessions déjà attachées au lieu de les drainer, puis libérer tout ce qui est encore attaché N minutes plus tard et quitter. Augmentez le délai d'arrêt de votre hôte avant de définir ceci. Voir Différer le drainage après le premier signal. 0 désactive. Nécessite Claude Code v2.1.238 ou ultérieur. |
--drain-grace-sec <n> |
SELF_HOSTED_RUNNER_DRAIN_GRACE_MS |
0 |
Jusqu'à ce que le runner reçoive un signal d'arrêt ou atteigne son heure de retraite, contrôle quand le runner se termine après la fin de ses sessions actives : 0 se termine immédiatement sans interrogation supplémentaire, et une valeur positive garde le runner actif et réinterroge la file d'attente du propriétaire verrouillé pendant ce nombre de secondes d'abord, au prix de l'isolation de conteneur par session décrite dans la section de renforcement. Après un premier signal que vous avez différé avec --defer-shutdown-max-min, le runner se termine dès qu'il ne détient aucune session, quelle que soit la valeur que vous définissez ici. |
--drain-marker-file <path> |
SELF_HOSTED_RUNNER_DRAIN_MARKER_FILE |
non défini | Fichier marqueur que votre hôte écrit pour annoncer un drainage gracieux avant d'envoyer SIGTERM. Quand le fichier existe au démarrage du drainage, le runner signale sa sortie à Anthropic comme un drainage d'hôte plutôt qu'un simple signal d'arrêt. Le drainage lui-même, y compris la retenue --drain-wait-sec, s'exécute de la même manière que sans le drapeau. Nommez un chemin sur un système de fichiers local que les sessions ne peuvent pas écrire. Nécessite Claude Code v2.1.271 ou ultérieur. |
--drain-wait-sec <n> |
SELF_HOSTED_RUNNER_DRAIN_WAIT_MS |
0 |
Une fois le drainage commencé, qui se fait sur SIGTERM sauf si vous définissez --defer-shutdown-max-min, attendre jusqu'à N secondes que le tour en cours de chaque session et les tâches en arrière-plan se terminent avant de terminer l'enfant. Pendant cette attente, le runner compte une tâche en arrière-plan qui vient de se terminer comme toujours en cours d'exécution jusqu'au démarrage du tour de suivi qui lit son résultat, pendant au maximum la fenêtre SELF_HOSTED_RUNNER_BG_RESULT_GRACE_MS. Augmentez aussi votre délai d'arrêt. |
--environment-secret-file <path> |
SELF_HOSTED_RUNNER_ENVIRONMENT_SECRET |
requis | Chemin vers un fichier contenant le secret d'environnement, ou, pour les runners générés par l'orchestrateur, le JWT de bon de travail à usage unique. SELF_HOSTED_RUNNER_ENVIRONMENT_SECRET porte la valeur secrète directement, pas un chemin de fichier. L'ancien drapeau --pool-secret-file et la variable SELF_HOSTED_RUNNER_POOL_SECRET fonctionnent toujours et impriment un avis de dépréciation sur stderr ; les builds de runner du programme d'aperçu plus anciens que 2.1.216 ne reconnaissent que ces anciens noms. |
--exec-path <path> |
SELF_HOSTED_RUNNER_EXEC_PATH |
binaire propre | Binaire ou script wrapper à générer pour chaque session. Voir Scripts wrapper. |
--exit-if-unused-min <n> |
SELF_HOSTED_RUNNER_IDLE_SHUTDOWN_MS |
0 |
Quitter après N minutes d'interrogation sans travail jamais assigné, pour la réduction d'échelle de l'autoscaler. 0 désactive. |
--git-host-rewrite <from>=<to> |
aucune | non défini | Réécrire les URL sources https://<from>/... en https://<to>/... avant le clonage, pour DNS à horizon divisé. Répétable ; drapeau uniquement. |
--git-ssh-rewrite <host> |
aucune | non défini | Réécrire les URL sources https://<host>/... en git@<host>:... avant le clonage, pour les hôtes git SSH uniquement. Répétable ; drapeau uniquement. |
--health-port <port> |
SELF_HOSTED_RUNNER_HEALTH_PORT |
8080 |
Port pour l'écouteur /healthz et /metrics. Définir 0 pour désactiver. |
--hold-idle-file <path> |
SELF_HOSTED_RUNNER_HOLD_IDLE_FILE |
non défini | Fichier que votre hôte continue de modifier pour conserver une session inactive sur le runner. Voir Conserver une session inactive pendant que ses processus s'exécutent. Nécessite Claude Code v2.1.311 ou ultérieur. |
--hooks-dir <path> |
SELF_HOSTED_RUNNER_HOOKS_DIR |
non défini | Répertoire des scripts de hook de cycle de vie. Voir Hooks de cycle de vie. |
--host-config-snapshot <mode> |
SELF_HOSTED_RUNNER_HOST_CONFIG_SNAPSHOT |
disk |
Où le runner garde l'instantané de démarrage du répertoire de configuration d'hôte qu'il amorce chaque session à partir de. disk copie l'instantané dans un répertoire appartenant au runner sous --base-dir et, à chaque démarrage de session, vérifie chaque fichier par rapport à un digest en mémoire. Si un fichier dans la copie a été modifié, la session échoue et le runner refuse les sessions jusqu'à ce que vous le redémarriez. memory garde l'instantané entier sur le tas, limité à 64 MiB ; au-delà de la limite, les sessions démarrent sans configuration d'hôte et affichent un avis le disant. Quand le runner ne peut pas écrire l'instantané disque, il enregistre l'échec et utilise memory pour cette exécution. Nécessite Claude Code v2.1.271 ou ultérieur. |
--kill-session-after-min <n> |
SELF_HOSTED_RUNNER_MAX_LIFETIME_MS |
0 |
Limiter une session à N minutes en temps réel, comme limite de sécurité pour les sessions bloquées. Sur v2.1.260 ou ultérieur, le runner libère une session qui atteint la limite afin qu'elle puisse reprendre au prochain message de son utilisateur, et la termine uniquement si elle est toujours sur le runner quand la fenêtre de grâce SELF_HOSTED_RUNNER_MAX_LIFETIME_GRACE_MS se termine. Avant v2.1.260, le runner terminait la session à la limite. Voir Certaines sessions ne comptent pas comme inactives pour les détails et comment choisir une valeur. 0 désactive. |
--lock-to-account <id> |
SELF_HOSTED_RUNNER_LOCK_TO_ACCOUNT |
non défini | Pré-verrouiller le runner à un compte spécifique au démarrage au lieu de verrouiller à la première session. Accepte une adresse e-mail ou un ID user_... dans l'organisation de l'environnement. Un runner pré-verrouillé ne récupère jamais les sessions du canal Claude Tag, qui n'ont pas de compte. |
--log-file <path> |
SELF_HOSTED_RUNNER_LOG_FILE |
non défini | Refléter les logs du runner vers un fichier en plus de stdout et stderr, créé avec les permissions 0600. Requis pour que self-hosted-runner doctor suive les logs localement. |
--log-level <level> |
aucune | info |
info ou debug |
--max-hold-min <n> |
SELF_HOSTED_RUNNER_MAX_HOLD_MS |
1440 |
Avec --hold-idle-file, libérer quand même une session conservée N minutes après qu'elle est devenue inactive. Une valeur inférieure ou égale à --release-idle-session-min ne conserve rien. 0 désactive la conservation. Nécessite Claude Code v2.1.311 ou ultérieur. |
--post-session-hook-timeout-sec <n> |
SELF_HOSTED_RUNNER_POST_SESSION_HOOK_TIMEOUT_MS |
60 |
Budget pour le hook post-session à la fin de chaque session, y compris l'arrêt du runner |
--proxy-authorization-command <command> |
SELF_HOSTED_RUNNER_PROXY_AUTHORIZATION_COMMAND |
non défini | Commande shell que le runner exécute pour chaque connexion à votre proxy de sortie, en utilisant sa stdout coupée comme valeur d'en-tête Proxy-Authorization. Nécessite HTTPS_PROXY ou HTTP_PROXY, et ne peut pas être combiné avec --proxy-authorization-file. Voir S'authentifier auprès d'un proxy de sortie. Nécessite Claude Code v2.1.238 ou ultérieur. |
--proxy-authorization-file <path> |
SELF_HOSTED_RUNNER_PROXY_AUTHORIZATION_FILE |
non défini | Fichier que le runner lit pour chaque connexion à votre proxy de sortie, en utilisant son contenu coupé comme valeur d'en-tête Proxy-Authorization. Utilisez ce drapeau pour un token qu'un autre processus fait tourner en place. Porte les mêmes exigences que --proxy-authorization-command, et ne peut pas être combiné avec lui. Voir S'authentifier auprès d'un proxy de sortie. Nécessite Claude Code v2.1.238 ou ultérieur. |
--push-outcome-on-release |
SELF_HOSTED_RUNNER_PUSH_OUTCOME_ON_RELEASE |
désactivé | Lorsque le runner met lui-même fin à une session, par exemple lors d'un drainage ou d'une libération pour inactivité, le runner pousse vers origin les branches de session principales contenant de nouveaux commits avant de supprimer l'espace de travail. Meilleur effort ; ajoute 30 secondes au budget d'arrêt. Nécessite git 2.29 ou plus récent pour reprendre à partir de ces branches. Restreignez l'accès en push aux refs claude/* ; voir Les sessions reprises perdent le travail non poussé. Les dépôts d'un hook checkout ne sont pas poussés ; prenez des snapshots de ceux-ci à partir du hook post-session. |
--release-idle-session-min <n> |
SELF_HOSTED_RUNNER_SESSION_IDLE_MS |
0 |
Libérer un créneau de session après N minutes d'inactivité une fois qu'un tour se termine ou que la session attend l'action de l'utilisateur. Certaines sessions ne comptent pas comme inactives, donc associez ce flag à --kill-session-after-min. Une tâche en arrière-plan terminée garde la session occupée pendant au maximum la fenêtre SELF_HOSTED_RUNNER_BG_RESULT_GRACE_MS. Pour retarder une libération, définissez --hold-idle-file. 0 désactive. |
--remove-session-state [bool] |
SELF_HOSTED_RUNNER_REMOVE_SESSION_STATE |
désactivé | Supprimer les répertoires par session d'une session sous <base-dir>/_sessions/ quand la session se termine sur ce runner, quel que soit le résultat. Réutiliser un checkout pré-chauffé décrit ce qu'ils contiennent et qui peut les lire quand ils restent. La suppression est meilleur effort : les répertoires par session restent en place quand le runner est tué ou atteint sa date limite de drainage avant que le nettoyage ne s'exécute. Avec le drapeau activé, le log de débogage d'une session échouée ou interrompue n'est pas conservé sur le disque. Nécessite Claude Code v2.1.268 ou ultérieur. |
--retire-at <epoch-seconds> |
SELF_HOSTED_RUNNER_RETIRE_AT |
non défini | Retirer le runner à un timestamp Unix absolu en secondes, pour l'infrastructure qui tue le runner à un moment connu ; Cycle de vie du runner décrit la séquence de libération et comment dimensionner la marge. Les valeurs avant 2001 ou après l'année 5138 sont rejetées par le drapeau et ignorées par la variable d'environnement. |
--server-auto-mode-lists <mode> |
SELF_HOSTED_RUNNER_SERVER_AUTO_MODE_LISTS |
no-allow |
Lesquelles des listes de règles du classifieur du mode auto que le plan de contrôle envoie avec une session peuvent atteindre cette session : all, no-allow ou none. Voir Listes de règles du mode auto pour ce que chaque valeur applique. Une valeur invalide arrête le runner au démarrage. Nécessite Claude Code v2.1.295 ou ultérieur. |
--session-stop-grace-sec <n> |
SELF_HOSTED_RUNNER_SESSION_STOP_GRACE_MS |
5 |
Combien de temps attendre que le processus Claude se termine proprement après la fin d'une session, avant de le tuer de force. Augmentez la valeur si les hooks SessionEnd propres de l'enfant ont besoin de plus de temps. |
--startup-timeout-min <n> |
SELF_HOSTED_RUNNER_STARTUP_TIMEOUT_MS |
15 |
Durée d'attente d'un processus enfant qui ne s'est pas initialisé avant de libérer le créneau de la session. Voir Délai d'expiration du démarrage de session pour savoir où commence le décompte et quelles sessions il laisse en cours d'exécution. 0 désactive le délai d'expiration. |
--trust-workspace [bool] |
SELF_HOSTED_RUNNER_TRUST_WORKSPACE |
activé | Amorcer la confiance persistante pour les chemins de dépôt de chaque session afin que les permissions.allow et additionalDirectories validés par le dépôt soient honorés. Définir false pour supprimer les subventions de permission validées par le dépôt et configurer les règles d'autorisation dans le settings.json de la configuration d'hôte à la place ; les paramètres sandbox.* validés par le dépôt s'appliquent toujours de toute façon, c'est pourquoi la garde de paramètres de dépôt les analyse indépendamment de ce drapeau. |
--use-anthropic-git-proxy |
CLAUDE_RUNNER_USE_GIT_PROXY=1 |
désactivé | Cloner les dépôts hébergés sur github.com via le proxy git Anthropic au lieu de l'authentification git gérée par le client. Nécessite --capacity 1 et git 2.32 ou plus récent ; le runner refuse de démarrer sinon. Nécessite également Claude Code v2.1.267 ou ultérieur. Remplace les flags de réécriture. |
La plupart des drapeaux de durée ont un maximum, choisi pour garder chaque délai d'attente en dessous du plafond de minuteur 32 bits du runtime d'environ 24,85 jours. Les drapeaux --*-min sont plafonnés à 10080 minutes, 7 jours ; --drain-grace-sec à 604800 secondes, également 7 jours ; et --drain-wait-sec à 86400 secondes, 24 heures. --session-stop-grace-sec et --post-session-hook-timeout-sec ne sont pas plafonnés. Dépasser un plafond se comporte différemment par surface :
- Drapeau : le démarrage échoue avec une erreur.
- Variable d'environnement : le runner serre la valeur au plafond de minuteur plutôt que de la rejeter.
Délai d'expiration du démarrage de session
Si une session a perdu son créneau pendant un tour tel que /code-review, mettez à jour le runner et le binaire enfant vers v2.1.309 ou ultérieur. De v2.1.299 à v2.1.308, le runner libérait une session, même en plein tour, dès que le délai d'expiration du démarrage s'écoulait sans message user ou assistant.
Avec --startup-timeout-min <n>, le runner libère le créneau d'une session quand son enfant ne s'est pas initialisé dans les <n> minutes qui suivent le clonage. Pendant un tour qui commence avant l'initialisation de l'enfant, la session conserve son créneau jusqu'à ce que <n> minutes s'écoulent sans aucune ligne sur le canal d'activité de l'enfant. Une fois l'enfant initialisé, le runner remet ce décompte à zéro et --release-idle-session-min régit la libération. Pour limiter une session dont l'enfant est actif mais bloqué, définissez --kill-session-after-min.
Listes de règles du mode auto
--server-auto-mode-lists vous permet de décider quelles règles du classifieur du mode auto provenant de l'extérieur du runner atteignent les sessions sur vos runners. Le plan de contrôle d'Anthropic peut envoyer des listes de règles avec une session et demander au runner de les appliquer. Certaines entrées peuvent être des règles rédigées par un administrateur de votre organisation. Les listes sont environment, soft_deny et allow :
environment: une entrée peut amener le classifieur à autoriser davantage comme à autoriser moins.soft_deny: une entrée bloque une action sauf si l'utilisateur l'a explicitement demandée ou si une exceptionallows'applique.allow: les exceptions aux entréessoft_deny.
La valeur du flag détermine quelles listes le runner applique :
no-allow: la valeur par défaut. Appliqueenvironmentetsoft_denyet retientallow. Une entréeenvironmentpeut toujours amener le classifieur à autoriser davantage, donc la valeur par défaut n'exclut pas tout assouplissement.all: applique les trois listes.none: n'en applique aucune. Choisisseznonepour exclure tout assouplissement provenant de ces listes. Cela supprime également les restrictionssoft_deny.
Aucun paramètre du runner ne fait en sorte que le plan de contrôle demande au runner d'appliquer les listes. Quand il ne le demande pas, les sessions ne reçoivent aucune liste, quelle que soit la valeur que vous définissez. Pour voir ce qui s'est passé, démarrez le runner avec --log-level debug. Pour chaque session, le runner journalise alors une ligne contenant the server asked this runner to apply, ou une ligne contenant the server did not ask this runner to apply the auto mode lists it sends.
Drapeaux CLI de l'orchestrateur
La sous-commande self-hosted-runner orchestrator, qui génère les runners à la demande, accepte --api-url, --environment-secret-file, --hooks-dir, --health-port et --log-level avec les mêmes valeurs par défaut que le runner et, où le drapeau du runner en a une, la même variable d'environnement, sauf que --hooks-dir est requis et doit contenir un hook spawn-runner. Il prend également ses propres drapeaux :
| Drapeau | Par défaut | Description |
|---|---|---|
--hook-concurrency <n> |
4 |
Nombre maximum de hooks spawn-runner s'exécutant en parallèle. Limite également le nombre de demandes de génération réclamées par interrogation. L'orchestrateur ne vérifie la présence de nouvelles demandes de génération qu'une fois que tous les hooks qu'il a lancés sont terminés ; un hook lent retarde donc les hooks suivants de cet orchestrateur. |
--hook-timeout <sec> |
60 |
Terminer l'arborescence des processus du hook après ce nombre de secondes. Le délai d'attente plus sa grâce de suppression de 5 secondes doit rester en dessous de --expected-spawn-seconds ; l'orchestrateur applique ceci au démarrage. |
--expected-spawn-seconds <sec> |
120 |
Temps p99 attendu entre le moment où l'orchestrateur reçoit une demande de génération et celui où le runner s'enregistre, y compris toute attente de capacité sur votre plateforme. Le serveur applique une plage de 10 à 3600. Envoyé à chaque interrogation comme bail côté serveur : si aucun runner ne s'enregistre avant son expiration, la session est re-proposée avec un nouvel ID de commande. Tous les réplicas doivent partager cette valeur. |
--min-idle <n> |
0 |
Garder au moins N créneaux de session inactifs libres en générant proactivement des runners de secours. 0 désactive le préchauffage. Associer avec le --exit-if-unused-min du runner afin que les runners de secours excédentaires se réclament eux-mêmes. |
--shutdown-drain-sec <n> |
0 |
À la réception de SIGTERM, cesser d'interroger les demandes de génération et accorder aux hooks spawn-runner en cours d'exécution ainsi qu'à toute interrogation sans réponse jusqu'à ce nombre de secondes pour se terminer, avant d'arrêter ce qui reste. À 0, arrêter immédiatement. Maximum 3600, ce que l'orchestrateur applique au démarrage. Pour choisir une valeur, consultez Dimensionner --shutdown-drain-sec et le délai d'arrêt de l'orchestrateur. Nécessite Claude Code v2.1.299 ou version ultérieure. |
--debug-dir <path> |
non défini | Écrire le bon de travail de chaque demande de génération et la stderr du hook sur le disque. Débogage uniquement ; ne jamais définir en production. |
Drapeaux du connecteur SCM
Le connecteur SCM n'est pas disponible, donc laissez les drapeaux de cette section non définis. Si vous définissez --scm-connector-host, la connexion ne s'ouvre pas, et l'orchestrateur continue à la réessayer. Les runners commencent toujours en tant que sessions en file d'attente.
Le connecteur est une connexion WebSocket permanente de l'orchestrateur au plan de contrôle d'Anthropic. Il est conçu pour permettre aux flux pré-session hébergés, tels que le sélecteur de dépôt et le résolveur de branche ou de ref, d'atteindre un hôte GitHub Enterprise Server qui n'est routable que de l'intérieur de votre réseau. Consultez Exigences réseau sur la page GitHub Enterprise Server pour voir ce dont ces flux ont besoin.
| Drapeau | Par défaut | Description |
|---|---|---|
--scm-connector-host <host[:port]> |
non défini | Nom d'hôte GitHub Enterprise Server vers lequel transférer les demandes. Le port par défaut est 443. |
--scm-connector-id <n> |
requis avec --scm-connector-host |
L'ID numérique de la connexion GitHub Enterprise Server de votre organisation. |
--scm-connector-provider <slug> |
ghe |
Segment de chemin identifiant le fournisseur, correspondant à ^[a-z0-9-]{1,32}$. |
--scm-connector-ca-file <path> |
non défini | Bundle CA supplémentaire, au format PEM, pour les connexions TLS à l'hôte GitHub Enterprise Server. |
--scm-connector-host-rewrite <from>=<to_host:to_port> |
non défini | Pour les tests de bout en bout uniquement : redirige la connexion TCP tout en gardant l'en-tête Host et TLS SNI comme --scm-connector-host. |
À chaque tentative de connexion, l'orchestrateur envoie son secret d'environnement existant, et il réessaye automatiquement avec un backoff exponentiel, plafonné à 30 secondes plus une gigue.
Paramètres réservés aux variables d'environnement
Ces paramètres du runner sont lus uniquement à partir de l'environnement et couvrent le comportement que la plupart des déploiements laissent à la valeur par défaut :
| Variable d'env | Par défaut | Description |
|---|---|---|
SELF_HOSTED_RUNNER_BG_RESULT_GRACE_MS |
30000 |
Combien de temps le runner considère une session comme occupée après la fin d'une tâche de fond tandis que le tour de suivi qui lit le résultat n'a pas commencé. Les lignes --drain-wait-sec et --release-idle-session-min décrivent où la retenue s'applique au drainage et à la libération inactive, et Cycle de vie du runner décrit où elle s'applique à la retraite --retire-at. 0 ou une valeur inutilisable revient à la valeur par défaut, donc la retenue ne peut pas être désactivée. Nécessite Claude Code v2.1.228 ou ultérieur. |
SELF_HOSTED_RUNNER_HOST_CONFIG_DIR |
~/.claude |
Répertoire capturé dans le snapshot de démarrage du runner et amorcé dans le CLAUDE_CONFIG_DIR de chaque session ; les modifications sur le disque s'appliquent après un redémarrage du runner. Définir la variable déplace également l'endroit où le runner lit .claude.json pour l'amorçage MCP, donc le définir, y compris à sa propre valeur par défaut, relocalise cette recherche ; pointez vers un répertoire vide pour désactiver complètement l'amorçage. |
SELF_HOSTED_RUNNER_MAX_LIFETIME_GRACE_MS |
900000 |
Combien de temps le runner attend après qu'une session atteigne sa limite --kill-session-after-min, pour qu'un tour en cours se termine ou que la libération se termine, avant de terminer la session |
SELF_HOSTED_RUNNER_POST_TURN_SETTLE_MS |
7000 |
Limite supérieure du temps pendant lequel le runner compte une session comme occupée pour le drainage --drain-wait-sec après la fin d'un tour, tandis que le processus de la session signale la fin du tour à Anthropic. 0 ou une valeur inutilisable revient à la valeur par défaut, donc la retenue ne peut pas être désactivée. Nécessite Claude Code v2.1.275 ou ultérieur. |
SELF_HOSTED_RUNNER_SIGKILL_GRACE_MS |
30000 |
Combien de temps le runner attend que le système d'exploitation livre SIGKILL à un enfant bloqué dans les E/S non interruptibles avant de se terminer lui-même. Plancher à --post-session-hook-timeout-sec plus 15 secondes, et 30 de plus quand --push-outcome-on-release est défini, donc le minimum effectif est 75 secondes aux valeurs par défaut. |
CLAUDE_RUNNER_DISABLE_RENEWAL_WARNING |
non défini | Quand 1, le runner ne publie pas The server has refused to renew this session's access to the model dans une session. Après chaque refus, il attend le prochain renouvellement planifié pour redemander. Nécessite Claude Code v2.1.319 ou ultérieur. |
CLAUDE_RUNNER_FETCH_DEPTH |
50 |
Profondeur de récupération git pour les clones frais. Définir un entier positif, ou full ou 0 pour une récupération complète. Pour un clone déjà présent dans l'espace de travail, consultez Réutiliser un checkout préchauffé. |
CLAUDE_RUNNER_FETCH_SERVER_PROGRESS_CAP_MS |
600000 |
Durée en millisecondes, par tentative, pendant laquelle une récupération git peut attendre ses premières données tant que les indicateurs de progression du serveur git lui-même continuent d'augmenter, par exemple lorsque le serveur prépare le pack d'un dépôt volumineux. 0 ou off désactive cette attente : une telle récupération est alors interrompue après deux minutes sans données. Tout autre nombre entier est borné entre 120000 et 1800000, soit 2 à 30 minutes. Nécessite Claude Code v2.1.295 ou ultérieur. |
CLAUDE_RUNNER_SKIP_GIT_VERIFY |
non défini | Quand 1, ignorer la vérification de présence .git après l'exécution d'un hook checkout. Définir ceci quand votre hook matérialise une source non-git. |
FORCE_AUTOUPDATE_PLUGINS |
non défini | Quand 1, laisser les marchés de plugins se mettre à jour automatiquement même si le binaire est épinglé |
CLAUDE_CODE_DISABLE_ARTIFACT |
non défini | Quand 1, désactiver l'outil Artifact dans les sessions indépendamment du paramètre d'administration de l'organisation, et supprimer l'exigence de sortie *.frame.claudeusercontent.com |
Télémétrie
Les enfants de session envoient la télémétrie opérationnelle à Anthropic sauf si vous la désactivez. Aucun code ou contenu de dépôt n'est envoyé. Définir les variables de télémétrie sur le processus du runner ; le runner les réaffirme après l'application des variables d'environnement fournies par le serveur, donc le paramètre de l'opérateur a toujours la priorité.
Un contrôle est spécifique aux environnements auto-hébergés : CLAUDE_CODE_BYOC_ENABLE_DATADOG=1 opte pour les métriques opérationnelles Datadog, qui sont désactivées par défaut dans les environnements auto-hébergés. Les contrôles de télémétrie Claude Code généraux, DISABLE_TELEMETRY, DO_NOT_TRACK, DISABLE_ERROR_REPORTING et CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC, s'appliquent aux enfants de session comme documenté dans la référence des variables d'environnement. CLAUDE_CODE_DISABLE_FEATURE_FLAGS est connexe mais différent : définir CLAUDE_CODE_DISABLE_FEATURE_FLAGS=1 désactive la récupération des drapeaux de fonctionnalité, et la télémétrie reste activée sauf si DISABLE_TELEMETRY est également défini. CLAUDE_CODE_DISABLE_FEATURE_FLAGS nécessite Claude Code v2.1.319 ou une version ultérieure.
CLAUDE_CODE_ENABLE_TELEMETRY n'est pas connexe : il active l'export OpenTelemetry vers votre propre collecteur, comme décrit dans Surveillance, et ne contrôle pas l'analytique d'Anthropic.
Point de terminaison de santé
Le runner sert GET /healthz sur le port de santé configuré une fois qu'il s'est enregistré et a terminé ses vérifications de démarrage. À partir de ce moment, la réponse est 200 OK chaque fois que le processus est actif, quel que soit l'état de la boucle d'interrogation, donc une sonde HTTP sur cet endpoint détecte uniquement un processus mort. Le corps JSON décrit l'état actuel :
{
"status": "ok",
"runner_id": "ccrunner_...",
"active_sessions": 2,
"last_poll_at": "2026-03-31T18:04:11.220Z",
"last_poll_age_ms": 842
}
Configurez des alertes sur last_poll_age_ms, mais ne l'utilisez pas dans une sonde de vivacité ; conservez cette sonde sur le code de statut HTTP. La valeur correspond au temps écoulé depuis la dernière interrogation réussie, elle augmente donc aussi lorsque le runner ne peut pas joindre Anthropic. last_poll_at et last_poll_age_ms valent tous deux null jusqu'à ce que la première interrogation réussisse. Pour détecter les interrogations qui échouent dès le départ, configurez également des alertes sur claude_code_self_hosted_runner_poll_errors_total, répertorié sous Métriques Prometheus.
Le /healthz propre à l'orchestrateur, sur son port de santé, retourne toujours 200. Le corps porte un champ connected signalant si l'interrogation la plus récente a réussi, plus les comptes de file d'attente de génération par état dans queue_counts. Pour savoir pourquoi connected vaut false, lisez le champ de premier niveau last_error, que chaque interrogation réussie réinitialise à null. Gater la disponibilité et les alertes sur connected plutôt que sur le code de statut.
Quand le connecteur SCM est configuré, le corps /healthz de l'orchestrateur porte également scm_connector_connected et un objet scm_connector avec connected, last_connected_at, last_error, reconnects et requests_forwarded. Les deux champs sont null quand --scm-connector-host n'est pas défini.
Métriques Prometheus
Chaque runner expose des métriques Prometheus sur GET /metrics, sur le même port que /healthz. Principales séries :
| Série | Remarques |
|---|---|
claude_code_self_hosted_runner_info{runner_id,version,client_label} |
Toujours 1 ; utile pour l'inventaire de la flotte et la détection des écarts de version |
claude_code_self_hosted_runner_capacity |
--capacity configurée |
claude_code_self_hosted_runner_active_sessions |
Sessions en cours d'exécution |
claude_code_self_hosted_runner_locked_account{email} |
Présente dès que le runner s'est verrouillé sur un utilisateur et qu'un jeton de session portant une revendication act.email a été émis. La série est absente sur un runner verrouillé sur un agent Claude Tag, dont les jetons de session ne portent pas d'act.email. La valeur du label est l'adresse e-mail du compte ; si votre stockage de métriques est largement accessible en lecture, supprimez ou hachez le label au moment du scrape, par exemple avec metric_relabel_configs de Prometheus. |
claude_code_self_hosted_runner_last_poll_age_seconds |
Secondes écoulées depuis le dernier poll réussi. Déclenchez une alerte au-delà de 60. |
claude_code_self_hosted_runner_poll_errors_total{error_kind} |
Échecs cumulés de PollWork par type : transport, timeout, 5xx, 429 ou 4xx. Les cinq séries sont présentes dès le démarrage du processus ; alertez sur rate(...[5m]) > 0. |
claude_code_self_hosted_runner_sessions_started_total{client_platform} |
Processus enfants de session lancés pendant la durée de vie du runner, une série par origine de session, comme web_claude_ai, ios, android, desktop_app ou claude_code_cli, ou unknown lorsque le serveur n'en a pas envoyé. Les sessions Slack portent soit claude_in_slack, soit claude-in-slack selon l'intégration Slack qui les a créées ; faites donc correspondre les deux avec un sélecteur regex tel que {client_platform=~"claude[-_]in[-_]slack"}. Utilisez sum() pour le total de la flotte. |
claude_code_self_hosted_runner_sessions_completed_total{client_platform} |
Sessions terminées proprement, avec les mêmes labels. Plus large qu'une simple sortie propre : consultez la sémantique des compteurs du cycle de vie des sessions pour savoir ce qui est comptabilisé. |
claude_code_self_hosted_runner_sessions_failed_total{client_platform} |
Sessions terminées en échec, avec les mêmes labels. Même réserve : consultez la sémantique des compteurs du cycle de vie des sessions. |
claude_code_self_hosted_runner_sessions_interrupted_total{client_platform} |
Sessions que le runner a arrêtées pour une raison opérationnelle plutôt qu'en raison de l'issue de la session, avec les mêmes labels. Consultez la sémantique des compteurs du cycle de vie des sessions. |
claude_code_self_hosted_runner_initializing_sessions |
Sessions actuellement en phase d'initialisation, de l'attribution jusqu'à l'événement init de l'enfant |
claude_code_self_hosted_runner_session_init_duration_seconds |
Histogramme des durées d'initialisation des sessions |
claude_code_self_hosted_runner_session_init_errors_total |
Sessions ayant échoué avant d'atteindre l'initialisation : échec du hook de checkout, préparation git, problème de jeton ou plantage de l'enfant avant l'initialisation |
claude_code_self_hosted_runner_session_start_hook_errors_total |
Hooks SessionStart ayant signalé une erreur, un par exécution de hook en échec |
claude_code_self_hosted_runner_session_idle_seconds{session_id,client_platform} |
Jauge par session du nombre de secondes écoulées depuis que la session est inactive. Utile pour arrêter les sessions bloquées sur une demande de permission restée sans réponse. |
L'orchestrateur expose ses propres séries sur GET /metrics, sur le même port que son /healthz :
| Série | Remarques |
|---|---|
claude_code_self_hosted_orchestrator_info{version,pool_id,orchestrator_uuid,hostname} |
Toujours 1 |
claude_code_self_hosted_orchestrator_connected |
1 lorsque le poll le plus récent a réussi ; passe à 0 après tout poll en échec, quel que soit le type d'échec |
claude_code_self_hosted_orchestrator_last_poll_age_seconds |
Secondes écoulées depuis la dernière tentative de poll, réussie ou non, contrairement à la métrique du runner portant le même nom, qui mesure le temps depuis le dernier succès ; associez-la à connected pour détecter les polls en échec. La boucle de poll de l'orchestrateur attend l'exécution des hooks ; déclenchez donc l'alerte au-delà de --hook-timeout plus une marge, soit environ 90 secondes avec les valeurs par défaut, plutôt qu'à un seuil fixe de 60. |
claude_code_self_hosted_orchestrator_poll_errors_total{error_kind} |
Échecs cumulés de PollSpawnHints par type : transport, timeout, 5xx, 429 ou 4xx. Les cinq séries sont présentes dès le démarrage du processus ; alertez sur rate(...[5m]) > 0. |
claude_code_self_hosted_orchestrator_queue_pending_sessions |
Demandes de lancement pouvant être réclamées immédiatement |
claude_code_self_hosted_orchestrator_queue_backing_off_sessions |
Demandes de lancement en backoff de nouvelle tentative après un échec de hook pouvant être réessayé |
claude_code_self_hosted_orchestrator_queue_circuit_broken_sessions |
Sessions dont le lancement est bloqué. Chacune reste bloquée jusqu'à ce qu'un utilisateur lui envoie un nouveau message ou qu'un Owner la relance depuis l'onglet Activity de l'environnement. Le compteur peut rester supérieur à zéro après que vous avez corrigé la cause. Déclenchez une alerte s'il est supérieur à zéro. |
claude_code_self_hosted_orchestrator_pool_pending_sessions |
Nombre total de sessions en attente d'un runner pour cet environnement. Agrégat à l'échelle de l'environnement, identique sur chaque instance de l'orchestrateur : utilisez MAX plutôt que SUM entre les instances. |
claude_code_self_hosted_orchestrator_pool_active_sessions |
Sessions actuellement attribuées à un runner actif dans cet environnement. Agrégat à l'échelle de l'environnement, identique sur chaque instance de l'orchestrateur : utilisez MAX plutôt que SUM entre les instances. |
claude_code_self_hosted_orchestrator_spawn_hooks_total{result} |
Résultats cumulés du hook spawn-runner : ok, retryable, non_retryable. Compte les invocations de hook de l'orchestrateur, et non les enfants de session lancés par les runners : non comparable à sessions_started_total, car une capacité supérieure à un, les pools préchauffés et les runners relancés pour la même session font tous diverger les deux. |
claude_code_self_hosted_orchestrator_spawn_hook_duration_seconds |
Histogramme des durées des hooks |
claude_code_self_hosted_orchestrator_warm_hints_dispatched_total |
Demandes de lancement en attente (standby) distribuées depuis le démarrage du processus |
claude_code_self_hosted_orchestrator_session_queue_wait_seconds |
Histogramme du nombre de secondes pendant lesquelles chaque session a attendu dans la file avant que l'orchestrateur ne la réclame pour la lancer, enregistré à partir de l'horodatage d'attente en file que le plan de contrôle envoie avec la demande de lancement de chaque session. À utiliser pour les alertes sur le temps d'attente en file p50/p99. Les lancements de préchauffage ne sont pas échantillonnés. |
claude_code_self_hosted_orchestrator_clock_skew_seconds |
Décalage d'horloge local moins serveur ; diagnostic, présent une fois mesuré |
claude_code_self_hosted_orchestrator_scm_connector_connected |
1 lorsque le WebSocket du connecteur SCM est ouvert ; 0 pendant la connexion ou le backoff. Absente lorsque --scm-connector-host n'est pas défini. |
claude_code_self_hosted_orchestrator_scm_connector_requests_forwarded_total |
Requêtes HTTP cumulées transmises par proxy à l'hôte SCM configuré depuis le démarrage du processus. Absente lorsque --scm-connector-host n'est pas défini. |
Pour l'autoscaling, choisissez la série qui correspond à votre stratégie de mise à l'échelle et filtrez-la avant qu'elle n'alimente le scaler :
- Mise à l'échelle selon la profondeur de file : alimentez votre scaler HPA ou KEDA avec
claude_code_self_hosted_orchestrator_pool_pending_sessions, et nonqueue_pending_sessions. - Mise à l'échelle selon la capacité : basez la mise à l'échelle sur le rapport entre
active_sessionsetcapacitydu runner. - Filtrer sur
connected: filtrez la requête avecclaude_code_self_hosted_orchestrator_connected == 1par instance, afin que la valeur obsolète d'un réplica déconnecté n'alimente pas le scaler.
Pendant une panne complète du poll, où tous les réplicas sont déconnectés, la requête filtrée ne renvoie aucune donnée. HPA conserve le nombre de réplicas actuel en cas de métrique manquante, mais le scaler Prometheus de KEDA, avec sa valeur par défaut ignoreNullValues: "true", interprète le résultat vide comme zéro et réduit le nombre de réplicas ; définissez ignoreNullValues: "false" sur le ScaledObject, éventuellement avec un plancher de réplicas fallback.
Le PodMonitor Prometheus Operator suivant couvre les deux processus. Il sélectionne les pods selon le label app.kubernetes.io/part-of: claude-code-self-hosted-runner et le port nommé health que définit la recette Kubernetes ; adaptez les namespaces à votre déploiement :
# Exemple de PodMonitor Prometheus Operator pour le runner auto-hébergé
# Claude Code + l'orchestrateur. Adaptez le namespace et les sélecteurs de labels
# à votre déploiement. Le runner et l'orchestrateur exposent tous deux /metrics sur
# leur --health-port (8080 par défaut).
apiVersion: monitoring.coreos.com/v1
kind: PodMonitor
metadata:
name: claude-code-self-hosted-runner
namespace: monitoring
spec:
namespaceSelector:
matchNames:
- claude-runners
selector:
matchExpressions:
# Correspond au Deployment du runner de la recette Kubernetes, ainsi qu'aux
# Jobs de runners à la demande et aux pods d'orchestrateur que vous étiquetez
# de la même manière et auxquels vous attribuez un containerPort nommé 'health'.
- key: app.kubernetes.io/part-of
operator: In
values: [claude-code-self-hosted-runner]
podMetricsEndpoints:
- port: health
path: /metrics
interval: 30s
Exemples de règles d'alerte
Ces exemples de règles d'alerte constituent un point de départ ; ajustez les seuils en fonction de la taille de votre flotte :
# Exemples de règles d'alerte Prometheus pour le runner auto-hébergé Claude Code
# + l'orchestrateur. Ajustez les seuils selon la taille de votre flotte et vos SLO.
groups:
- name: claude-code-self-hosted-runner
rules:
- alert: ClaudeRunnerPollStale
expr: claude_code_self_hosted_runner_last_poll_age_seconds > 60
for: 2m
labels: {severity: warning}
annotations:
summary: "Runner {{ $labels.pod }} has not polled in >60s"
- alert: ClaudeRunnerVersionDrift
expr: count(count by (version) (claude_code_self_hosted_runner_info)) > 1
for: 30m
labels: {severity: info}
annotations:
summary: "Runners are running mixed versions"
- alert: ClaudeRunnerInitErrorsHigh
expr: sum by (namespace) (increase(claude_code_self_hosted_runner_session_init_errors_total[10m])) > 3
for: 5m
labels: {severity: warning}
annotations:
summary: "Sessions are failing before init (checkout hook / git / token / pre-init crash)"
- alert: ClaudeRunnerPollErrors
expr: sum by (pod) (rate(claude_code_self_hosted_runner_poll_errors_total[5m])) > 0
for: 2m
labels: {severity: warning}
annotations:
summary: "Runner {{ $labels.pod }}: PollWork failing ({{ $value | humanize }}/s over 5m)"
- alert: ClaudeRunnerSessionStartHookErrors
expr: sum by (namespace) (increase(claude_code_self_hosted_runner_session_start_hook_errors_total[10m])) > 3
for: 5m
labels: {severity: warning}
annotations:
summary: "SessionStart hooks are failing"
- name: claude-code-self-hosted-orchestrator
rules:
- alert: ClaudeOrchestratorDisconnected
expr: claude_code_self_hosted_orchestrator_connected == 0
for: 2m
labels: {severity: critical}
annotations:
summary: "Orchestrator {{ $labels.pod }} cannot reach the Anthropic control plane"
- alert: ClaudeOrchestratorPollStale
expr: claude_code_self_hosted_orchestrator_last_poll_age_seconds > 90
for: 2m
labels: {severity: warning}
annotations:
summary: "Orchestrator {{ $labels.pod }} has not polled in >90s (poll loop waits on hook execution)"
- alert: ClaudeOrchestratorCircuitBroken
expr: max by (namespace) (claude_code_self_hosted_orchestrator_queue_circuit_broken_sessions and on (instance) max_over_time(claude_code_self_hosted_orchestrator_connected[2m]) == 1) > 0
for: 1m
labels: {severity: critical}
annotations:
summary: "Sessions blocked from spawning: {{ $value }}. Read each one's error in the Activity tab, fix the cause, then select Retry"
- alert: ClaudeOrchestratorPollErrors
expr: sum by (pod) (rate(claude_code_self_hosted_orchestrator_poll_errors_total[5m])) > 0
for: 2m
labels: {severity: warning}
annotations:
summary: "Orchestrator {{ $labels.pod }}: PollSpawnHints failing ({{ $value | humanize }}/s over 5m)"
- alert: ClaudeOrchestratorSpawnHookFailing
expr: sum by (pod) (increase(claude_code_self_hosted_orchestrator_spawn_hooks_total{result!="ok"}[5m])) > 3
for: 5m
labels: {severity: warning}
annotations:
summary: "Orchestrator {{ $labels.pod }}: >3 spawn-runner hook failures in 5m"
Alerter en cas de perte de runners et de sessions en attente
Pour être alerté lorsque des runners sont perdus, que des sessions attendent ou que l'orchestrateur est arrêté, chargez ces règles d'alerte Prometheus en complément des exemples de règles d'alerte :
- Flotte fixe :
ClaudeRunnersBelowFloor - Runners à la demande :
ClaudeOrchestratorSessionsWaiting,ClaudeOrchestratorQueueWaitHighetClaudeOrchestratorAbsent
Alerter lorsqu'une flotte fixe perd des runners
ClaudeRunnersBelowFloor se déclenche lorsque le nombre de runners enregistrés et scrapés restants est inférieur au plancher pendant 10 minutes :
groups:
# Flottes fixes uniquement. Avec des runners à la demande, le nombre suit la demande,
# donc ClaudeRunnersBelowFloor se déclencherait dès que la demande est faible.
- name: claude-code-self-hosted-fixed-fleet-capacity
rules:
- alert: ClaudeRunnersBelowFloor
expr: (count(claude_code_self_hosted_runner_info{namespace="claude-runners"}) or vector(0)) < 2
for: 10m
labels: {severity: critical, namespace: claude-runners}
annotations:
summary: "Runners registered and scraped: {{ $value }}, below the floor. Check the runner workloads first, then the scrape targets if all are running."
- Plancher : définissez le
2dansexprà environ la moitié de votre nombre de réplicas, arrondi à l'entier supérieur. Avec trois réplicas, conservez2: l'alerte se déclenche lorsqu'il reste un seul runner ou aucun. - Namespace : remplacez
claude-runnersdans le matcher et danslabels, et dupliquez l'alerte pour chaque namespace supplémentaire. Si vos cibles n'ont pas de labelnamespace, supprimez le matcher et le label, sinon l'alerte lit 0 et se déclenche. ClaudeRunnerPollStaleetClaudeRunnerPollErrors: gardez-les chargées depuis les exemples de règles d'alerte, carClaudeRunnersBelowFloorcompte toujours un runner qui ne parvient pas à effectuer de poll
Alerter lorsque des sessions attendent des runners à la demande
ClaudeOrchestratorSessionsWaiting se déclenche lorsque le nombre de sessions en attente d'un runner reste supérieur à 0 pendant 10 minutes. ClaudeOrchestratorQueueWaitHigh se déclenche lorsque plus de 1 % des attentes en file au cours des 10 dernières minutes ont dépassé 160 secondes, et que cette situation dure 5 minutes :
groups:
# Runners à la demande uniquement. Aucune modification nécessaire pour le namespace.
- name: claude-code-self-hosted-on-demand-capacity
rules:
- alert: ClaudeOrchestratorSessionsWaiting
expr: |
max by (namespace) (
claude_code_self_hosted_orchestrator_pool_pending_sessions
and on (instance)
max_over_time(claude_code_self_hosted_orchestrator_connected[2m]) == 1
) > 0
for: 10m
labels: {severity: warning}
annotations:
summary: "Sessions waiting for a runner: {{ $value }}, above the threshold for 10 minutes. Check claude_code_self_hosted_orchestrator_spawn_hooks_total by result, then runner workloads that don't start."
- alert: ClaudeOrchestratorQueueWaitHigh
expr: |
histogram_quantile(0.99, sum by (namespace, le) (
rate(claude_code_self_hosted_orchestrator_session_queue_wait_seconds_bucket[10m])
)) > 160
for: 5m
labels: {severity: warning}
annotations:
summary: "Over 1% of queue waits in the last 10 minutes exceeded 160 seconds. Check whether ClaudeOrchestratorDisconnected is firing, then claude_code_self_hosted_orchestrator_spawn_hooks_total by result and claude_code_self_hosted_orchestrator_spawn_hook_duration_seconds."
- Seuil : si une session est toujours en attente, augmentez le
> 0deClaudeOrchestratorSessionsWaitingau-dessus du nombre que vous observez habituellement ClaudeOrchestratorDisconnected: gardez-la chargée depuis les exemples de règles d'alerte, carClaudeOrchestratorSessionsWaitingcesse de se déclencher environ 2 minutes après la déconnexion du dernier orchestrateur du namespace
Alerter lorsque l'orchestrateur est arrêté
Pour savoir si l'orchestrateur lui-même est arrêté, chargez ClaudeOrchestratorAbsent. Elle se déclenche lorsqu'aucun orchestrateur du namespace n'a été scrapé depuis 5 minutes :
groups:
# Runners à la demande uniquement. Remplacez claude-runners par le namespace de l'orchestrateur.
- name: claude-code-self-hosted-on-demand-orchestrator
rules:
- alert: ClaudeOrchestratorAbsent
expr: absent(claude_code_self_hosted_orchestrator_connected{namespace="claude-runners"})
for: 5m
labels: {severity: critical}
annotations:
summary: "No orchestrator has been scraped for 5 minutes. If it's down, no on-demand runner starts, and sessions wait. Check the orchestrator workload first, then its scrape target if it's running."
- Namespace : remplacez
claude-runnerspar le namespace de l'orchestrateur, et dupliquez l'alerte pour chaque namespace supplémentaire qui exécute un orchestrateur. Si vos cibles n'ont pas de labelnamespace, supprimez le matcher, sinon l'alerte se déclenche au bout de 5 minutes et reste active. - Serveurs Prometheus qui ne scrapent pas l'orchestrateur : n'incluez pas l'alerte dans leurs fichiers de règles, car sur un tel serveur elle se déclenche au bout de 5 minutes et reste active
- Ne vous fiez pas aux autres alertes de l'orchestrateur : elles lisent des métriques que l'orchestrateur expose lui-même.
ClaudeOrchestratorSessionsWaiting,ClaudeOrchestratorQueueWaitHighet les exemples de règles d'alerte de l'orchestrateur cessent tous de se déclencher dans les 10 minutes environ suivant l'arrêt de l'orchestrateur.
Relayer les métriques des enfants de session
Chaque session s'exécute dans son propre processus enfant avec ses propres métriques OpenTelemetry ; avec une --capacity supérieure à un, le runner réécrit la manière dont ces métriques enfants sont exposées. Définir OTEL_METRICS_EXPORTER=prometheus sur l'hôte du runner et CLAUDE_CODE_ENABLE_TELEMETRY=1 dans l'environnement de la session, par exemple depuis votre script wrapper ou l'environnement du runner lui-même, dont les sessions héritent, réexpose les instruments de type compteur et jauge de chaque enfant sur l'endpoint /metrics du runner, à côté des séries du runner. Le runner réécrit l'exportateur de l'enfant pour qu'il envoie via OTLP vers un récepteur en loopback uniquement sur le port de santé, ajoute à chaque série les labels session_id et client_platform, et supprime les séries d'une session lorsque celle-ci se termine. Les histogrammes ne sont pas relayés, et une métrique enfant dont le nom entrerait en conflit avec le préfixe propre du runner est ignorée.
Avec la valeur par défaut --capacity 1, la réécriture ne s'applique pas : l'enfant de la session lie son propre endpoint Prometheus sur le port 9464, comme d'habitude.
Joindre les métriques d'une session à celles du runner
Pour connaître le coût des sessions inactives, joignez la métrique claude_code_self_hosted_runner_session_idle_seconds du runner à la métrique de coût de Claude Code sur ccr_session_id. La métrique du runner ne porte pas ce label ; attribuez-le-lui avec label_replace, comme dans cette requête :
sum by (ccr_session_id) (claude_code_cost_usage_total)
and on (ccr_session_id)
label_replace(
claude_code_self_hosted_runner_session_idle_seconds > 600,
"ccr_session_id", "cse_$1", "session_id", "session_(.*)"
)
La requête renvoie un résultat par session inactive depuis plus de dix minutes : le coût en dollars américains que son processus Claude Code a comptabilisé jusqu'à présent. Pour joindre une autre métrique Claude Code, remplacez claude_code_cost_usage_total dans la requête. La requête fonctionne quelle que soit la --capacity.
session_id: sur le port 9464, ce label sur les métriques Claude Code contient lesession.idpropre à Claude Code, qui ne correspond à aucune série du runner. Une jointure sur ce label ne renvoie rien ; effectuez donc la jointure surccr_session_id.- Les métriques Claude Code n'ont pas de
ccr_session_id: vérifiez queOTEL_METRICS_INCLUDE_SESSION_IDn'est pas défini surfalse
Sémantique des compteurs du cycle de vie des sessions
Les compteurs sessions_started_total, sessions_completed_total, sessions_failed_total et sessions_interrupted_total classent chaque session selon la manière dont elle s'est terminée. Chaque enfant de session lancé incrémente sessions_started_total au moment du lancement, et exactement un des trois autres compteurs est incrémenté à la sortie ; ainsi, sessions_started_total moins la somme des trois autres est égal au nombre d'enfants de session en cours d'exécution.
completed: la session s'est terminée proprement. Cela couvre l'enfant qui se termine de lui-même avec le code0, la session archivée ou supprimée alors que l'enfant était encore connecté, et le runner qui restitue proprement le slot : libération de la session à l'expiration du délai d'inactivité, à l'heure de retrait ou à la limite--kill-session-after-min; un délai d'expiration au démarrage ; ou une désattribution côté serveur détectée par la boucle de poll avant la sortie de l'enfant. Incrémentesessions_completed_total.failed: l'enfant s'est terminé de lui-même avec un code non nul, soit à la suite d'un plantage, soit d'un échec de configuration après le lancement. Incrémentesessions_failed_total.interrupted: le runner a arrêté l'enfant pour une raison opérationnelle qui n'est ni un succès de la session ni une défaillance du runner, comme un drain, ou l'arrêt d'une session encore présente sur le runner à la fin de la fenêtre de grâceSELF_HOSTED_RUNNER_MAX_LIFETIME_GRACE_MSqui suit sa limite--kill-session-after-min. Un redémarrage progressif Kubernetes envoyantSIGTERMest un exemple de drain. Incrémentesessions_interrupted_total.
Avant la v2.1.260, le runner arrêtait chaque session atteignant sa limite --kill-session-after-min et la comptabilisait dans sessions_interrupted_total.
La variable CLAUDE_RUNNER_EXIT_REASON du hook post-session classe différemment les restitutions propres. Le hook les signale comme interrupted, car c'est le runner qui a arrêté l'enfant : une libération, un délai d'expiration au démarrage, une désattribution par le serveur, et une archive ou une suppression détectée en premier par le poll. Ces compteurs enregistrent les mêmes événements comme completed, car le slot a été restitué proprement.
Si vous rapprochez directement les accusés de réception du hook de sessions_completed_total, vous sous-estimez le nombre de sessions terminées. Utilisez le hook pour les garanties par session et les compteurs pour les taux agrégés.
Sur un environnement à usage unique, avec --capacity 1 et la valeur par défaut --drain-grace-sec 0, chaque processus runner se termine quelques instants après la fin de son unique session. sessions_completed_total, sessions_failed_total et sessions_interrupted_total ne sont incrémentés qu'à la fin de la session, juste avant cette sortie ; un scrape Prometheus toutes les 15 à 60 secondes capte donc rarement l'incrément avant la disparition des séries du runner. Ces trois compteurs de fin de session sont les compteurs terminaux auxquels fait référence le reste de cette section. sessions_started_total est incrémenté au lancement et reste visible pendant toute la durée de la session ; il apparaît donc de manière fiable, mais sur un environnement à usage unique, il s'interprète davantage comme « sessions en cours d'exécution » que comme un compteur cumulatif.
Utilisez les séries de ce tableau pour l'objectif correspondant plutôt que les compteurs terminaux :
| Objectif | À utiliser |
|---|---|
| Débit | claude_code_self_hosted_orchestrator_spawn_hooks_total{result="ok"}, un compteur sur l'orchestrateur de longue durée qui s'incrémente une fois par hook spawn-runner réussi et reste pertinent avec rate(). Il compte les invocations de hook plutôt que les sessions ; le préchauffage et les lancements répétés pour la même session le font donc diverger du nombre de sessions. |
| Utilisation | sum(claude_code_self_hosted_runner_active_sessions) comparé à sum(claude_code_self_hosted_runner_capacity), deux jauges valides à chaque scrape, quelle que soit la durée de vie du runner |
| Arriéré | claude_code_self_hosted_orchestrator_pool_pending_sessions pour la profondeur de file, et claude_code_self_hosted_orchestrator_queue_circuit_broken_sessions, avec une alerte si la valeur est supérieure à zéro |
| Échecs | claude_code_self_hosted_runner_sessions_failed_total, au mieux : les véritables plantages après le lancement l'incrémentent bien, et rate() est pertinent sur les runners qui survivent à leurs sessions avec --drain-grace-sec supérieur à 0. Un environnement à usage unique présente le même problème de fenêtre de scrape que les autres compteurs terminaux ; considérez donc toute valeur non nulle observée comme méritant une investigation. Les échecs antérieurs au lancement, comme un échec du hook de checkout, la préparation git ou un problème de jeton, n'apparaissent que dans session_init_errors_total. |
Les lignes orchestrator_* n'existent que sur les environnements exécutant l'orchestrateur à la demande. Sur une flotte fixe dont les runners survivent à leurs sessions, avec --drain-grace-sec supérieur à 0, utilisez sum(rate(claude_code_self_hosted_runner_sessions_started_total[5m])) pour le débit ; sur une flotte à usage unique, cette série présente le même problème de fenêtre de scrape que les compteurs terminaux ; fiez-vous donc plutôt au nombre de sessions en file d'attente. Vérifiez l'arriéré dans l'onglet Activity de l'environnement, sur la page d'administration Cloud environments : les runners n'exportent pas de série de profondeur de file.
Pour un suivi des résultats par session, utilisez plutôt le hook post-session : il se déclenche à chaque fin de session pour laquelle un processus enfant a été lancé, sauf en cas d'arrêt brutal du runner, comme une préemption de VM, conformément au contrat propre au hook.
Étapes suivantes
- Environnements auto-hébergés : le modèle d'environnement, de runner et de session ; le guide de démarrage rapide et Déployer en production contiennent la configuration et les opérations
- Personnaliser les sessions : scripts wrapper, hooks de cycle de vie et runners à la demande
- Vérifier l'identité de la session : le token de session, ses revendications et comment le vérifier