Falha ao configurar o erro de implantação

Você está lendo a documentação do Apigee Edge.
Acesse a documentação da Apigee X.
info

Sintoma

A implantação de revisões de proxy de API ou fluxo compartilhado pela API de gerenciamento ou pela interface do Edge falha com um erro de Configuration failed.

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 = []}

Confira abaixo a captura de tela de uma mensagem de erro de exemplo observada na interface do Edge:

Causas possíveis

A implantação de um proxy de API pode falhar com o erro "Configuration failed" por vários motivos. A tabela abaixo lista algumas causas observadas com frequência que levam a esse erro :

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

Etapas comuns do diagnóstico

  1. Confira o status das implantações da revisão específica do proxy de API para a qual você está observando o erro de implantação usando a API abaixo:

    curl -v <management-server-host>:<port#>/v1/runtime/organizations/<org-name>/environments/<env-name>/apis/<apiproxy-name>/revisions/deployments -u <user>
    
  2. Confira 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" vai aparecer em cada um dos processadores de mensagens na saída do status de implantação.

  4. Faça login em um dos processadores de mensagens e confira 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, siga as etapas de solução de problemas e resolução adequadas para o problema.

  6. As seções abaixo fornecem algumas das exceções observadas com mais frequência que levam ao erro de implantação "Configuration failed" e etapas para solucionar e resolver esses problemas.

Causa: classe Java ausente na política JavaCallout

Diagnóstico

  1. Nos registros do processador de mensagens, se você encontrar alguma exceção com a mensagem "Failed to instantiate the JavaCallout Class" durante a implantação de um proxy de API (DeployEvent), conforme mostrado abaixo, siga para a etapa 2. Caso contrário, acesse Operandos incorretos usados em condições no 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 a classe JavaCallout com.something.apigee.callout.crypto.main.SecretCallout não pôde ser instanciada. Esse erro geralmente ocorre quando a classe específica não está disponível no arquivo JAR especificado na política JavaCallout ou em qualquer um dos arquivos JAR dependentes.

  4. Verifique o arquivo JAR que continha todas as classes relacionadas 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 o upload do arquivo JAR.
  2. Reimplantar o proxy da API.
  3. No exemplo acima, resolvemos o problema:
    1. Adicionando a classe ausente com.something.apigee.callout.crypto.main.SecretCallout ao arquivo JAR.
    2. Fazendo o upload do arquivo JAR atualizado e reimplantando 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 você encontrar um com.apigee.expressions.parser.ParseException durante a implantação de um proxy de API ou fluxo compartilhado, conforme mostrado nas mensagens de exemplo abaixo, siga 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. Vamos analisar um exemplo para entender como diagnosticar esse problema.

    Exemplo : os operandos da expressão <Operator> precisam 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 em ParseException - "Both the operands for EQUALS expression should be data expressions" indica que há um problema com uma condição que envolve igual a (=), diferente de (!=) ou estatísticas com o operador (=|).

  5. Confira 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ê tiver uma variável de string no lado esquerdo do operador, precisará ter outra variável de 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ê vai receber a ParseException - "Both the operands for EQUALS expression should be data expressions".

  7. Vamos analisar um exemplo para entender esse problema. Confira um exemplo de condição de erro

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

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

Resolução

  1. 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 do host inválido na política MessageLogging

Diagnóstico

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

    com.apigee.rest.framework.ValidationException: Invalid syslog config: Invalid HostName 'splunkprod.myorg.com/' for Syslog handler
    
  2. Vamos analisar os dois exemplos abaixo para entender como solucionar e resolver 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>' for Syslog handler". Isso indica que o nome do host usado na política MessageLogging é inválido.

  3. Ao examinar a exceção no registro do processador de mensagens com cuidado, é possível observar que há um caractere especial indesejado "/" no final do 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 e resolver o problema.
  2. No exemplo acima, o caractere especial "/" foi removido da política MessageLogging. Isso resolveu o problema.

Exemplo 2: nome do host não resolvível

  1. O registro do processador de mensagens tinha algumas linhas que mostram que o evento de implantação de um proxy de API é acionado, 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>' for Syslog handler".

  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 no nome do host e na porta usados na política de geração de registros de mensagens.

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

      Política 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 no host com uma porta específica. Para este exemplo, tentamos o Telnet e recebemos o mesmo erro mostrado 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 provou claramente que o nome do host não pode ser resolvido.

Resolução

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

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

Causa: nome KeyValueMap inválido

Diagnóstico

  1. Nos registros do processador de mensagens, se você encontrar 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, siga 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 analisar um exemplo para entender como solucionar e resolver esse problema.

  3. Registro do processador de mensagens de exemplo mostrando a exceção com a mensagem "KeyValueMap name is invalid" que leva a um erro 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 proxy de API: CustomerAPI, revisão: 1.

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

  6. Ao analisar o pacote do proxy de API, você encontra uma política KeyValuMapOperations que tem 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 mostrado acima, o mapIdentifier, que indica o nome do KeyValueMap, tem uma string vazia. O nome 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 adequado para o KeyValueMap.
  2. No exemplo acima, resolvemos o problema modificando o KeyValueMapOperations para ter 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>
    

Precisa de informações de diagnóstico

Se o problema persistir mesmo depois de seguir as instruções acima, reúna as informações de diagnóstico a seguir. Entre em contato com o suporte do Apigee Edge e forneça 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 outras informações que nos ajudarão a acelerar a resolução desse problema.