07/Documentation
Solução de problemas de um durable agent
Um durable agent que não aparece ou diz Unreachable: as primeiras verificações, cada motivo e como corrigir, as linhas do doctor e os casos comuns
Experimental. O protocolo de rede, o SDK e esta página podem mudar, ou o recurso pode ser removido, em uma versão secundária posterior. Durable agents explica o que decide sua permanência.
Um durable agent que não aparece, exibe Unreachable ou não responde a um toque: três comandos encontram a causa, e uma tabela de motivos com uma lista de casos fornece a solução. Solução de problemas cobre o Collie como um todo.
Primeiras verificações
Execute estes três, nesta ordem:
collie durable list
collie doctor
collie logs| comando | o que ele mostra para um durable agent |
|---|---|
collie durable list | Uma linha por entrada de sources.json, com o estado atribuído pela bridge em execução: loaded, not loaded (restart to apply), refused (<status>) ou bridge not answering. loaded significa que a bridge carregou a entrada. Não significa que o durable agent responde. Um not loaded também aparece quando a bridge responde HTTP 400 para o nome |
collie doctor | Consulta o próprio durable agent. Ele imprime as linhas de Linhas do doctor para durable agents e indica a verificação com falha junto com uma solução |
collie logs | A linha de inicialização de cada durable agent, [bridge] program "desk": durable, private socket /run/user/1000/desk/app.sock, e seu motivo quando uma configuração viola uma regra. Um sources.json inválido imprime [bridge] FATAL:. Uma falha de leitura imprime [state] poll failed, marking disconnected: <reason> uma vez por interrupção. Linhas que começam com [durable] indicam recusa de versão, um lead desatualizado, itens descartados e um log excluído |
O telefone mostra menos informações. A linha de um durable agent exibe Starting ou Unreachable e não fornece nenhum motivo. Uma recusa de versão de protocolo tem uma mensagem própria, Version mismatch, e uma caixa de aviso na página inicial do durable agent. Um token recusado tem sua própria mensagem na barra de conexão. collie doctor e collie logs indicam todos os outros motivos.
A tabela de motivos
Quando o Collie não consegue alcançar um agente durável, o restante do Collie inicia mesmo assim, e o agente durável aparece como inacessível com um motivo.
Um motivo indica o nome da variável de ambiente mesmo quando o agente durável é uma entrada de sources.json. Leia COLLIE_DURABLE_SOCKET como o socket da entrada, COLLIE_DURABLE_URL como seu url e COLLIE_DURABLE_TOKEN como seu token. A correção para uma entrada fica em sources.json. A correção para o formato exclusivo para duráveis fica em .env, depois collie restart.
A configuração viola uma regra
O Collie relata estes erros sem discar para o agente durável. Regras presentes em entradas de sources.json também são recusadas no início da bridge (Um erro de digitação em sources.json).
| motivo | o que significa e a correção |
|---|---|
COLLIE_DURABLE_SOCKET is not set | O formato exclusivo para duráveis não tem um caminho de socket. Defina-o, ou defina a URL com seu token |
COLLIE_DURABLE_SOCKET must be an absolute path | Informe o caminho completo, começando com / |
COLLIE_DURABLE_SOCKET is longer than 103 bytes | Encurte o caminho. Mantenha-o abaixo de $XDG_RUNTIME_DIR |
the private socket transport is not available on Windows; set COLLIE_DURABLE_URL and COLLIE_DURABLE_TOKEN instead | O Windows não tem transporte por socket. Use uma URL e um token |
COLLIE_DURABLE_SOCKET and COLLIE_DURABLE_URL are both set; set the socket, or the URL with its token, not both | O formato exclusivo para duráveis recebeu ambos. Mantenha apenas um transporte |
COLLIE_DURABLE_URL is set without COLLIE_DURABLE_TOKEN; the durable agent refuses a caller with no token | O formato exclusivo para duráveis recebeu uma URL e nenhum token. Defina o token |
COLLIE_DURABLE_TOKEN is set without COLLIE_DURABLE_URL; a token is only sent to a URL | O formato exclusivo para duráveis recebeu um token e nenhuma URL. Defina a URL ou remova o token |
COLLIE_DURABLE_URL is longer than 2048 bytes | Encurte a URL para o endereço base do agente durável |
COLLIE_DURABLE_URL is not a URL | Escreva como https://host |
COLLIE_DURABLE_URL must start with https:// | Qualquer esquema além de https:// é recusado. Um http:// simples tem sua própria linha abaixo |
COLLIE_DURABLE_URL uses plain http to <host>, so the token would cross the network unencrypted; use https://, or http://127.0.0.1:<port> for wrangler dev | Use https://. http simples é para 127.0.0.1 ou localhost com uma porta |
COLLIE_DURABLE_URL uses plain http on loopback without a port; name the port, for example http://127.0.0.1:8801 | Adicione a porta |
COLLIE_DURABLE_URL must not carry a user name or password; the token goes in COLLIE_DURABLE_TOKEN | Remova o nome de usuário e a senha da URL |
COLLIE_DURABLE_URL must not carry a query or a fragment | Remova a parte ? e a parte # da URL |
COLLIE_DURABLE_URL names the durable agent's base only; leave out /session/v1, the adapter adds it | Corte o /session/v1 do caminho |
COLLIE_DURABLE_TOKEN is <n> bytes; it must be at least 32 bytes, for example 64 hex characters from openssl rand -hex 32 | Gere um token mais longo e forneça o mesmo ao agente durável |
COLLIE_DURABLE_TOKEN must be printable ASCII with no spaces | Remova espaços e outros caracteres do token |
COLLIE_DURABLE_TOKEN is longer than 4096 bytes | Um cabeçalho desse tamanho é um erro. Use um token mais curto |
O agente durável não responde, ou responde incorretamente
| motivo | o que significa e a correção |
|---|---|
no socket at <path> | Não há nada no caminho ainda. Inicie o agente durável ou corrija o caminho |
cannot check <path>: <message> | O Collie não conseguiu ler o caminho. Torne-o legível para o seu usuário |
socket-not-private: <check> | A navegação pelo caminho falhou, e o texto após os dois-pontos indica a parte. A verificação de privacidade falhou contém as ocorrências comuns |
connection refused | Nada escuta. Um agente durável que travou pode deixar seu arquivo de socket para trás: Um arquivo de socket órfão. Em https, nada escuta na URL |
no answer within <n>ms | O agente durável trava ou está frio. O Collie espera 1000 ms em um socket e 5000 ms em https |
tls refused: <message> | O certificado da URL foi recusado. O Collie não tem opção para ignorar a verificação |
the host name does not resolve | O nome do host na URL está errado, ou sua rede não consegue alcançá-lo |
token-refused: the durable agent answered 401 ou 403 | O agente durável recusou o token. O agente durável recusou o token |
too-large | O agente durável respondeu com mais do que o Collie lê: 16 KiB para hello, 4 MiB para um snapshot. Reduza o tamanho da resposta |
incompatible: the durable agent speaks 2..3, this Collie speaks 1..1 | Os intervalos de versão não são compatíveis. Atualize o lado mais antigo. collie doctor mostra ambos os intervalos e o log recebe uma linha por intervalo |
incompatible: not a durable agent | Outra coisa responde nesse caminho ou URL. Aponte a entrada para o agente durável |
incompatible: the durable agent asks for a token | Um agente durável em um socket exige um token, que um socket nunca transmite. Atualize o lado mais antigo ou acesse-o por URL com um token |
unreadable hello: <detail> ou unreadable snapshot: <detail> | O agente durável enviou um documento que o protocolo de comunicação não permite. Leia o log do próprio agente durável |
the durable agent answered <status> ou the durable agent answered 409 <code> | O agente durável respondeu com um status que o protocolo de comunicação não usa aqui. Leia o log do próprio agente durável |
starting | O agente durável está ativo e informa que não está pronto, ou responde com 503. O Collie tenta novamente na próxima sondagem |
Linhas do doctor para durable agents
collie doctor faz a cada agente durável as mesmas perguntas que o bridge faz, na ordem em que o bridge as faz. Ele não envia nada além de hello.
Cada entrada de sources.json recebe um bloco de seis linhas, escrito durable-socket:desk para um agente durável chamado desk. Uma linha sources antes dos blocos verifica o arquivo, e uma linha durable-lead os segue. Um Collie exclusivo para duráveis imprime as mesmas seis linhas sem sufixo, e sua linha mux exibe durable, see the durable-* lines.
| linha | verde | aviso ou vermelho |
|---|---|---|
sources | 2 durable agents in <path>, mode 0600 | Vermelho quando o arquivo não pode ser analisado. Sua correção informa que o bridge não inicia enquanto estiver errado. Vermelho quando o grupo ou outros podem ler o arquivo, com chmod 600 como correção, pois uma entrada pode conter um token |
durable-env | transport: private socket com o caminho, ou transport: https with a bearer token | Vermelho quando a configuração viola uma regra de a tabela de motivos |
durable-socket | O caminho é um socket, seu, modo 0600, em uma pasta sua com modo 0700, sem link no caminho | Vermelho, e a linha indica a verificação com falha: nada lá, ilegível, não é um socket, um symlink, não é uma pasta, uma pasta de outro proprietário, uma pasta com o modo errado, uma pasta acima que outros podem gravar, um socket de outro proprietário ou um socket com modo aberto. Ignorado em um agente durável atrás de https |
durable-url | O endereço, https ou http de loopback, e seu tamanho em bytes | Vermelho quando a URL viola uma regra. Ignorado em um socket |
durable-token | set, <n> bytes. O Collie nunca imprime o valor | Vermelho quando o token viola uma regra. Ignorado em um socket |
durable-hello | O agente durável respondeu. Ambos os intervalos, a versão em que concordam | Vermelho com a causa: o token foi recusado, nada respondeu, algo que não é um durable agent respondeu, o durable agent pede um token em um socket, um hello ilegível ou intervalos que não se cruzam. Uma divergência de intervalo mostra ambos os intervalos |
durable-ready | ready, o nome de host do durable agent e sua época | Um aviso quando o durable agent informa que ainda não está pronto |
durable-lead | O lead é novo o suficiente para exibir o card de pergunta | Consulte Em uma crew |
Uma linha com falha interrompe as linhas seguintes. Elas são exibidas como ignoradas com o motivo fix the row above first, porque o Collie nunca faz requisições a um durable agent por um socket que falhe na verificação de privacidade ou com um token que viole sua regra. Uma linha ignorada não é uma falha.
Casos
Cada caso informa o que você vê, o motivo e a correção.
Um erro de digitação em sources.json
Você vê o Collie fora do ar, e não apenas um durable agent: o celular não consegue se conectar. collie logs termina com [bridge] FATAL:, o caminho do arquivo, a entrada e o campo.
A bridge lê sources.json na inicialização e para em um campo desconhecido, um kind que não seja durable, um nome que viole a regra, um nome duplicado, socket e url juntos, nenhum dos dois, um url sem token ou um token com um socket. Corrija o arquivo e execute collie restart. O collie doctor mostra a mesma mensagem na linha sources.
Quando a bridge não consegue nomear a entrada (ela não é um objeto, tem um campo desconhecido ou o nome viola a regra), ela conta a partir de 0 e grava entry 1 para a segunda entrada. O collie durable attach conta a partir de 1 e grava entry 2 para a mesma entrada. Ambos indicam qual é o campo. Quando o nome for válido, a bridge grava o nome: entry "desk".
attach e detach se recusam a gravar um arquivo que não conseguem ler, portanto um erro de digitação nunca afeta suas outras entradas. Eles param com o código de saída 1.
Um durable agent não aparece após o attach
Você não vê nenhum durable agent no celular, e collie durable list indica not loaded (restart to apply).
attach e detach apenas gravam sources.json. A bridge o lê na inicialização. Execute collie restart ou adicione --restart ao verbo da próxima vez. Quando not loaded persistir após uma reinicialização, leia collie logs: list formula um HTTP 400 da bridge da mesma forma que um 404.
A verificação de privacidade falhou
Você vê socket-not-private: the socket's folder /tmp/hello has mode 0755, not 0700, e a linha do doctor durable-socket está vermelha.
O Collie só se conecta a um socket se o caminho inteiro for privado. As causas comuns são uma pasta com modo 0755, um socket diretamente em /tmp ou em outra pasta compartilhada e um link simbólico no caminho. É fácil não notar um link simbólico: /var/run aponta para /run em muitos hosts Linux, então um caminho que começa com /var/run/ falha com /var/run is a symlink. Use o caminho real.
Execute chmod 700 na própria pasta do socket ou mova o socket para $XDG_RUNTIME_DIR. As regras estão em Segurança de um durable agent. Um durable agent criado com o SDK se recusa a iniciar em uma pasta existente cujo modo não seja 0700, e avisa isso por conta própria.
Um arquivo de socket órfão
Você vê connection refused em um socket, e o arquivo existe.
Um durable agent que travou deixa seu arquivo de socket para trás, e nada escuta nele. Inicie o durable agent novamente. O SDK remove um arquivo de socket inativo antes de escutar e para com another instance is already listening quando o socket estiver ativo. Exclua o arquivo manualmente apenas se o durable agent não limpá-lo.
Um nome que também é uma sessão de terminal
Você vê a bridge parar na inicialização com the name is the terminal session's own; pick another, ou uma sessão de terminal ausente no celular.
Um durable agent não pode ter o mesmo nome do terminal a partir do qual o Collie é executado. Esse nome é default na maioria das instalações e, em um Collie apenas com durable agents, default é o do seu durable agent. A bridge para na inicialização e nomeia a entrada. Uma sessão do Herdr com o mesmo nome de um durable agent é outro caso: o durable agent mantém o nome, o celular não mostra essa sessão e o log avisa isso uma vez. Renomeie um deles.
Um aviso de durable-ready que persiste
Você vê durable-ready como um aviso em cada execução de collie doctor.
O durable agent responde com hello e informa ready: false. O celular o mostra como Starting. Um durable agent só informa que está pronto depois de estruturar suas conversas e reabrir suas perguntas em aberto. Leia o próprio log do durable agent para saber o que ele está aguardando.
O durable agent para na inicialização na verificação de descendentes
Você vê o durable agent parar na inicialização com the descendant check needs Bun on Linux to read the peer of a socket; pass callerCheck: "off" to run without it.
A verificação requer o Bun no Linux. No macOS, execute o durable agent com Node ou passe callerCheck: "off" para openCollie e leia o que a verificação protege primeiro. O erro se origina no durable agent. O Collie não está envolvido.
Uma pergunta volta após uma reinicialização
Você vê uma pergunta novamente após a reinicialização do durable agent, ou um card informando que ela já foi respondida.
Uma resposta a uma pergunta de antes da reinicialização recebe too-late, e o card mostra isso e desaparece. Um durable agent que deriva o id da pergunta a partir da chamada de ferramenta faz a mesma pergunta novamente, de modo que uma resposta enviada durante a reinicialização chega e a ferramenta roda uma vez. Um durable agent que gera um novo id a cada vez faz uma nova pergunta para a mesma chamada de ferramenta. O card a exibe, e o Collie não envia um segundo push, pois a proteção de push usa a chamada de ferramenta como chave. A proteção também permite 3 pushes por conversa por minuto, 10 por host por minuto e 30 por host por hora. O push que seria o 31º em uma hora se torna um único push de resumo para aquele host, e o host não envia mais nada até uma hora depois dele. Um card é sempre exibido.
403 caller-refused
Você vê o celular informar que a resposta ou a mensagem foi recusada, e o motivo do durable agent é 403 caller-refused.
A verificação de descendentes do durable agent recusou o chamador. Ela recusa o próprio durable agent, qualquer processo iniciado pelo durable agent e qualquer chamador que ela não consiga distinguir deles. O Collie cai do lado do durable agent quando o durable agent, ou uma ferramenta executada por ele, iniciou o processo do Collie e o processo ainda é seu filho. Inicie o Collie a partir de fora do durable agent e tente novamente.
Tentar novamente e uma resposta que pode ser aplicada
Você vê "Not sure the answer arrived" com um botão Tentar novamente e, após o toque, "May already be applied. Check the chat."
Um timeout, uma conexão perdida ou um 5xx após o envio da resposta significa que ela pode ter chegado. Tentar novamente envia o mesmo id de requisição, de modo que o durable agent responde replayed e nunca resolve a pergunta duas vezes. Quando a pergunta já está fechada, a primeira tentativa pode tê-la fechado, então o celular diz para verificar o chat. Um envio, uma parada e um toque de botão dizem o mesmo com palavras próprias.
O agente durável recusou o token
Você vê a barra de conexão dizer "The durable agent refused the token. Check COLLIE_DURABLE_TOKEN on this peer.", e o motivo é token-refused.
O durable agent respondeu 401 ou 403 para o token. A causa mais comum é uma rotação em que um lado mudou primeiro. As palavras no celular mencionam COLLIE_DURABLE_TOKEN mesmo para uma entrada de sources.json: leia isso como o token da entrada. Forneça o novo token ao durable agent antes de reiniciar o Collie. Tokens contém as etapas de rotação. Um 403 também pode vir de um proxy de acesso na frente do durable agent.
Uma mudança para Unreachable que leva duas leituras
Você vê um durable agent permanecer Ready por uma leitura com falha e depois mudar para Unreachable.
Uma leitura com falha após uma bem-sucedida mantém o último layout para essa sondagem. A segunda falha consecutiva muda o estado do durable agent. Um token recusado segue a mesma regra. Um caminho de socket que falha na verificação de privacidade é a única exceção: ele é exibido imediatamente.
Via https, um durable agent que está fora do ar ou recusa o token é consultado no máximo uma vez a cada 10 s, porque cada tentativa é uma requisição cobrada. Via socket, o menor intervalo entre duas leituras de um durable agent fora do ar é de 250 ms.
Em uma crew
Um durable agent em um membro de uma crew aparece no celular do lead, então o lead precisa saber o que é um durable agent.
Um lead anterior a 1.21.0 lista as conversas do durable agent sem o card de pergunta, e sua aba Terminal sonda uma conversa que não tem terminal. Nada no membro corrige isso. O membro avisa por si mesmo: collie doctor alerta em durable-lead, e o log recebe uma linha, [durable] the lead is 1.20.1; it shows durable panes without the question card and its Terminal tab polls; update the lead, uma vez para cada versão identificada. Atualize o lead.
durable-lead | o que ele diz |
|---|---|
| ignorado, sem crew | Esta máquina não está em uma crew, portanto não há lead |
| ignorado, lead | Esta máquina é o lead e mostra seus próprios painéis |
| ignorado, sem versão | O lead não informou uma versão: uma compilação de desenvolvimento, uma atualização em andamento ou nenhuma chamada desde que a bridge iniciou |
| aviso | O lead executa uma versão anterior a 1.21.0 |
| verde | O lead é 1.21.0 ou posterior |
Um membro que é mais antigo que o lead tem a falha oposta. O celular diz "This machine runs an older Collie and cannot take answers here. Update it, or answer in the durable agent." Atualize esse membro.