ההגדרה של שגיאת הפריסה נכשלה

אתם צופים במסמכי התיעוד של 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.

שלבים נפוצים לאבחון

  1. כדי לקבל את סטטוס הפריסות של הגרסה הספציפית של שרת ה-proxy של ה-API שבה נתקלתם בשגיאת הפריסה, משתמשים ב-API הבא:

    curl -v <management-server-host>:<port#>/v1/runtime/organizations/<org-name>/environments/<env-name>/apis/<apiproxy-name>/revisions/deployments -u <user>
    
  2. זוהי דוגמה לפלט מה-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" 
    },
    
  3. הודעת השגיאה "ההגדרה נכשלה" תופיע בכל אחד ממעבדי ההודעות בפלט של סטטוס הפריסה.

  4. מתחברים לאחד ממעבדי ההודעות ובודקים את היומן /opt/apigee/var/log/edge-message-processor/logs/system.log. בודקים אם יש שגיאות במהלך הפריסה של ה-API Proxy.

  5. בהתאם לשגיאה או לחריגה שמופיעות ביומן של מעבד ההודעות, צריך לפעול לפי השלבים המתאימים לפתרון הבעיה.

  6. בקטעים הבאים מפורטות כמה מהחריגות הנפוצות ביותר שמובילות לשגיאת הפריסה Configuration failed, ומוסבר איך לפתור אותן.

הסיבה: מחלקת Java חסרה במדיניות JavaCallout

אבחון

  1. ביומנים של מעבד בקשות, אם מופיע חריג עם ההודעה "Failed to instantiate the JavaCallout Class" במהלך הפריסה של proxy ל-API ‏ (DeployEvent) כמו שמוצג בהמשך, צריך להמשיך לשלב 2. אם לא, עוברים אל Incorrect operands used in conditions in the Condition Flow.
  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>
    
  3. הודעת השגיאה בחריגה שלמעלה מציינת שלא ניתן ליצור מופע של המחלקה JavaCallout‏ com.something.apigee.callout.crypto.main.SecretCallout. השגיאה הזו מתרחשת בדרך כלל כשהמחלקה הספציפית לא זמינה בקובץ ה-JAR שצוין במדיניות JavaCallout או בקובצי JAR תלויים כלשהם.

  4. בודקים את קובץ ה-JAR שהכיל את כל המחלקות שקשורות לחבילה com.something.apigee.callout.crypto.main ומוודאים שהמחלקה הספציפית com.something.apigee.callout.crypto.main.SecretCallout חסרה.

רזולוציה

  1. מוסיפים את המחלקה החסרה לקובץ ה-JAR הספציפי ומעלים את קובץ ה-JAR.
  2. פורסים מחדש את ה-API Proxy.
  3. בדוגמה שלמעלה, פתרנו את הבעיה באמצעות:
    1. הוספת המחלקה החסרה com.something.apigee.callout.crypto.main.SecretCallout לקובץ ה-JAR.
    2. העלאת קובץ ה-JAR המעודכן ופריסה מחדש של ה-API Proxy.

הגורם: נעשה שימוש באופרנדים שגויים עם אופרטורים ב-Condition Flow

אבחון

  1. ביומנים של מעבד בקשות, אם מופיע com.apigee.expressions.parser.ParseException במהלך הפריסה של proxy ל-API או תהליך משותף כמו בדוגמה של ההודעות שלמטה, צריך להמשיך לשלב 2. אם לא, עוברים לסיבה הבאה שם מארח לא תקין במדיניות רישום ההודעות ביומן.

    הודעת שגיאה לדוגמה

    com.apigee.expressions.parser.ParseException: Both the operands for EQUALS expression should be data expressions
    
    
  2. כדי להבין איך מאבחנים את הבעיה הזו, נבחן דוגמה.

    דוגמה : אופרנדים של ביטוי <Operator> צריכים להיות ביטויי נתונים

  3. מעבד ההודעות מציג את החריגה הבאה במהלך הפריסה של 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>
    
  4. הודעת השגיאה ב-ParseException – "Both the operands for EQUALS expression should be data expressions" מציינת שיש בעיה בתנאי שכולל את האופרטורים שווה ל- (=), לא שווה ל- (!=) או Stats עם האופרטור (=|).

  5. בודקים את התנאים בכל זרימות התנאים שכוללות את האופרטור הספציפי שמוזכר בהודעת השגיאה, ומחפשים את הבעיות הבאות:

    1. הביטויים משני הצדדים של האופרטור הם מאותו סוג. לדוגמה, אם יש לכם משתנה מחרוזת בצד ימין של האופרטור, צריך שיהיה בצד שמאל משתנה מחרוזת או ערך מחרוזת.
    2. המשתנים שמופיעים בין האופרטורים הם משתנים תקינים.
    3. יש רווח בין האופרטור לבין כל אחד מהביטויים.

  6. אם אחד מהקריטריונים שצוינו למעלה לא מתקיים, תקבלו את ParseException –‏ 'Both the operands for EQUALS expression should be data expressions'.

  7. כדי להבין את הבעיה הזו, נבחן דוגמה. הנה דוגמה למצב שגיאה ש

    <Condition>
               (fault.name = "invalid_access_token") or(fault.name = "ApiKeyNotApproved")
    </Condition>
    
  8. בדוגמה הזו אפשר לראות שאין רווח בין האופרטור or לבין התנאי הבא. לכן, כשמנתחים את התנאי השני, הביטוי הראשון נחשב ל-"or(fault.name" עבור האופרטור EQUALS. זה לא שם משתנה תקין, ולכן הוא לא נחשב לביטוי נתונים תקין. כתוצאה מכך, מתקבלת החריגה הבאה:

    com.apigee.expressions.parser.ParseException: Both the operands for EQUALS expression should be data expressions
    
    

