メールサービス

このサービスは、注文が行われたときにユーザーに確認メールを送信します。

メールサービスのソースコード

トレースの初期化

コアの OpenTelemetry SDK とエクスポーターの Ruby gem、および自動計装ライブラリに必要な gem(例: Sinatra)を require する必要があります。

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

トレース

自動計装されたスパンへの属性の追加

自動計装されたコードの実行中に、コンテキストから現在のスパンを取得できます。

current_span = OpenTelemetry::Trace.current_span

スパンオブジェクトの add_attributes を使用して、スパンに複数の属性を追加できます。

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

スパンオブジェクトの set_attribute を使用して、単一の属性のみを追加することもできます。

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

新しいスパンの作成

OpenTelemetry の Tracer オブジェクトの in_span を使用して、新しいスパンを作成しアクティブなコンテキストに配置できます。 do..end ブロックと組み合わせて使用すると、ブロックの実行が終了したときにスパンは自動的に終了します。

tracer = OpenTelemetry.tracer_provider.tracer('email')
tracer.in_span("send_email") do |span|
  # スパンのコンテキスト内のロジックをここに記述
end

メトリクス

メトリクスの初期化

OpenTelemetry メトリクス SDK と OTLP メトリクスエクスポーターは、email_server.rb ファイルのルートレベルで初期化されます。 アクセスするには、まず require 文が必要です。

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

Ruby SDK は OpenTelemetry 標準の環境変数を使用して、OTLP エクスポート、リソース属性、サービス名を自動的に設定します。 OpenTelemetry メトリクス SDK を初期化する際に、メータープロバイダーとメトリクスリーダーも設定する必要があります。

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

メータープロバイダーを使用してメーターにアクセスでき、これを使ってグローバルなメトリクス(例: counter)を作成できます。

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

カスタムメトリクス

現在、以下のカスタムメトリクスが利用可能です。

  • app.confirmation.counter: 送信された注文確認メールの累積カウント

ログ

ログの初期化

OpenTelemetry ログ SDK と OTLP ログエクスポーターは、email_server.rb ファイルのルートレベルで初期化されます。 アクセスするには、まず require 文が必要です。

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

Ruby SDK は OpenTelemetry 標準の環境変数を使用して、OTLP エクスポート、リソース属性、サービス名を自動的に設定します。 OpenTelemetry ログ SDK を初期化する際に、グローバルなロガーを作成するためにロガープロバイダーが必要です。

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

構造化ログの出力

ロガーの 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 }
)