Falha ao configurar o erro de implantação

Você está vendo a documentação do Apigee Edge.
Acesse a documentação da Apigee X.
informações

Sintoma

A implantação de revisões de proxy de API ou fluxo compartilhado pela IU do Edge ou pela API de gerenciamento falha com um erro Falha na configuração.

Mensagem de erro

Você receberá uma mensagem de erro na interface do Edge, conforme mostrado abaixo:

The revision is deployed, but traffic cannot flow.
com.apigee.kernel.exceptions.spi.UncheckedException{ code = application.bootstrap.FailedToConfigure, message = Configuration failed, associated contexts = []}

Esta é uma captura de tela de um exemplo de mensagem de erro observada na interface do Edge:

Causas possíveis

A implantação de um proxy de API pode falhar e mostrar o erro "Falha na configuração" por vários motivos. A tabela abaixo lista algumas causas frequentemente observadas que levam a esse erro :

Causa Descrição Instruções de solução de problemas aplicáveis a
Classe Java ausente na política Java existente Falta uma classe Java no arquivo JAR que está sendo referenciado pela política Java callout. Usuários da nuvem privada de borda
Operandos incorretos usados em condições no fluxo de condições Os operandos/expressões usados em um ou ambos os lados dos operadores nas condições não são válidos.
Nome de host inválido na política de geração de registros de mensagens O nome do host usado na política MessageLogging não pode ser resolvido ou pode ter alguns caracteres especiais indesejados.
Nome de KeyValueMap inválido O KeyValueMap é inválido ou está vazio na política KeyValueMapOperations no proxy de API.

