요약
SUMMARY
Spring Boot 앱의 trace·메트릭을 관측 스택으로 보내려면 원래 MDC·Micrometer Tracing 같은 라이브러리를 붙이고 설정해야 하는 줄 알았다. 그런데 OpenTelemetry javaagent를 실행 옵션으로 등록만 하면, 코드를 한 줄도 안 건드리고 HTTP·JDBC·gRPC trace와 JVM 메트릭이 자동으로 잡혀 OTLP로 otel-collector에 실려 간다. collector가 그걸 SigNoz(ClickHouse)로 넘긴다.
계측을 앱 코드가 아니라 실행 시점 에이전트가 대신 하니, 서비스마다 코드를 고칠 필요가 없다.
1. OpenTelemetry javaagent만 붙이면 된다
처음엔 trace_id·span_id를 로그에 넣으려면 MDC나 Micrometer Tracing 같은 라이브러리를 추가하고 설정을 손봐야 한다는 글이 많아 부담이었다. 실제로 해보니 javaagent 등록 한 번이면 끝이었다.
-javaagent:/opentelemetry-javaagent.jar
-Dotel.resource.attributes=service.name=test-api
-Dotel.traces.exporter=otlp
-Dotel.exporter.otlp.endpoint=http://otel-collector-opentelemetry-collector.otel-collector.svc:4318javaagent는 바이트코드에 계측을 끼워 넣는 방식이라, 앱 코드 수정이 필요 없다. 붙이는 순간 HTTP 요청, JDBC 쿼리, gRPC 호출 같은 흔한 경로가 자동으로 trace에 잡힌다. service.name으로 서비스를 구분하고, 엔드포인트는 클러스터 안 otel-collector의 OTLP 수신 포트(4318, HTTP)를 가리킨다.
trace_id·span_id는 이 javaagent가 로그 MDC에도 넣어줘서, 로그와 trace를 같은 id로 이어 볼 수 있다. 로그 한 줄에서 그 요청의 전체 trace로 바로 넘어가는 게 이 설정의 실익이다.
2. 메트릭도 같은 에이전트가 가져간다
메트릭도 별도 수집기를 붙이지 않고 같은 javaagent가 처리한다.
- JVM 메모리(heap/non-heap), GC 횟수·시간, 스레드, CPU 사용량을 기본으로 잡아준다.
- 앱이 Micrometer로 커스텀 메트릭을 노출하면 그것도 함께 가져간다.
수집된 메트릭은 trace와 같은 OTLP 경로로 otel-collector에 전송되고, collector가 SigNoz(ClickHouse)로 넘긴다. 결과적으로 trace·메트릭·(id로 묶인) 로그가 한 스택에서 함께 조회된다.