Estás viendo la documentación de Apigee Edge.
Ir a la
documentación de Apigee X. info
Síntoma
La implementación de revisiones de proxy de API o de flujo compartido a través de la IU de Edge o la API de administración falla con un error de Configuration failed.
Mensaje de error
Verá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 = []}
Esta es la captura de pantalla de un mensaje de error de ejemplo que se observó en la IU de Edge:

Causas posibles
La implementación de un proxy de API puede fallar con el error "Configuration failed" por muchos motivos 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 para |
| Falta la clase 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 de Edge |
| Se usaron operandos incorrectos en las condiciones del flujo condicional | Los operandos o las 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 | No se puede resolver el nombre de host que se usa en la política MessageLogging o puede tener algunos caracteres especiales no deseados. | |
| Nombre de KeyValueMap no válido | El KeyValueMap no es válido o está vacío en la política KeyValueMapOperations en el proxy de API. |
Pasos comunes de diagnóstico
Obtén el estado de las implementaciones para la revisión específica del proxy de API para la que observas el error de implementación con la siguiente API:
curl -v <management-server-host>:<port#>/v1/runtime/organizations/<org-name>/environments/<env-name>/apis/<apiproxy-name>/revisions/deployments -u <user>Este es un ejemplo de resultado 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" },Verás el mensaje de error "Configuration failed" en cada uno de los procesadores de mensajes en el resultado del estado de implementación.
Accede a uno de los Message Processor(s) y verifica el registro
/opt/apigee/var/log/edge-message-processor/logs/system.log. Comprueba si hay errores durante la implementación del proxy de API.Según el error o la excepción que se observe en el registro del Message Processor, debes seguir los pasos de solución de problemas y la resolución adecuados para el problema.
En las siguientes secciones, se proporcionan algunas de las excepciones observadas con mayor frecuencia que generan el error de implementación "Configuration failed" y se proporcionan pasos para solucionar problemas y resolverlos.
Causa: Falta la clase Java en la política JavaCallout
Diagnóstico
- En los registros del Message Processor, si ves alguna excepción con el mensaje "Failed to instantiate the JavaCallout 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 Se usaron operandos incorrectos en las condiciones del flujo condicional.
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>El mensaje de error en la excepción anterior indica que no se pudo crear una instancia de la clase JavaCallout
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 JavaCallout o en cualquiera de sus archivos JAR dependientes.Verifica el archivo JAR que contenía todas las clases relacionadas con el paquete
com.something.apigee.callout.crypto.mainy confirma que faltaba la clase específicacom.something.apigee.callout.crypto.main.SecretCallout.
Solución
- Agrega la clase que falta al archivo JAR específico y sube el archivo JAR.
- Vuelve a implementar el proxy de API.
- En el ejemplo anterior, resolvimos el problema de la siguiente manera:
- Agregamos la clase que falta
com.something.apigee.callout.crypto.main.SecretCalloutal archivo JAR. - Subimos el archivo JAR actualizado y volvimos a implementar el proxy de API.
- Agregamos la clase que falta
Causa: Se usaron operandos incorrectos con operadores en el flujo condicional
Diagnóstico
En los registros del Message Processor, si ves un
com.apigee.expressions.parser.ParseExceptiondurante 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 expressionsVeamos un ejemplo para comprender cómo diagnosticar este problema.
Ejemplo : Los operandos para la expresión <Operator> deben ser expresiones de datos
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>El 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.Observa las condiciones en todos los flujos condicionales que involucran el operador específico mencionado en el mensaje de error y comprueba si hay alguno de los siguientes problemas:
- 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 valor de cadena en el lado derecho.
- Se usan variables válidas entre los operadores.
- Hay un espacio entre el operador y cada una de las expresiones.
Si no se cumple ninguno de los criterios mencionados anteriormente, obtendrás ParseException: "
Both the operands for EQUALS expression should be data expressions".Veamos un ejemplo para comprender este problema. Esta es una condición de error de ejemplo.
<Condition> (fault.name = "invalid_access_token") or(fault.name = "ApiKeyNotApproved") </Condition>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, obtienes esta excepción:
com.apigee.expressions.parser.ParseException: Both the operands for EQUALS expression should be data expressions
Solución
- Asegúrate de tener siempre expresiones de datos adecuadas a ambos lados de los operadores.
En el ejemplo analizado anteriormente, la resolución fue 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 MessageLogging
Diagnóstico
En los registros del Message Processor, si ves alguna excepción con el mensaje "Invalid HostName" 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, 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 handlerVeamos los siguientes dos ejemplos para comprender cómo solucionar este problema.
Ejemplo 1: HostName con un carácter especial no deseado
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>La excepción anterior muestra que la implementación falla debido a "Invalid HostName '<hostname>' for Syslog handler". Esto indica que el HostName que se usa en la política MessageLogging es un nombre de host no válido.
Si examinas la excepción en el registro del Message Processor con atención, verás que hay un carácter especial no deseado "/" al final del HostName
'splunkprod.myorg.com/'.Este carácter especial no deseado fue la causa del error de implementación.
Solución
- Modifica la política MessageLogging para quitar los caracteres especiales no deseados y resolver el problema.
- En el ejemplo anterior, se quitó el carácter especial "/" de la política MessageLogging. Esto resolvió el problema.
Ejemplo 2: Nombre de host no resoluble
El registro del Message Processor tenía algunas líneas que muestran 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>La excepción anterior muestra que la implementación falla debido a "Invalid HostName '<hostname>' for Syslog handler".
Si lees la línea sobre la excepción, puedes notar que el Message Processor no puede resolver el nombre de host
'input-prd.cloud.splunk.com'que se proporciona en la política MessageLogging.Para confirmar esto, puedes intentar ejecutar telnet al nombre de host y al número de puerto que se usan en la política de registro de mensajes.
Verifica 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 que se usan. En el ejemplo anterior, el nombre del proxy de API es myapi y la revisión es 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>Ejecuta telnet al host con un puerto específico. En este ejemplo, probamos telnet y obtuvimos el mismo error que se ve en el registro del 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
Esto demostró claramente que no se puede resolver el nombre de host.
Solución
- Modifica la política MessageLogging para usar 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
En los registros del Message Processor, si ves 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 Se debe recopilar información de diagnóstico.
com.apigee.rest.framework.ValidationException: Invalid syslog config: Invalid HostName 'splunkprod.myorg.com/' for Syslog handlerVeamos un ejemplo para comprender cómo solucionar este problema.
Registro del Message Processor de ejemplo que muestra la excepción con el mensaje "KeyValueMap name is invalid" 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]La segunda excepción anterior indica que el error de implementación ocurrió para API Proxy: CustomerAPI, revisión: 1.
Si verificas el seguimiento de pila, puedes notar que se arroja un error mientras se ejecuta la política KeyValuMapOperations.
Si observas el paquete del proxy de API, verás que hay una política KeyValuMapOperations que tiene el código 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=""> <DisplayName>Pulling Keys</DisplayName> <Properties/> <ExclusiveCache>false</ExclusiveCache>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
- Modifica la política KeyValueMapOperations para que tenga un nombre válido adecuado para el KeyValueMap.
En el ejemplo anterior, resolvimos el problema modificando KeyValueMapOperations para que el nombre de KeyValueMap sea "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ónales la información recopilada.
Resultado del comando
curl -v <management-server-host>:<port #>/v1/runtime/organizations/<org-name>/environments/<env-name>/apis/<apiproxy-name>/revisions/deployments -u <user>Registros del Message Processor
/opt/apigee/var/log/edge-message-processor/logs/system.logDetalles sobre las secciones de esta guía que se probaron y cualquier otra información que nos ayude a acelerar la resolución de este problema