

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

# 配置适用于 Ruby 的 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)。

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

**Topics**
+ [

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

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

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

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

## 使用 Rails 时的记录器配置
](#xray-sdk-ruby-middleware-configuration-rails)
+ [

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

## 服务插件


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

**插件**
+ Amazon EC2 - `ec2` 添加实例 ID 和可用区。
+ Elastic Beanstalk - `elastic_beanstalk` 添加环境名称、版本标签和部署 ID。
+ Amazon ECS — `ecs` 添加容器 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)


要使用插件，请在您传递给记录器的配置对象中指定插件。

**Example main.rb - 插件配置**  

```
my_plugins = %I[ec2 elastic_beanstalk]

config = {
  plugins: my_plugins,
  name: 'my app',
}

XRay.recorder.configure(config)
```

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

开发工具包还使用插件设置为设置分段上的 `origin` 字段。这表示运行您的应用程序的 Amazon 资源类型。当您使用多个插件时，软件开发工具包使用以下解析顺序来确定来源： 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 服务管理。随着您部署更多主机，固定速率会成倍增加，这使得控制记录的数据量变得更加困难。

要配置备份规则，请在传递给记录器的配置对象中为文档定义一个哈希。

**Example main.rb - 备份规则配置**  

```
require 'aws-xray-sdk'
my_sampling_rules =  {
  version: 1,
  default: {
    fixed_target: 1,
    rate: 0.1
  }
}
config = {
  sampling_rules: my_sampling_rules,
  name: 'my app',
}
XRay.recorder.configure(config)
```

要单独存储采样规则，请在一个单独的文件中定义哈希，并要求该文件将哈希拉入您的应用程序中。

**Example config/sampling-rules.rb**  

```
my_sampling_rules =  {
  version: 1,
  default: {
    fixed_target: 1,
    rate: 0.1
  }
}
```

**Example main.rb - 文件中的采样规则**  

```
require 'aws-xray-sdk'
require 'config/sampling-rules.rb'

config = {
  sampling_rules: my_sampling_rules,
  name: 'my app',
}
XRay.recorder.configure(config)
```

要仅使用本地规则，需要采样规则和配置 `LocalSampler`。

**Example main.rb - 本地规则采样**  

```
require 'aws-xray-sdk'
require 'aws-xray-sdk/sampling/local/sampler'

config = {
  sampler: LocalSampler.new,
  name: 'my app',
}
XRay.recorder.configure(config)
```

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

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

```
require 'aws-xray-sdk'
config = {
  sampling: false,
  name: 'my app',
}
XRay.recorder.configure(config)
```

## 日志记录


默认情况下，记录器将信息级别事件输出到 `$stdout`。您可以通过在传递给记录器的配置对象中定义[记录器](https://ruby-doc.org/stdlib-2.4.2/libdoc/logger/rdoc/Logger.html)来自定义日志记录。

**Example main.rb - 日志记录**  

```
require 'aws-xray-sdk'
config = {
  logger: my_logger,
  name: 'my app',
}
XRay.recorder.configure(config)
```

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

## 代码中的记录器配置


其他设置包含在 `XRay.recorder` 的 `configure` 方法中。
+ `context_missing` - 设置为 `LOG_ERROR` 可避免在您的已检测代码尝试在分段未打开的情况下记录数据时引发异常。
+ `daemon_address` - 设置 X-Ray 进程守护程序侦听器的主机和端口。
+ `name` - 设置开发工具包用于进行分段的服务名称。
+ `naming_pattern` - 设置域名模式以使用[动态命名](xray-sdk-ruby-middleware.md#xray-sdk-ruby-middleware-naming)。
+ `plugins` - 使用[插件](#xray-sdk-ruby-configuration-plugins)记录有关应用程序的 Amazon 资源的信息。
+ `sampling` 设置为 `false` 可禁用采样。
+ `sampling_rules` - 设置包含您的[采样规则](#xray-sdk-ruby-configuration-sampling)的哈希。

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

```
require 'aws-xray-sdk'
config = {
  context_missing: 'LOG_ERROR'
}

XRay.recorder.configure(config)
```

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


如果您使用的是 Rails 框架，则可在 `app_root/initializers` 下的 Ruby 文件中配置全局记录器的选项。X-Ray 开发工具包支持对 Rails 使用其他配置键。
+ `active_record` - 设置为 `true` 可记录 Active Record 数据库事务的子分段。

在名为 `Rails.application.config.xray` 的配置对象中配置可用设置。

**Example config/initializers/aws\$1xray.rb**  

```
Rails.application.config.xray = {
  name: 'my app',
  patch: %I[net_http aws_sdk],
  active_record: true
}
```

## 环境变量


您可以使用环境变量来配置 Ruby 的 X-Ray 开发工具包。开发工具包支持以下变量：
+ `AWS_XRAY_TRACING_NAME` - 设置 SDK 用于进行分段的服务名称。覆盖您根据 servlet 筛选器的[分段命名策略](xray-sdk-ruby-middleware.md#xray-sdk-ruby-middleware-naming)设置的服务名称。
+ `AWS_XRAY_DAEMON_ADDRESS` - 设置 X-Ray 进程守护程序侦听器的主机和端口。默认情况下，开发工具包会将跟踪数据发送到 `127.0.0.1:2000`。如果您已将进程守护程序配置为[侦听不同端口](xray-daemon-configuration.md)或者进程守护程序在另一台主机上运行，则使用此变量。
+ `AWS_XRAY_CONTEXT_MISSING` - 设置为 `RUNTIME_ERROR` 会在您的已检测代码尝试在分段未打开的情况下记录数据时引发异常。

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

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

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