No se pudo configurar el error de implementación

Estás viendo la documentación de Apigee Edge.
Ve a la Documentación de Apigee X.
información

Síntoma

La implementación del proxy de API o de revisiones de flujo compartido a través de la IU de Edge o la API de Management falla y muestra el mensaje Error de configuración.

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 la captura de pantalla de un ejemplo de mensaje de error observado en la IU de Edge:

Causas posibles

La implementación de un proxy de API puede fallar con un mensaje de error de configuración de errores debido a muchas razones diferentes. En la siguiente tabla, se enumeran algunas causas observadas con frecuencia que generan este error :

Causa Descripción Instrucciones de solución de problemas aplicables a
Falta la clase de Java en la política JavaCallout Falta una clase Java en el archivo JAR al que hace referencia la política JavaCallout. Usuarios de la nube privada perimetral
Se usaron operandos incorrectos en las condiciones del flujo de condición Los operandos o expresiones que se usan 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 contener 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 de diagnóstico

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

    curl -v <management-server-host>:<port#>/v1/runtime/organizations/<org-name>/environments/<env-name>/apis/<apiproxy-name>/revisions/deployments -u <user>
    
  2. Aquí hay 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 "Configuration failed" en cada uno de los Message Processor en el resultado del estado de implementación.

  4. Accede a uno de los Message Processor y revisa el registro /opt/apigee/var/log/edge-message-processor/logs/system.log. Verifica 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, debes seguir los pasos 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 “Error de configuración” y se indican los pasos para solucionarlos y resolverlos.

Causa: Falta la clase Java en la política JavaDeclaración

Diagnóstico

  1. En los registros de Message Processor, si ves alguna excepción con el mensaje "Failed to instanceiate the Java dicha Class" (no se pudo crear una instancia de la clase JavaDeclaración) 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, consulta Operandos incorrectos usados en condiciones en el flujo de condición.
  2. 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 en la excepción anterior indica que no se pudo crear una instancia de la clase com.something.apigee.callout.crypto.main.SecretCallout de JavaTexto. Este error suele ocurrir cuando la clase específica no está disponible en el archivo JAR especificado en la política JavaTexto destacado o en cualquiera de los archivos JAR dependientes.

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

Solución

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

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

Diagnóstico

  1. En los registros de Message Processor, si ves una com.apigee.expressions.parser.ParseException durante la implementación de un proxy de API o de flujo compartido, como se muestra en los mensajes de ejemplo que aparecen a continuación, continúa con el paso 2. De lo contrario, dirígete a la causa siguiente: El nombre de host no es válido en la política de Message Logging.

    Ejemplo de mensaje de error

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

    Ejemplo : Operandos para <Operator> expresión deben ser expresiones de datos

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

  5. Observa las condiciones en todos los flujos de condiciones relacionados con el operador específico mencionado en el mensaje de error y comprueba 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 en el lado izquierdo del operador, debes tener otra variable de cadena o un valor de cadena en el lado derecho.
    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 ParseException - "Both the operands for EQUALS expression should be data expressions".

  7. Observemos un ejemplo para entender este problema. A continuación, se muestra un ejemplo de una condición de error

    <Condition>
               (fault.name = "invalid_access_token") or(fault.name = "ApiKeyNotApproved")
    </Condition>
    
  8. En este ejemplo, se puede observar que no hay espacio entre los caracteres "o" y, luego, a la condición siguiente. 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
    
    

Solució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 consistió en asegurarse de que hubiera espacio después de la palabra “o” 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 del procesador de mensajes, si ves alguna excepción con el mensaje "Nombre de host no válido" durante la implementación del proxy de API o el flujo compartido, como se muestra a continuación, continúa con el paso 2. De lo contrario, vaya a la causa siguiente: El nombre de KeyValueMap no es válido.

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

Ejemplo 1: HostName con un carácter especial no deseado

  1. 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 que "Nombre de host no válido '<nombredehost>" para el controlador Syslog". Esto indica que el HostName que se usa en la política de MessageLogging es un nombre de host no válido.

  3. Si examina detenidamente la excepción en el registro de Message Processor, verá que hay un carácter especial "/" no deseado. al final del nombre de host 'splunkprod.myorg.com/'.

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

Solución

  1. Modifica la política de MessageLogging para quitar los caracteres especiales no deseados y resolver el problema.
  2. En el ejemplo anterior, el carácter especial "/" se quitó de la política de MessageLogging. Esto 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 muestran cómo se activó el evento de implementación de un proxy de API, seguida 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 que "Nombre de host no válido '<nombredehost>" para el controlador Syslog".

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

  4. Para confirmarlo, intenta usar telnet con el nombre de host y el puerto # que se usan en la política de Message Logging.

    1. Comprueba la política MessageLogging en la revisión específica del proxy de API y verifica el nombre de host y el número de puerto usados. En el ejemplo anterior, el nombre del proxy de API es 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. 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.

Solución

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

Si el problema persiste, consulta Se debe recopilar información de diagnóstico.

Causa: Nombre de KeyValueMap no válido

Diagnóstico

  1. En los registros de Message Processor, si ves una excepción con el mensaje “KeyValueMap name is invalid” durante la implementación de un proxy de API o de un flujo compartido, como se muestra a continuación, continúa con el paso 2. De lo contrario, consulte el artículo Se debe recopilar información de diagnóstico.

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

  3. Ejemplo de registro del procesador de mensajes en el que se muestra la excepción con el mensaje “El nombre de KeyValueMap no es válido” lo que genera errores 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 el error de implementación se produjo en API Proxy: CustomerAPI, revision: 1.

  5. Si revisas el seguimiento de pila, puedes ver que se genera un error cuando se ejecuta la política KeyValuMapOperations.

  6. Si observas el paquete del proxy de API, notarás 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 arriba, el mapIdentifier, que indica el nombre del KeyValueMap, tiene una cadena vacía. El nombre de KeyValueMap no puede ser una cadena vacía. Esta fue la causa del error de implementación.

Solución

  1. Modifica la política KeyValueMapOperations a fin de tener un nombre válido adecuado para KeyValueMap.
  2. En el ejemplo anterior, resolvimos el problema modificando KeyValueMapOperations para que tuviera el nombre KeyValueMap como "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 recopilada.

  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 del procesador de mensajes

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