無法建立追蹤工作階段

您正在查看 Apigee Edge 說明文件。
查看 Apigee X 說明文件
資訊

問題

使用者無法在 Edge UI 中建立追蹤工作階段。

錯誤訊息

Edge UI 中會顯示錯誤訊息,如下所示:

Error creating trace session for API proxy <api proxy name>, revision <revision number>, environment <environment name>.
Failed to create DebugSession <session number> 

以下是在 Edge UI 中觀察到的錯誤訊息範例螢幕截圖:

可能原因

這個錯誤的一些可能原因如下:

原因 說明 適用的疑難排解操作說明
網路連線問題 網路連線問題或防火牆規則導致管理伺服器與訊息處理器之間的通訊失敗。 Edge Private Cloud 使用者
在訊息處理器上未載入環境 發生錯誤,訊息處理器尚未載入特定環境 (您嘗試啟用追蹤記錄的功能)。
過時的訊息處理器項目 管理伺服器參照了不存在 (過時) 的訊息處理器。
無法連上訊息處理器 訊息處理器已停止運作或無法存取。
高資源使用率問題 訊息處理器的資源 (CPU、記憶體或負載) 使用率偏高,
未部署於一或多個訊息處理器的 API Proxy 由於在部署期間缺少事件通知,無法將 API Proxy 部署至一或多個訊息處理器。
Edge UI 問題 發生錯誤,Edge UI 無法建立追蹤工作階段。

常見診斷步驟

  1. 執行這個管理 API:

    curl -v <management-server-host>:8080/v1/runtime/organizations/<org-name>/environments/<env-name>/apis/<apiproxy-name>/revisions/<revision-number>/debugsessions -u <user>
    
  2. 如果畫面上顯示任何錯誤訊息,請加以留意。請參閱「網路連線問題」。

  3. 如果取得成功的回應,就表示您可以透過 Management API 建立追蹤工作階段。不過,Edge UI 可能發生問題,導致無法在 UI 中建立追蹤工作階段。移至「Edge UI 的問題」。

原因:網路連線問題

