초보자를 위한 OpenTelemetry 소개
원격 측정 데이터를 수집하는 데 있어 벤더 중립적인 표준 방식인 OpenTelemetry에 대해 심도 있게 논의해 보겠습니다.
애플리케이션의 가시성을 높이는 것은 모든 개발자에게 중요한 과제입니다. 이는 애플리케이션에서 생성되는 원격 측정 데이터를 정확하게 캡처해야 하기 때문입니다. 캠브리지 사전에서는 원격 측정을 "멀리 떨어진 물체에 대한 정보를 수집하고 그 정보를 전자적으로 전송하는 과정"이라고 정의합니다.
예를 들어, 웹사이트에서 사용자가 한 번 클릭하거나 세션을 시작하는 경우, 수많은 요청이 발생하고 네트워크, 마이크로서비스, 데이터베이스 등을 거치는 흐름이 생성됩니다. 이러한 흐름을 추적하는 것이 중요합니다.
OpenTelemetry는 서로 결합하거나 개별적으로 사용할 수 있는 잘 구성된 구성 요소들의 집합체로, 관측 가능성을 위한 플랫폼을 제공합니다. 오늘날 널리 사용되는 프레임워크와 라이브러리 개발자들은 이제 원격 측정 데이터를 이러한 라이브러리와 프레임워크 내에 통합하는 표준화된 방식을 사용함으로써, 최종 사용자에게 프레임워크가 내부적으로 수행하는 작업에 대한 심층적인 통찰력을 즉시 제공할 수 있게 되었습니다.
OpenTelemetry를 제대로 이해하기 위해서는 먼저 분산 추적이라는 개념에 대한 이해가 선행되어야 합니다.
분산 추적이란 무엇인가?
애플리케이션이 점차 복잡해지고, 사용자 트래픽 처리 및 트랜잭션 완료에 더 많은 서비스들이 관여하게 되면서, 요청이 여러 서비스를 통과하는 방식과 각 서비스가 전체 지연 시간에 미치는 영향을 파악하는 것이 갈수록 중요해지고 있습니다. 바로 이것이 분산 추적이 담당하는 역할입니다. 분산 추적은 사용자 요청의 지연 시간과 요청 경로에 있는 각 마이크로서비스가 응답을 반환하는 데 걸리는 시간을 정확하게 기록합니다.
사용자 요청이 시스템에 들어오면 시스템은 해당 사용자 요청에 응답하는 방식을 상세히 설명하는 전체적인 정보, 즉 추적을 생성하려고 시도합니다. 이 추적은 스팬들로 구성되며, 각 스팬은 사용자 요청을 처리하는 데 관련된 특정 요청과 응답 쌍을 나타냅니다. 최상위 스팬은 최종 사용자가 경험하는 지연 시간을 보여주며, 하위 스팬은 분산 시스템 내의 특정 서비스가 호출되고 응답을 반환하는 데 걸린 시간과 같은 세부 정보를 파악하는 데 활용됩니다.
OpenTelemetry란 무엇인가?

