Guia de resolução de problemas do processador de mensagens

Este tópico aborda os passos que pode seguir para resolver problemas com o processador de mensagens. O processador de mensagens faz parte do componente apigee-runtime. Consulte também a vista geral da configuração do serviço de tempo de execução.

A Readiness probe falha com o código de estado HTTP 500

Sintoma

Um ou mais pods do apigee-runtime não estão no estado Ready.

Mensagem de erro

Quando usa kubectl para descrever um pod apigee-runtime com falhas, vê o seguinte erro:

Readiness probe failed: HTTP probe failed with statuscode: 500

Por exemplo:

kubectl describe pod -n hybrid \
apigee-runtime-apigee-gcp-prod1-test-blue-67db4f457b-9c7c7

...
apigee-runtime-apigee-gcp-prod1-test-blue-67db4f457b-9c7c7  Readiness probe failed: HTTP probe
failed with statuscode: 500
...

Causas possíveis

O erro significa que não está disponível nenhum contrato ativo para o processador de mensagens publicar o tráfego. Neste estado, o processador de mensagens não pode considerar-se "pronto".

Causa Descrição
Problema de ligação do sincronizador ao plano de gestão O sincronizador não consegue estabelecer ligação ao plano de gestão. Normalmente, este problema é causado nos casos em que substitui o URL contractProvider e associa a conta de serviço errada ao mesmo. Por exemplo, se configurar uma conta de serviço para uma implementação de teste com um contractProvider URL que aponta para o servidor de produção.
Problema de ligação do processador de mensagens ao sincronizador Se o novo MP aparecer como parte de um ajuste de escala automático ou de um reinício do pod, pode ver este erro. Geralmente, este problema ocorre quando o sincronizador está inativo e o MP não conseguiu carregar o respetivo contrato.

Diagnóstico: problema de ligação do sincronizador ao plano de gestão

Para diagnosticar um problema de ligação do sincronizador ao plano de gestão, faça o seguinte:

  1. Liste os pods no cluster:
    kubectl get pods -n namespace
  2. Abra uma shell num pod do apigee-synchronizer:
    kubectl exec -it -n namespace synchronizer-pod-name bash

    Por exemplo:

    kubectl exec -it -n apigee apigee-synchronizer-apigee-gcp-prod1-test-blue-cnj5x bash
  3. Aceda ao seguinte diretório:
    cd /opt/apigee/var/log/apigee-synchronizer
    ls
    
      dr-xr-sr-x 4 apigee apigee  4096 Sep 12 16:52 750
      drwxr-sr-x 2 apigee apigee  4096 Sep 12 16:52 cachedFiles
      -rw-r--r-- 1 apigee apigee 22295 Sep 12 16:52 config.log
      -rw-r--r-- 1 apigee apigee    76 Sep 12 16:52 versions.properties
  4. Verifique a versão ativa em version.properties. Por exemplo:
    cat versions.properties
    
      #active repository version
      #Sat Dec 14 19:45:00 GMT 2019
      active.version=749
  5. Certifique-se de que o valor de active.version corresponde ao número da pasta de contrato. No exemplo acima (também apresentado abaixo), o nome da pasta é 750; por conseguinte, não corresponde:
    dr-xr-sr-x 4 apigee apigee  4096 Sep 12 16:52 750
  6. Saia da caixa do pod.

Resolução

Se version.properties estiver em falta ou se existir uma incompatibilidade de versões, conforme explicado acima, verifique os registos do sincronizador para tentar determinar o motivo pelo qual os contratos mais recentes não estão a ser transferidos. Por exemplo:

kubectl logs -f -n namespace synchronizer-pod-name

Para obter informações sobre a interpretação dos registos do sincronizador, consulte o artigo Registos do sincronizador. Se o sincronizador estiver inativo, experimente reiniciá-lo através de apigeectl. Por exemplo:

$APIGEECTL_HOME/apigeectl apply -f overrides/overrides.yaml --org --env env-name

Diagnóstico: problema de ligação do processador de mensagens ao sincronizador

Para diagnosticar um problema de ligação do processador de mensagens ao sincronizador, faça o seguinte:

  1. Liste os pods no cluster:
    kubectl get pods -n namespace
  2. Verifique os registos de tempo de execução para tentar descobrir por que motivo os contratos não estão a ser transferidos:
    kubectl logs -f -n namespace pod-name

    Por exemplo:

    kubectl logs -f -n apigee apigee-runtime-apigee-gcp-prod1-test-blue-67db4f457b-9c7c7

    É possível que, se o novo MP aparecer como parte de uma escalabilidade automática ou de um reinício do pod, o MP não carregue os contratos. Geralmente, o problema ocorre quando o sincronizador está inativo, o que impede o carregamento dos contratos por parte do MP. Por exemplo:

    2019-09-13 16:59:24,331 podName:N/A ipAddress:N/A dpColor:N/A
    HttpClient@331886186-301 DEBUG o.e.j.c.AbstractConnectionPool - AbstractConnectionPool$1.failed() :
    Connection 1/64 creation failed
    java.net.UnknownHostException: apigee-synchronizer-apigee-gcp-prod1-test.hybrid.svc.cluster.local
    at java.net.InetAddress.getAllByName0(InetAddress.java:1281)
    at java.net.InetAddress.getAllByName(InetAddress.java:1193)
    at java.net.InetAddress.getAllByName(InetAddress.java:1127)
    at org.eclipse.jetty.util.SocketAddressResolver$Async.lambda$resolve$1(SocketAddressResolver.java:167)
    at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:672)
    at org.eclipse.jetty.util.thread.QueuedThreadPool$2.run(QueuedThreadPool.java:590)
    at java.lang.Thread.run(Thread.java:748)
    	at org.eclipse.jetty.util.thread.QueuedThreadPool$2.run(QueuedThreadPool.java:590)
    	at java.lang.Thread.run(Thread.java:748)

