Monitorare e risolvere i problemi dei worker self-hosted
Leggi la profondità della coda, arresta sessioni e worker senza perdere lavoro e risolvi i problemi comuni delle sandbox self-hosted.
Le chiamate di monitoraggio in questa pagina vengono eseguite dai tuoi strumenti di monitoraggio o di gestione operativa, autenticate con la tua chiave API di Claude. Gli helper del worker gestiscono il ciclo di acquisizione e keep-alive, quindi non devi chiamare direttamente quegli endpoint.
Leggere la profondità della coda
client.beta.environments.work.stats() restituisce lo stato della coda per un ambiente:
| Campo | Significato | Usalo per |
|---|---|---|
depth | Elementi in attesa di essere acquisiti. | Scalare la tua flotta di worker o generare avvisi in caso di arretrato. |
pending | Elementi acquisiti da un worker ma non ancora confermati. Gli helper del worker confermano ogni elemento prima di elaborarlo, quindi questo valore resta vicino a zero durante il normale funzionamento. | Rilevare un worker bloccato tra l'acquisizione e la conferma: genera un avviso se il valore resta diverso da zero. |
oldest_queued_at | Timestamp dell'elemento più vecchio ancora in coda, in attesa di essere acquisito oppure acquisito ma non ancora confermato. null quando non ce n'è nessuno. | Vedere da quanto tempo attende l'elemento più vecchio. |
workers_polling | Worker che hanno eseguito il polling negli ultimi 30 secondi. | Generare avvisi sulla liveness. |
import os
import anthropic
client = anthropic.Anthropic()
stats = client.beta.environments.work.stats(os.environ["ANTHROPIC_ENVIRONMENT_ID"])
print(f"depth={stats.depth} pending={stats.pending}"){
"type": "work_queue_stats",
"depth": 0,
"pending": 0,
"oldest_queued_at": null,
"workers_polling": 0
}Arrestare una sessione in modo controllato
Usa client.beta.environments.work.stop() per chiedere al worker che gestisce una sessione specifica di chiuderla.
Per impostazione predefinita l'elemento di lavoro passa a stopping. Il worker se ne accorge al successivo heartbeat del lease, annulla la chiamata allo strumento in corso della sessione e conferma l'arresto. L'elemento di lavoro diventa quindi stopped.
Passa force=True per contrassegnare immediatamente l'elemento di lavoro come stopped invece di attendere la conferma del worker.
Poiché queste chiamate vengono eseguite dai tuoi strumenti operativi anziché dall'host del worker, ANTHROPIC_WORK_ID non viene impostato automaticamente. Impostalo sull'ID dell'elemento di lavoro di destinazione prima di eseguire gli esempi seguenti. Per trovare l'ID di un elemento di lavoro, elenca gli elementi di lavoro dell'ambiente tramite gli endpoint Environments Work.
import os
import anthropic
client = anthropic.Anthropic()
work = client.beta.environments.work.stop(
os.environ["ANTHROPIC_WORK_ID"],
environment_id=os.environ["ANTHROPIC_ENVIRONMENT_ID"],
)
print(work.state)Arrestare i worker in modo controllato
Un worker che viene annullato mentre una sessione è in esecuzione arresta il lavoro in corso prima di terminare. Se alla sessione sono collegati dei memory store, il worker salta la sincronizzazione finale ma carica comunque i file modificati e rimuove le directory degli store.
Un processo terminato forzatamente non esegue alcun teardown. Per arrestare un worker in modo pulito:
-
Assicurati che SIGTERM e SIGINT annullino il worker. Il modo dipende dal worker:
Worker Cosa fare CLI antNiente. La CLI gestisce autonomamente entrambi i segnali: annulla qualsiasi chiamata allo strumento in corso, invia il risultato di errore e rilascia l'elemento di lavoro. Worker SDK che è un processo a sé stante EnvironmentWorkernon installa gestori di segnali. Annulla il worker da un gestore di segnali, come fanno gli esempi di worker standalone.Worker SDK all'interno di un server webhook Annulla il worker dall'hook di arresto del server stesso, come fanno gli esempi webhook. Il worker non deve prendere il controllo dei segnali del server. -
Arresta il worker con SIGTERM e attendi almeno 30 secondi prima di qualsiasi terminazione forzata. Il caricamento finale può richiedere tutto quel tempo. Per impostazione predefinita Docker invia SIGKILL 10 secondi dopo il segnale di arresto. Aumenta questo limite con
--stop-timeoutsudocker run, oppure con il periodo di tolleranza per la terminazione del tuo orchestratore.
Se un worker viene terminato forzatamente prima che venga eseguito il suo teardown, tutte le modifiche alla memoria non ancora sincronizzate vanno perse. Su un host di lunga durata, rimuovi anche la directory dello store rimasta in /mnt/memory/ prima della sessione successiva che collega quello store. Una sandbox che serve una sola sessione e viene poi eliminata non richiede alcuna pulizia.
Risoluzione dei problemi
Il worker non si connette
Se workers_polling resta a 0, il worker non raggiunge la coda. Verifica che ANTHROPIC_ENVIRONMENT_KEY e ANTHROPIC_ENVIRONMENT_ID siano impostati sull'host del worker.
Una sessione resta in coda
Nessun worker sta acquisendo il lavoro. Una sessione in coda resta in attesa anziché fallire. Controlla workers_polling e depth in Leggere la profondità della coda.
Il montaggio dei memory store non riesce
Il worker registra nei log gli errori di montaggio e di sincronizzazione in background anziché segnalarli alla sessione. Solo i rifiuti dovuti alla sola lettura raggiungono l'agente, come errori degli strumenti (vedi Store di sola lettura e conflitti).
Se il worker non riesce a montare un memory store quando acquisisce una sessione, fa fallire l'elemento di lavoro. La sessione non emette alcun evento di errore e resta inattiva.
| Sintomo | Causa | Soluzione |
|---|---|---|
Il log del worker contiene the work item carried no sessions token (in Go, l'errore ErrSessionMemoryNoToken) e l'elemento di lavoro fallisce. | Il secret per sessione dell'elemento di lavoro non ha raggiunto il worker. O il tuo codice non lo ha inoltrato, oppure i memory store sulle sandbox self-hosted non sono abilitati per la tua organizzazione. | Inoltra il segreto dell'elemento di lavoro. Se il worker esegue il polling e le sessioni in un unico processo e registra comunque questo messaggio, contatta il supporto. |
Il log del worker contiene something already exists at the memory store's path. | Una directory rimasta da una sessione precedente, di solito una il cui worker è stato terminato forzatamente prima che venisse eseguito il suo teardown. | Rimuovi la directory rimasta indicata dalla riga di log. Le modifiche al suo interno non ancora sincronizzate vanno perse. |
Il log del worker contiene cannot create the memory store's folder e the worker host must make this mount path writable. | L'utente con cui viene eseguito il worker non può creare directory in /mnt/memory. | Crea /mnt/memory ed esegui chown assegnandola a quell'utente. Vedi Preparare l'host. |
La sessione resta idle con uno stop reason requires_action e nessun evento di errore poco dopo che un worker l'ha acquisita. | Il worker ha fatto fallire l'elemento di lavoro perché non è riuscito a montare un memory store, per uno dei motivi precedenti. | Correggi la causa sull'host, quindi invia un evento user.interrupt. Il lavoro della sessione viene rimesso in coda e il worker successivo che lo acquisisce ritenta il montaggio. |
Una chiamata a uno strumento personalizzato non restituisce mai un risultato
Se la sessione resta in pausa con uno stop reason requires_action, nessun worker o client serve quello strumento. Vedi Servire uno strumento personalizzato.
Una chiamata a uno strumento MCP incapsulato si blocca
Senza un timeout sul client MCP, una chiamata bloccata a un server MCP incapsulato diventa un risultato di errore dello strumento solo quando scatta un meccanismo di sicurezza:
| SDK | Meccanismo di sicurezza | Scatta dopo |
|---|---|---|
| Python | Il limite delle chiamate agli strumenti del worker stesso | Circa due minuti e mezzo |
| TypeScript | Il timeout predefinito delle richieste dell'SDK MCP | Circa un minuto |
| Go | Il worker annulla una chiamata allo strumento che supera il suo limite predefinito | 120 secondi |
Was this page helpful?