OpenTelemetry는 CNCF에서 호스팅하는 오픈 소스 프로젝트로, 원격 측정 데이터를 생성하는 표준화된 방법을 제공합니다. 이 프로젝트는 OpenTracing (추적 데이터 생성 표준)과 OpenCensus (메트릭 데이터 생성 표준)가 통합되어 탄생했습니다.
OpenTelemetry는 애플리케이션에서 분산 추적 및 메트릭을 캡처하기 위한 API, 에이전트, 수집기 서비스 및 라이브러리 등을 통합적으로 제공합니다. OpenTelemetry는 원격 측정 데이터를 수집하고 사용자가 선택한 백엔드로 전송하는 방법을 표준화합니다. 이를 통해 벤더에 종속되지 않는 계측 경로를 제공하며, 코드 재계측 없이 백엔드를 유연하게 변경할 수 있습니다.
예를 들어, Datadog과 같은 SaaS 벤더에게 메트릭과 추적을 계속해서 전송하면서 벤더에 구애받지 않는 에이전트를 사용하여 애플리케이션을 계측할 수 있습니다. 만약 나중에 다른 벤더로 전환하고 싶다면 (예: Datadog에서 Dynatrace로) 애플리케이션 코드를 변경하지 않고도 원활하게 전환할 수 있습니다.
OpenTelemetry 프로젝트의 목표는 애플리케이션에서 메트릭 및 분산 추적을 캡처하기 위한 API 라이브러리 및 에이전트의 단일 집합을 제공하는 것입니다. 이는 다양한 언어와 플랫폼에서 적용 가능합니다. 또한 OpenTelemetry 프로젝트에는 선택적으로 사용할 수 있는 수집기 서비스도 포함되어 있으며, 각 기능에 대한 사양을 담은 별도의 저장소를 운영하고 있습니다. OpenTelemetry 자체는 Jaeger나 Prometheus와 같은 관측 가능성 백엔드가 아닙니다. 하지만, 데이터를 오픈 소스 및 상용 백엔드로 내보내는 데 중요한 역할을 합니다.
OpenTelemetry가 제공하는 주요 기능은 다음과 같습니다.
- 원격 측정 데이터 수집에 대한 표준화를 통해 조직이 벤더 간에 쉽게 이동할 수 있습니다.
- 데이터 수집 과정을 위한 벤더 중립적인 개방형 표준 시맨틱 컨벤션
- 다양한 방식으로 배포할 수 있는 에이전트 또는 게이트웨이 역할을 하는 수집기
- 마이그레이션을 위한 여러 컨텍스트 전파 형식 지원
- 원격 측정 데이터의 생성, 방출, 수집, 처리 및 내보내기를 위한 완벽한 엔드 투 엔드 솔루션
- 데이터에 대한 완벽한 제어 권한을 유지하면서 다양한 목적지로 데이터를 전송할 수 있는 기능
OpenTelemetry 구성 요소
OpenTelemetry의 핵심 구성 요소는 다음과 같습니다.
- Proto: OpenTelemetry를 위한 언어 독립적 인터페이스 타입으로, 수집기, 계측 라이브러리 등을 정의하는 데 사용됩니다.
- 수집기: 원격 측정 데이터를 수신, 처리 및 내보내는 데 사용됩니다. 수집기 구현은 특정 벤더에 종속되지 않아야 합니다. 기본적으로 모든 원격 측정 데이터는 이 수집기의 계측 라이브러리에서 내보내집니다.
- 사양: API, SDK 및 데이터로 구성되며, 다양한 언어로 구현하기 위한 요구사항과 기대치를 정의합니다. API는 SDK에서 제공하는 API를 구현하기 위한 원격 측정 데이터 생성, 처리 및 내보내기 기능을 제공합니다. 데이터에는 코드를 변경하지 않고 모든 벤더를 지원하는 시맨틱 규칙이 포함되어 있습니다.
- 계측 라이브러리: OpenTelemetry 프로젝트의 일환으로 다양한 언어로 제공됩니다. 이러한 라이브러리는 OpenTelemetry API를 호출하여 모든 애플리케이션에 대한 관측 가능성을 확보하고, 다른 라이브러리에 관측 가능성을 제공하는 데 사용됩니다.
OpenTelemetry 아키텍처
New Relic에서 제공한 이미지
OpenTelemetry는 크게 세 가지 주요 부분으로 구성됩니다.
- 애플리케이션, 라이브러리 및 프레임워크를 계측하기 위한 일련의 API
- API를 구현하는 SDK
- 필요에 따라 원격 측정 데이터를 수집, 집계 및 내보낼 수 있는 선택적 수집기
API의 주요 목적은 라이브러리 및 애플리케이션 코드에 대한 계측 기능을 제공하는 것입니다. API에는 추적, 미터, 공유 컨텍스트, 시맨틱 규칙의 네 가지 주요 영역이 있습니다.
- Tracer API는 스팬 생성, 주석 추가 및 완료를 지원합니다.
- 미터 API는 다양한 메트릭 도구로 구성되어 있습니다. 예시로 관찰자, 값 기록기, 카운터 등이 있습니다.
- 컨텍스트 API는 스팬 컨텍스트를 추적 및 실행하고, 시스템 내부 및 외부로 해당 컨텍스트를 전파하는 기능을 제공합니다.
- 시맨틱 규칙은 주로 스팬, 속성, 레이블 및 메트릭 기기의 이름 지정에 관한 모든 지침 및 규칙을 포함합니다. 이러한 규칙은 다양한 언어 구현과 외부 계측에서 일관성을 유지하기 위해 적용됩니다.
공유 컨텍스트에서 컨텍스트 구현은 추적자와 측정기 사이에 위치하며, 관찰자를 제외한 모든 메트릭 기록이 실행 범위 컨텍스트에서 이루어지도록 합니다. 이러한 기능을 통해 SDK는 메트릭 값에 대한 최적의 범위를 캡처할 수 있습니다. 또한, 시스템 내부 및 외부로 스팬 컨텍스트를 전파하는 기능을 제공하여 진정한 분산 추적이 가능하도록 하며, 사용자는 필요에 따라 컨텍스트를 맞춤 설정할 수도 있습니다.
수집기는 OpenTelemetry 아키텍처의 필수 구성 요소입니다. 이 독립 실행형 서비스는 OpenCensus, Zipkin, Jaeger 및 OpenTelemetry 프로토콜을 포함한 다양한 소스에서 원격 측정 데이터를 수신, 처리 및 내보낼 수 있습니다. 수집기를 사용하면 스팬 및 메트릭을 다양한 벤더 및 오픈 소스 원격 측정 시스템으로 내보낼 수 있습니다.
OpenTelemetry 아키텍처는 즉시 사용 가능한 완벽한 원격 측정 솔루션을 제공합니다. 또한 필요에 따라 다양한 확장점을 활용하여 사용자 정의 기능을 구현할 수 있습니다.
OpenTelemetry는 어떻게 작동하는가?
배포 환경의 모든 서비스 내부에 OpenTelemetry 클라이언트를 설치해야 합니다. 이 클라이언트는 SDK 역할을 하며, SDK 내에는 API가 포함되어 있습니다. 애플리케이션 프레임워크 및 라이브러리는 이 계측 API를 사용하여 수행 중인 작업을 설명합니다. 그 다음, SDK는 수집된 관측 데이터를 Collector라는 데이터 파이프라인 서비스로 내보냅니다.
OpenTelemetry는 OTLP라는 자체 데이터 프로토콜을 사용하지만, 수집기는 OTLP를 Zipkin, Jaeger, Prometheus와 같은 다양한 형식으로 변환할 수 있습니다. 특히, OpenTelemetry는 자체 백엔드 또는 분석 도구를 제공하지 않습니다. 이는 OpenTelemetry의 핵심 목표가 표준화에 있기 때문입니다. OpenTelemetry의 목표는 클라우드 환경에서 컴퓨터의 작동을 설명하기 위한 범용 언어를 제시하는 것입니다. 데이터를 분석하는 방법을 표준화하는 것이 아니라, OpenTelemetry가 원격 측정 소프트웨어의 전체 생태계를 재구축하지 않고도 새로운 분석 도구를 빠르게 도입할 수 있도록 지원함으로써 관측 가능성 영역을 발전시키는 데 기여하는 것입니다.
시스템을 통해 대량의 데이터를 전송할 때는 여러 요소를 고려해야 합니다. 다행히도 OpenTelemetry는 이러한 모든 측면을 고려하고 있으며, 각 문제에 대한 해결책을 제시하고 있습니다. 무엇보다도 OpenTelemetry는 매우 유연하며 다양한 컨텍스트 전파 형식을 처리할 수 있습니다. 이는 표준이 존재하더라도 그 표준 내에서 다양한 선택의 여지가 있다는 것을 의미합니다. 예를 들어, w3c 추적 컨텍스트 형식 또는 b3 전파와 같은 것을 사용하는 경우, 서비스들이 상호 연결될 수 있도록 하는 표준 내의 또 다른 표준을 의미합니다.
결론
OpenTelemetry는 다양한 관측 데이터를 비롯해 분산 추적 메트릭 및 시스템 리소스를 효과적으로 수집합니다. 중요한 점은, OpenTelemetry는 이러한 신호들을 독립적으로 처리하지 않고, 하나의 묶음으로 통합하여 백엔드에서 모든 신호들을 집계하고 상호 참조할 수 있도록 인덱스 및 컨텍스트를 제공합니다.
데이터 수집 기능 외에도 OpenTelemetry는 데이터 형식을 변환하고 데이터를 조작할 수 있는 데이터 처리 및 파이프라인 기능과, 최신 시스템에서 강력한 원격 분석 파이프라인을 구축하는 데 필요한 다양한 도구를 제공합니다.
이것으로 OpenTelemetry에 대한 논의를 마칩니다. 이 도구를 직접 사용해 보시고 많은 것을 경험해 보시기를 바랍니다.