診斷方式

  1. 查看管理伺服器記錄 /opt/apigee/var/log/edge-management-server/logs/system.log,確認追蹤/偵錯工作階段的建立期間是否發生錯誤。

    管理伺服器記錄中的錯誤範例

    2018-02-08 09:08:21,310 org:myorg env:uat  qtp1073741635-1074 ERROR DISTRIBUTION - DebugSessionAPI.createDebugSession() : createDebugSession : Unable to connect to the server with UUID cedeabd2-e4d1-40bb-8f18-d6afc8835e5b
    org.apache.http.conn.HttpHostConnectException: Connect to 10.84.75.92:8082 [/10.84.75.92] failed: Connection refused
        at org.apache.http.impl.conn.HttpClientConnectionOperator.connect(HttpClientConnectionOperator.java:140) ~[httpclient-4.3.5.jar:4.3.5]
        at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.connect(PoolingHttpClientConnectionManager.java:318) ~[httpclient-4.3.5.jar:4.3.5]
        at org.apache.http.impl.execchain.MainClientExec.establishRoute(MainClientExec.java:363) ~[httpclient-4.3.5.jar:4.3.5]
    ...<snipped>
    Caused by: java.net.ConnectException: Connection refused
        at java.net.PlainSocketImpl.socketConnect(Native Method) ~[na:1.8.0_65]
        at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350) ~[na:1.8.0_65]
    ...<snipped>
    
  2. 上方的錯誤範例顯示,管理伺服器嘗試透過通訊埠 # 8082 連線至「郵件處理器」時,會收到「連線遭拒」錯誤。因此管理伺服器無法建立追蹤工作階段。

  3. 如果您沒有看到任何與網路連線相關的錯誤,或是與上述範例中顯示的錯誤類似,請移至「未載入郵件處理器的環境」部分。

  4. 如果你發現網路連線相關錯誤,或是與上例所示類似的錯誤,請按照下列步驟操作。

  5. 請按照下列步驟測試從管理伺服器連至通訊埠 8082 的郵件處理器的連線:

    1. 如有可用的 telnet,請使用 telnet:

      telnet <MessageProcessor_IP> 8082
      
    2. 如果無法使用 telnet,請使用下列 netcat 檢查連線:

      nc -vz <MessageProcessor_IP> 8082
      
    3. 如果你收到「連線遭拒」或「連線逾時」回應,請繼續下一個步驟。

  6. 請使用顯示錯誤的對應 IP 位址來登入每個「郵件處理器」,然後執行下列步驟:

    1. 檢查訊息處理器是否正在監聽通訊埠 8082:

      netstat -an | grep LISTEN | grep 8082
      
    2. 如果訊息處理器正在監聽通訊埠 8082,請前往步驟 7。

    3. 如果「訊息處理器」未監聽通訊埠 8082,請使用下列指令重新啟動「訊息處理工具」:

      /opt/apigee/apigee-service/bin/apigee-service edge-message-processor restart
      
    4. 請等待訊息處理器完全開始使用這個指令:

      /opt/apigee/apigee-service/bin/apigee-service edge-message-processor wait_for_ready
      
    5. 開啟「訊息處理器」後,再次檢查「訊息處理器」是否正在透過通訊埠 8082 接聽通訊內容。

    6. 如果訊息處理器正在監聽通訊埠 8082,請前往步驟 7。

  7. 檢查現在是否可在 UI 中啟動追蹤工作階段。如果系統不再發現問題,請略過下列步驟。

  8. 如果「郵件處理程式」正在執行並監聽通訊埠 8082,但您還是無法從管理伺服器等其他伺服器連線,可能是因為防火牆必須封鎖外部連線。

  9. 使用適當的指令檢查防火牆規則。舉例來說,您可以執行 iptables 指令,列出系統中定義的所有防火牆規則:

    iptables -L -n
    
  10. 如果通訊埠 8082 未設定防火牆規則,請移至高資源使用率問題

  11. 如果通訊埠 8082 上設有任何防火牆規則,請移至下方的「解析度」部分。

解析度

  1. 請與您的網路管理員合作,允許外部伺服器透過通訊埠 8082 傳入/傳出流量。

如果問題仍未解決,請參閱「必須收集診斷資訊」一文。

原因:未在訊息處理器上載入環境

診斷方式

  1. 查看管理伺服器記錄 /opt/apigee/var/log/edge-management-server/logs/system.log,確認追蹤記錄/偵錯工作階段的建立期間是否發生錯誤。
  2. 建立追蹤記錄/偵錯工作階段時,您可能會看到類似「no valid response from MP(s)」(來自 MP 的有效回應) 的錯誤訊息,如下所示:

    2018-01-30 08:28:09,721 org:mynonprod env:uat  qtp2007599722-712162 ERROR DISTRIBUTION - DebugSessionAPI.createDebugSession() : no valid responses from MP(s), throwing error
    2018-01-30 08:28:09,723 org:mynonprod env:uat  qtp2007599722-712162 ERROR REST - CustomJAXRSInvoker.performInvocation() : CustomJAXRSInvoker.performInvocation : Method com.apigee.distribution.DebugSessionAPI.createDebugSession threw an exception.
    2018-01-30 08:28:09,724 org:mynonprod env:uat  qtp2007599722-712162 ERROR REST - ExceptionMapper.toResponse() : Error occurred : Failed to create DebugSession 1517297564678
    2018-01-30 08:28:09,724 org:mynonprod env:uat  qtp2007599722-712162 ERROR REST - ExceptionMapper.toResponse() : Returning error response : ErrorResponse{errorCode = distribution.CreateDebugSessionFailed, errorMessage = Failed to create DebugSession 1517297564678}
    

    這個錯誤表示「郵件處理者」未因為某些原因而未回應管理伺服器。

  3. 如果您沒有看見與上述範例所示類似的錯誤,請移至「過時的訊息處理器項目」

  4. 如果您確實發現與上述示例類似的錯誤,請按照下列步驟操作。

  5. 發生這個錯誤的原因之一,可能是訊息處理器並未載入您要建立追蹤工作階段的環境。

  6. 請登入每個訊息處理器,並使用下列指令,檢查您嘗試建立追蹤工作階段的特定環境是否載入至「訊息處理器」:

    curl -s http://localhost:8082/v1/runtime/organizations/<org-name>/environments
    

    輸出內容示例:

    在上述指令的輸出內容中,您會看見在特定機構載入的環境清單。舉例來說,如果訊息處理器載入了 preprodtest 環境,輸出內容將如下所示:

    [ "preprod"、"test" ]

  7. 假設特定環境您要建立追蹤工作階段的 "dev",也列在上述指令中,請直接移到「過時的訊息處理器項目」

  8. 如果特定環境並未列在上述指令中,例如 "dev",,請檢查訊息處理器上的 /opt/apigee/var/log/edge-message-processor/logs/system.log/opt/apigee/var/log/edge-message-processor/logs/startupruntimeerrors.log,檢查環境載入期間是否有任何錯誤。

  9. 有許多不同的錯誤可能導致訊息處理器載入環境失敗,解決方法取決於發生的錯誤。

