无法创建跟踪会话

<ph type="x-smartling-placeholder"></ph> 您正在查看 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 界面中观察到的示例错误消息的屏幕截图:

可能的原因

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

原因 说明 适用的问题排查说明
网络连接问题 由于网络连接问题或防火墙规则,管理服务器和消息处理器之间的通信失败。 边缘私有云用户
消息处理器上未加载环境 由于出现错误,消息处理器尚未加载特定环境(您尝试启用跟踪)。
消息处理器条目过时 管理服务器引用了不存在(过时)的消息处理器。
无法访问邮件处理器 消息处理器已停止或变得无法访问。
资源利用率高问题 消息处理器的资源(CPU、内存或负载)利用率较高。
在一个或多个消息处理器上未部署 API 代理 由于部署期间缺少事件通知,可能无法在一个或多个消息处理器上部署 API 代理。
Edge 界面存在问题 由于出现错误,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. 如果您没有看到任何与网络连接相关的错误或与上例所示的错误类似的错误,请转到环境未在消息处理器上加载

  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,但仍然无法从其他服务器(如 Management Server)进行连接,则可能是防火墙必须阻止外部连接。

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

  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. 如果您在消息处理器日志中看到以下某个错误,则是由于在添加到指定环境中的指定密钥库/信任存储区的证书/密钥存在问题所致。

    错误 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. 使用以下 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 界面需要很长时间并且无法创建跟踪会话,可能是以下一些原因导致的: <ph type="x-smartling-placeholder">
      </ph>
    1. 管理服务器可能引用了不存在的(过时)消息处理器
    2. 消息处理器已停止或变得无法访问
    3. 消息处理器的内存/CPU 使用率较高
  2. 检查管理服务器日志 /opt/apigee/var/log/edge-management-server/logs/system.log,并查看创建跟踪/调试会话期间是否出现任何错误。
  3. 您可能会看到一条错误消息,如“server <UUID>在创建跟踪/调试会话期间未启动或可达”,如下所示:

    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. 记下管理服务器日志的错误消息中提及的消息处理器 UUID(上述“诊断”步骤中的第 3 步)所对应的 IP 地址或主机名。使用以下方法之一验证这些是否为有效的消息处理器:

    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. 根据在管理服务器日志的错误消息中观察到的 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>
      
      
    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. 详细说明本手册中的哪些内容已被尝试过,以及可帮助我们快速解决此问题的任何其他分析洞见。