[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로 분리된다. NotificationEventWorkerpayment.completed.v1·booking.confirmed.v1을 소비하므로, 결제→알림 흐름이 하나의 trace로 이어져야 병목 식별(User Scenario 1)이 성립한다.

  • KafkaConsumerConfig.kt#kafkaListenerContainerFactory: factory.containerProperties.isObservationEnabled = true
  • KafkaProducerConfig.kt: KafkaTemplatesetObservationEnabled(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 활성 후에도 기존 메시지 소비 동작(역직렬화·핸들러 호출)이 변하지 않는다.