解析度

有很多原因會導致無法在訊息處理器上載入環境。本節說明可能導致這個問題的幾個可能原因,並說明如何解決問題。

  1. 如果「訊息處理器」記錄中顯示下列其中一項錯誤,表示在特定環境中新增至指定 KeyStore/truststore 的憑證/金鑰發生問題。

    錯誤 #1:java.security.KeyStoreException:無法覆寫自己的憑證

    2018-01-30 12:04:38,248 pool-47-thread-4 ERROR MESSAGING.RUNTIME - AbstractConfigurator.propagateEvent() : Error while handling the update for the Configurator 
    com.apigee.kernel.exceptions.spi.UncheckedException: Failed to add certificate : mycert in key store : mytruststore in environment : test
    at com.apigee.entities.configurators.KeyStore.setCertificateEntry(KeyStore.java:156) ~[config-entities-1.0.0.jar:na] 
    at com.apigee.entities.configurators.KeyStore.handleUpdate(KeyStore.java:101) ~[config-entities-1.0.0.jar:na] 
    at com.apigee.entities.AbstractConfigurator.propagateEvent(AbstractConfigurator.java:85) ~[config-entities-1.0.0.jar:na] 
    at com.apigee.messaging.runtime.Environment.handleUpdate(Environment.java:238) [message-processor-1.0.0.jar:na] 
    … 
    Caused by: java.security.KeyStoreException: Cannot overwrite own certificate 
    at com.sun.crypto.provider.JceKeyStore.engineSetCertificateEntry(JceKeyStore.java:355) ~[sunjce_provider.jar:1.8.0_151] 
    at java.security.KeyStore.setCertificateEntry(KeyStore.java:1201) ~[na:1.8.0_151] 
    at com.apigee.entities.configurators.KeyStore.setCertificateEntry(KeyStore.java:153) ~[config-entities-1.0.0.jar:na]
    ... 20 common frames omitted
    2018-01-30 12:04:38,250 pool-47-thread-4 ERROR MESSAGING.RUNTIME - AbstractConfigurator.rollbackTransaction() : Error in processing the changes : Unknown resource type cert
    

    錯誤 #2:java.security.KeyStoreException:無法覆寫密鑰

    2017-11-01 03:28:47,560 pool-21-thread-7 ERROR MESSAGING.RUNTIME - AbstractConfigurator.propagateEvent() : Error while handling the update for the Configurator 
    com.apigee.kernel.exceptions.spi.UncheckedException: Failed to add certificate : mstore in key store : myTruststore in environment : dev 
    at com.apigee.entities.configurators.KeyStore.setCertificateEntry(KeyStore.java:156) ~[config-entities-1.0.0.jar:na] 
    at com.apigee.entities.configurators.KeyStore.handleUpdate(KeyStore.java:101) ~[config-entities-1.0.0.jar:na] 
    ... 
    Caused by: java.security.KeyStoreException: Cannot overwrite secret key 
    at com.sun.crypto.provider.JceKeyStore.engineSetCertificateEntry(JceKeyStore.java:354) ~[sunjce_provider.jar:1.8.0_144] 
    at java.security.KeyStore.setCertificateEntry(KeyStore.java:1201) ~[na:1.8.0_144] 
    at com.apigee.entities.configurators.KeyStore.setCertificateEntry(KeyStore.java:153) ~[config-entities-1.0.0.jar:na] 
    ... 20 common frames omitted 
    
    2017-11-01 03:28:47,562 pool-21-thread-7 ERROR MESSAGING.RUNTIME - AbstractConfigurator.rollbackTransaction() : Error in processing the changes : Unknown resource type cert 
    
  2. 請使用下列管理 API 呼叫,取得上個步驟顯示的錯誤訊息中指定的 KeyStore/truststore 詳細資料:

    curl -v "http://<management-IPaddress>:8080/v1/organizations/<org-name>/environments/<env-name>/keystores/myTruststore" -u <user>
    

    輸出內容示例:

    { 
    "certs": [ 
    "mycert", 
    "mycert-new" 
    ], 
    "keys": [ 
    "mycert" 
    ], 
    "name": "myTruststore" 
    }
    
  3. 範例輸出結果顯示信任儲存庫 myTruststore 中有兩個憑證和一個金鑰。信任儲存庫通常不含金鑰。如果是的話,最好使用單一憑證和單一金鑰。

  4. 使用以下 API 取得兩個憑證的詳細資料:

    curl -s http://<management-IPaddress>:8080/v1/runtime/organizations/<org-name>/environments/<env-name>/keystores/<keystore-name>/certs/<cert-name>
    
  5. 檢查每個憑證的到期日,判斷過期/較舊的憑證。

  6. 將過期或不需要的憑證從信任儲存庫「myTruststore」中刪除。

