本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
迁移到 OpenTelemetry Python
本指南可帮助你将 Python 应用程序从 X-Ray SDK 迁移到 OpenTelemetry 仪器中。它涵盖了自动和手动检测方法,并提供了常见场景的代码示例。
Sections
零代码自动检测解决方案
使用 X-Ray SDK,您必须修改应用程序代码才能跟踪请求。 OpenTelemetry 提供用于跟踪请求的零代码自动检测解决方案。使用 OpenTelemetry,您可以选择使用零代码自动检测解决方案来跟踪请求。
使用 OpenTelemetry基于自动仪器的零代码
-
将 Amazon 发行版用于 Python 的 OpenTelemetry (ADOT) 自动插入 — 有关 Python 应用程序的自动检测,请参阅使用 Python 自动检测Amazon 发行版进行 OpenTelemetry 跟踪和衡量指标
。 (可选)您还可以在使用 ADOT Python 自动检测应用程序时启用 CloudWatch 应用程序信号,以监控当前应用程序运行状况并根据 Amazon 业务目标跟踪长期应用程序性能。Application Signals 为您提供统一的、以应用程序为中心的应用程序、服务和依赖项视图,帮助您监控应用程序的运行状况并对其进行分类。
-
使用 OpenTelemetry Python 零代码自动检测 — 要使用 Py OpenTelemetry thon 进行自动检测,请参阅 Pyt hon 零代码
检测。
手动检测您的应用程序
您可以使用pip
命令手动检测应用程序。
跟踪设置初始化
使用适用于 Python 的 ADOT 自动检测功能
你可以使用适用于 Python 的 ADOT 自动插桩来自动为你的 Python OpenTelemetry 应用程序进行配置。通过使用 ADOT 自动检测,您无需手动更改代码即可跟踪传入的请求或跟踪 Amazon SDK 或 HTTP 客户端等库。有关更多信息,请参阅使用适用于 OpenTelemetry Python 自动检测的 Amazon 发行版进行跟踪和指标
适用于 Python 的 ADOT 自动检测支持:
-
通过环境变量进行 X-Ray 远程采样
export OTEL_TRACES_SAMPLER=xray
-
X-Ray 轨迹上下文传播(默认启用)
-
资源检测(亚马逊 EC2、亚马逊 ECS 和 Amazon EKS 环境的资源检测默认处于启用状态)
-
默认情况下,所有支持的乐器的自动库 OpenTelemetry 乐器均处于启用状态。您可以通过
OTEL_PYTHON_DISABLED_INSTRUMENTATIONS
环境变量有选择地禁用。 (默认情况下全部启用) -
手动创建跨度
从 X-Ray 服务插件到 OpenTelemetry Amazon 资源提供商
X-Ray SDK 提供了插件,您可以将其添加到中,以从亚马逊 EC2、亚马逊 ECS 和 Elastic Beanstalk 等托管服务中捕获平台特定信息。xray_recorder
它与中的资源提供者类似 OpenTelemetry ,它将信息捕获为资源属性。有多个资源提供器可用于不同的 Amazon 平台。
-
首先安装 Amazon 扩展包,
pip install opentelemetry-sdk-extension-aws
-
配置所需的资源检测器。以下示例说明如何在 OpenTelemetry 软件开发工具包中配置 Amazon EC2 资源提供商
from opentelemetry import trace from opentelemetry.sdk.trace import TracerProvider from opentelemetry.sdk.extension.aws.resource.ec2 import ( AwsEc2ResourceDetector, ) from opentelemetry.sdk.resources import get_aggregated_resources provider = TracerProvider( active_span_processor=span_processor, resource=get_aggregated_resources([ AwsEc2ResourceDetector(), ])) trace.set_tracer_provider(provider)
跟踪传入的请求
Amazon 软件开发工具包工具
通过请求检测传出的 HTTP 调用
对其他库的仪器支持
你可以在支持的库、框架、应用程序服务器和下找到支持 P OpenTelemetry ython 的库
或者,您可以搜索 OpenTelemetry 注册表以了解是否 OpenTelemetry 支持检测。请查看注册表
手动创建跟踪数据
您可以在 Python 应用程序xray_recorder
中使用创建区段和子区段。有关更多信息,请参阅手动检测 Python 代码。您也可以手动向跟踪数据添加注释和元数据。
使用 SDK 创建跨度 OpenTelemetry
使用 start_as_current_span
API 启动跨度并将其设置为创建跨度。有关创建跨度的示例,请参阅创建跨SERVER
种类跨度会转换为 X-Ray 分段,而其他跨度会转换为 X-Ray 子分段。
from opentelemetry import trace from opentelemetry.trace import SpanKind import time tracer = trace.get_tracer("my.tracer.name") # Create a new span to track some work with tracer.start_as_current_span("parent", kind=SpanKind.SERVER) as parent_span: time.sleep(1) # Create a nested span to track nested work with tracer.start_as_current_span("child", kind=SpanKind.CLIENT) as child_span: time.sleep(2) # the nested span is closed when it's out of scope # Now the parent span is the current span again time.sleep(1) # This span is also closed when it goes out of scope
使用 OpenTelemetry SDK 向跟踪添加注释和元数据
X-Ray Python SDK 提供了单独的 APIs、put_annotation
put_metadata
用于向追踪添加注释和元数据的功能。在 OpenTelemetry SDK 中,注释和元数据只是通过 set_attribute
API 添加的跨度上的属性。
您希望它们成为轨迹注释的 Span 属性会添加到保留键下,保留键的aws.xray.annotations
值是注释的键值对列表。所有其他 span 属性都将成为转换后的分段或子分段的元数据。
此外,如果您使用的是 ADOT 收集器,则可以通过在收集器配置indexed_attributes
中指定,来配置哪些跨度属性应转换为 X-Ray 注释。
以下示例演示了如何使用 OpenTelemetry SDK 向跟踪添加注释和元数据。
with tracer.start_as_current_span("parent", kind=SpanKind.SERVER) as parent_span: parent_span.set_attribute("TransactionId", "qwerty12345") parent_span.set_attribute("AccountId", "1234567890") # This will convert the TransactionId and AccountId to be searchable X-Ray annotations parent_span.set_attribute("aws.xray.annotations", ["TransactionId", "AccountId"]) with tracer.start_as_current_span("child", kind=SpanKind.CLIENT) as child_span: # The MicroTransactionId will be converted to X-Ray metadata for the child subsegment child_span.set_attribute("MicroTransactionId", "micro12345")
Lambda 仪器
要在 X-Ray 上监控您的 lambda 函数,您可以启用 X-Ray 并向函数调用角色添加相应的权限。此外,如果您正在跟踪来自函数的下游请求,则需要使用 X-Ray Python SDK 来检测代码。
对 OpenTelemetry 于 X-Ray,建议在关闭 CloudWatch 应用程序信号的情况下使用应用信号 lambda 层。这将自动检测你的函数,并将为函数调用和来自你的函数的任何下游请求生成跨度。除了跟踪之外,如果您有兴趣使用应用程序信号来监控函数的运行状况,请参阅在 Lambda 上启用应用程序。
-
从 Lambda 层中找到您的函数所需的 Lambda 层 ARN 并将其Amazon 添加。 OpenTelemetry ARNs
-
为您的函数设置以下环境变量。
-
Amazon_LAMBDA_EXEC_WRAPPER=/opt/otel-instrument
— 这将加载该函数的自动仪器 -
OTEL_Amazon_APPLICATION_SIGNALS_ENABLED=false
— 这将禁用应用程序信号监控
-
使用 Lambda 工具手动创建跨度
此外,你可以在函数中生成自定义跨度来跟踪工作。您可以仅将该opentelemetry-api
软件包与应用程序信号 lambda 层自动检测结合使用。
-
将
opentelemetry-api
作为依赖项包含在函数中 -
以下代码片段是生成自定义跨度的示例
from opentelemetry import trace # Get the tracer (auto‑configured by the Application Signals layer) tracer = trace.get_tracer(__name__) def handler(event, context): # This span is a child of the layer's root span with tracer.start_as_current_span("my-custom-span") as span: span.set_attribute("key1", "value1") span.add_event("custom-event", {"detail": "something happened"}) # Any logic you want to trace result = some_internal_logic() return { "statusCode": 200, "body": result }