Etapas comuns de diagnóstico

  1. Use a API abaixo para conferir o status das implantações da revisão específica do proxy de API referente ao erro de implantação:

    curl -v <management-server-host>:<port#>/v1/runtime/organizations/<org-name>/environments/<env-name>/apis/<apiproxy-name>/revisions/deployments -u <user>
    
  2. Veja um exemplo de saída da API acima.

    "server" : [ { 
    "error" : "com.apigee.kernel.exceptions.spi.UncheckedException{ code = application.bootstrap.FailedToConfigure, message = Configuration failed, associated contexts = []}", 
    "status" : "error", 
    "type" : [ "message-processor" ], 
    "uUID" : "0a20926c-f4bf-401b-af84-05fd84b9f492" 
    }, { 
    "error" : "com.apigee.kernel.exceptions.spi.UncheckedException{ code = application.bootstrap.FailedToConfigure, message = Configuration failed, associated contexts = []}", 
    "status" : "error", 
    "type" : [ "message-processor" ], 
    "uUID" : "f2ee6ab4-a108-4465-a7ba-b56530d8e3fc" 
    }, { 
    "error" : "com.apigee.kernel.exceptions.spi.UncheckedException{ code = application.bootstrap.FailedToConfigure, message = Configuration failed, associated contexts = []}", 
    "status" : "error", 
    "type" : [ "message-processor" ], 
    "uUID" : "0f41991e-b310-4e77-aac5-5fdb150ef9f6" 
    },
    
  3. A mensagem de erro "Falha na configuração" será exibida em cada um dos processadores de mensagens na saída de status da implantação.

  4. Faça login em um dos processadores de mensagens e verifique o registro /opt/apigee/var/log/edge-message-processor/logs/system.log. Verifique se há erros durante a implantação do proxy de API.

  5. Dependendo do erro/exceção observado no registro do Processador de mensagens, você precisa seguir as etapas de solução de problemas e a resolução apropriadas.

  6. As seções abaixo mostram algumas das exceções mais frequentemente observadas que geram o erro de implantação "Falha na configuração" e etapas para resolver esses problemas.

Causa: classe Java ausente na política Java callout

Diagnóstico

  1. Nos registros do processador de mensagens, se você vir qualquer exceção com a mensagem "Failed to instance the Java callout Class" durante a implantação de um proxy de API (DeployEvent), conforme mostrado abaixo, prossiga para a etapa 2. Caso contrário, acesse Operadores incorretos usados em condições no fluxo de condições.
  2. O processador de mensagens mostra a seguinte exceção durante a implantação do proxy de API:

    2017-10-10 05:02:42,330 Apigee-Main-5 ERROR MESSAGING.CONFIGURATION - MessageProcessorServiceImpl.configure() : error configuring config events [DeployEvent{organization='myorg', application='oauth2', applicationRevision='14', deploymentSpec=basepath=/;env=dev;, deploymentID=null}] 
    com.apigee.kernel.exceptions.spi.UncheckedException: Failed to instantiate the JavaCallout Class com.something.apigee.callout.crypto.main.SecretCallout 
    at com.apigee.steps.javacallout.JavaCalloutStepDefinition.newInstance(JavaCalloutStepDefinition.java:89) ~[javacallout-1.0.0.jar:na] 
    at com.apigee.messaging.runtime.StepDefinition.getStepDefinitionExecution(StepDefinition.java:230) ~[message-processor-1.0.0.jar:na] 
    …
    <snipped>
    
  3. A mensagem de erro na exceção acima indica que não foi possível instanciar a classe Java callout com.something.apigee.callout.crypto.main.SecretCallout. Esse erro geralmente ocorre quando a classe específica não está disponível no arquivo JAR especificado na política Java callout ou em qualquer um dos arquivos JAR dependentes.

  4. Verifique o arquivo JAR que continha todas as classes pertencentes ao pacote com.something.apigee.callout.crypto.main e confirme se a classe específica com.something.apigee.callout.crypto.main.SecretCallout estava ausente.

Resolução

  1. Adicione a classe ausente ao arquivo JAR específico e carregue o arquivo.
  2. Reimplantar o proxy da API.
  3. No exemplo acima, resolvemos o problema da seguinte forma:
    1. Adicionar a classe ausente com.something.apigee.callout.crypto.main.SecretCallout ao arquivo JAR.
    2. Fazer upload do arquivo JAR atualizado e reimplantar o proxy da API.

Causa: operandos incorretos usados com operadores no fluxo de condições

Diagnóstico

  1. Nos registros do processador de mensagens, se aparecer um com.apigee.expressions.parser.ParseException durante a implantação de um proxy de API ou fluxo compartilhado, como mostrado nas mensagens de exemplo abaixo, prossiga para a etapa 2. Caso contrário, acesse a próxima causa sobre a política de nome de host inválido na política de geração de registros de mensagens.

    Exemplo de mensagem de erro

    com.apigee.expressions.parser.ParseException: Both the operands for EQUALS expression should be data expressions
    
    
  2. Vamos ver um exemplo para entender como diagnosticar esse problema.

    Exemplo : os operandos da expressão <Operator> devem ser expressões de dados

  3. O processador de mensagens mostra a seguinte exceção durante a implantação de um fluxo compartilhado:

    2017-11-23 09:11:04,498  Apigee-Main-6 ERROR MESSAGING.RUNTIME - AbstractConfigurator.loadXMLConfigurations() : Unable to Load default for path /organizations/myorg/apiproxies/Introspection/revisions/12/sharedflows/default
    2017-11-23 09:11:04,499  Apigee-Main-6 ERROR MESSAGING.RUNTIME - Application.sync() :  sync error for Introspection and revision 12
    2017-11-23 09:11:04,499  Apigee-Main-6 ERROR MESSAGING.RUNTIME - Application.sync() :  Actual Error
    com.apigee.expressions.parser.ParseException: Both the operands for EQUALS expression should be data expressions
        at com.apigee.expressions.parser.ExpressionParser.buildExpressionTree(ExpressionParser.java:337) ~[expressions-1.0.0.jar:na]
        at com.apigee.expressions.parser.ExpressionParser.parse(ExpressionParser.java:24) ~[expressions-1.0.0.jar:na]
        at com.apigee.expressions.parser.ExpressionParser.parseLogicExpression(ExpressionParser.java:28) ~[expressions-1.0.0.jar:na]
        at com.apigee.messaging.runtime.Step.getExpression(Step.java:67) ~[message-processor-1.0.0.jar:na]
        at com.apigee.messaging.runtime.Step.handleAdd(Step.java:58) ~[message-processor-1.0.0.jar:na]
        at com.apigee.messaging.runtime.SharedFlowRuntime.addStep(SharedFlowRuntime.java:81) ~[message-processor-1.0.0.jar:na] … <snipped>
    
  4. A mensagem de erro no operador ParseException - "Both the operands for EQUALS expression should be data expressions" indica que uma condição que envolve um operador igual a (=), diferente de (!=) ou estatísticas com (=|) tem um problema.

  5. Observe as condições em todos os Fluxos de condição que envolvem o operador específico mencionado na mensagem de erro e veja se há algum dos seguintes problemas:

    1. As expressões em ambos os lados do operador são do mesmo tipo. Por exemplo, se você tem uma variável string no lado esquerdo do operador, precisa ter outra variável string ou valor de string no lado direito.
    2. Variáveis válidas são usadas entre os operadores.
    3. Há um espaço entre o operador e cada uma das expressões.

  6. Se algum dos critérios mencionados acima não for atendido, você receberá a ParseException - "Both the operands for EQUALS expression should be data expressions".

  7. Vamos conferir um exemplo para entender o problema. Este é um exemplo de condição de erro

    <Condition>
               (fault.name = "invalid_access_token") or(fault.name = "ApiKeyNotApproved")
    </Condition>
    
  8. Neste exemplo, você pode observar que não há espaço entre o operador "ou" e a próxima condição. Portanto, quando a segunda condição estiver sendo analisada, a primeira expressão é considerada "or(fault.name") para o operador EQUALS. Esse não é um nome de variável válido, por isso não é tratado como uma expressão de dados válida. Como consequência, você recebe esta exceção:

    com.apigee.expressions.parser.ParseException: Both the operands for EQUALS expression should be data expressions
    
    

