揭开应用程序的神秘面纱:深入了解 AWS X-Ray
1.AWS X-Ray 概述:
AWS X-Ray 是一项服务,它收集应用程序所处理请求的数据,并提供一些工具供您查看、筛选和深入了解这些数据,从而发现问题和优化机会。您不仅可以查看请求和响应的详细信息,还可以查看应用程序对下游 AWS 资源、第三方应用程序、微服务、数据库和 HTTP Web API 的调用的详细信息。
调用的详细信息以跟踪记录的形式显示。
X-Ray SDK 将 JSON 数据段文档发送到 X-Ray 守护程序,X-Ray 守护程序再将数据发送到 X-Ray 控制台。X-Ray 守护程序将数据段缓存在队列中,然后将其批量上传到 X-Ray。
该 SDK 可帮助应用程序快速启动,无需明确指示应用程序记录元数据。SDK 支持的语言和框架包括:
- C#
- Go
- Java
- Node.js
- Python
- Ruby
守护程序安装在基础系统中。
AWS 还提供与部分服务的直接集成。提供 X-Ray 集成的 AWS 服务如下:
- AWS Lambda
- Amazon API Gateway
- Elastic Load Balancing
- AWS Elastic Beanstalk
- AWS SNS
- AWS SQS
您甚至可以将本地主机或本地服务器与 AWS X-Ray 集成。
2. AWS X-Ray 概念
- 分段
- 子分段
- 跟踪
- 服务图
- 采样
2.1 分段
运行应用程序逻辑的计算资源会将其工作数据以分段的形式发送。分段提供以下信息:
• 主机 - 主机名、别名或 IP 地址
• 请求 - 方法、客户端地址、路径、用户代理
• 响应 - 状态、内容
• 已完成的工作 - 开始和结束时间、子分段
• 发生的问题 - 发生的错误、故障和异常
2.2 子分段
子分段提供更精细的时序信息以及应用程序对 SQL 数据库、DynamoDB 或外部 HTTP API(第三方应用程序)进行的下游调用的详细信息。

