OpenTelemetry는 애플리케이션의 동작을 이해하는 데 필수적인 세 가지 유형의 시그널을 방출하며, 이들을 서로 연결하여 심층 분석을 용이하게 합니다.
OpenTelemetry 시그널 유형
- 트레이스 (Traces)
- 특정 요청에 대한 애플리케이션의 여정을 시각화하여, 결과를 제공하기 위해 함께 작동하는 모든 구성 요소 및 종속성을 명확하게 보여줍니다.
- Rails에서는 들어오는 요청, 데이터베이스 호출, 응답 렌더링 과정을 시간 순서대로 아름다운 시각 자료로 나타낼 수 있습니다.
- 트레이스를 구성하는 개별 조각들을 스팬(Spans)이라고 합니다.
- 메트릭 (Metrics)
- 나중에 분석하기 위해 특정 시점의 측정값을 캡처합니다.
- 단순한 카운터부터 시간 경과에 따른 값을 추적하는 히스토그램 데이터까지 다양합니다.
- Rails 컨텍스트에서는 200이 아닌 상태 코드를 반환한 횟수 또는 Sidekiq 큐의 특정 시점 크기 등이 예시가 될 수 있습니다.
- 로그 (Logs)
- 일반적인 애플리케이션 로그를 의미하며, OpenTelemetry SDK를 통해 방출될 때 스팬 및 메트릭과 연결되어 컨텍스트 내에서 문제를 쉽게 진단할 수 있도록 합니다.
- OpenTelemetry는 로그가 포맷되어야 하는 구조를 명시합니다.
Ruby 시작하기
Ruby SDK는 Rails, Sidekiq 등 다양한 라이브러리에 대한 자동 계측 기능을 풍부하게 제공하여, 플러그 앤 플레이 방식으로 OpenTelemetry를 시작할 수 있게 합니다.
-
Gemfile 설정:
ruby gem 'opentelemetry-exporter-otlp' gem 'opentelemetry-auto-instrumentation' gem 'opentelemetry-instrumentation-rails' -
초기화 파일 생성: 애플리케이션 부팅 시 OpenTelemetry를 설정하는 초기화 파일을 생성합니다. ```ruby require ‘opentelemetry/sdk’ require ‘opentelemetry/exporter/otlp’ require ‘opentelemetry/instrumentation/all’
OpenTelemetry::SDK.configure do |c|
c.service_name = ‘my-rails-app’
c.use_all # 모든 자동 계측 라이브러리 활성화
end
```
* service_name을 설정하여 시그널의 출처를 식별합니다.
* use_all 메서드는 내성(introspection)을 사용하여 Rails와 같은 특정 계측을 초기화할지 여부를 결정합니다. 이를 통해 초기 요청부터 데이터베이스 호출, 응답 렌더링까지 Rails 앱의 모든 과정에 대한 스팬이 자동으로 방출됩니다.
커스텀 컨텍스트 추가
자동 계측 외에, 모니터링 서비스에서 검사하고 싶은 커스텀 컨텍스트를 트레이스에 추가할 수 있습니다. 예를 들어, 고객 ID를 추가하여 특정 고객이 문제를 보고했을 때 관련 트레이스를 쉽게 추적할 수 있습니다.
```ruby class ApplicationController < ActionController::Base before_action :set_current_user_id
private
def set_current_user_id
span = OpenTelemetry::Trace.current_span
span.set_attribute(‘enduser.id’, current_user.id)
end
end
```
이 코드는 현재 스팬을 가져와 enduser.id라는 새로운 속성을 추가합니다. OpenTelemetry는 정보를 표준적인 방식으로 캡처하기 위한 속성 목록인 Semantic Conventions을 정의하고 있으며, 이를 활용하여 특정 사용자별 트레이스를 쿼리할 수 있습니다.