Resolução

  1. Certifique-se de que você sempre tenha expressões de dados adequadas em ambos os lados dos operadores.
  2. No exemplo discutido acima, a resolução foi garantir que houvesse espaço após o operador "or", conforme descrito no snippet de código:

    <Condition>
               (fault.name = "invalid_access_token") or (fault.name = "ApiKeyNotApproved")
    </Condition>
    
    

Nome de host inválido na política MessageLogging

Diagnóstico

  1. Nos registros do processador de mensagens, se você encontrar alguma exceção na mensagem "Invalid HostName" durante a implantação do proxy da API ou do fluxo compartilhado, conforme mostrado abaixo, prossiga para a etapa 2. Caso contrário, vá para a próxima causa Invalid KeyValueMap Name.

    com.apigee.rest.framework.ValidationException: Invalid syslog config: Invalid HostName 'splunkprod.myorg.com/' for Syslog handler
    
  2. Vejamos dois exemplos abaixo para entender como solucionar esse problema.

Exemplo 1: nome do host com caractere especial indesejado

  1. O processador de mensagens mostra a seguinte exceção durante a implantação do proxy de API:

      2018-01-20 02:12:13,535 Apigee-Main-3 ERROR MESSAGING.CONFIGURATION - MessageProcessorServiceImpl.configure() : error configuring config events [DeployEvent{organization='myorg', application='providersearch', applicationRevision='4', deploymentSpec=basepath=/;env=prod;, deploymentID=null}] 
      com.apigee.rest.framework.ValidationException: Invalid syslog config: Invalid HostName 'splunkprod.myorg.com/' for Syslog handler 
      at com.apigee.messaging.runtime.destinations.SyslogDestination.<init>(SyslogDestination.java:44) ~[message-processor-1.0.0.jar:na] 
      at com.apigee.messaging.runtime.destinations.SysLoggerFactory.getInstance(SysLoggerFactory.java:39) ~[message-processor-1.0.0.jar:na]
      at com.apigee.messaging.runtime.destinations.DestinationRegistry.newDestination(DestinationRegistry.java:44) ~[message-processor-1.0.0.jar:na] 
      ...<snipped>
    
  2. A exceção acima mostra que a implantação está falhando devido a "Nome de host inválido '<nome do host>' para gerenciador Syslog". Isso indica que o nome do host usado na política MessageLogging é inválido.

  3. A análise da exceção no registro do Processador de mensagens mostra cuidadosamente que há um caractere especial "/" indesejado no final de Nome do host 'splunkprod.myorg.com/'.

  4. Esse caractere especial indesejado foi a causa do erro de implantação.

Resolução

  1. Modifique a política MessageLogging para remover caracteres especiais indesejados para resolver o problema.
  2. No exemplo acima, o caractere especial "/" foi removido da Política MessageLogging. Isso resolveu o problema.