如果問題仍未解決,或是您看到步驟 1 中提及的其他錯誤,請參閱「收集診斷資訊」一文。

原因:過時的訊息處理器項目或無法聯絡訊息處理者

診斷

  1. 如果 Edge UI 需要很長的時間,且無法建立追蹤工作階段,以下是幾個可能的原因:
    1. 管理伺服器可能是指不存在 (過時) 的訊息處理器
    2. 「訊息處理器」已停止運作或無法存取
    3. 訊息處理器的記憶體用量偏高/CPU
  2. 查看管理伺服器記錄 /opt/apigee/var/log/edge-management-server/logs/system.log,確認建立追蹤記錄/偵錯工作階段期間是否發生任何錯誤。
  3. 建立追蹤/偵錯工作階段時,您可能會看到類似「server <UUID> is not up or connection」的錯誤訊息,如下所示:

    2017-12-27 07:42:38,975 org:cocacola env:prod qtp2007599722-222063 INFO DISTRIBUTION - DebugSessionAPI.createDebugSession() : server 458b5910-2646-441c-a6e2-428b6d84e021 is either not up or reachable, skipping the server
    

    如果在一點時間過後,可能會出現另一個「連線逾時」錯誤,如下所示:

    2017-12-27 07:44:46.000 UTC org:cocacola env:prod qtp2007599722-222063 ERROR DISTRIBUTION - DebugSessionAPI.createDebugSession() : createDebugSession : Unable to connect to the server with UUID {}, skipping it458b5910-2646-441c-a6e2-428b6d84e021 org.apache.http.conn.HttpHostConnectException: Connect to 192.168.101.7:8080 [/192.168.101.7] failed: Connection timed out (Connection timed out) at org.apache.http.impl.conn.HttpClientConnectionOperator.connect(HttpClientConnectionOperator.java:140) ~[httpclient-4.3.5.jar:4.3.5] at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.connect(PoolingHttpClientConnectionManager.java:318) ~[httpclient-4.3.5.jar:4.3.5] at org.apache.http.impl.execchain.MainClientExec.establishRoute(MainClientExec.java:363) ~[httpclient-4.3.5.jar:4.3.5] at org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:219) ~[httpclient-4.3.5.jar:4.3.5] 
    …<snipped>
    Caused by: java.net.ConnectException: Connection timed out (Connection timed out) at java.net.PlainSocketImpl.socketConnect(Native Method) ~[na:1.8.0_144] at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350) ~[na:1.8.0_144]
    …<snipped>
    
  4. 這兩種錯誤可能是由於特定訊息處理器所導致:

    1. 過時 (已不適用)
    2. 因為某些原因而停止運作/無法聯絡
  5. 請根據系統發生的情境,採取適當的解決方法。

