No se pudo configurar el error de implementación

Estás consultando la documentación de Apigee Edge.
Consulta la documentación de Apigee X.
Información

Síntoma

La implementación del proxy de la API o las revisiones de flujo compartido a través de la IU de Edge o la API de administración falla con el error Configuration failed.

Mensaje de error

Recibirás un mensaje de error en la IU de Edge como se muestra a continuación:

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

A continuación, se muestra una captura de pantalla de un mensaje de error de muestra observado en la IU de Edge:

Causas posibles

La implementación de un proxy de API puede fallar y mostrar el error "Error de configuración" debido a muchos motivos diferentes. En la siguiente tabla, se enumeran algunas causas que se observan con frecuencia que generan este error :

Causa Descripción Instrucciones de solución de problemas aplicables a
Falta la clase Java en la política JavaDestacado Falta una clase Java en el archivo JAR al que hace referencia la política JavaLarge. Usuarios de la nube privada perimetral
Se usaron operandos incorrectos en las condiciones del flujo de condición Las expresiones o los operandos usados en uno o ambos lados de los operadores en las condiciones no son válidos.
Nombre de host no válido en la política de Registro de mensajes El nombre de host que se usa en la política de MessageLogging no se puede resolver o puede tener algunos caracteres especiales no deseados.
El nombre de KeyValueMap no es válido KeyValueMap no es válido o está vacío en la política KeyValueMapOperations del proxy de API.

Pasos comunes del diagnóstico

  1. Obtén el estado de las implementaciones para la revisión específica del proxy de API en la que observas el error de implementación mediante la siguiente API:

    curl -v <management-server-host>:<port#>/v1/runtime/organizations/<org-name>/environments/<env-name>/apis/<apiproxy-name>/revisions/deployments -u <user>
    
  2. Este es un resultado de ejemplo de la API anterior:

    "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. Verás el mensaje de error “Error de configuración” en cada uno de los procesadores de mensajes en el resultado del estado de implementación.

  4. Accede a uno de los procesadores de mensajes y revisa el registro /opt/apigee/var/log/edge-message-processor/logs/system.log. Observa si hay algún error durante la implementación del proxy de API.

  5. Según el error o la excepción observados en el registro de Message Processor, deberás seguir los pasos y la resolución adecuados para solucionar el problema.

  6. En las siguientes secciones, se proporcionan algunas de las excepciones observadas con más frecuencia que provocan el error de implementación "Configuration failed" y se proporcionan pasos para solucionarlas y solucionarlas.

Causa: Falta la clase Java en la política JavaDestacado

Diagnóstico

  1. En los registros de Message Processor, si observas alguna excepción con el mensaje "Failed to Instantiate the Javahere Class" durante la implementación de un proxy de API (DeployEvent), como se muestra a continuación, continúa con el paso 2. De lo contrario, ve a Operandos incorrectos en las condiciones del flujo de condición.
  2. El Message Processor muestra la siguiente excepción durante la implementación del 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. El mensaje de error de la excepción anterior indica que no se pudo crear una instancia de la clase JavaHighlight com.something.apigee.callout.crypto.main.SecretCallout. Este error suele ocurrir cuando la clase específica no está disponible en el archivo JAR especificado en la política Javahere ni en ninguno de sus archivos JAR dependientes.

  4. Verifica el archivo JAR que contenía todas las clases correspondientes al paquete com.something.apigee.callout.crypto.main y confirma que faltara la clase específica com.something.apigee.callout.crypto.main.SecretCallout.

Resolución

  1. Agrega la clase que falta al archivo JAR específico y sube ese archivo.
  2. Vuelve a implementar el proxy de API.
  3. En el ejemplo anterior, resolvimos el problema de la siguiente manera:
    1. Agregando la clase com.something.apigee.callout.crypto.main.SecretCallout faltante al archivo JAR
    2. Subir el archivo JAR actualizado y volver a implementar el proxy de API

Causa: Se usan operandos incorrectos con operadores en el flujo de condición

Diagnóstico

  1. En los registros del procesador de mensajes, si ves un com.apigee.expressions.parser.ParseException durante la implementación de un proxy de API o un flujo compartido, como se muestra en los mensajes de ejemplo a continuación, continúa con el paso 2. De lo contrario, ve a la siguiente causa Nombre de host no válido en la política de Registro de mensajes.

    Ejemplo de mensaje de error

    com.apigee.expressions.parser.ParseException: Both the operands for EQUALS expression should be data expressions
    
    
  2. Veamos un ejemplo para comprender cómo diagnosticar este problema.

    Ejemplo : Los operandos para la expresión <Operator> deben ser expresiones de datos

  3. Message Processor muestra la siguiente excepción durante la implementación de un flujo compartido:

    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. El mensaje de error en ParseException: "Both the operands for EQUALS expression should be data expressions" indica que una condición que involucra el operador igual a (=), no igual a (!=) o Stats con (=|) tiene un problema.

  5. Observa las condiciones en todos los flujos de condición que involucran el operador específico mencionado en el mensaje de error y verifica si hay alguno de los siguientes problemas:

    1. Las expresiones a ambos lados del operador son del mismo tipo. Por ejemplo, si tienes una variable de cadena a la izquierda del operador, debes tener otra variable de cadena o valor de cadena a la derecha.
    2. Se usan variables válidas entre los operadores.
    3. Hay un espacio entre el operador y cada una de las expresiones.

  6. Si no se cumple alguno de los criterios mencionados anteriormente, obtendrás la excepción ParseException “Both the operands for EQUALS expression should be data expressions”.

  7. Veamos un ejemplo para entender este problema. Este es un ejemplo de condición de error que

    <Condition>
               (fault.name = "invalid_access_token") or(fault.name = "ApiKeyNotApproved")
    </Condition>
    
  8. En este ejemplo, puedes observar que no hay espacio entre el operador "or" y la siguiente condición. Por lo tanto, cuando se analiza la segunda condición, la primera expresión se toma como "or(fault.name") para el operador EQUALS. Este no es un nombre de variable válido, por lo que no se trata como una expresión de datos válida. Como consecuencia, obtendrás esta excepción:

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