Exemplo 2: nome de host sem solução

  1. O registro do processador de mensagem tem algumas linhas que mostram que o evento de implantação de um proxy de API é acionado, seguidas por uma exceção que ocorre durante a implantação do proxy de API:

    2017-12-22 00:13:49,057 Apigee-Main-87446 INFO MESSAGING.CONFIGURATION - MessageProcessorServiceImpl.configure() : configuring [DeployEvent{organization='myorg', application='myapi', applicationRevision='42', deploymentSpec=basepath=/;env=dev;, deploymentID=null}] 
    
    2017-12-22 00:13:49,318 Apigee-Main-87446 ERROR c.a.p.h.d.DNSCachedAddress - DNSCachedAddress.refresh() : Unable to resolve host : input-prd.cloud.splunk.com: Name or service not known 
    
    2017-12-22 00:13:49,323 Apigee-Main-87446 ERROR MESSAGING.RUNTIME - AbstractConfigurator.handleUpdate() : Fatal error deploying proxy: {} 
    com.apigee.rest.framework.ValidationException: Invalid syslog config: Invalid HostName 'input-prd.cloud.splunk.com' for Syslog handler 
    at com.apigee.messaging.runtime.destinations.SyslogDestination.<init>(SyslogDestination.java:44) ~[message-processor-1.0.0.jar:na] 
    at com.apigee.messaging.runtime.destinations.SysLoggerFactory.getInstance(SysLoggerFactory.java:39) ~[message-processor-1.0.0.jar:na] 
    at com.apigee.messaging.runtime.destinations.DestinationRegistry.newDestination(DestinationRegistry.java:44) ~[message-processor-1.0.0.jar:na] 
    at com.apigee.steps.messagelogging.MessageLoggingStepDefinition.populateDestinations(MessageLoggingStepDefinition.java:118) ~[message-logging-1.0.0.jar:na] 
    at com.apigee.steps.messagelogging.MessageLoggingStepDefinition.handleAdd(MessageLoggingStepDefinition.java:99) ~[message-logging-1.0.0.jar:na] 
    …
    <snipped> 
    
  2. A exceção acima mostra que a implantação está falhando devido a "Nome de host inválido '<nome do host>' para gerenciador Syslog".

  3. Se você ler a linha acima da exceção, vai notar que o processador de mensagens não consegue resolver o nome do host 'input-prd.cloud.splunk.com' fornecido na política MessageLogging.

  4. Para confirmar isso, tente usar o telnet para o nome do host e o número da porta usados na política de registro de mensagens.

    1. Confira a política MessageLogging na revisão específica do proxy de API e verifique o nome do host e a porta da porta usados. No exemplo acima, o nome do proxy da API é myapi, revisão: 42.

      Política do MessageLogging

        <MessageLogging async="false" continueOnError="false" enabled="true" name="Log-To-Splunk">
            <DisplayName>Log-To-Splunk</DisplayName>
            <Syslog>
                <Message>Message.id = {request.header.id}</Message>
                <Host>input-prd.cloud.splunk.com</Host>
                <Port>2900</Port>
                <Protocol>TCP</Protocol>
                <SSLInfo>
                    <Enabled>true</Enabled>
                </SSLInfo>
            </Syslog>
        </MessageLogging>
      
    2. Use o Telnet para o host com uma porta específica. Para este exemplo, tentamos usar o telnet e recebemos o mesmo erro visto no registro do processador de mensagens:

      telnet input-prd.cloud.splunk.com 2900 
      telnet: input-prd.cloud.splunk.com: Name or service not known 
      input-prd.cloud.splunk.com: Host name lookup failure
      
  5. Isso prova claramente que o nome do host não pode ser resolvido.

Resolução

  1. Modifique a política MessageLogging para usar um nome de host válido.

Se o problema persistir, acesse Precisa coletar informações de diagnóstico.

Causa: nome de KeyValueMap inválido

