Show GN: Odigos (YC W23) – Kubernetes 클러스터에 대한 즉각적인 분산 추적
(github.com/keyval-dev)안녕하세요. Odigos(https://github.com/keyval-dev/odigos) 공동 설립자 Eden과 Ari입니다. Odigos는 애플리케이션에 대한 분산 트레이스(distributed trace)을 즉시 생성하여 사용자가 쉽게 활용할 수 있도록 지원하는 오픈소스 프로젝트입니다. Odigos는 기존 모니터링 도구와 호환되며, 소스코드의 변경도 필요가 없습니다.
예전 모니터링 도구에 대한 경험은 매우 아쉬웠습니다. 우리는 여러 마이크로서비스가 포함된 분산 시스템을 모니터링하는 과정에서, 문제의 근원이 되는 마이크로서비스를 특정하는 데 너무 많은 시간을 소비하고 있음을 알게 되었습니다. 예를 들면, 우리는 특정 애플리케이션이 지연을 유발하는 것으로 의심하고 디버깅하는 데 몇 시간을 보낸 적이 있었는데, 결국 문제의 원인이 다른 연관 애플리케이션에 있음을 뒤늦게 파악하게 되었습니다.
이후, 우리는 이러한 문제 해결에 적합한 분산 추적(distributed tracing)에 대해 연구하였습니다. 단일 애플리케이션에서 특정 시점의 데이터를 캡처하는 메트릭 또는 로그와 달리, 분산 추적은 요청 별로 고유 ID로 태그를 지정하여 분산 환경 내에서 전파된 요청을 추적할 수 있게 합니다. 이를 통해 개발자는 각 요청의 컨텍스트(context)와 분산 애플리케이션들의 동작 방식을 이해할 수 있습니다.
다만, 이러한 방식은 구현하기 어렵다는 단점이 있습니다. 단일 애플리케이션을 위한 메트릭이나 로그와 달리 분산 추적은 여러 애플리케이션에 걸쳐 구현되어야만 달성할 수 있습니다. 애플리케이션 중 분산 트레이스를 생성하지 않는 애플리케이션이 하나라도 있으면 컨텍스트의 전파가 중단되고 해당 트레이스의 가치는 크게 떨어집니다.
여러 기업을 위해 분산 추적을 손수 구현해 본 경험에 따르면, 완전한 분산 추적을 달성하기 위해 모든 개발 팀이 각 애플리케이션을 계측하도록 조정하는 것은 매우 어려운 일입니다. 구현이 완료되면 프로덕션 문제를 훨씬 빠르게 해결할 수 있었으므로 가치가 높았습니다. 그러나, 부분적인 구현은 그다지 가치 있지 않았습니다.
우리는 이 프로세스를 자동화하기 시작했습니다. 우리는 프로세스의 대부분에 대해 처리 방법을 알고 있었지만 가장 까다로운 부분은 (Go와 같이) 컴파일된 언어로 작성된 프로그램을 자동으로 계측하는 방법이었습니다. 그 부분만 자동화할 수 있다면 분산 트레이스를 생성하는 전체 프로세스 자동화가 가능할 것이라고 생각하였습니다. 연구 과정에서 우리는 eBPF(Linux 커널이 외부 프로그램을 로드하여 커널 내에서 실행 가능하도록 하는 기술)를 사용하면, 컴파일된 언어에 대한 자동 계측이 가능함을 깨달았습니다. 그것이 퍼즐의 마지막 조각이었고, 그것으로 우리는 Odigos를 개발할 수 있었습니다.
Odigos는 먼저 실행 중인 모든 애플리케이션을 스캔하고 eBPF 및 OpenTelemetry를 사용하여 각 애플리케이션의 프로그래밍 언어를 인식하고 그에 따라 자동 계측합니다. 또한 데이터를 버퍼링, 필터링 및 선택한 모니터링 도구로 전달하는 수집기들을 배포하고, 트래픽 양에 따라 오토스케일(auto scale) 합니다. 이러한 자동화를 통해 개발자는 구현에 몇 달이 걸릴 수 있는 수동 작업과 달리 단 몇 분 내에 분산 추적을 활용할 수 있습니다.
다양한 프로그래밍 언어 간의 자동 계측은 특히 정적 바이너리(예: Go 컴파일러에서 생성된 바이너리)를 고려하면 간단한 작업이 아닙니다. 우리는 관련 헤더를 안전하고 안정적인 방식으로 삽입할 수 있도록 다양한 메커니즘을 도입하였고, 다양한 버전의 오픈소스 라이브러리 기능과 구조체를 추적하는 시스템을 개발했습니다. 또한 eBPF에서 사용자 공간(userspace) 메모리 관리를 수행하는 시스템을 개발했습니다. 결과적으로 Odigos는 Go 및 Rust와 같은 컴파일된 언어에 대한 분산 트레이스를 자동으로 생성할 수 있는 유일한 솔루션이 되었습니다. 다른 솔루션은 사용자가 OpenTelemetry 또는 eBPF의 전문가가 되어야 하는 반면, 우리 솔루션은 관찰 가능성(observability) 기술에 대한 사전 지식이 필요 없습니다.
우리의 솔루션은 단일 명령으로 쿠버네티스 클러스터에 설치할 수 있습니다. 일단 설치되면 실행 중인 모든 애플리케이션의 프로그래밍 언어를 감지하고 적합한 계측기를 적용합니다. JIT 언어(Java 및 .NET) 또는 인터프리트 언어(JavaScript 및 Python)의 경우 OpenTelemetry 계측기를 배포합니다. 컴파일된 언어(Go, Rust, C)에는 eBPF 기반 계측기를 배포합니다. 이 모든 것은 사용자에게 추상화되어 있으므로, 사용자는 (1) 대상 애플리케이션 중 일부 또는 전부를 선택하고, (2) 모니터링 데이터를 보낼 백엔드를 선택하기만 하면 됩니다.
2022년 5월, 우리는 eBPF를 기반으로 하는 Go 애플리케이션용 자동 계측기라는 첫 번째 오픈소스 프로젝트를 릴리스했습니다. 이후, 이 프로젝트를 OpenTelemetry 커뮤니티에 기부했으며 현재 Go Automatic Instrumentation SIG의 일부로 개발되고 있습니다.
우리는 개방형 표준을 굳게 믿고 있으므로 Odigos에서 사용하는 계측 및 수집기는 모두 OpenTelemetry 커뮤니티에서 개발한 오픈소스 프로젝트를 기반으로 합니다. 이를 통해 특정 벤더에 구애받지 않을 수 있습니다.
현재 우리는 오픈소스 프로젝트를 구축하는 데 집중하고 있습니다. 아직 책정된 가격이나 유료 기능은 없지만 향후 엔터프라이즈 기능을 포함하는 Odigos의 관리형 버전도 제공할 계획입니다.
더 자세한 정보는 아래에서 확인 가능합니다.
- 문서: https://docs.odigos.io
- 비디오(시연): https://www.youtube.com/watch?v=9d36AmVtuGU
- 홈페이지: https://odigos.io
분산 애플리케이션 추적 및 모니터링에 대한 여러분의 경험과 다양한 이야기를 듣고 함께 공유하고 싶습니다!
안녕하세요, 이곳에 글을 올리는 것은 이번이 처음입니다. 우리는 커뮤니티로부터 피드백을 받고 싶습니다. Slack 채널에 자유롭게 참여하세요.
https://join.slack.com/t/odigos/…
감사합니다!