排查 Amazon X-Ray 问题
本主题列出了您在使用 X-Ray API、控制台或 SDK 时可能会遇到的常见错误和问题。如果您发现某个问题未在此处列出,可以使用此页上的反馈按钮来报告。
X-Ray 跟踪地图和跟踪详情页面
如果您在使用 X-Ray 跟踪地图和跟踪详情页面时遇到问题,以下各节可以提供帮助:
我看不到我的所有 CloudWatch 日志
如何配置日志,使其显示在 X-Ray 跟踪地图和跟踪详情页面中,具体取决于服务。
-
如果已在 API Gateway 中启用了日志记录,则会显示 API Gateway 日志。
并非所有服务地图节点都支持查看关联的日志。查看以下节点类型的日志:
Lambda 上下文
Lambda 函数
API Gateway 阶段
Amazon ECS 集群
Amazon ECS 实例
Amazon ECS 服务
Amazon ECS 任务
Amazon 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::FunctionLambda 函数由两个节点表示:一个表示 Lambda 容器,另一个表示函数。这有助于识别 Lambda 函数的冷启动问题。Lambda 容器节点与警报和控制面板的关联方式与 Lambda 函数节点与警报和控制面板的关联方式相同。
-
AWS::ApiGateway::Stage -
AWS::SQS::Queue -
AWS::SNS::Topic
跟踪地图包含太多节点
使用 X-Ray 组将您的地图分成多个地图。有关更多信息,请参阅对组使用筛选表达式。
适用 Java 的 X-Ray 开发工具包
错误:线程“Thread-1”中发生异常 com.amazonaws.xray.exceptions.SegmentNotFoundException:无法开始名为“AmazonSNS”的子分段:无法找到分段。
此错误指示 X-Ray SDK 尝试记录对 Amazon 的传出调用,但找不到打开的分段。这可在以下情况下发生:
-
servlet 筛选条件未配置 - X-Ray SDK 会使用名为
AWSXRayServletFilter的筛选条件为传入请求创建分段。配置 servlet 筛选条件来检测传入请求。 -
您正在 servlet 代码外部使用检测过的客户端 - 如果您在启动代码或并非运行用于响应传入请求的其他代码中,使用检测过的客户端来发出调用,则必须手动创建一个分段。有关示例,请参阅 检测启动代码。
-
您正在工作线程中使用检测过的客户端 - 当您创建新线程时,X-Ray 记录器会丢失对打开的分段的引用。您可以使用
getTraceEntity和setTraceEntity方法来获取对当前分段或子分段的引用(Entity),并将其传递回线程内部的记录器。有关示例,请参阅 在工作线程中使用检测的客户端。
适用于 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 来加载凭证。如果您使用多种方法提供凭证,将使用优先顺序最高的方法。请参阅运行进程守护程序了解更多信息。