מוצג המסמך של Apigee Edge.
עוברים אל
מסמכי תיעוד של Apigee X. מידע
תיאור הבעיה
הפריסה של שרת proxy ל-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:
סיבות אפשריות
הפריסה של שרת Proxy ל-API עלולה להיכשל עם "ההגדרה נכשלה" בגלל סיבות רבות ושונות. בטבלה הבאה מפורטות כמה סיבות נפוצות לשגיאה הזו :
הסיבה | תיאור | הוראות לפתרון בעיות שרלוונטיות |
חסרה מחלקת Java במדיניות JavaCallout | חסרה מחלקה של Java בקובץ ה-JAR שאליו מפנה מדיניות JavaCallout. | משתמשי Edge בענן פרטי |
אופרנדים שגויים משמשים בתנאים בתהליך התנאים | ביטויים או רכיבים זמניים שנמצאים בשימוש באחד מהצדדים של האופרטורים או בשניהם לא תקינים. | |
שם מארח לא חוקי במדיניות רישום הודעות | לא ניתן לפענח את שם המארח המשמש במדיניות MessageLogging או להכיל תווים מיוחדים לא רצויים. | |
שם KeyValueMap לא חוקי | השדה KeyValueMap לא חוקי או ריק במדיניות KeyValueMapOperations בשרת ה-proxy של ה-API. |
שלבים לאבחון נפוץ
קבלת סטטוס הפריסות של הגרסה הספציפית של ה-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.בהתאם לשגיאה/לחריגה שזוהו ביומן מעבד ההודעות, עליכם לפעול לפי השלבים המתאימים לפתרון הבעיה ולפתרון הבעיה.
בקטעים שבהמשך מתוארות כמה מהחריגות הנפוצות ביותר שגורמות לשגיאת הפריסה 'ההגדרה נכשלה', ומפורטים שלבים לפתרון בעיות ולפתרון שלהן.
הסיבה: חסר שיעור Java במדיניות JavaCallout
אבחון
- ביומני מעבד ההודעות, אם מופיעה הודעה כלשהי עם ההודעה "נכשלה ההפעלה של JavaCallout Class" במהלך הפריסה של שרת Proxy ל-API (DeployEvent) כפי שמוצג בהמשך, ממשיכים לשלב 2. אם לא, עוברים למאמר אופרנדים שגויים שנמצאים בשימוש בתנאים בתהליך התנאי.
במעבד ההודעות מוצג החריג הבא במהלך הפריסה של ה-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.
- מתבצעת הוספה של הכיתה החסרה
הסיבה: שימוש באופרנדים שגויים עם אופרטורים בתהליך התנאים
אבחון
ביומני מעבד ההודעות, אם מופיע
com.apigee.expressions.parser.ParseException
במהלך הפריסה של שרת proxy ל-API או של תהליך משותף כפי שמוצג בהודעות לדוגמה שלמטה, ממשיכים לשלב 2. אם לא, עוברים לגורם הבא: שם מארח לא חוקי במדיניות רישום הודעות.דוגמה להודעת שגיאה
com.apigee.expressions.parser.ParseException: Both the operands for EQUALS expression should be data expressions
נבחן דוגמה כדי להבין איך לאבחן את הבעיה.
דוגמה : Operands עבור <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>
הודעת השגיאה ב-Parse במיוחד – '
.Both the operands for EQUALS expression should be data expressions
' מציין שיש בעיה בתנאי שכולל בעיה של 'שווה ל-' (=), 'לא שווה ל-' (!=) או 'נתונים סטטיסטיים עם האופרטור (=|)'.עליך לבחון את התנאים בכל זרמי התנאים הקשורים לאופרטור הספציפי שצוין בהודעת השגיאה ולבדוק אם יש בעיות כלשהן:
- הביטויים בכל אחד מצידי האופרטור הם מאותו סוג. לדוגמה, אם יש משתנה מחרוזת בצד שמאל של האופרטור, אתם צריכים משתנה מחרוזת או ערך מחרוזת נוסף בצד שמאל.
- המערכת משתמשת במשתנים חוקיים בין האופרטורים.
- יש רווח בין האופרטור לכל אחד מהביטויים.
אם אחד מהקריטריונים שצוינו למעלה לא מתקיים, מקבלים את Parse קונים – '
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>
שם המארח לא תקין במדיניות MessageLogging
אבחון
ביומני מעבד ההודעות, אם מופיעה הודעה כלשהי עם ההודעה "שם מארח לא חוקי" במהלך הפריסה של שרת proxy ל-API או 'תהליך משותף', כפי שמוצג בהמשך, ממשיכים לשלב 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>
החריג שלמעלה מראה שהפריסה נכשלת עקב 'שם המארח '<hostname>' לא חוקי' עבור Syslog handler". ההגדרה הזו מציינת ששם המארח שנעשה בו שימוש במדיניות MessageLogging הוא שם מארח לא חוקי.
בדיקת החריגה ביומן של מעבד ההודעות מראה בקפידה שיש תו מיוחד לא רצוי "/" בסוף שם המארח
'splunkprod.myorg.com/'.
התו המיוחד הלא רצוי הזה היה הסיבה לשגיאת הפריסה.
רזולוציה
- כדי לפתור את הבעיה, משנים את המדיניות של MessageLogging כדי להסיר תווים מיוחדים לא רצויים.
- בדוגמה שלמעלה, התו המיוחד "/" הוסר ממדיניות MessageLogging. הבעיה נפתרה.
דוגמה 2: שם מארח לא ניתן לפתרון
יומן מעבד ההודעות כלל כמה שורות שמראות את אירוע הפריסה עבור שרת Proxy של API מופעל, ואחריה מופיעה חריגה שמתרחשת במהלך פריסת ה-Proxy של ה-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>
החריג שלמעלה מראה שהפריסה נכשלת עקב 'שם המארח '<hostname>' לא חוקי' עבור Syslog handler".
אם קוראים את השורה שמעל החריגה, רואים שמעבד ההודעות לא יכול לפענח את שם המארח
'input-prd.cloud.splunk.com'
שצוין במדיניות MessageLogging.כדי לוודא זאת, אפשר לנסות לבצע telnet לשם המארח ולמספר היציאה שצוינו במדיניות רישום ההודעות.
צריך לבדוק את מדיניות MessageLogging בגרסה הספציפית של ה-proxy ל-API, ולאמת את שם המארח ואת מספר היציאה שבשימוש. בדוגמה שלמעלה, שם ה-API של שרת ה-proxy: myapi, גרסה: 42.
המדיניות בנושא 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>
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 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]
החריג השני שלמעלה מציין שאירעה שגיאת הפריסה עבור שרת ה-proxy ל-API: CustomerAPI, גרסה: 1.
בזמן בדיקת ה-Stacktrace, תראו ששגיאה זו משודרת במהלך ביצוע מדיניות KeyValuMapOperations.
בדקתי את חבילת ה-proxy ל-API, וגיליתי שיש מדיניות 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
פרטים על הקטעים במדריך הזה שכבר ניסו למצוא, ועל כל תובנות אחרות שיעזרו לנו לפתור את הבעיה במהירות.