Nie udało się skonfigurować błędu wdrożenia

Wyświetlasz dokumentację Apigee Edge.
Przejdź do dokumentacji Apigee X.
info

Krótki opis problemu

Wdrożenie wersji proxy interfejsu API lub współdzielonego przepływu za pomocą interfejsu Edge lub interfejsu Management API nie udaje się i wyświetla się błąd Configuration failed.

Komunikat o błędzie

W interfejsie Edge zobaczysz komunikat o błędzie jak poniżej:

The revision is deployed, but traffic cannot flow.
com.apigee.kernel.exceptions.spi.UncheckedException{ code = application.bootstrap.FailedToConfigure, message = Configuration failed, associated contexts = []}

Oto zrzut ekranu z przykładowym komunikatem o błędzie w interfejsie Edge:

Możliwe przyczyny

Wdrożenie proxy interfejsu API może się nie udać z powodu błędu „Configuration failed” z wielu różnych przyczyn. W tabeli poniżej znajdziesz kilka najczęstszych przyczyn tego błędu :

Przyczyna Opis Instrukcje rozwiązywania problemów, których dotyczy
Brak klasy Java w zasadzie JavaCallout W pliku JAR, do którego odwołuje się zasada JavaCallout, brakuje klasy Java. Użytkownicy Edge Private Cloud
Nieprawidłowe operandy użyte w warunkach w przepływie warunkowym Operandy lub wyrażenia użyte po jednej lub obu stronach operatorów w warunkach są nieprawidłowe.
Nieprawidłowa nazwa hosta w zasadzie Message Logging Nie można rozpoznać nazwy hosta użytej w zasadzie MessageLogging lub może ona zawierać niechciane znaki specjalne.
Nieprawidłowa nazwa KeyValueMap W zasadzie KeyValueMapOperations w proxy interfejsu API KeyValueMap jest nieprawidłowy lub pusty.

Typowe czynności diagnostyczne

  1. Aby uzyskać stan wdrożenia konkretnej wersji proxy interfejsu API, w przypadku której występuje błąd wdrożenia, użyj tego interfejsu API:

    curl -v <management-server-host>:<port#>/v1/runtime/organizations/<org-name>/environments/<env-name>/apis/<apiproxy-name>/revisions/deployments -u <user>
    
  2. Oto przykładowy wynik powyższego interfejsu 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. W przypadku każdego procesora komunikatów w danych wyjściowych stanu wdrożenia zobaczysz komunikat o błędzie "Configuration failed".

  4. Zaloguj się w jednym z procesorów komunikatów i sprawdź dziennik /opt/apigee/var/log/edge-message-processor/logs/system.log. Sprawdź, czy podczas wdrażania proxy interfejsu API nie występują błędy.

  5. W zależności od błędu lub wyjątku zaobserwowanego w dzienniku procesora komunikatów musisz wykonać odpowiednie czynności rozwiązywania problemów i naprawić problem.

  6. W sekcjach poniżej znajdziesz niektóre z najczęściej występujących wyjątków, które powodują błąd wdrożenia "Configuration failed" , oraz czynności, które należy wykonać, aby rozwiązać problem.

Przyczyna: brak klasy Java w zasadzie JavaCallout

Diagnostyka

  1. Jeśli w dziennikach procesora komunikatów podczas wdrażania proxy interfejsu API (DeployEvent) zobaczysz wyjątek z komunikatem "Failed to instantiate the JavaCallout Class", jak pokazano poniżej, przejdź do kroku 2. W przeciwnym razie przejdź do sekcji Nieprawidłowe operandy użyte w warunkach w przepływie warunkowym.
  2. Podczas wdrażania proxy interfejsu API procesor komunikatów wyświetla ten wyjątek:

    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. Komunikat o błędzie w powyższym wyjątku wskazuje, że nie można utworzyć instancji klasy JavaCallout com.something.apigee.callout.crypto.main.SecretCallout. Ten błąd występuje zwykle, gdy określona klasa nie jest dostępna w pliku JAR podanym w zasadzie JavaCallout ani w żadnym z jego zależnych plików JAR.

  4. Sprawdź plik JAR, który zawierał wszystkie klasy należące do pakietu com.something.apigee.callout.crypto.main, i potwierdź, że brakuje w nim konkretnej klasy com.something.apigee.callout.crypto.main.SecretCallout.

Rozwiązanie

  1. Dodaj brakującą klasę do konkretnego pliku JAR i prześlij ten plik.
  2. Wdróż ponownie proxy interfejsu API.
  3. W powyższym przykładzie problem został rozwiązany przez:
    1. Dodanie brakującej klasy com.something.apigee.callout.crypto.main.SecretCallout do pliku JAR.
    2. Przesłanie zaktualizowanego pliku JAR i ponowne wdrożenie proxy interfejsu API.

