

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

# 配置适用于 Python 的 X-Ray 开发工具包
配置

**注意**  
X-Ray SDK/Daemon 维护通知 — 2026 年 2 月 25 日， Amazon X-Ray SDKs/Daemon 将进入维护模式，在该模式下，X-Ray SDK 和 Daemon 的发布 Amazon 将仅限于解决安全问题。有关支持时间表的更多信息，请参阅 [X-Ray SDK 和 Daemon Support 时间表](xray-sdk-daemon-timeline.md)。我们建议迁移到 OpenTelemetry。有关迁移到的更多信息 OpenTelemetry，请参阅[从 X-Ray 仪器迁移到 OpenTelemetry 仪器](https://docs.amazonaws.cn/xray/latest/devguide/xray-sdk-migration.html)。

适用于 Python 的 X-Ray 开发工具包具有提供全局记录器的、名为 `xray_recorder` 的类。您可以配置全局记录器以自定义为传入 HTTP 调用创建分段的中间件。

**Topics**
+ [

## 服务插件
](#xray-sdk-python-configuration-plugins)
+ [

## 采样规则
](#xray-sdk-python-configuration-sampling)
+ [

## 日志记录
](#xray-sdk-python-configuration-logging)
+ [

## 代码中的记录器配置
](#xray-sdk-python-middleware-configuration-code)
+ [

## 使用 Django 时的记录器配置
](#xray-sdk-python-middleware-configuration-django)
+ [

## 环境变量
](#xray-sdk-python-configuration-envvars)

## 服务插件


`plugins` 用于记录有关托管应用程序的服务的信息。

**插件**
+ Amazon EC2 — `EC2Plugin` 添加实例 ID、可用区和 CloudWatch 日志组。
+ Elastic Beanstalk - `ElasticBeanstalkPlugin` 添加环境名称、版本标签和部署 ID。
+ Amazon ECS — `ECSPlugin` 添加容器 ID。

![\[Segment - Scorekeep overview showing Elastic Beanstalk and EC2 deployment details.\]](http://docs.amazonaws.cn/xray/latest/devguide/images/scorekeep-PUTrules-segment-resources-python09.png)


要使用插件，请在 `xray_recorder` 上调用 `configure`。

```
from aws_xray_sdk.core import xray_recorder
from aws_xray_sdk.core import patch_all

xray_recorder.configure(service='My app')
plugins = ('ElasticBeanstalkPlugin', 'EC2Plugin')
xray_recorder.configure(plugins=plugins)
patch_all()
```

**注意**  
由于 `plugins` 是作为元组传入的，因此请确保包含指定单一插件尾随的 `,`。例如，`plugins = ('EC2Plugin',)`

您还可以使用[环境变量](#xray-sdk-python-configuration-envvars)来配置记录器，它优先于在代码中设置的值。

配置插件，然后再[修补库](xray-sdk-python-patching.md)，从而记录下游调用。

该 SDK 还使用插件设置为设置分段上的 `origin` 字段。这表示运行您的应用程序的 Amazon 资源类型。当您使用多个插件时，SDK 使用以下解析顺序来确定来源： ElasticBeanstalk > EKS > ECS > EC2。

## 采样规则


该 SDK 使用您在 X-Ray 控制台中定义的采样规则来确定要记录的请求。默认规则跟踪每秒的第一个请求，以及所有将跟踪发送到 X-Ray 的服务的任何其他请求的百分之五。[在 X-Ray 控制台中创建其他规则](xray-console-sampling.md)以自定义为每个应用程序记录的数据量。

该 SDK 按照定义的顺序应用自定义规则。如果请求与多个自定义规则匹配，则 SDK 仅应用第一条规则。

**注意**  
如果 SDK 无法访问 X-Ray 来获取采样规则，它将恢复为默认的本地规则，即每秒第一个请求以及每个主机所有其他请求的百分之五。如果主机无权调用采样，或者无法连接到 X-Ray 守护程序 APIs，后者充当 SDK 发出的 API 调用的 TCP 代理，则可能会发生这种情况。

您还可以将 SDK 配置为从 JSON 文档加载采样规则。在 X-Ray 采样不可用的情况下，SDK 可以使用本地规则作为备份，也可以只使用本地规则。

**Example sampling-rules.json**  

```
{
  "version": 2,
  "rules": [
    {
      "description": "Player moves.",
      "host": "*",
      "http_method": "*",
      "url_path": "/api/move/*",
      "fixed_target": 0,
      "rate": 0.05
    }
  ],
  "default": {
    "fixed_target": 1,
    "rate": 0.1
  }
}
```

此示例定义了一个自定义规则和一个默认规则。自定义规则采用百分之五的采样率，对于 `/api/move/` 之下的路径要跟踪的请求数量不设下限。默认规则中每秒的第一个请求以及其他请求的百分之十。

在本地定义规则的缺点是，固定目标由记录器的每个实例独立应用而不是由 X-Ray 服务管理。随着您部署更多主机，固定速率会成倍增加，这使得控制记录的数据量变得更加困难。

开启后 Amazon Lambda，您无法修改采样率。如果您的函数由检测服务调用，Lambda 将记录生成由该服务采样的请求的调用。如果启用了活动跟踪且不存在任何跟踪标头，则 Lambda 会做出采样决定。

要配置备份采样规则，请调用`xray_recorder.configure`，如以下示例所示，其中要么*rules*是规则字典，要么是包含采样规则的 JSON 文件的绝对路径。

```
xray_recorder.configure(sampling_rules=rules)
```

要仅使用本地规则，请使用 `LocalSampler` 配置记录器。

```
from aws_xray_sdk.core.sampling.local.sampler import LocalSampler
xray_recorder.configure(sampler=LocalSampler())
```

您还可以配置全局记录器，以禁止对所有传入请求进行采样和检测。

**Example main.py - 禁用采样**  

```
xray_recorder.configure(sampling=False)
```

## 日志记录


开发工具包使用 Python 内置的 `logging` 模块，其中包含默认 `WARNING` 日志记录级别。获取对 `aws_xray_sdk` 类的日志记录器的引用，并对其调用 `setLevel` 来为库以及应用程序的其余部分配置不同的日志级别。

**Example app.py - 日志记录**  

```
logging.basicConfig(level='WARNING')
logging.getLogger('aws_xray_sdk').setLevel(logging.ERROR)
```

当您手动[生成子分段](xray-sdk-python-subsegments.md)时，使用调试日志来识别诸如未结束子分段之类的问题。

## 代码中的记录器配置


其他设置包含在 `xray_recorder` 的 `configure` 方法中。
+ `context_missing` - 设置为 `LOG_ERROR` 可避免在您的已检测代码尝试在分段未打开的情况下记录数据时引发异常。
+ `daemon_address` - 设置 X-Ray 进程守护程序侦听器的主机和端口。
+ `service` - 设置开发工具包用于进行分段的服务名称。
+ `plugins`— 记录有关您的应用程序 Amazon 资源的信息。
+ `sampling` 设置为 `False` 可禁用采样。
+ `sampling_rules` - 设置包含您的[采样规则](#xray-sdk-python-configuration-sampling)的 JSON 文件的路径。

**Example main.py - 禁用缺少上下文异常**  

```
from aws_xray_sdk.core import xray_recorder

xray_recorder.configure(context_missing='LOG_ERROR')
```

## 使用 Django 时的记录器配置


如果您使用 Django 框架，您可以使用 Django `settings.py` 文件来配置全局记录器的选项。
+ `AUTO_INSTRUMENT`（仅限 Django） - 记录内置数据库和模板渲染操作的子分段。
+ `AWS_XRAY_CONTEXT_MISSING` - 设置为 `LOG_ERROR` 可避免在您的已检测代码尝试在分段未打开的情况下记录数据时引发异常。
+ `AWS_XRAY_DAEMON_ADDRESS` - 设置 X-Ray 进程守护程序侦听器的主机和端口。
+ `AWS_XRAY_TRACING_NAME` - 设置开发工具包用于进行分段的服务名称。
+ `PLUGINS`— 记录有关您的应用程序 Amazon 资源的信息。
+ `SAMPLING` 设置为 `False` 可禁用采样。
+ `SAMPLING_RULES` - 设置包含您的[采样规则](#xray-sdk-python-configuration-sampling)的 JSON 文件的路径。

要启用 `settings.py` 中的记录器配置，请将 Django 中间件添加到已安装应用程序列表中。

**Example settings.py - 已安装的应用程序**  

```
INSTALLED_APPS = [
    ...
    'django.contrib.sessions',
    'aws_xray_sdk.ext.django',
]
```

在名为 `XRAY_RECORDER` 的 dict 中配置可用设置。

**Example settings.py - 已安装的应用程序**  

```
XRAY_RECORDER = {
    'AUTO_INSTRUMENT': True,
    'AWS_XRAY_CONTEXT_MISSING': 'LOG_ERROR',
    'AWS_XRAY_DAEMON_ADDRESS': '127.0.0.1:5000',
    'AWS_XRAY_TRACING_NAME': 'My application',
    'PLUGINS': ('ElasticBeanstalkPlugin', 'EC2Plugin', 'ECSPlugin'),
    'SAMPLING': False,
}
```

## 环境变量


您可以使用环境变量配置适用于 Python 的 X-Ray 开发工具包。开发工具包支持以下变量：
+ `AWS_XRAY_TRACING_NAME` - 设置 SDK 用于进行分段的服务名称。覆盖您以编程方式设置的服务名称。
+ `AWS_XRAY_SDK_ENABLED` - 如果设置为 `false`，则会禁用开发工具包。默认情况下，开发工具包处于启用状态，除非环境变量设置为 false。
  + 禁用时，全局记录器会自动生成不发送到进程守护程序的虚拟分段和子分段，并禁用自动修补。中间件是作为全局记录器的包装器编写的。通过中间件生成的所有分段和子分段也成为虚拟分段和虚拟子分段。
  + 通过环境变量设置 `AWS_XRAY_SDK_ENABLED` 值，或者通过与 `aws_xray_sdk` 库中 `global_sdk_config` 对象的直接交互来设置。环境变量的设置会覆盖这些交互。
+ `AWS_XRAY_DAEMON_ADDRESS` - 设置 X-Ray 进程守护程序侦听器的主机和端口。默认情况下，SDK 使用用于跟踪数据（UDP）和采样（TCP）的 `127.0.0.1:2000`。如果您已将进程守护程序配置为[侦听不同端口](xray-daemon-configuration.md)或者进程守护程序在另一台主机上运行，则使用此变量。

**Format**
  + **同一个端口** — `address:port`
  + **不同的端口** — `tcp:address:port udp:address:port`
+ `AWS_XRAY_CONTEXT_MISSING` - 设置为 `RUNTIME_ERROR` 在您的已检测代码尝试在分段未打开的情况下记录数据时引发异常。

**有效值**
  + `RUNTIME_ERROR`— 引发运行时异常。
  + `LOG_ERROR`— 记录错误并继续（默认）。
  + `IGNORE_ERROR`— 忽略错误并继续。

  对于在未打开任何请求时运行的启动代码或者会生成新线程的代码，如果您尝试在其中使用检测过的客户端，则可能发生与缺失分段或子分段相关的错误。

环境变量覆盖在代码中设置的值。