Falha ao configurar o erro de implantação

Esta é a documentação do Apigee Edge.
Acesse Documentação da Apigee X.
informações

Sintoma

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

Mensagem de erro

Você vai 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 é a 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 exibir a mensagem "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 para solução de problemas aplicáveis
Classe Java ausente na política JavaAnnotation 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 são usados em condições no fluxo de condição Operandos/expressões usadas 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 registro 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 da API.

Etapas comuns do diagnóstico

  1. Use a API abaixo para conferir o status das implantações referentes à revisão específica do proxy de API em que você está observando o 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. Aqui está 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 "Configuration failed" será exibida em cada um dos processadores de mensagens na saída do 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 do problema.

  6. Veja nas seções abaixo algumas das exceções mais observadas que levam ao erro de implantação Falha na configuração e instruções para solucionar esses problemas.

.

Causa: classe Java ausente na política JavaAnnotation

Diagnóstico

  1. Nos registros do processador de mensagens, se aparecer 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 Operandos incorretos usados nas condições do fluxo de condição.
  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 JavaCall com.something.apigee.callout.crypto.main.SecretCallout. Este 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 faça upload do arquivo.
  2. Reimplantar o proxy da API.
  3. No exemplo acima, resolvemos o problema da seguinte forma:
    1. Adicionando a classe ausente com.something.apigee.callout.crypto.main.SecretCallout ao arquivo JAR.
    2. Fazer upload do arquivo JAR atualizado e reimplantar o proxy de API.

Causa: operandos incorretos usados com operadores no fluxo de condição

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: Nome do 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. Vejamos um exemplo para entender como diagnosticar esse problema.

    Exemplo : operandos para <Operator> a expressão deve 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 ParseException: "Both the operands for EQUALS expression should be data expressions" indica que uma condição que envolve o operador igual a (=), diferente de (!=) ou Estatísticas com (=|) está com 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 verifique 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 de string no lado esquerdo do operador, precisa ter outra variável 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. Vejamos um exemplo para entender esse problema. Este é um exemplo de condição de erro que

    <Condition>
               (fault.name = "invalid_access_token") or(fault.name = "ApiKeyNotApproved")
    </Condition>
    
  8. Nesse exemplo, é possível observar que não há espaço entre "ou" e depois na próxima condição. Portanto, quando a segunda condição estiver sendo analisada, a primeira expressão será usada como "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ê obtém esta exceção:

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

Resolução

  1. Verifique se você sempre tem 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 "ou" 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ê vir alguma exceção com a mensagem "Nome de host inválido" durante a implantação do proxy de API ou fluxo compartilhado, como 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 caracteres especiais indesejados

  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 "Invalid HostName '<hostname>' para gerenciador Syslog". Isso indica que o HostName usado na política MessageLogging é um nome de host inválido.

  3. Um exame cuidadoso da exceção no registro do processador de mensagens mostra que há um caractere especial indesejado "/" no final de HostName '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 e 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 resolução

  1. O registro do processador de mensagens tinha algumas linhas que mostravam o evento de implantação de um proxy de API sendo acionado, que é seguido 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 "Invalid HostName '<hostname>' para gerenciador Syslog".

  3. Se você ler a linha acima da exceção, vai notar que o processador de mensagens não conseguiu resolver o nome de host 'input-prd.cloud.splunk.com' fornecido na política do 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. Verifique a política MessageLogging na revisão específica do proxy de API e o nome do host e o número 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. Telnet para o host com porta específica. Para este exemplo, testamos o telnet e obtivemos 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 comprovou claramente que o nome do host não pode ser resolvido.

Resolução

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

Se o problema persistir, consulte Precisa de 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 "KeyValueMap name is invalid" 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 de informações de diagnóstico.

    com.apigee.rest.framework.ValidationException: Invalid syslog config: Invalid HostName 'splunkprod.myorg.com/' for Syslog handler
    
  2. Vamos conferir um exemplo para entender como solucionar esse problema.

  3. Exemplo de registro do processador de mensagens mostrando a exceção com a mensagem "KeyValueMap name is invalid" causando erros durante a implantação do proxy de 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 API Proxy: CustomerAPI, revisão: 1.

  5. Ao verificar o stack trace, é possível notar que um erro é gerado ao executar a política KeyValuMapOperations.

  6. Analisando o pacote do proxy de API, você descobre que há uma política KeyValuMapOperations com o código 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 próprio para o KeyValueMap.
  2. No exemplo acima, resolvemos o problema modificando KeyValueMapOperations para definir o nome 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 do problema.