Przyczyna: nieprawidłowe operandy użyte z operatorami w przepływie warunkowym

Diagnostyka

  1. Jeśli w dziennikach procesora komunikatów podczas wdrażania proxy interfejsu API lub współdzielonego przepływu zobaczysz com.apigee.expressions.parser.ParseException , jak pokazano w przykładowych komunikatach poniżej, przejdź do kroku 2. W przeciwnym razie przejdź do następnej przyczyny: Nieprawidłowa nazwa hosta w zasadzie Message Logging.

    Przykładowy komunikat o błędzie

    com.apigee.expressions.parser.ParseException: Both the operands for EQUALS expression should be data expressions
    
    
  2. Aby zrozumieć, jak zdiagnozować ten problem, przyjrzyjmy się przykładowi.

    Przykład : operandy wyrażenia <Operator> powinny być wyrażeniami danych

  3. Podczas wdrażania współdzielonego przepływu procesor komunikatów wyświetla ten wyjątek:

    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. Komunikat o błędzie w ParseException – „Both the operands for EQUALS expression should be data expressions” – wskazuje, że występuje problem z warunkiem zawierającym operator równości (=), nierówności (!=) lub Stats with (=|).

  5. Sprawdź warunki we wszystkich przepływach warunkowych, które zawierają operator wymieniony w komunikacie o błędzie, i sprawdź, czy nie występują żadne z tych problemów:

    1. Wyrażenia po obu stronach operatora są tego samego typu. Jeśli np. po lewej stronie operatora masz zmienną typu string, po prawej stronie musisz mieć inną zmienną typu string lub wartość typu string.
    2. Między operatorami używane są prawidłowe zmienne.
    3. Między operatorem a każdym z wyrażeń znajduje się spacja.

  6. Jeśli nie jest spełnione żadne z wymienionych wyżej kryteriów, otrzymasz ParseException – „Both the operands for EQUALS expression should be data expressions”.

  7. Aby zrozumieć ten problem, przyjrzyjmy się przykładowi. Oto przykładowy warunek błędu:

    <Condition>
               (fault.name = "invalid_access_token") or(fault.name = "ApiKeyNotApproved")
    </Condition>
    
  8. W tym przykładzie widać, że między operatorem „or” a następnym warunkiem nie ma spacji. Gdy analizowany jest drugi warunek, pierwsze wyrażenie jest traktowane jako "or(fault.name" dla operatora EQUALS. Nie jest to prawidłowa nazwa zmiennej, więc nie jest traktowana jako prawidłowe wyrażenie danych. W konsekwencji otrzymasz ten wyjątek:

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

Rozwiązanie

  1. Zawsze upewnij się, że po obu stronach operatorów masz prawidłowe wyrażenia danych.
  2. W omówionym powyżej przykładzie rozwiązaniem było upewnienie się, że po operatorze „or” jest spacja, jak opisano we fragmencie kodu:

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

Nieprawidłowa nazwa hosta w zasadzie MessageLogging

Diagnostyka

  1. Jeśli w dziennikach procesora komunikatów podczas wdrażania proxy interfejsu API lub współdzielonego przepływu zobaczysz wyjątek z komunikatem „Invalid HostName”, jak pokazano poniżej, przejdź do kroku 2. W przeciwnym razie przejdź do następnej przyczyny: Nieprawidłowa nazwa KeyValueMap.

    com.apigee.rest.framework.ValidationException: Invalid syslog config: Invalid HostName 'splunkprod.myorg.com/' for Syslog handler
    
  2. Aby zrozumieć, jak rozwiązać ten problem, przyjrzyjmy się 2 przykładom poniżej.

Przykład 1. Nazwa hosta zawierająca niechciany znak specjalny

  1. Podczas wdrażania proxy interfejsu API procesor komunikatów wyświetla ten wyjątek:

      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. Powyższy wyjątek pokazuje, że wdrożenie nie powiodło się z powodu "Invalid HostName '<hostname>' for Syslog handler". Wskazuje to, że nazwa hosta użyta w zasadzie MessageLogging jest nieprawidłowa.

  3. Dokładne zbadanie wyjątku w dzienniku procesora komunikatów pokazuje, że na końcu nazwy hosta 'splunkprod.myorg.com/'. znajduje się niechciany znak specjalny „/”.

  4. Ten niechciany znak specjalny był przyczyną błędu wdrożenia.

Rozwiązanie

  1. Aby rozwiązać problem, zmodyfikuj zasadę MessageLogging, aby usunąć niechciane znaki specjalne.
  2. W powyższym przykładzie znak specjalny „/” został usunięty z zasady MessageLogging. To rozwiązało problem.

