

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 故障排除 Amazon X-Ray
问题排查

本主题列出了您在使用 X-Ray API、控制台或时可能遇到的常见错误和问题 SDKs。如果您发现某个问题未在此处列出，可以使用此页上的**反馈**按钮来报告。

**Topics**
+ [

## X-Ray 跟踪地图和跟踪详情页面
](#xray-console-troubleshooting)
+ [

## 适用 Java 的 X-Ray 开发工具包
](#troubleshooting-java)
+ [

## 适用于 Node.js 的 X-Ray 软件开发工具包
](#troubleshooting-nodejs)
+ [

## X-Ray 进程守护程序
](#troubleshooting-daemon)

## X-Ray 跟踪地图和跟踪详情页面


如果您在使用 X-Ray 跟踪地图和跟踪详情页面时遇到问题，以下各节可以提供帮助：

### 我没有看到我所有的日 CloudWatch 志


如何配置日志，使其显示在 X-Ray 跟踪地图和跟踪详情页面中，具体取决于服务。
+ 如果已在 API Gateway 中启用了日志记录，则会显示 API Gateway 日志。

 并非所有服务地图节点都支持查看关联的日志。查看以下节点类型的日志：
+ Lambda 上下文
+ Lambda 函数
+ API Gateway 阶段
+ Amazon ECS 集群
+ Amazon ECS 实例
+ Amazon ECS 服务
+ Amazon ECS 任务
+ 亚马逊 EKS 集群
+ Amazon EKS 命名空间
+ Amazon EKS 节点
+ Amazon EKS 容器组（pod）
+ Amazon EKS 服务

### 我未在 X-Ray 跟踪地图上看到我的所有警报


如果与节点关联的任何警报都处于 ALARM 状态，则 X-Ray 跟踪地图仅显示该节点的提示图标。

跟踪地图使用以下逻辑将警报与节点关联：
+ 如果该节点代表一项 Amazon 服务，则所有与该服务关联的命名空间的警报都将与该节点相关联。例如，类型`AWS::Kinesis`为的节点与所有基于 CloudWatch 命名空间中指标的警报相关联`AWS/Kinesis`。
+ 如果该节点代表一种 Amazon 资源，则会关联该特定资源的警报。例如，名为 “MyTable” `AWS::DynamoDB::Table` 的节点会链接到基于命名空间`AWS/DynamoDB`且`TableName`维度设置为的指标的所有警报`MyTable`。
+ 如果节点的类型未知（由名称周围的虚线边框标识），则任何警报均不会与该节点关联。

### 我在追踪地图上看不到一些 Amazon 资源


并非每个 Amazon 资源都由专用节点表示。有些 Amazon 服务由一个节点表示，用于向该服务发出的所有请求。将显示以下资源类型，并且每个资源对应一个节点：
+ `AWS::DynamoDB::Table`
+ `AWS::Lambda::Function`

  Lambda 函数由两个节点表示：一个表示 Lambda 容器，另一个表示函数。这有助于识别 Lambda 函数的冷启动问题。Lambda 容器节点与警报和控制面板的关联方式与 Lambda 函数节点与警报和控制面板的关联方式相同。
+ `AWS::ApiGateway::Stage`
+ `AWS::SQS::Queue`
+ `AWS::SNS::Topic`

### 跟踪地图包含太多节点


使用 X-Ray 组将您的地图分成多个地图。有关更多信息，请参阅[对组使用筛选表达式](xray-console-filters.md#groups)。

## 适用 Java 的 X-Ray 开发工具包


**错误：***话题 “Thread-1” 出现异常 com.amazonaws.xray.exceptions SegmentNotFoundException: 无法开始名为 “AmazonSNS” 的子区段：找不到区段*。

此错误表示 X-Ray SDK 尝试录制拨出的呼叫 Amazon，但找不到打开的分段。这可在以下情况下发生：
+ **servlet 筛选条件未配置** - X-Ray SDK 会使用名为 `AWSXRayServletFilter` 的筛选条件为传入请求创建分段。[配置 servlet 筛选条件](xray-sdk-java-filters.md)来检测传入请求。
+ **您正在 servlet 代码外部使用检测过的客户端** - 如果您在启动代码或并非运行用于响应传入请求的其他代码中，使用检测过的客户端来发出调用，则必须手动创建一个分段。有关示例，请参阅 [检测启动代码](scorekeep-startup.md)。
+ **您正在工作线程中使用检测过的客户端** - 当您创建新线程时，X-Ray 记录器会丢失对打开的分段的引用。您可以使用 [https://docs.amazonaws.cn/xray-sdk-for-java/latest/javadoc/com/amazonaws/xray/AWSXRayRecorder.html#getTraceEntity--](https://docs.amazonaws.cn/xray-sdk-for-java/latest/javadoc/com/amazonaws/xray/AWSXRayRecorder.html#getTraceEntity--) 和 [https://docs.amazonaws.cn/xray-sdk-for-java/latest/javadoc/com/amazonaws/xray/AWSXRayRecorder.html#setTraceEntity--](https://docs.amazonaws.cn/xray-sdk-for-java/latest/javadoc/com/amazonaws/xray/AWSXRayRecorder.html#setTraceEntity--) 方法来获取对当前分段或子分段的引用（[https://docs.amazonaws.cn/xray-sdk-for-java/latest/javadoc/com/amazonaws/xray/entities/Entity.html](https://docs.amazonaws.cn/xray-sdk-for-java/latest/javadoc/com/amazonaws/xray/entities/Entity.html)），并将其传递回线程内部的记录器。有关示例，请参阅 [在工作线程中使用检测的客户端](scorekeep-workerthreads.md)。

## 适用于 Node.js 的 X-Ray 软件开发工具包


**问题：***CLS 无法与 Sequelize 一起使用*

使用 `cls` 方法，将 X-Ray SDK for Node.js 命名空间传递到 Sequelize。

```
var AWSXRay = require('aws-xray-sdk');
const Sequelize = require('sequelize');
Sequelize.cls = AWSXRay.getNamespace();
const sequelize = new Sequelize(...);
```

**问题：***CLS 无法与 Bluebird 一起使用*

使用 `cls-bluebird` 实现 Bluebird 与 CLS 配合工作。

```
var AWSXRay = require('aws-xray-sdk');
var Promise = require('bluebird');
var clsBluebird = require('cls-bluebird');
clsBluebird(AWSXRay.getNamespace());
```

## X-Ray 进程守护程序


**问题：***进程守护程序使用错误的凭证*

守护程序使用 Amazon SDK 加载凭证。如果您使用多种方法提供凭证，将使用优先顺序最高的方法。参阅 [运行进程守护程序](xray-daemon.md#xray-daemon-running) 了解更多信息。