Вы просматриваете документацию Apigee Edge .
Перейдите к документации Apigee X. информация
Симптом
Развертывание прокси-сервера API или версий общего потока через интерфейс Edge или API управления завершается с ошибкой конфигурации .
Сообщение об ошибке
Вы получите сообщение об ошибке в пользовательском интерфейсе Edge, как показано ниже:
The revision is deployed, but traffic cannot flow.
com.apigee.kernel.exceptions.spi.UncheckedException{ code = application.bootstrap.FailedToConfigure, message = Configuration failed, associated contexts = []}
Вот снимок экрана с примером сообщения об ошибке, наблюдаемого в пользовательском интерфейсе Edge:
Возможные причины
Развертывание прокси-сервера API может завершиться с ошибкой «Ошибка конфигурации» по множеству разных причин. В таблице ниже перечислены несколько часто встречающихся причин, приводящих к этой ошибке:
Причина | Описание | Инструкции по устранению неполадок применимы для |
Отсутствует класс Java в политике JavaCallout | Класс Java отсутствует в файле JAR, на который ссылается политика JavaCallout. | Пользователи Edge частного облака |
В условиях потока условий используются неправильные операнды. | Операнды/выражения, используемые с одной или обеих сторон операторов в условиях, недопустимы. | |
Неверное имя хоста в политике ведения журнала сообщений. | Имя хоста, используемое в политике MessageLogging, не может быть разрешено или может содержать нежелательные специальные символы. | |
Неверное имя KeyValueMap | KeyValueMap недействителен или пуст в политике KeyValueMapOperations в прокси-сервере API. |
Общие этапы диагностики
Получите статус развертываний для конкретной версии прокси-сервера API, для которой вы наблюдаете ошибку развертывания, с помощью приведенного ниже API:
curl -v <management-server-host>:<port#>/v1/runtime/organizations/<org-name>/environments/<env-name>/apis/<apiproxy-name>/revisions/deployments -u <user>
Вот пример вывода вышеуказанного API;
"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" },
Вы увидите сообщение об ошибке «Ошибка конфигурации» в каждом из процессоров сообщений в выходных данных о состоянии развертывания.
Войдите в один из процессоров сообщений и проверьте журнал
/opt/apigee/var/log/edge-message-processor/logs/system.log
. Посмотрите, нет ли ошибок при развертывании прокси-сервера API.В зависимости от ошибки/исключения, наблюдаемого в журнале процессора сообщений, вам необходимо выполнить соответствующие действия по устранению неполадок и решению проблемы.
В разделах ниже представлены некоторые из наиболее часто наблюдаемых исключений, которые приводят к ошибке развертывания « Ошибка конфигурации» , а также приведены действия по их устранению и устранению.
Причина: в политике JavaCallout отсутствует класс Java.
Диагностика
- Если в журналах процессора сообщений вы видите какое-либо исключение с сообщением «Не удалось создать экземпляр класса JavaCallout» во время развертывания прокси-сервера API (DeployEvent), как показано ниже, перейдите к шагу №2. Если нет, перейдите к разделу «Неправильные операнды, используемые в условиях потока условий» .
Обработчик сообщений отображает следующее исключение во время развертывания прокси-сервера 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>
Сообщение об ошибке в приведенном выше исключении указывает на то, что не удалось создать экземпляр класса JavaCallout
com.something.apigee.callout.crypto.main.SecretCallout
. Эта ошибка обычно возникает, когда определенный класс недоступен в файле JAR, указанном в политике JavaCallout, или в любом из ее зависимых файлов JAR.Проверьте файл JAR, содержащий все классы, относящиеся к пакету
com.something.apigee.callout.crypto.main
, и убедитесь, что конкретный классcom.something.apigee.callout.crypto.main.SecretCallout
отсутствует.
Разрешение
- Добавьте недостающий класс в конкретный файл JAR и загрузите файл JAR.
- Повторно разверните прокси-сервер API.
- В приведенном выше примере мы решили проблему следующим образом:
- Добавление отсутствующего класса
com.something.apigee.callout.crypto.main.SecretCallout
в файл JAR. - Загрузка обновленного файла JAR и повторное развертывание прокси-сервера API.
- Добавление отсутствующего класса
Причина: неправильные операнды используются с операторами в потоке условий.
Диагностика
Если в журналах процессора сообщений вы видите исключение
com.apigee.expressions.parser.ParseException
во время развертывания прокси-сервера API или общего потока, как показано в примерах сообщений ниже, затем перейдите к шагу № 2. Если нет, перейдите к следующей причине : Неверное имя хоста в политике ведения журнала сообщений .Пример сообщения об ошибке
com.apigee.expressions.parser.ParseException: Both the operands for EQUALS expression should be data expressions
Давайте рассмотрим пример, чтобы понять, как диагностировать эту проблему.
Пример: операнды для выражения <Operator> должны быть выражениями данных.
Обработчик сообщений отображает следующее исключение во время развертывания общего потока:
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>
Сообщение об ошибке в ParseException — «
Both the operands for EQUALS expression should be data expressions
» указывает на то, что условие, включающее оператор равенства (=), не равно (!=) или статистики с (=|), имеет проблему.Просмотрите условия во всех потоках условий, включающих конкретный оператор, упомянутый в сообщении об ошибке, и проверьте, есть ли какие-либо из следующих проблем:
- Выражения по обе стороны от оператора имеют один и тот же тип. Например, если у вас есть строковая переменная в левой части оператора, вам необходимо иметь другую строковую переменную или строковое значение в правой части.
- Между операторами используются допустимые переменные.
- Между оператором и каждым выражением есть пробел.
Если какой-либо из вышеупомянутых критериев не соблюдается, вы получаете исключение ParseException: «
Both the operands for EQUALS expression should be data expressions
».Давайте рассмотрим пример, чтобы понять эту проблему. Вот пример состояния ошибки, которое
<Condition> (fault.name = "invalid_access_token") or(fault.name = "ApiKeyNotApproved") </Condition>
В этом примере вы можете заметить, что между оператором «или» и следующим условием нет пробела. Таким образом, при анализе второго условия первое выражение принимается как «or(fault.name» для оператора EQUALS. Это недопустимое имя переменной, поэтому оно не рассматривается как допустимое выражение данных. Как следствие, вы получить это исключение:
com.apigee.expressions.parser.ParseException: Both the operands for EQUALS expression should be data expressions
Разрешение
- Убедитесь, что у вас всегда есть правильные выражения данных по обе стороны от операторов.
В приведенном выше примере решением было обеспечить наличие пробела после оператора «или», как описано во фрагменте кода:
<Condition> (fault.name = "invalid_access_token") or (fault.name = "ApiKeyNotApproved") </Condition>
Неверное имя хоста в политике регистрации сообщений
Диагностика
Если в журналах процессора сообщений вы видите какое-либо исключение с сообщением «Неверное имя хоста» во время развертывания прокси-сервера API или общего потока, как показано ниже, перейдите к шагу №2. Если нет, перейдите к следующей причине. Неверное имя KeyValueMap .
com.apigee.rest.framework.ValidationException: Invalid syslog config: Invalid HostName 'splunkprod.myorg.com/' for Syslog handler
Давайте рассмотрим два примера ниже, чтобы понять, как устранить и решить эту проблему.
Пример 1: Имя хоста имеет нежелательный специальный символ
Обработчик сообщений отображает следующее исключение во время развертывания прокси-сервера 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>
Исключение выше показывает, что развертывание не удалось из-за «Неверное имя хоста '<имя хоста>' для обработчика системного журнала» . Это указывает на то, что имя хоста, используемое в политике регистрации сообщений, является недопустимым именем хоста.
Внимательное изучение исключения в журнале процессора сообщений показывает, что в конце имени хоста
'splunkprod.myorg.com/'.
Этот нежелательный специальный символ стал причиной ошибки развертывания.
Разрешение
- Измените политику MessageLogging, удалив все нежелательные специальные символы, чтобы решить проблему.
- В приведенном выше примере специальный символ «/» был удален из политики регистрации сообщений. Это решило проблему.
Пример 2: Неразрешимое имя хоста
В журнале процессора сообщений было несколько строк, показывающих, что инициируется событие развертывания прокси-сервера API, за которым следует исключение, возникающее во время развертывания прокси-сервера 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>
Исключение выше показывает, что развертывание не удалось из-за «Неверное имя хоста '<имя хоста>' для обработчика системного журнала» .
Если вы прочитаете строку над исключением, вы заметите, что процессор сообщений не может разрешить имя хоста
'input-prd.cloud.splunk.com'
указанное в политике MessageLogging.Чтобы убедиться в этом, вы можете попробовать подключиться по телнету к имени хоста и номеру порта, используемых в политике ведения журнала сообщений.
Проверьте политику регистрации сообщений в конкретной версии прокси-сервера API и проверьте имя хоста и номер порта. В приведенном выше примере имя прокси-сервера API: myapi, версия: 42.
Политика регистрации сообщений
<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>
Telnet к хосту с определенным портом. В этом примере мы попробовали telnet и получили ту же ошибку, что и в журнале процессора сообщений:
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
Это ясно доказывает, что имя хоста не может быть разрешено.
Разрешение
- Измените политику MessageLogging, чтобы использовать допустимое имя хоста.
Если проблема не устранена, перейдите к разделу «Необходимо собрать диагностическую информацию» .
Причина: неверное имя KeyValueMap.
Диагностика
Если в журналах процессора сообщений вы видите исключение с сообщением «Имя KeyValueMap недопустимо» во время развертывания прокси-сервера API или общего потока, как показано ниже, перейдите к шагу №2. Если нет, перейдите к разделу «Необходимо собрать диагностическую информацию» .
com.apigee.rest.framework.ValidationException: Invalid syslog config: Invalid HostName 'splunkprod.myorg.com/' for Syslog handler
Давайте рассмотрим пример, чтобы понять, как устранить и решить эту проблему.
Пример журнала обработчика сообщений, в котором показано исключение с сообщением «Имя KeyValueMap недопустимо», что приводит к ошибке во время развертывания прокси-сервера 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]
Второе исключение выше указывает на то, что произошла ошибка развертывания прокси-сервера API: CustomerAPI, версия: 1.
Проверяя трассировку стека, вы можете заметить, что при выполнении политики KeyValuMapOperations возникает ошибка.
Заглянув в пакет API Proxy, вы обнаружите, что существует одна политика KeyValuMapOperations, код которой показан ниже:
<?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>
Как видно выше, MapIdentifier , который указывает имя KeyValueMap, имеет пустую строку. Имя KeyValueMap не может быть пустой строкой. Это было причиной ошибки развертывания.
Разрешение
- Измените политику KeyValueMapOperations, чтобы указать правильное допустимое имя для KeyValueMap.
В приведенном выше примере мы решили проблему, изменив KeyValueMapOperations, чтобы имя KeyValueMap было «MyKeyValueMap», как показано ниже:
<?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>
Необходимо собрать диагностическую информацию
Если проблема не устранена даже после выполнения приведенных выше инструкций, соберите следующую диагностическую информацию. Свяжитесь со службой поддержки Apigee Edge и предоставьте им собранную информацию.
Вывод команды
curl -v <management-server-host>:<port #>/v1/runtime/organizations/<org-name>/environments/<env-name>/apis/<apiproxy-name>/revisions/deployments -u <user>
Журналы процессора сообщений
/opt/apigee/var/log/edge-message-processor/logs/system.log
Подробная информация о том, какие разделы этого руководства были опробованы, а также любые другие сведения, которые помогут нам ускорить решение этой проблемы.