揭开应用程序的神秘面纱:深入了解 AWS X-Ray

发布于:2025-05-01 ⋅ 阅读:(21) ⋅ 点赞:(0)

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 json

def 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 client
        session = boto3.Session()
        s3 = session.resource('s3')
        bucket_name = os.getenv('BUCKET_NAME')

        # 访问 Dog API
        with aws_xray_sdk.core.xray_recorder.capture('call_dog_api'):
            # 定义 Dog API endpoint
            endpoint = 'https://dog.ceo/api/breeds/image/random'
            
            # 对Dog API发出get 请求
            response = requests.get(endpoint)
            
            # 从请求的相应中提取图片的url
            image_url = response.json()['message']

            # 获得image 名称
            image_name = str(response.json()['message']).split('/')[-1]
            
            # 从url中下载图片
            image = requests.get(image_url, stream=True).content
            
        # 保存图片到s3
        with 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 工具包中不可或缺的补充。


网站公告

今日签到

点亮在社区的每一天
去签到