Przykład 2. Nazwa hosta, której nie można rozpoznać

  1. Dziennik procesora komunikatów zawierał kilka wierszy, które pokazują, że zostało wywołane zdarzenie wdrożenia proxy interfejsu API, po którym nastąpił wyjątek podczas wdrażania proxy interfejsu 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> 
    
  2. Powyższy wyjątek pokazuje, że wdrożenie nie powiodło się z powodu "Invalid HostName '<hostname>' for Syslog handler".

  3. Jeśli przeczytasz wiersz powyżej wyjątku, zauważysz, że procesor komunikatów nie może rozpoznać nazwy hosta 'input-prd.cloud.splunk.com' podanej w zasadzie MessageLogging.

  4. Aby to potwierdzić, możesz spróbować połączyć się z nazwą hosta i numerem portu używanym w zasadzie Message Logging za pomocą telnetu.

    1. Sprawdź zasadę MessageLogging w konkretnej wersji proxy interfejsu API i zweryfikuj używaną nazwę hosta oraz numer portu. W powyższym przykładzie nazwa proxy interfejsu API to myapi, a wersja to 42.

      Zasada 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>
      
    2. Połącz się z hostem za pomocą telnetu i określonego portu. W tym przykładzie próbowaliśmy użyć telnetu i otrzymaliśmy ten sam błąd, który widzieliśmy w dzienniku procesora komunikatów:

      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. To wyraźnie dowodzi, że nie można rozpoznać nazwy hosta.

Rozwiązanie

  1. Zmodyfikuj zasadę MessageLogging, aby używać prawidłowej nazwy hosta.

Jeśli problem nadal występuje, przejdź do sekcji Informacje diagnostyczne, które należy zebrać.

Przyczyna: nieprawidłowa nazwa KeyValueMap

Diagnostyka

  1. Jeśli w dziennikach procesora komunikatów podczas wdrażania proxy interfejsu API lub współdzielonego przepływu zobaczysz wyjątek z komunikatem "KeyValueMap name is invalid", jak pokazano poniżej, przejdź do kroku 2. W przeciwnym razie przejdź do sekcji Informacje diagnostyczne, które należy zebrać.

    com.apigee.rest.framework.ValidationException: Invalid syslog config: Invalid HostName 'splunkprod.myorg.com/' for Syslog handler
    
  2. Aby zrozumieć, jak rozwiązać ten problem, przyjrzyjmy się przykładowi.

  3. Przykładowy dziennik procesora komunikatów pokazujący wyjątek z komunikatem „KeyValueMap name is invalid”, który powoduje błąd podczas wdrażania proxy interfejsu 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]
    
  4. Drugi wyjątek powyżej wskazuje, że błąd wdrożenia wystąpił w przypadku proxy interfejsu API: CustomerAPI, wersja: 1.

  5. Sprawdzenie śladu stosu pozwala zauważyć, że błąd jest zgłaszany podczas wykonywania zasady KeyValuMapOperations.

  6. Po przejrzeniu pakietu proxy interfejsu API stwierdzisz, że istnieje jedna zasada KeyValuMapOperations, która zawiera kod jak poniżej:

    <?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. Jak widać powyżej, mapIdentifier, który wskazuje nazwę KeyValueMap, zawiera pusty ciąg znaków. Nazwa KeyValueMap nie może być pusta. To było przyczyną błędu wdrożenia.

Rozwiązanie

  1. Zmodyfikuj zasadę KeyValueMapOperations, aby używać prawidłowej nazwy KeyValueMap.
  2. W powyższym przykładzie problem został rozwiązany przez zmodyfikowanie zasady KeyValueMapOperations, aby używać nazwy KeyValueMap „MyKeyValueMap”, jak pokazano poniżej:

      <?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>
    

Informacje diagnostyczne, które należy zebrać

Jeśli problem nadal występuje po wykonaniu powyższych instrukcji, zbierz te informacje diagnostyczne. Skontaktuj się z zespołem pomocy Apigee Edge i przekaż mu zebrane informacje.

  1. Wynik polecenia

    curl -v <management-server-host>:<port #>/v1/runtime/organizations/<org-name>/environments/<env-name>/apis/<apiproxy-name>/revisions/deployments -u <user>
    
  2. Dzienniki procesora komunikatów

    /opt/apigee/var/log/edge-message-processor/logs/system.log
    
  3. Szczegółowe informacje o tym, które sekcje tego przewodnika zostały wypróbowane, oraz wszelkie inne informacje, które pomogą nam przyspieszyć rozwiązanie tego problemu.