רזולוציה

  1. חשוב לוודא שתמיד יש ביטויים נכונים של נתונים משני צידי האופרטורים.
  2. בדוגמה שצוינה למעלה, הפתרון היה לוודא שיש רווח אחרי האופרטור or, כפי שמתואר בקטע הקוד:

    <Condition>
               (fault.name = "invalid_access_token") or (fault.name = "ApiKeyNotApproved")
    </Condition>
    
    

שם מארח לא תקין במדיניות MessageLogging

אבחון

  1. ביומנים של מעבד ההודעות, אם מופיע חריג עם ההודעה "Invalid HostName" במהלך הפריסה של API Proxy או Shared Flow, כמו שמוצג בהמשך, צריך להמשיך לשלב 2. אם לא, עוברים לגורם הבא שם לא תקין של KeyValueMap.

    com.apigee.rest.framework.ValidationException: Invalid syslog config: Invalid HostName 'splunkprod.myorg.com/' for Syslog handler
    
  2. כדי להבין איך לפתור את הבעיה הזו, כדאי לעיין בשתי הדוגמאות הבאות.

דוגמה 1: שם המארח מכיל תו מיוחד לא רצוי

  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>
    
  2. החריגה שלמעלה מראה שהפריסה נכשלת בגלל "Invalid HostName '<hostname>' for Syslog handler". השגיאה הזו מציינת ששם המארח שנעשה בו שימוש במדיניות MessageLogging הוא שם מארח לא תקין.

  3. בדיקה מדוקדקת של החריג ביומן של מעבד ההודעות מראה שיש תו מיוחד לא רצוי '/' בסוף שם המארח 'splunkprod.myorg.com/'.

  4. התו המיוחד הלא רצוי הזה גרם לשגיאת הפריסה.

רזולוציה

  1. כדי לפתור את הבעיה, צריך לשנות את מדיניות MessageLogging כדי להסיר את כל התווים המיוחדים הלא רצויים.
  2. בדוגמה שלמעלה, התו המיוחד '/' הוסר ממדיניות MessageLogging. הפעולה הזו פתרה את הבעיה.

דוגמה 2: שם מארח שלא ניתן לפענוח

  1. ביומן של מעבד ההודעות היו כמה שורות שבהן מוצג אירוע הפריסה של 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> 
    
  2. החריגה שלמעלה מראה שהפריסה נכשלת בגלל "Invalid HostName '<hostname>' for Syslog handler".

  3. אם קוראים את השורה שמעל החריגה, אפשר לראות שמעבד ההודעות לא מצליח לזהות את שם המארח 'input-prd.cloud.splunk.com' שצוין במדיניות MessageLogging.

  4. כדי לאשר זאת, אפשר לנסות להשתמש ב-Telnet כדי להתחבר לשם המארח ולמספר היציאה שמשמשים במדיניות של רישום הודעות.

    1. בודקים את מדיניות 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>
      
    2. מבצעים 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
      
  5. ההוכחה הזו מראה בבירור שלא ניתן לפענח את שם המארח.

רזולוציה

  1. משנים את המדיניות MessageLogging כך שתשתמש בשם המארח התקין.

אם הבעיה נמשכת, עוברים אל איסוף מידע לצורך אבחון.

הסיבה: שם לא תקין של KeyValueMap

אבחון

  1. אם ביומני של מעבד בקשות מופיע חריג עם ההודעה "KeyValueMap name is invalid" במהלך הפריסה של proxy ל-API או תהליך משותף, כמו שמוצג בהמשך, צריך להמשיך לשלב 2. אם לא, כדאי לעבור אל איסוף נתוני אבחון.

    com.apigee.rest.framework.ValidationException: Invalid syslog config: Invalid HostName 'splunkprod.myorg.com/' for Syslog handler
    
  2. נבחן דוגמה כדי להבין איך לפתור את הבעיה.

  3. דוגמה ליומן של מעבד הודעות שבו מוצג החריג עם ההודעה 'השם של 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]
    
  4. החריגה השנייה שלמעלה מציינת ששגיאת הפריסה התרחשה עבור API Proxy: CustomerAPI, revision: 1.

  5. בבדיקה של ה-stacktrace, אפשר לראות שהשגיאה מופקת במהלך הביצוע של מדיניות KeyValuMapOperations.

  6. כשבודקים את חבילת ה-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>
    
    
  7. כפי שניתן לראות למעלה, mapIdentifier, שמציין את השם של KeyValueMap, הוא מחרוזת ריקה. השם של KeyValueMap לא יכול להיות מחרוזת ריקה. זו הסיבה לשגיאת הפריסה.

רזולוציה

  1. משנים את המדיניות KeyValueMapOperations כך שיהיה לה שם תקין וקביל ל-KeyValueMap.
  2. בדוגמה שלמעלה, פתרנו את הבעיה על ידי שינוי של 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 ומספקים להם את המידע שאספתם.

  1. פלט הפקודה

    curl -v <management-server-host>:<port #>/v1/runtime/organizations/<org-name>/environments/<env-name>/apis/<apiproxy-name>/revisions/deployments -u <user>
    
  2. יומנים של מעבד הודעות

    /opt/apigee/var/log/edge-message-processor/logs/system.log
    
  3. פרטים על החלקים בחוברת ההדרכה הזו שניסית, ותובנות אחרות שיעזרו לנו לפתור את הבעיה במהירות.