شما در حال مشاهده مستندات Apigee Edge هستید.
به مستندات Apigee X مراجعه کنید . اطلاعات
علامت
پیادهسازی پروکسی API یا اصلاحات Shared Flow از طریق رابط کاربری Edge یا API مدیریتی با خطای Configuration failed مواجه میشود.
پیام خطا
همانطور که در زیر نشان داده شده است، یک پیام خطا در رابط کاربری 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 Proxy میتواند به دلایل مختلفی با خطای "Configuration failed" مواجه شود. جدول زیر چند دلیل رایج که منجر به این خطا میشوند را فهرست میکند:
| علت | توضیحات | دستورالعملهای عیبیابی قابل اجرا برای |
| کلاس جاوا در خطمشی JavaCallout وجود ندارد | یک کلاس جاوا در فایل JAR که توسط خطمشی JavaCallout به آن ارجاع داده میشود، وجود ندارد. | کاربران ابر خصوصی Edge |
| عملوندهای نادرستی که در شرطهای موجود در روند شرط استفاده شدهاند | عملوندها/عباراتی که در یک یا هر دو طرف عملگرها در شرطها استفاده میشوند، معتبر نیستند. | |
| نام میزبان نامعتبر در سیاست ثبت پیام | نام میزبان استفاده شده در سیاست MessageLogging قابل اصلاح نیست یا ممکن است حاوی کاراکترهای خاص ناخواسته باشد. | |
| نام KeyValueMap نامعتبر است | KeyValueMap در سیاست KeyValueMapOperations در API Proxy نامعتبر یا خالی است. |
مراحل تشخیص رایج
وضعیت استقرار را برای نسخه خاصی از API Proxy که در آن خطای استقرار مشاهده میکنید، با استفاده از 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" },در خروجی وضعیت استقرار، پیام خطای "پیکربندی ناموفق بود" را در هر یک از پردازندههای پیام مشاهده خواهید کرد.
وارد یکی از پردازشگرهای پیام (Message Processor) شوید و فایل log
/opt/apigee/var/log/edge-message-processor/logs/system.logرا بررسی کنید. ببینید آیا در طول استقرار API Proxy خطایی وجود دارد یا خیر.بسته به خطا/استثنای مشاهده شده در گزارش پردازشگر پیام، باید مراحل عیبیابی و راهحل مناسب برای مشکل را دنبال کنید.
بخشهای زیر برخی از رایجترین استثنائات مشاهدهشده که منجر به خطای استقرار " پیکربندی ناموفق" میشوند را ارائه میدهند و مراحلی را برای عیبیابی و حل آنها ارائه میدهند.
علت: فقدان کلاس جاوا در JavaCallout Policy
تشخیص
- در گزارشهای پردازشگر پیام، اگر در حین استقرار یک API Proxy (DeployEvent) مطابق شکل زیر، هرگونه استثنایی با پیام "Failed to instantiate the JavaCallout Class" مشاهده کردید، به مرحله ۲ بروید. در غیر این صورت، در Condition Flow به بخش Incorrect operands used in conditions بروید.
پردازشگر پیام، هنگام استقرار پروکسی 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 Proxy.
- کلاس
علت: عملوندهای نادرستی که در روند شرط با عملگرها استفاده شدهاند
تشخیص
در گزارشهای پردازشگر پیام، اگر خطای
com.apigee.expressions.parser.ParseExceptionرا مشاهده کردیدcom.apigee.expressions.parser.ParseExceptionدر طول استقرار یک API Proxy یا Shared Flow همانطور که در پیامهای نمونه زیر نشان داده شده است، به مرحله ۲ بروید. اگر اینطور نیست، به مرحله بعدی بروید زیرا در سیاست ثبت پیام، نام میزبان نامعتبر است .مثال پیام خطا
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" نشان میدهد که شرطی که شامل مساوی (=)، غیر مساوی (!=) یا Stats با عملگر (=|) است، دارای مشکل است.به شرطهای موجود در تمام جریانهای شرط مربوط به عملگر خاص ذکر شده در پیام خطا نگاه کنید و ببینید آیا موارد زیر وجود دارد یا خیر:
- عبارات در دو طرف عملگر از یک نوع هستند. برای مثال، اگر یک متغیر رشتهای در سمت چپ عملگر دارید، باید یک متغیر رشتهای یا مقدار رشتهای دیگر در سمت راست داشته باشید.
- متغیرهای معتبر بین عملگرها استفاده میشوند.
- بین عملگر و هر یک از عبارات، یک فاصله وجود دارد.
اگر هر یک از معیارهای ذکر شده در بالا رعایت نشود، با خطای ParseException مواجه میشوید - «
Both the operands for EQUALS expression should be data expressions».بیایید برای درک این مسئله به یک مثال نگاه کنیم. در اینجا یک نمونه شرط خطا وجود دارد که
<Condition> (fault.name = "invalid_access_token") or(fault.name = "ApiKeyNotApproved") </Condition>در این مثال، میتوانید مشاهده کنید که هیچ فاصلهای بین عملگر "or" و سپس شرط بعدی وجود ندارد. بنابراین وقتی شرط دوم تجزیه میشود، عبارت اول برای عملگر EQUALS به صورت "or(fault.name)" در نظر گرفته میشود. این یک نام متغیر معتبر نیست، بنابراین به عنوان یک عبارت داده معتبر در نظر گرفته نمیشود. در نتیجه، با این استثنا مواجه میشوید:
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 Proxy یا Shared Flow مانند تصویر زیر، هرگونه استثنایی با پیام "Invalid HostName" مشاهده کردید، به مرحله ۲ بروید. در غیر این صورت، به دلیل Invalid KeyValueMap Name به مرحله بعدی بروید.
com.apigee.rest.framework.ValidationException: Invalid syslog config: Invalid HostName 'splunkprod.myorg.com/' for Syslog handlerبیایید به دو مثال زیر نگاه کنیم تا بفهمیم چگونه این مشکل را عیبیابی و حل کنیم.
مثال ۱: نام میزبان دارای کاراکتر ویژه ناخواسته است
پردازشگر پیام، هنگام استقرار پروکسی 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>استثنای بالا نشان میدهد که استقرار به دلیل «نام میزبان نامعتبر '<hostname>' برای کنترلکنندهی Syslog» با شکست مواجه میشود. این نشان میدهد که نام میزبان استفاده شده در سیاست ثبت پیام، یک نام میزبان نامعتبر است.
بررسی دقیق استثنا در گزارش پردازشگر پیام نشان میدهد که یک کاراکتر ویژه ناخواسته "/" در انتهای نام میزبان
'splunkprod.myorg.com/'.این کاراکتر ویژه ناخواسته دلیل خطای استقرار بود.
وضوح تصویر
- برای حل این مشکل، سیاست MessageLogging را اصلاح کنید تا هرگونه کاراکتر ویژه ناخواسته حذف شود.
- در مثال بالا، کاراکتر ویژه "/" از سیاست ثبت پیام حذف شد. این کار مشکل را حل کرد.
مثال ۲: نام میزبان غیرقابل حل
گزارش پردازشگر پیام چند خط داشت که نشان میداد رویداد استقرار برای یک پروکسی 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>استثنای بالا نشان میدهد که استقرار به دلیل «Invalid HostName '<hostname>' for Syslog handler» با شکست مواجه شده است.
اگر خط بالای استثنا را بخوانید، متوجه میشوید که پردازشگر پیام قادر به تشخیص نام میزبان
'input-prd.cloud.splunk.com'که در سیاست MessageLogging ارائه شده است، نیست.برای تأیید این موضوع، میتوانید به نام میزبان و شماره پورت استفاده شده در سیاست ثبت پیام، telnet کنید.
سیاست MessageLogging را در نسخه خاص API Proxy بررسی کنید و نام میزبان و شماره پورت مورد استفاده را تأیید کنید. در مثال بالا، نام API Proxy: myapi، نسخه: ۴۲ است.
سیاست ثبت پیامها
<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 نامعتبر است
تشخیص
در گزارشهای پردازشگر پیام، اگر هنگام استقرار یک API Proxy یا Shared Flow، همانطور که در زیر نشان داده شده است، استثنایی با پیام "KeyValueMap name is invalid" مشاهده کردید، به مرحله ۲ بروید. در غیر این صورت، به Must Gather Diagnostic Information بروید.
com.apigee.rest.framework.ValidationException: Invalid syslog config: Invalid HostName 'splunkprod.myorg.com/' for Syslog handlerبیایید به یک مثال نگاه کنیم تا بفهمیم چگونه میتوان این مشکل را عیبیابی و حل کرد.
مثالی از لاگ پردازنده پیام که خطای "KeyValueMap name is invalid" را نشان میدهد و منجر به خطا در هنگام استقرار API Proxy میشود.
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 Proxy: CustomerAPI، نسخه: ۱ رخ داده است.
با بررسی stacktrace، میتوانید متوجه شوید که هنگام اجرای سیاست 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 نمیتواند رشته خالی باشد. این دلیل خطای Deployment بود.
وضوح تصویر
- سیاست KeyValueMapOperations را اصلاح کنید تا یک نام معتبر و مناسب برای KeyValueMap داشته باشد.
در مثال بالا، ما این مشکل را با تغییر KeyValueMapOperations به نام "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جزئیات مربوط به بخشهایی از این کتابچه راهنما که مورد بررسی قرار گرفتهاند و هرگونه بینش دیگری که به ما در تسریع حل این مشکل کمک میکند.