אתם צופים במסמכי התיעוד של Apigee Edge.
כדאי לעיין במסמכי התיעוד של Apigee X. מידע
תיאור הבעיה
פריסה של גרסאות של proxy ל-API או של תהליך משותף דרך ממשק המשתמש של Edge או דרך Management 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 (ההגדרה נכשלה) בגלל סיבות שונות. בטבלה הבאה מפורטות כמה מהסיבות הנפוצות ביותר לשגיאה הזו :
| הסיבה | תיאור | הוראות לפתרון בעיות שרלוונטיות ל |
| חסרה מחלקת Java במדיניות JavaCallout | חסרה מחלקה של Java בקובץ ה-JAR שאליו יש הפניה במדיניות JavaCallout. | משתמשים ב-Edge Private Cloud |
| נעשה שימוש באופרנדים שגויים בתנאים בתהליך Condition | האופרנדים או הביטויים שמשמשים בצד אחד או בשני הצדדים של האופרטורים בתנאים לא תקינים. | |
| שם מארח לא תקין במדיניות רישום ההודעות ביומן | לא ניתן לפתור את שם המארח שמשמש במדיניות MessageLogging, או שהוא עשוי להכיל תווים מיוחדים לא רצויים. | |
| שם לא תקין של KeyValueMap | ה-KeyValueMap לא תקין או ריק במדיניות KeyValueMapOperations ב-API Proxy. |
שלבים נפוצים לאבחון
כדי לקבל את סטטוס הפריסות של הגרסה הספציפית של שרת ה-proxy של ה-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 Proxy.בהתאם לשגיאה או לחריגה שמופיעות ביומן של מעבד ההודעות, צריך לפעול לפי השלבים המתאימים לפתרון הבעיה.
בקטעים הבאים מפורטות כמה מהחריגות הנפוצות ביותר שמובילות לשגיאת הפריסה Configuration failed, ומוסבר איך לפתור אותן.
הסיבה: מחלקת Java חסרה במדיניות JavaCallout
אבחון
- ביומנים של מעבד בקשות, אם מופיע חריג עם ההודעה "Failed to instantiate the JavaCallout Class" במהלך הפריסה של proxy ל-API (DeployEvent) כמו שמוצג בהמשך, צריך להמשיך לשלב 2. אם לא, עוברים אל Incorrect operands used in conditions in the Condition Flow.
מעבד ההודעות מציג את החריגה הבאה במהלך הפריסה של API Proxy:
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 Proxy.
- בדוגמה שלמעלה, פתרנו את הבעיה באמצעות:
- הוספת המחלקה החסרה
com.something.apigee.callout.crypto.main.SecretCalloutלקובץ ה-JAR. - העלאת קובץ ה-JAR המעודכן ופריסה מחדש של ה-API Proxy.
- הוספת המחלקה החסרה
הגורם: נעשה שימוש באופרנדים שגויים עם אופרטורים ב-Condition Flow
אבחון
ביומנים של מעבד בקשות, אם מופיע
com.apigee.expressions.parser.ParseExceptionבמהלך הפריסה של proxy ל-API או תהליך משותף כמו בדוגמה של ההודעות שלמטה, צריך להמשיך לשלב 2. אם לא, עוברים לסיבה הבאה שם מארח לא תקין במדיניות רישום ההודעות ביומן.הודעת שגיאה לדוגמה
com.apigee.expressions.parser.ParseException: Both the operands for EQUALS expression should be data expressionsכדי להבין איך מאבחנים את הבעיה הזו, נבחן דוגמה.
דוגמה : אופרנדים של ביטוי <Operator> צריכים להיות ביטויי נתונים
מעבד ההודעות מציג את החריגה הבאה במהלך הפריסה של Shared Flow:
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 לבין התנאי הבא. לכן, כשמנתחים את התנאי השני, הביטוי הראשון נחשב ל-"or(fault.name" עבור האופרטור EQUALS. זה לא שם משתנה תקין, ולכן הוא לא נחשב לביטוי נתונים תקין. כתוצאה מכך, מתקבלת החריגה הבאה:
com.apigee.expressions.parser.ParseException: Both the operands for EQUALS expression should be data expressions
רזולוציה
- חשוב לוודא שתמיד יש ביטויים נכונים של נתונים משני צידי האופרטורים.
בדוגמה שצוינה למעלה, הפתרון היה לוודא שיש רווח אחרי האופרטור or, כפי שמתואר בקטע הקוד:
<Condition> (fault.name = "invalid_access_token") or (fault.name = "ApiKeyNotApproved") </Condition>
שם מארח לא תקין במדיניות MessageLogging
אבחון
ביומנים של מעבד ההודעות, אם מופיע חריג עם ההודעה "Invalid HostName" במהלך הפריסה של API Proxy או Shared Flow, כמו שמוצג בהמשך, צריך להמשיך לשלב 2. אם לא, עוברים לגורם הבא שם לא תקין של KeyValueMap.
com.apigee.rest.framework.ValidationException: Invalid syslog config: Invalid HostName 'splunkprod.myorg.com/' for Syslog handlerכדי להבין איך לפתור את הבעיה הזו, כדאי לעיין בשתי הדוגמאות הבאות.
דוגמה 1: שם המארח מכיל תו מיוחד לא רצוי
מעבד ההודעות מציג את החריגה הבאה במהלך הפריסה של API Proxy:
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>החריגה שלמעלה מראה שהפריסה נכשלת בגלל "Invalid HostName '<hostname>' for Syslog handler". השגיאה הזו מציינת ששם המארח שנעשה בו שימוש במדיניות MessageLogging הוא שם מארח לא תקין.
בדיקה מדוקדקת של החריג ביומן של מעבד ההודעות מראה שיש תו מיוחד לא רצוי '/' בסוף שם המארח
'splunkprod.myorg.com/'.התו המיוחד הלא רצוי הזה גרם לשגיאת הפריסה.
רזולוציה
- כדי לפתור את הבעיה, צריך לשנות את מדיניות MessageLogging כדי להסיר את כל התווים המיוחדים הלא רצויים.
- בדוגמה שלמעלה, התו המיוחד '/' הוסר ממדיניות MessageLogging. הפעולה הזו פתרה את הבעיה.
דוגמה 2: שם מארח שלא ניתן לפענוח
ביומן של מעבד ההודעות היו כמה שורות שבהן מוצג אירוע הפריסה של API Proxy, ואחריו חריגה שמתרחשת במהלך הפריסה של API Proxy:
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, והגרסה היא 42.
MessageLogging Policy
<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 name is invalid" במהלך הפריסה של proxy ל-API או תהליך משותף, כמו שמוצג בהמשך, צריך להמשיך לשלב 2. אם לא, כדאי לעבור אל איסוף נתוני אבחון.
com.apigee.rest.framework.ValidationException: Invalid syslog config: Invalid HostName 'splunkprod.myorg.com/' for Syslog handlerנבחן דוגמה כדי להבין איך לפתור את הבעיה.
דוגמה ליומן של מעבד הודעות שבו מוצג החריג עם ההודעה 'השם של KeyValueMap לא תקין' שמוביל לשגיאה במהלך פריסת ה-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, revision: 1.
בבדיקה של ה-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 לא יכול להיות מחרוזת ריקה. זו הסיבה לשגיאת הפריסה.
רזולוציה
- משנים את המדיניות 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>
Must Gather Diagnostic Information
אם הבעיה נמשכת גם אחרי שמבצעים את ההוראות שלמעלה, צריך לאסוף את נתוני האבחון הבאים. פונים אל התמיכה של 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פרטים על החלקים בחוברת ההדרכה הזו שניסית, ותובנות אחרות שיעזרו לנו לפתור את הבעיה במהירות.