[BE-03] Kafka observation 계측 — Producer↔Consumer trace 전파
작업 내용 (설계 의도)
근거 TDD: ../TDD.md “실패 경로 — trace 연결 끊김(Kafka 경계)”, ADR-001.
변경 사항
Kafka 경계에서 trace가 끊기지 않도록 observation을 활성화한다. HTTP·JDBC는 Micrometer가 자동 전파하나, Kafka는 옵션이 꺼져 있으면 Producer span과 Consumer span이 별개 trace로 분리된다. NotificationEventWorker가 payment.completed.v1·booking.confirmed.v1을 소비하므로, 결제→알림 흐름이 하나의 trace로 이어져야 병목 식별(User Scenario 1)이 성립한다.
KafkaConsumerConfig.kt#kafkaListenerContainerFactory:factory.containerProperties.isObservationEnabled = trueKafkaProducerConfig.kt:KafkaTemplate에setObservationEnabled(true)(또는 빈 설정 시 observation 활성)
trace 전파 헤더(W3C traceparent)가 Kafka 레코드 헤더로 자동 주입·추출된다. 파일 소유는 두 Kafka config 파일 — BE-02(yml)·BE-04(logback/executor)와 교집합 없음.
의존
- BE-01 (micrometer-tracing 클래스패스 필요)
다이어그램
처리 흐름
sequenceDiagram participant P as Payment (Producer) participant K as Kafka participant W as NotificationEventWorker P->>K: publish (traceparent 헤더 주입) K->>W: consume (traceparent 추출) Note over P,W: 단일 trace_id 유지
클래스 의존
flowchart LR KC["KafkaConsumerConfig"] --> CF["ContainerProperties.observationEnabled"] KP["KafkaProducerConfig"] --> KT["KafkaTemplate.observationEnabled"]
테스트 케이스
- Producer로 발행한 레코드가 W3C
traceparent헤더를 포함한다(Testcontainers Kafka). - Consumer가 소비한 span의 trace_id가 Producer span의 trace_id와 동일하다(단일 trace 연결).
isObservationEnabled=false로 되돌리면 Producer/Consumer trace_id가 분리된다(회귀 검증).- observation 활성 후에도 기존 메시지 소비 동작(역직렬화·핸들러 호출)이 변하지 않는다.