Repository navigation
feat(ai): trace_context 구현 — 문서에만 있던 함수를 실제로 만든다 - #263
Merged
Merged
Conversation
#262 로 Core 쪽 추적을 고치고 "AI 서버 로그에는 아직 traceId 가 없다" 를 남은 과제로 적어 뒀는데, 그 이유가 따로 있었다. ai/CLAUDE.md 는 컨슈머 패턴으로 이렇게 안내해 왔다: with trace_context(envelope.trace_id): await resume_analyzer.handle(envelope.payload) **그런데 trace_context 가 존재한 적이 없다.** 문서를 따라 쓰면 ImportError 가 나고, 실제 컨슈머들은 traceId 를 로그에 전혀 싣지 않았다. 오늘만 세 번째다 — infra/backup/README 의 Discord 알림(#260), Core 의 "동일 traceId 전파"(#262), 그리고 이것. 문서가 주장하는 동작은 grep 으로 확인해야 한다. ## 구현 observability/trace.py. structlog 기본 프로세서 체인의 첫 번째가 merge_contextvars 인 것을 실측으로 확인하고 그 위에 올렸다: 기본 프로세서: ['merge_contextvars', 'add_log_level', 'StackInfoRenderer', 'set_exc_info', 'TimeStamper', ...] 한 번 묶으면 그 구간의 **모든 로그 줄에 자동으로** 실린다 — 호출부마다 인자로 넘길 필요가 없다. 적용 지점 3곳: consume_with_failure_signal(생성·분석 컨슈머 공통) + voice/tts(직접-발행 모델). 비어 있으면 새로 만든다. 끝나면 반드시 되돌린다 — 워커 태스크가 재사용되면 남은 값이 다음 메시지 로그에 묻는다. ## 테스트 "바인딩했다"가 아니라 **"출력에 나온다"** 를 본다. Core 에서 겪은 함정이 정확히 그거였다 — MDC 는 채우는데 로그 패턴이 참조하지 않아 아무 데도 안 나왔다. trace_id 가 실제 로그 엔트리에 실린다 / 빠져나오면 지워진다 비어 있으면 생성하고 서로 다르다 예외로 빠져나와도 지워진다(컨슈머는 예외를 다시 던져 DLQ 로 보낸다) **동시 메시지 3건이 서로의 traceId 를 오염시키지 않는다** — 추적이 틀린 것은 없는 것보다 나쁘다 AI 전체 422건 통과.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
#262 에서 Core 추적을 고치고 "AI 서버 로그에는 아직 traceId 가 없다" 를 남은 과제로 적었다.
그런데 이유가 따로 있었다.
ai/CLAUDE.md가 없는 함수를 패턴으로 제시하고 있었다문서를 따라 쓰면
ImportError가 나고, 실제 컨슈머들은 traceId 를 로그에 전혀 싣지 않았다.오늘만 세 번째다 —
infra/backup/README의 Discord 알림(#260), Core 의 "모든 후속 처리에동일 traceId 전파"(#262), 그리고 이것.
구현 — 추측 대신 실측 위에
structlog 기본 프로세서 체인을 먼저 확인했다:
merge_contextvars가 첫 번째라서, 한 번 묶으면 그 구간의 모든 로그 줄에 자동으로실린다 — 호출부마다 인자로 넘길 필요가 없다.
적용 지점 3곳:
consume_with_failure_signal(생성·분석 컨슈머 공통) +voice/tts(직접-발행 모델).테스트 — "바인딩했다"가 아니라 "출력에 나온다"
Core 에서 겪은 함정이 정확히 그거였다: MDC 는 채우는데 로그 패턴이 참조하지 않아 운영 로그
어디에도 traceId 가 없었다. 그래서 여기서는 실제 로그 엔트리를 캡처해서 검증한다.
trace_id가 로그 엔트리에 실린다 / 빠져나오면 사라진다AI 전체 422건 통과, black·flake8 clean.
배포 후 확인할 것
실제 면접이 한 번 돌면 AI 로그가 이렇게 나와야 한다:
그리고 그
trace_id로 Core 로그([3f2a…])와 같은 요청이 이어지는지 확인할 수 있다 —#262 의 큐 전파 수정과 합쳐져야 Core→AI 상관이 처음으로 성립한다.
남은 것
uvicorn 액세스 로그(
GET /health)에는 여전히 traceId 가 없다. 요청 단위 미들웨어는 미도입이고,AI 서버는 내부 통신 전용이라 우선순위가 낮다. 문서에 남겼다.