본문 바로가기
DevOps/Observability

MSA 모니터링을 구축해보자 ! - Trace <> Log

by journalctl 2025. 1. 29.

개요

인내심이 매우 짧은편이다..

 

정말 어려웠다. 많은 포스팅을 읽어봤지만 이해되는것 같으면서도 설정하는 부분에서 막혀서 답답해 죽는줄 알았다.


Correlation

Grafana를 통해 설정하기 전 해당 내용을 이해하는 것이 우선이라고 생각했다.

Grafana Correlation - Metric, Trace, Log

  • Metric <> Trace의 관계는 Exemplars를 통하여 생성된 Metric을 기반으로 구성하게 됩니다.
  • Metric <> Log는 Time을 기반으로 생성된 Metric을 기반으로 구성하게 됩니다.
  • Trace <> Log는 TraceID, SpanID을 기반으로 생성된 이벤트를 기반으로 구성하게 됩니다.

각 요소별로 서로 다른 역할을 가지고 있지만 상관관계를 찾아내어 구성하면 어떤 이벤트가 발생했을때 원인을 파악하는데 큰 이점을 가지고 있습니다.

Observability는 다음과 같이 세가지 요소를 달성하여 필요한 답변을 찾아낼 수 있도록 도와주는 역할을 합니다.


Log - Grafana

먼저 Log를 통해서 Trace(Tempo)와 연결지을 수 있도록 설정합니다.

연결짓기 위해 필요한 정보인 TraceID, SpanID를 Log에서 분석합니다.

Json 형식으로 로그를 전달받게 되며, 내부에 “traceid”, “spanid”도 포함되어 있어 해당 내용을 바탕으로 추출합니다.

{
  "body": "10.244.1.8 - - [29/Jan/2025 13:01:54] \"GET /dashboard?user_id=2&order_id=102 HTTP/1.1\" 200 -",
  "traceid": "6e2e7ef9ed625abc2382014ef654ac80",
  "spanid": "70cb220639b32a93",
  "severity": "INFO",
  "flags": 1,
  "attributes": {
    "code.filepath": "/usr/local/lib/python3.9/site-packages/werkzeug/_internal.py",
    "code.function": "_log",
    "code.lineno": 97,
    "otelServiceName": "flask-web",
    "otelSpanID": "70cb220639b32a93",
    "otelTraceID": "6e2e7ef9ed625abc2382014ef654ac80",
    "otelTraceSampled": true
  },
  "resources": {
    "k8s.container.name": "flask-web",
    "k8s.namespace.name": "default",
    "k8s.node.name": "kind-worker",
    "k8s.pod.name": "flask-web",
    "service.instance.id": "default.flask-web.flask-web",
    "service.name": "flask-web",
    "service.version": "web",
    "telemetry.auto.version": "0.50b0",
    "telemetry.sdk.language": "python",
    "telemetry.sdk.name": "opentelemetry",
    "telemetry.sdk.version": "1.29.0"
  },
  "instrumentation_scope": {
    "name": "werkzeug"
  }
}

Grafana Data sources - Loki에서 아래와 같이 설정을 진행합니다.

 

이후 Example Log Message를 통해서 정상적으로 정규표현식을 통해 “trace_id”, “span_id”가 추출되었다면 성공입니다!

Home > Connections > Data sources > Loki > Derived fields

 

Loki에서 로그를 살펴보면 Tempo로 연결될 수 있도록 링크가 자동으로 생성되었습니다.

Home > Explore > Loki


Tempo - Grafana

Tempo에서 해당 Log와 연결짓기 위해서 “TraceID”와 trace span에 속성 중 “service.name”을 사용합니다.

Tags 부분을 설정해서 service.name을 app으로 변경하여 Loki Query로 질의할 수 있도록 설정합니다.

(app으로 질의할 수 있는 이유는 Alloy Collector의 Processor 부분에서 Log의 Label에 “app”을 추가했기 때문입니다!)

이후 Query 부분에는 앞서 설정한 Tags와 trace span 속성에 담겨있는 traceId를 사용하여 검색할 수 있도록 합니다.

Home > Connections > Data sources > tempo

 

설정을 완료하고 확인하면 다음과 같이 나타나게 됩니다!

 

trace를 클릭하여 “Logs for this span” 버튼이 나타나고 클릭하게 되면 해당 로그로 이동하게 됩니다.

Home > Explore > tempo ❘ tempo
Home > Explore > tempo ❘ loki

 


후기

오랜만에 뿌듯하다.

 

제대로 완성되지 않았지만 50% 정도는 완성된 것 같다..

아직 Metric 쪽은 건드리지도 못하고 있어서 하루빨리 공부하고 설정을 완료해봐야겠다 !