이메일 서비스

이 서비스는 주문이 접수되면 사용자에게 확인 이메일을 보낸다.

이메일 서비스 소스

트레이싱 초기화하기

핵심 오픈텔레메트리(OpenTelemetry) SDK와 익스포터 Ruby gem뿐만 아니라, 자동 계측 라이브러리에 필요한 gem(예: Sinatra)도 require로 불러와야 한다.

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

Ruby SDK는 오픈텔레메트리 표준 환경 변수를 사용하여 OTLP 내보내기, 리소스 속성, 서비스 이름을 자동으로 설정한다. 오픈텔레메트리 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)

새 스팬 생성하기

오픈텔레메트리 트레이서 객체의 in_span을 사용하여 새 스팬을 생성하고 활성 컨텍스트에 스팬을 넣을 수 있다. do..end 블록과 함께 사용하면 블록 실행이 끝날 때 스팬이 자동으로 종료된다.

tracer = OpenTelemetry.tracer_provider.tracer('email')
tracer.in_span("send_email") do |span|
  # 스팬 컨텍스트 내에서 실행할 로직
end

메트릭

메트릭 초기화하기

오픈텔레메트리 메트릭 SDK와 OTLP 메트릭 익스포터는 email_server.rb 파일의 최상위 수준에서 초기화한다. 먼저 이들을 사용하기 위한 require 문이 필요하다.

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

Ruby SDK는 오픈텔레메트리 표준 환경 변수를 사용하여 OTLP 내보내기, 리소스 속성, 서비스 이름을 자동으로 설정한다. 오픈텔레메트리 메트릭 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: 전송된 주문 확인 이메일 수의 누적값

로그

로그 초기화하기

오픈텔레메트리 로그 SDK와 OTLP 로그 익스포터는 email_server.rb 파일의 최상위 수준에서 초기화한다. 먼저 이들을 사용하기 위한 require 문이 필요하다.

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

Ruby SDK는 오픈텔레메트리 표준 환경 변수를 사용하여 OTLP 내보내기, 리소스 속성, 서비스 이름을 자동으로 설정한다. 오픈텔레메트리 로그 SDK를 초기화할 때 전역 로거를 생성하려면 로거 프로바이더가 필요하다.

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

구조화된 로그 생성하기

로거의 on_emit 메서드를 사용하여 구조화된 로그를 작성할 수 있다. severity_text(예: INFO, ERROR), 사람이 읽을 수 있는 body, 그리고 추후 로그를 조회할 때 도움이 될 수 있는 app.email.recipient 속성을 포함한다.

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