Distributed System, Micro Service가 난무하는 세상에서 시스템의 동작을 확인하거나 에러를 추적하는 일은 너무 힘들어졌습니다. 이런 환경에서 여러 서비스가 공통된 형식의 data를 보내고 이를 연결지어 시스템을 분석해야할 일이 많아졌습니다.
Opentelemetry (이하 otel)는 최신 소프트웨어 트렌드에서 Observability를 증대시키기위해 만들어진 프레임워크 입니다. API 및 컨벤션, 툴킷등을 제공합니다.
근데 그냥 서비스 하나여도 로그 보기 좀 편한것 같고, 설정도 크게 어렵지 않아서 (이상한 짓만 안한다면...) 도입해보는 것도 나쁘지 않다.
otel을 이해하기 위해서는 Observability를 알아야합니다.
명확하게 정의하기는 애매하지만 '왜 이런일이 일어난거야?'에 대한 답을 낼 수 있는 능력이라고 정의할 수 있을 것 같습니다.
그렇기 위해서는 프로그램이 'well instrumented'되어 있어야합니다.
Opentelementry를 구현하다보면 많이 만나게 되는 표현입니다. 한국어로는 '계측'이라는 뜻인데 이것저것 잘 측정해서 기록해둔다라고 생각하면 될것 같습니다.
계측하는 것들은 예를 들어 여러 Signal(Telemetry Data라고도 함)들이 있을건데 Logs, Traces, Metrics 들이 이 시그널에 속합니다. (이 시그널들은 이따 또 등장할 것임)
Otel은 Vendor- and tool-agnostic 하여, 광범위하게 사용할 수 있습니다. Observability backends 로 뭘써야한다 강제되지 않습니다. Otel 규격을 만족하는 오픈 소스들을 쓰면 됩니다.
Otel을 사용하기 위해, 조금(?)의 개념과 API등 을 배우면 됩니다.
Otel을 구성하는 요소들을 익혀둘 필요가 있습니다.
Distributed tracing
Log, Span, Trace
Context propagation
Signals
Collector
Distributed System에서 리퀘스트 요청시에 벌어지는 일을 추적하는 것 입니다. Otel이 중요하게 다루는 것 입니다. Distributed System이란 하나의 요청이 A service, B service, C service를 통해 완수되는 시스템을 말합니다.
Log는 우리가 코딩하면서 항상 찍는 그 로그와 같습니다. Timestamp가 있어서 해당 시각에 적힙니다. 시스템의 행동을 해석하는데 많은 도움을 줍니다.
하지만 로그 그자체로 코드를 파악하는데는 어려움이 있습니다. 좀 더 맥락적인 정보가 포함되어야할 필요가 있습니다. Log는 Span이나 Trace와 연관되어야 좀 더 유용합니다.
Span은 동작의 단위입니다. 특정 동작의 이름, 시간 관련된 데이터, span에 포함된 log들 span attribute 라 불리는 특성들을 가집니다.
예를 들어 http.request.method, url.path 같은 특성들을 가집니다.
어떤 Request의 시작부터 완료까지를 Trace라고 합니다. 이 Trace에는 하나의 시스템이 아니라 여러개의 시스템의 Span이 포함될 수 있습니다.
가장 첫 Span을 Root Span 이라고 합니다.
보통 Waterfall diagram으로 묘사합니다.
컨텍스트 정보를 계속 전파해서, 연관된 Signal들끼리 그리고 Trace끼리 연결될 수 있도록 합니다.
Propagation은 이 컨텍스트 정보 Object를 serialize, deserializes하면서 서비스와 프로세스 사이를 넘나들도록 합니다. 보통의 경우 W3C TraceContext Propagator를 사용합니다.
시그널은 Otel의 수집 요소입니다. 총 4개로 Log, Metric, Trace, Baggage가 있습니다.
위에서 언급한 그 로그 입니다. 특정 시간에 찍힌 메세지를 담고 있습니다.
서비스에서 측정해야할 수치들을 측정하기위한 데이터 입니다. 예를 들어 뭐가 몇번 불렸는지, 큐가 얼만큼 찼는지 등의 수치들을 측정하기 위해 기록해야할 것들 입니다.
위에서 언급한 Trace와 같습니다.
Key value store로 컨택스트와 같이 Propagation되는 정보입니다. 주로 User ID 같은 Additional 정보를 저장합니다.
Opentelemetry Collector라고 합니다. Collector는 어플리케이션으로 부터 telemetry data를 받고, 프로세싱하고, telemetry 저장소로 내보내는 역할을 합니다.
Collector 없이 직접 어플리케이션에서 저장소로 telemetry 데이터를 쏴도 상관없지만, collector 하나 띄워 놓고 telemetry data의 처리는 collector에게 맡겨두고, 어플리케이션은 제 할일 하는 것이 좋습니다.
configuration도 다양하게 할 수 있고 collector에서 span tail filtering등을 할 수 있는 등 collector를 쓰면 이점이 많습니다.
위 내용은 Opentelemetry의 기본 개념의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!