电子邮件服务

当用户下订单时,此服务将向用户发送一封确认电子邮件。

电子邮件服务源代码

初始化追踪

您需要引入核心 OpenTelemetry SDK 和 exporter Ruby gem,以及任何将用于自动检测库的 gem(例如:Sinatra)

require "opentelemetry/sdk"
require "opentelemetry/exporter/otlp"
require "opentelemetry/instrumentation/sinatra"

Ruby SDK 使用 OpenTelemetry 标准环境变量来自动配置 OTLP 导出、资源属性和服务名称。在初始化 OpenTelemetry SDK 时,您还将指定要利用的自动检测库(例如:Sinatra)

OpenTelemetry::SDK.configure do |c|
  c.use "OpenTelemetry::Instrumentation::Sinatra"
end

追踪

为自动仪表化的 Span 添加属性

在自动仪表化代码的执行过程中,您可以从上下文中获取当前的 Span。

current_span = OpenTelemetry::Trace.current_span

使用 span 对象的 add_attributes 来添加多个属性到 span。

current_span.add_attributes({
  "app.order.id" => data.order.order_id,
})

使用 span 对象的 set_attribute 来添加单个属性。

span.set_attribute("app.email.recipient", data.email)

创建新跨度

可以使用 OpenTelemetry Tracer 对象的 in_span 来创建新 span 并将其放入活动上下文。当与 do..end 块一起使用时,span 将在块执行结束时自动结束。

tracer = OpenTelemetry.tracer_provider.tracer('email')
tracer.in_span("send_email") do |span|
  # logic in context of span here
end

指标

初始化指标

OpenTelemetry Metrics SDK 和 OTLP metrics exporter 在 email_server.rb 文件的根级别进行初始化。首先需要 require 语句来访问它们。

require "opentelemetry-metrics-sdk"
require "opentelemetry-exporter-otlp-metrics"

Ruby SDK 使用 OpenTelemetry 标准环境变量来自动配置 OTLP 导出、资源属性和服务名称。在初始化 OpenTelemetry Metrics SDK 时,您还需要配置一个 meter provider 和一个 metric reader。

otlp_metric_exporter = OpenTelemetry::Exporter::OTLP::Metrics::MetricsExporter.new
OpenTelemetry.meter_provider.add_metric_reader(otlp_metric_exporter)
meter = OpenTelemetry.meter_provider.meter("email")

通过 meter provider,您现在可以访问 meter,该 meter 可用于创建全局指标(例如:counter)。

$confirmation_counter = meter.create_counter("app.confirmation.counter", unit: "1", description: "Counts the number of order confirmation emails sent")

自定义指标

当前可用的自定义指标如下

  • app.confirmation.counter:已发送订单确认电子邮件数量的累计计数

日志

初始化日志

OpenTelemetry Logs SDK 和 OTLP logs exporter 在 email_server.rb 文件的根级别进行初始化。首先需要 require 语句来访问它们。

require "opentelemetry-logs-sdk"
require "opentelemetry-exporter-otlp-logs"

Ruby SDK 使用 OpenTelemetry 标准环境变量来自动配置 OTLP 导出、资源属性和服务名称。在初始化 OpenTelemetry Logs SDK 时,您需要一个 logger provider 来创建一个全局 logger。

$logger = OpenTelemetry.logger_provider.logger(name: "email")

发出结构化日志

您可以使用 logger 的 on_emit 方法来编写结构化日志。包括 severity_text(例如:INFOERROR)、人类可读的 body 以及 app.email.recipient 属性,这些属性可能有助于稍后查询日志。

$logger.on_emit(
  timestamp: Time.now,
  severity_text: "INFO",
  body: "Order confirmation email sent",
  attributes: { "app.email.recipient" => data.email }
)