无法创建跟踪会话

您正在查看的是 Apigee Edge 文档。
转到 Apigee X 文档
信息

问题

用户无法在 Edge 界面中创建跟踪会话。

错误消息

您会在 Edge 界面中收到一条错误消息,如下所示:

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

以下是在 Edge 界面中观察到的错误消息示例的屏幕截图:

可能的原因

下面列出了可能造成此错误的一些原因:

原因 说明 问题排查说明适用于
网络连接问题 由于网络连接问题或防火墙规则而导致管理服务器与消息处理器之间的通信故障。 Edge Private Cloud 用户
未在消息处理器上加载环境 由于发生错误,消息处理器尚未加载特定环境(您尝试启用轨迹)。
过时的消息处理器条目 管理服务器引用了不存在(过时)的消息处理器。
无法访问消息处理器 消息处理器已停止或无法访问。
资源利用率高问题 消息处理器(CPU、内存或负载)利用率较高。
一个或多个消息处理器上未部署 API 代理 由于在部署期间缺少事件通知,因此 API 代理可能无法在一个或多个消息处理器上部署。
Edge 界面问题 由于出现错误,边缘界面无法创建跟踪会话。

常见诊断步骤

  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 界面可能存在一个问题,导致无法在该界面中创建跟踪会话。移至 Edge 界面问题

原因:网络连接问题

诊断

  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 上的消息处理器时,我们会收到 "Connection refused" 错误。因此,管理服务器无法创建跟踪会话。

  3. 如果您未看到任何与网络连接相关的错误,或未看到与上例所示类似的错误,请前往 Environment not loaded on the Message Processor

  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. 检查您现在能否在界面中启动跟踪会话。如果此问题已不存在,请跳过以下步骤。

  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 有效响应来自 MP(s)”的错误消息,如下所示:

    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", "测试" ]

  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. 如果您在消息处理器日志中看到以下错误之一,可能是由于在指定环境中添加到指定密钥库/truststore 的证书/密钥存在问题。

    错误 1:java.security.KeyStoreException: Cannot 覆盖自己的证书

    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: Cannot 覆盖 Secret key

    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. 使用以下 Management API 调用获取上一步中显示的错误消息中指定的密钥库/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 界面需要很长时间,并且未能创建跟踪会话,下面列出了一些可能的原因:
    1. 管理服务器可能引用了不存在(过时)的消息处理器
    2. 消息处理器已停止或无法访问
    3. 消息处理器占用大量内存/CPU
  2. 检查管理服务器日志 /opt/apigee/var/log/edge-management-server/logs/system.log,看看创建跟踪/调试会话期间是否出现错误。
  3. 在创建跟踪/调试会话期间,您可能会看到类似于“server <UUID> is not up or reachable”之类的错误消息,如下所示:

    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. 记下与 Management Server 日志的错误消息中提到的消息处理器的 UUID 对应的 IP 地址或主机名(上面“诊断”中的第 3 步)。通过以下任一方式验证这些消息处理器是否有效:

    1. 最新私有云拓扑设置图表
    2. 最新边缘服务器 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. 根据 Management Server 日志中错误消息的 UUID,确定 IP 地址/主机名,以登录到每个消息处理器。
  2. 重新启动消息处理器:

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

重新检查您能否创建跟踪会话。如果问题仍然存在,请参阅必须收集诊断信息.

原因:资源利用率高问题

诊断

  1. 登录各个消息处理器,检查是否存在任何资源(CPU、内存或负载)的高利用率。您可以在基于 Unix 的操作系统上使用 top 命令来获取 Message Processor 进程的资源利用率信息:

    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>
      
      
    3. 转到“分辨率”。

分辨率

  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 代理

在极少数情况下,一个或多个消息处理器可能未部署 API 代理。这主要是因为在部署特定 API 代理的过程中,未收到来自管理服务器到消息处理器的事件通知。在这种情况下,您将无法在 Edge 界面中创建跟踪会话。

诊断

  1. 登录每个消息处理器,并使用以下命令检查是否已部署 API 代理的特定修订版本:

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

    输出示例

    您将看到修订版本列表作为上述命令的输出。例如,如果部署了修订版本 12,您将看到如下输出:

    [ "12" ]

  2. 如果 API 代理的特定修订版本没有在上述第 1 步提到的命令输出中显示,请按照下文解决方法中的说明重启特定消息处理器。

  3. 对所有消息处理器重复第 1-2 步。

  4. 如果在所有消息处理器上部署了 API 代理的特定修订版本,则此问题不是导致此问题的原因。移至必须收集诊断信息

分辨率

  1. 重启未部署 API 代理的特定修订版本的特定消息处理器:

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

原因:Edge 界面存在问题

诊断

  1. 检查 Edge 界面日志 /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 界面存在问题,请提供 Edge 界面日志 /opt/apigee/var/log/edge-ui/application.log/opt/apigee/var/log/edge-ui/edge-ui.log.

  7. 详细说明本手册中的哪些部分进行了尝试,以及其他任何有助于我们快速解决此问题的数据分析。