解析度

情境 1:訊息處理器已過時 (不存在)

  1. 請使用以下 Management API 取得訊息處理器清單:

    curl -u <sysadmin> "http://<management-server-host>:8080/v1/servers?pod=<podName>&regions=<regionName>"
    
  2. 請記下「管理伺服器記錄」錯誤訊息中提及的訊息處理器 (位於上方診斷步驟 3) 對應的 IP 位址或主機名稱,請使用下列其中一種方式,驗證這些是有效的訊息處理器:

    1. 最新的 Private Cloud 拓撲設定圖表
    2. 最新 Edge Server IP 位址 - 主機名稱對應表

    如果確認這些訊息是有效的訊息處理器,請進入「情境 2:無法聯絡訊息處理者」

  3. 請使用下列管理 API 刪除過時 (不存在) 的訊息處理器:

    1. 將機構環境中的訊息處理器取消註冊:

      curl -X POST http://<management-server-host>:8080/v1/o/<orgName>/e/<envName>/servers -d "uuid={uuid}&region=<regionName>&pod=<podName}&action=remove" 
      
    2. 取消註冊伺服器類型:

      curl http://<management-server-host>:8080/v1/servers -X POST -d "type={message-processor}&region=<regionName>&pod=<podName>&uuid=<uuid>&action=remove"
      
    3. 刪除伺服器:

      curl http://<management-ip>:8080/v1/servers/<uuid> -X DELETE
      
  4. 如果貴機構在其他環境中遇到相同問題,請重複執行步驟 #3。

情境 2:無法連線至訊息處理器

  1. 根據「管理伺服器記錄」錯誤訊息中的 UUID,決定 IP 位址/主機名稱,以登入每個郵件處理器。
  2. 重新啟動訊息處理器:

    /opt/apigee/apigee-service/bin/apigee-service edge-message-processor restart
    
    

請重新檢查您是否能建立追蹤工作階段。如果問題仍未解決,請參閱這篇文章.,瞭解如何收集診斷資訊。

原因:高資源使用率問題

診斷

  1. 登入每個訊息處理器,檢查任何資源是否具有高使用率,例如 CPU、記憶體或負載。您可以在 Unix 作業系統中使用 top 指令,取得訊息處理器程序的資源使用率資訊:

    top
    
  2. 如果訊息處理器的資源使用率偏高,請查看「必須收集診斷資訊」

  3. 如果「訊息處理器」的 CPU 或記憶體用量偏高,這可能表示「訊息處理者」未及時回應管理伺服器。因此您無法建立追蹤工作階段。

    1. 如果任一訊息處理器的 CPU 使用率偏高,請使用下列指令每 30 秒產生三個執行緒傾印

      sudo <JAVA_HOME>/bin/jstack -l <pid> > <filename>
      
    2. 如果任何訊息處理器的記憶體用量偏高,請使用下列指令產生記憶體快照資料

      sudo -u apigee <JAVA_HOME>/bin/jmap -dump:live,format=b,file=<filename> <pid>
      
      

