관측 가능성
관측 가능성(Observability)은 시스템의 외부 출력에 대한 이해만으로 시스템의 내부 상태를 파악하는 능력을 의미한다. 시스템이 관측 가능하려면 애플리케이션이 트레이스나 메트릭과 같은 신호, 혹은 로그와 같은 출력을 생성해야 한다. 그리고 이 출력을 계측할 수 있어야 한다.
신뢰성과 메트릭
신뢰성(Reliability)은 "서비스가 사용자가 기대하는 대로 동작하는가?"에 대한 답이다. 시스템이 100% 가동 중이더라도 사용자가 “장바구니에 담기” 버튼을 클릭해서 검은색 신발을 장바구니에 담을 때 시스템이 항상 검은색 신발을 담지 않는다면, 그 시스템은 신뢰할 수 없다.
메트릭(Metrics)은 인프라나 애플리케이션에 대한 수치 데이터를 일정 기간동안 집계한 측정값이다. 메트릭이 수집된 시점을 메트릭 이벤트라고 하며, 이벤트에는 메트릭 자체 뿐 아니라 수집 시간과 메타데이터도 포함된다. 예를 들어 시스템 오류율, CPU 사용률, 특정 서비스에 대한 요청률 등이 있다.
SLI(Service Level Indicator, 서비스 수준 지표)는 서비스의 동작을 측정하는 지표다. 좋은 SLI는 사용자 관점에서 서비스의 성능을 측정한다. 웹 페이지의 로딩 속도는 SLI의 한 예다. SLO(Service Level Objective, 서비스 수준 목표)는 조직이나 다른 팀에 신뢰를 전달하는 수단이다. SLO는 하나 이상의 SLI를 비스니스 가치와 연결함으로써 달성할 수 있다.
분산 추적
분산 시스템에서 요청이 전파되는 과정을 관측하려면 분산 추적이 필요하다. 특히 MSA 환경에서는 클라이언트의 요청이 여러 서버를 거치기 때문에 어떤 마이크로서비스에서 무슨 일이 일어나고 있는지 파악하는 것이 중요하다. 특히 로컬에서 재현하기 어려운 분산 시스템에서 분산 추적은 필수적이다.
분산 추적에서 로그(Log)는 서비스 또는 기타 구성 요소에서 생성하는 메시지다. 로그는 클라이언트의 요청이나 트랜잭션과 반드시 연관되는 것은 아니다. 과거에는 개발자와 운영자 모두 시스템을 관측하는 데 로그를 많이 활용해왔다. 그러나 로그에는 맥락 정보가 부족하기 대문에 코드의 실행을 추적하기에는 충분하지 않다. 로그는 트레이스(Trace) 혹은 스팬(Span)과 결합했을 때 훨씬 유용하다.
트레이스는 애플리케이션에 요청이 발생했을 대 일어나는 전체적인 상황을 표현한다. 스팬은 단일 작업 혹은 운영 단위를 표현한다. 스팬은 요청이 수행하는 작업을 추적해 해당 작업이 실행되는 시간 동안 발생한 상황을 보여준다. 트레이스는 하나 이상의 스팬으로 구성된다.
트레이스의 첫 번째 스팬은 루트 스팬이다. 각 루트 스팬은 요청의 시작부터 끝가지의 과정을 나타낸다. 하위 스팬들은 요청 중 발생하는 상황이나 요청을 구성하는 단계에 대해 보다 심층적인 맥락을 제공한다. 예를 들어, 사용자가 웹 페이지를 로드할 때 초기 HTTP 요청은 API 게이트웨이와 백엔드 서비스, 데이터베이스를 거칠 수 있다. 이러한 각 단계는 스팬으로 표현되며, 이들을 모두 합쳐 요청의 전체 과정을 보여주는 단일 트레이스를 구성한다.
트레이스를 사용하면 분산 시스템에서 요청이 한 서비스에서 다른 서비스로 이동하는 과정을 관찰할 수 있다. 하지만 대부분의 요청이 성공적이라면, 시스템을 관측하기 위해 모든 트레이스를 수집할 필요는 없다. 적절한 샘플링만으로도 의미있는 계측이 가능하다.