Diagnóstico

  1. Nos registros do processador de mensagens, se aparecer uma exceção com a mensagem "O nome do KeyValueMap é inválido" durante a implantação de um proxy de API ou fluxo compartilhado, conforme mostrado abaixo, prossiga para a etapa 2. Caso contrário, acesse Precisa coletar informações de diagnóstico.

    com.apigee.rest.framework.ValidationException: Invalid syslog config: Invalid HostName 'splunkprod.myorg.com/' for Syslog handler
    
  2. Vamos ver um exemplo para entender como resolver essa questão.

  3. Exemplo de registro do processador de mensagens mostrando a exceção com a mensagem "O nome do KeyValueMap é inválido", gerando um erro durante a implantação do proxy da API

    2018-02-27 14:14:50,318  Apigee-Main-6 ERROR MESSAGING.RUNTIME - AbstractConfigurator.handleUpdate() : Fatal error deploying proxy: {}
    com.apigee.keyvaluemap.KeyValueMapApiException: KeyValueMap name  is invalid
            at com.apigee.keyvaluemap.service.legacy.KeyValueMapServiceImpl.validateMapName(KeyValueMapServiceImpl.java:125) ~[keyvaluemap-1.0.0.jar:na]
            at com.apigee.keyvaluemap.service.legacy.KeyValueMapServiceImpl.createOrUpdateKeyValueMap(KeyValueMapServiceImpl.java:185) ~[keyvaluemap-1.0.0.jar:na]
            at com.apigee.steps.keyvaluemapoperations.KeyValueMapOperationsStepDefinition.digest(KeyValueMapOperationsStepDefinition.java:180) ~[keyvaluemap-operations-1.0.0.jar:na]
            at com.apigee.steps.keyvaluemapoperations.KeyValueMapOperationsStepDefinition.handleAdd(KeyValueMapOperationsStepDefinition.java:197) ~[keyvaluemap-operations-1.0.0.jar:na]
            at com.apigee.entities.AbstractConfigurator.handleUpdate(AbstractConfigurator.java:130) [config-entities-1.0.0.jar:na]
            at com.apigee.messaging.runtime.Application.handleUpdate(Application.java:229) [message-processor-1.0.0.jar:na]
    
    2018-02-27 14:14:50,344  Apigee-Main-6 ERROR BOOTSTRAP - RuntimeConfigurationServiceImpl.dispatchToListeners() : RuntimeConfigurationServiceImpl.dispatchToListeners : Error occurred while dispatching the request DeployEvent{organization='myorg', application='CustomerAPI', applicationRevision='1', deploymentSpec=basepath=/;env=test;, deploymentID=null} to com.apigee.application.bootstrap.listeners.MessageProcessorBootstrapListener@5009d06e
    com.apigee.keyvaluemap.KeyValueMapApiException: KeyValueMap name  is invalid
            at com.apigee.keyvaluemap.service.legacy.KeyValueMapServiceImpl.validateMapName(KeyValueMapServiceImpl.java:125) ~[keyvaluemap-1.0.0.jar:na]
            at com.apigee.keyvaluemap.service.legacy.KeyValueMapServiceImpl.createOrUpdateKeyValueMap(KeyValueMapServiceImpl.java:185) ~[keyvaluemap-1.0.0.jar:na]
            at com.apigee.steps.keyvaluemapoperations.KeyValueMapOperationsStepDefinition.digest(KeyValueMapOperationsStepDefinition.java:180) ~[keyvaluemap-operations-1.0.0.jar:na]
            at com.apigee.steps.keyvaluemapoperations.KeyValueMapOperationsStepDefinition.handleAdd(KeyValueMapOperationsStepDefinition.java:197) ~[keyvaluemap-operations-1.0.0.jar:na]
            at com.apigee.entities.AbstractConfigurator.handleUpdate(AbstractConfigurator.java:130) ~[config-entities-1.0.0.jar:na]
            at com.apigee.messaging.runtime.Application.handleUpdate(Application.java:229) ~[message-processor-1.0.0.jar:na]
    
  4. A segunda exceção acima indica que o erro de implantação ocorreu para Proxy de API: CustomerAPI, revisão: 1.

  5. Ao verificar o stack trace, você vai perceber que um erro é gerado ao executar a política KeyValuMapOperations.

  6. Ao analisar o pacote de proxy de API, você descobre que há uma política KeyValuMapOperations com o código mostrado abaixo:

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <KeyValueMapOperations async="false" continueOnError="false" enabled="true" name="Pulling-Keys" mapIdentifier="">
     <DisplayName>Pulling Keys</DisplayName>
     <Properties/>
     <ExclusiveCache>false</ExclusiveCache>
    
    
  7. Como visto acima, o mapIdentifier, que indica o nome do KeyValueMap, tem uma string vazia. O nome de KeyValueMap não pode ser uma string vazia. Essa foi a causa do erro de implantação.

Resolução

  1. Modifique a política KeyValueMapOperations para ter um nome válido e adequado para o KeyValueMap.
  2. No exemplo acima, resolvemos o problema modificando KeyValueMapOperations para ter o nome de KeyValueMap como "MyKeyValueMap", conforme mostrado abaixo:

      <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
      <KeyValueMapOperations async="false" continueOnError="false" enabled="true" name="Pulling-Keys" mapIdentifier="MyKeyValueMap">
        <DisplayName>Pulling Keys</DisplayName>
        <Properties/>
        <ExclusiveCache>false</ExclusiveCache>
    

É necessário coletar informações de diagnóstico

Se o problema persistir mesmo depois de seguir as instruções acima, colete as seguintes informações de diagnóstico. Entre em contato com o suporte do Apigee Edge e envie as informações coletadas.

  1. Saída do comando

    curl -v <management-server-host>:<port #>/v1/runtime/organizations/<org-name>/environments/<env-name>/apis/<apiproxy-name>/revisions/deployments -u <user>
    
  2. Registros do processador de mensagens

    /opt/apigee/var/log/edge-message-processor/logs/system.log
    
  3. Detalhes sobre quais seções deste Manual foram testadas e quaisquer outros insights que nos ajudarão a agilizar a resolução deste problema.