解析度

  1. 使用下列指令重新啟動訊息處理器。這應該會導致 CPU 和記憶體用量降低:

    /opt/apigee/apigee-service/bin/apigee-service edge-message-processor restart
    
  2. 監控 API 呼叫,確認問題是否仍然存在。

  3. Apigee Edge 支援團隊聯絡,並提供執行緒傾印、記憶體快照資料和訊息處理器記錄檔 (/opt/apigee/var/log/edge-message-processor/logs/system.log),幫助調查 CPU/記憶體用量偏高的原因。

原因:未部署於一或多個訊息處理器的 API Proxy

極少數 API Proxy 可能無法部署在一或多個訊息處理器上。這通常是因為在部署特定 API Proxy 期間,管理伺服器未發送事件通知給「訊息處理者」。在這種情況下,您也無法在 Edge UI 中建立追蹤工作階段。

診斷

  1. 登入每個訊息處理器,並使用下列指令檢查是否已部署 API Proxy 的特定修訂版本:

    curl -v localhost:8082/v1/runtime/organizations/<orgname>/environments/<envname>/apis/<apiname>/revisions
    

    輸出內容示例:

    您會看到修訂版本清單做為上述指令的輸出內容。舉例來說,如果部署修訂版本 12,輸出內容將如下所示:

    [「12」]

  2. 如果 API Proxy 的特定修訂版本並未顯示為上述步驟 #1 中提及的指令輸出內容,請重新啟動特定的訊息處理器,詳情請參閱下方的解決方法

  3. 針對所有訊息處理器重複執行步驟 1 到 2。

  4. 如果所有「訊息處理器」已部署 API Proxy 的特定修訂版本,則這並非造成這個問題的原因。另請參閱「必須收集診斷資訊」一節。

解析度

  1. 重新啟動未部署 API Proxy 特定修訂版本的特定訊息處理器:

    /opt/apigee/apigee-service/bin/apigee-service edge-message-processor restart
    
    

原因:Edge UI 發生問題

診斷

  1. 檢查 Edge UI 記錄 /opt/apigee/var/log/edge-ui/application.log/opt/apigee/var/log/edge-ui/edge-ui.log,看看是否有任何錯誤。
  2. 請與 Apigee Edge 支援團隊聯絡,分享這些檔案以便進一步調查。

必須收集診斷資訊

如果按照上述指示操作後仍無法解決問題,請收集以下診斷資訊。請與 Apigee Edge 支援團隊聯絡並分享相關資訊:

  1. 指令的輸出內容:

    curl -v <management-server-host>:8080/v1/runtime/organizations/<org-name>/environments/<env-name>/apis/<apiproxy-name>/revisions/<revision-number>/debugsessions -u <user>
    
  2. 管理伺服器記錄

    /opt/apigee/var/log/edge-management-server/logs/system.log.
    
  3. 訊息處理器記錄

    /opt/apigee/var/log/edge-message-processor/logs/system.log.
    
  4. 從管理伺服器到訊息處理器的 telnet/nc 指令輸出:

    telnet <MessageProcessor_IP> 8082
    nc -vz <MessageProcessor_IP> 8082
    
  5. 對「訊息處理器」輸出以下 netstat 指令:

    netstat -an > netstat.txt
    
  6. 如果後來發現 Edge UI 有問題,請提供 Edge UI 記錄 /opt/apigee/var/log/edge-ui/application.log/opt/apigee/var/log/edge-ui/edge-ui.log.

  7. 詳細說明這份教戰手冊中有哪些部分經過嘗試,以及提供其他深入分析,協助我們快速解決這個問題。