Resolución

  1. Asegúrate de tener siempre expresiones de datos adecuadas a ambos lados de los operadores.
  2. En el ejemplo anterior, la resolución consistía en garantizar que hubiera espacio después del operador "or", como se describe en el fragmento de código:

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

Nombre de host no válido en la política de MessageLogging

Diagnóstico

  1. En los registros de Message Processor, si observas alguna excepción con el mensaje "Invalid HostName" durante la implementación del proxy de API o flujo compartido, como se muestra a continuación, continúa con el paso 2. De lo contrario, ve a la siguiente causa Nombre de KeyValueMap no válido.

    com.apigee.rest.framework.ValidationException: Invalid syslog config: Invalid HostName 'splunkprod.myorg.com/' for Syslog handler
    
  2. Veamos los dos ejemplos que aparecen a continuación para entender cómo solucionar este problema.

Ejemplo 1: Nombre de host con un carácter especial no deseado

  1. El Message Processor muestra la siguiente excepción durante la implementación del 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. La excepción anterior muestra que la implementación falla debido a "Invalid HostName '<hostname>' for Syslog controlador". Esto indica que el HostName usado en la política MessageLogging es un nombre de host no válido.

  3. Al examinar la excepción en el registro de Message Processor, se muestra con cuidado que hay un carácter especial "/" no deseado al final de HostName 'splunkprod.myorg.com/'.

  4. Este carácter especial no deseado fue la causa del error de implementación.

Resolución

  1. Modifica la política MessageLogging para quitar los caracteres especiales no deseados y resolver el problema.
  2. En el ejemplo anterior, se quitó el carácter especial “/” de la política de MessageLogging. Esta acción resolvió el problema.

Ejemplo 2: Nombre de host que no se puede resolver

  1. El registro de Message Processor tenía algunas líneas que indican que se activa el evento de implementación para un proxy de API, seguido de una excepción que ocurre durante la implementación del 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. La excepción anterior muestra que la implementación falla debido a "Invalid HostName '<hostname>' for Syslog controlador".

  3. Si lees la línea anterior a la excepción, notarás que Message Processor no puede resolver el nombre de host 'input-prd.cloud.splunk.com' proporcionado en la política MessageLogging.

  4. Para confirmarlo, puedes intentar conectarte mediante telnet al nombre de host y el número de puerto que se usaron en la política de Registro de mensajes.

    1. Verifica la política de MessageLogging en la revisión específica del proxy de API y verifica el nombre de host y el número de puerto que se usó. En el ejemplo anterior, el nombre del proxy de API: myapi, revisión: 42

      Política de 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. Usa Telnet al host con un puerto específico. Para este ejemplo, probamos telnet y obtuvimos el mismo error que aparece en el registro de Message Processor:

      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. Esto demostró claramente que el nombre de host no se puede resolver.

Resolución

  1. Modifica la política MessageLogging para usar el nombre de host válido.

Si el problema persiste, ve a Debes recopilar información de diagnóstico.

Causa: Nombre de KeyValueMap no válido

Diagnóstico

  1. En los registros de Message Processor, si observas una excepción con el mensaje "KeyValueMap name is invalid" durante la implementación de un proxy de API o un flujo compartido como se muestra a continuación, continúa con el paso 2. De lo contrario, ve a Debe recopilar información de diagnóstico.

    com.apigee.rest.framework.ValidationException: Invalid syslog config: Invalid HostName 'splunkprod.myorg.com/' for Syslog handler
    
  2. Veamos un ejemplo para comprender cómo solucionar este problema.

  3. Ejemplo de registro de Message Processor que muestra la excepción con el mensaje "KeyValueMap name is invalid" lo que genera un error durante la implementación del 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. La segunda excepción anterior indica que se produjo un error de implementación en Proxy de API: CustomerAPI, revisión 1.

  5. Al verificar el seguimiento de pila, puedes observar que se produce un error cuando se ejecuta la política KeyValuMapOperations.

  6. Cuando observas el paquete del proxy de la API, descubres que hay una política KeyValuMapOperations que tiene el código que se muestra a continuación:

    <?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 se ve antes, el mapIdentifier, que indica el nombre del KeyValueMap, tiene una string vacía. El nombre de KeyValueMap no puede ser una cadena vacía. Esta fue la causa del error de Deployment.

Resolución

  1. Modifica la política KeyValueMapOperations para que tenga un nombre válido adecuado para KeyValueMap.
  2. En el ejemplo anterior, resolvimos el problema modificando KeyValueMapOperations para que el nombre de KeyValueMap fuera "MyKeyValueMap", como se muestra a continuación:

      <?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>
    

Se debe recopilar información de diagnóstico

Si el problema persiste, incluso después de seguir las instrucciones anteriores, recopila la siguiente información de diagnóstico. Comunícate con el equipo de asistencia de Apigee Edge y proporciónale la información que recopila.

  1. Resultado del comando

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

    /opt/apigee/var/log/edge-message-processor/logs/system.log
    
  3. Detalles acerca de las secciones de esta Guía que se han probado y cualquier otra información que nos ayude a resolver este problema rápidamente.