2.3 跟踪
AWS X-Ray 会跟踪用户请求在整个应用程序中的传输过程。它汇总了组成您应用程序的各个服务和资源生成的数据,为您提供应用程序性能的端到端视图。
2.4 服务图
X-Ray 使用来自 AWS 资源和 API 的跟踪数据来生成详细的服务地图。服务图显示客户端、前端、后端以及后端调用的服务/API。用户可以使用服务图来识别瓶颈、延迟和其他问题,从而提高性能并解决应用程序问题。
AWS X-Ray 以分段的形式接收来自服务的数据。然后,X-Ray 将具有共同请求的分段分组到跟踪中。X-Ray 处理这些跟踪以生成服务图,以直观的方式呈现您的应用程序。
2.5 采样
为了确保高效的跟踪并提供应用程序所服务的请求的代表性样本,X-Ray SDK 应用了一种采样算法来确定要跟踪的请求。
默认情况下,X-Ray SDK 每秒记录第一个请求,以及 5% 的额外请求。
3. AWS X-Ray 的优势
- 它为架构提供了实时架构图。
- 精确定位应用程序中的瓶颈。
- 它有助于优化应用程序的性能。
- 帮助优化 SQL 查询。
- 支持数据驱动的架构决策。
AWS X-Ray 用例
- 它有助于找出应用程序中出现故障的特定微服务。
- 帮助查找应用程序中的瓶颈。
- 帮助分析应用程序中 SQL 查询的执行时间。
- 它有助于分析从一个微服务到另一个微服务的执行时间。
AWS X-Ray案例分析一:
创建S3 bucket
创建lambda
选择python 作为runtime , 输入下面的代码
import jsondef lambda_handler(event, context):print('event', event)return {'statusCode': 200,'body': json.dumps('Hello from Lambda!')}
设置触发器
点击触发器,选择s3 bucket
上传测试文件到S3 bucket
在cloudwatch 日志组中查看文件上传的日志
点击cloudwatch - x ray - trace,点击traceid
可以看到跟踪
点击跟踪图,可以查看trace map
AWS X-Ray案例分析二:
创建IAM role
创建S3 bucket
创建lambda 函数,上传zip file
import aws_xray_sdk.core
import boto3
import requests
import os
import base64
import io
import mimetypes# 初始化AWS X-Ray SDK
aws_xray_sdk.core.patch_all()def lambda_handler(event, context):# 启动 X-Ray 分段with aws_xray_sdk.core.xray_recorder.capture('get_dog_images'):# 创建 S3 clientsession = boto3.Session()s3 = session.resource('s3')bucket_name = os.getenv('BUCKET_NAME')# 访问 Dog APIwith aws_xray_sdk.core.xray_recorder.capture('call_dog_api'):# 定义 Dog API endpointendpoint = 'https://dog.ceo/api/breeds/image/random'# 对Dog API发出get 请求response = requests.get(endpoint)# 从请求的相应中提取图片的urlimage_url = response.json()['message']# 获得image 名称image_name = str(response.json()['message']).split('/')[-1]# 从url中下载图片image = requests.get(image_url, stream=True).content# 保存图片到s3with aws_xray_sdk.core.xray_recorder.capture('save_dog_to_s3'):contenttype = mimetypes.types_map['.' + image_name.split('.')[-1]]bucket = s3.Bucket(bucket_name)bucket.upload_fileobj(io.BytesIO(image), image_name, ExtraArgs={'ContentType': contenttype})# 生成包含正文中图片的回复response = {'statusCode': 200,'headers': {'Content-Type': 'image/jpeg'},'body': base64.b64encode(image),'isBase64Encoded': True}return response
配置lambda 的URL
启用xray 跟踪
设置环境变量和timeout
访问lambda url,该lambda会访问网站并上传狗狗图片到指定的S3 bucket。
在回到S3 bucket,
打开x-ray console,你会看到lambda 函数的调用链图
点击到S3 bucket的调用,你会看到到S3的请求的metric:延时,请求数量
点击x ray- trace ,你可以看到瀑布式的调用链trace 图。
现在将BUCKET_NAME 的值该为一个无法访问的值,再次访问该lambda,在segment中你可以看到下面的错误
这个功能在分析复杂的lambda调用的时候,尤其是带有外部API的调用场景中非常有用。
最佳实践:
- 为所有相关组件启用 X-Ray:为了充分利用 X-Ray,务必为系统的所有相关组件启用它。这包括 Lambda 函数、DynamoDB 表和 SNS 主题。
- 使用 X-Ray 控制台和 API 查看和分析跟踪数据:使用控制台查看跟踪数据的可视化表示。使用 API 以编程方式访问和操作跟踪数据,并自动执行性能分析或错误报告等任务。
- 使用分段和子分段为跟踪数据添加上下文:使用分段表示请求在系统中的整体流程。使用子分段表示该流程中的特定操作。通过为跟踪数据添加上下文,您可以更轻松地理解和排查可能发生的问题。
- 启用采样以减少跟踪开销:跟踪会增加系统开销,尤其是在您正在检测大量函数或函数被频繁调用的情况下。为了减少此开销,您可以在 X-Ray 中启用采样。这将使 X-Ray 仅跟踪部分请求,从而显著降低跟踪开销和成本。
- 使用自定义属性为跟踪数据添加上下文:自定义属性是键值对,您可以将其添加到跟踪数据中以提供更多上下文。使用自定义属性可以添加有关请求的元数据,例如用户 ID 或请求 ID。
- 使用 X-Ray 开发工具包为 Lambda 函数添加错误处理:X-Ray 开发工具包提供了一个 captureFunc 方法,您可以使用它来捕获错误并将其添加到跟踪数据中。
结论:
对于寻求对分布式应用程序进行可见性和控制的开发人员和 DevOps 团队来说,AWS X-Ray 是一款强大的工具。X-Ray 通过提供实时跟踪、端到端可见性和切实可行的洞察,简化了微服务架构调试的复杂性。对于希望最大限度地利用 AWS 的组织而言,AWS X-Ray 是 DevOps 工具包中不可或缺的补充。