Resolução

Experimente reiniciar o sincronizador. Por exemplo:

$APIGEECTL_HOME/apigeectl apply -f overrides/overrides.yaml --org --env env-name

A sondagem de disponibilidade falha devido a uma chave de encriptação inválida

Sintoma

Os pods apigee-runtime não estão no estado Ready.

Diagnóstico

Quando usa kubectl para descrever um pod apigee-runtime com falha, vê este erro: Readiness probe failed: Probe hybrid-encryption-key-validation-probe failed. Por exemplo:

$ kubectl describe pod -n namespace apigee-runtime-pod-name

...
Readiness probe failed: Probe hybrid-encryption-key-validation-probe failed due to
com.apigee.probe.model.ProbeFailedException{ code = hybrid.encryption.key.InvalidEncryptionKey,
message = Invalid encryption key. Please check the length of the encryption key, associated
contexts = []}
...

Resolução

Os comprimentos de chaves de encriptação suportados são de 16, 24 ou 32 bytes, e o valor da chave tem de estar codificado em base64. Para mais informações sobre como criar uma chave formatada corretamente, consulte o artigo Encriptação de dados.

Visualizar registos do processador de mensagens

Para ver detalhes sobre a visualização e a interpretação dos registos do processador de mensagens, consulte o artigo Registos do tempo de execução.

Chame um proxy de API a partir do pod de tempo de execução

Em algumas situações, para ajudar a isolar um problema, é recomendável verificar se consegue fazer uma chamada de proxy de API diretamente a partir do pod apigee-runtime e, assim, ignorar o gateway de entrada.

  1. Execute o seguinte comando para encaminhar para a porta 8443. Isto permite-lhe chamar a API no pod:
    kubectl port-forward -n namespace apigee-runtime-pod-name 8443:8443
  2. Chame um proxy de API implementado. Por exemplo, quando o caminho base do proxy é ilove-apis:
    curl -k -v https://0:8443//ilove-apis
    
        < HTTP/1.1 200 OK
        < X-Powered-By: Apigee
        < Access-Control-Allow-Origin: *
        < X-Frame-Options: ALLOW-FROM RESOURCE-URL
        < X-XSS-Protection: 1
        < X-Content-Type-Options: nosniff
        < Content-Type: text/html; charset=utf-8
        < Content-Length: 18
        < ETag: W/"12-Jb9QP1bUxNSmZkxQGt5KLQ"
        < Date: Fri, 13 Sep 2019 18:33:46 GMT
        < Via: 1.1 google
        < X-Apigee.Message-ID: 016f5f7f-c59e-404c-86e8-7b0737833f982
        < X-Apigee.dp.color: blue
        < X-Apigee.proxy: /organizations/my-org/environments/test/apiproxies/i-loveapis/revisions/1
        < X-Apigee.proxy.basepath: /ilove-apis
        < X-Apigee.target-latency: 9
        <
        * Connection #0 to host 0 left intact
        <H2>I <3 APIs
    

Verifique a API de gestão

Pode usar a API descrita abaixo para verificar se a API Management está a funcionar corretamente.

  1. Obtenha os nomes dos pods no seu cluster:
    kubectl get pods -n namespace
  2. Use o encaminhamento de portas para aceder ao pod apigee-runtime. A sintaxe para o encaminhamento de porta é a seguinte:
    kubectl port-forward -n namespace podname 8843:8843

    Por exemplo:

    kubectl port-forward -n apigee \
        apigee-runtime-my-organization-test-blue-57965b7789-6j4bp 8843:8843
  3. Em seguida, noutra janela do terminal, use uma utilidade como curl para enviar um pedido para a API classification/tree, conforme mostra o exemplo seguinte:
    curl -k https://0:8843/v1/classification/tree

    Segue-se um exemplo de resposta que apresenta informações sobre os proxies implementados no ambiente "test":

    [ {
      "condition" : "(always matches)",
      "virtualHost" : {
        "env" : "test",
        "name" : "default",
        "org" : "my-organization",
        "tree" : {
          "elements" : [ {
            "application" : "myproxy",
            "basePath" : "/myproxy",
            "name" : "default",
            "revision" : "1"
          } ],
          "name" : "IdentificationTree"
        }
      }
    } ]

Usar o modo DEBUG

Para ajudar na resolução de problemas, pode ativar o modo DEBUG para incluir informações mais detalhadas nos registos do pod.apigee-runtime

  1. Liste os pods no seu espaço de nomes:
    kubectl get pods -n namespace
  2. Escolha um dos pods apigee-runtime listados para depurar.
  3. Execute o comando de encaminhamento de portas para esse pod. Por exemplo:
    kubectl port-forward -n hybrid apigee-runtime-hybrid-prod-blue-fcpdd 8843
  4. Abra outro terminal e chame a seguinte API para ativar a depuração:
    curl "https://0:8843/v1/logsessions?sessions=debug" -X POST -v -k
  5. Execute o comando kubectl logs para verificar o registo que está no modo DEBUG. Por exemplo:
    kubectl logs -f -n hybrid apigee-runtime-hybrid-prod-blue-fcpdd
    
  6. Quando terminar de examinar o registo DEBUG, reponha o nível de registo para INFO (o predefinido). Por exemplo:
    curl "https://0:8843/v1/logsessions?sessions=info" -X POST -v -k
  7. Execute o comando kubectl logs para se certificar de que o registo está novamente no modo INFO.