로그를 디버깅하는 AI를 만들었습니다 — 그리고 그 AI 자체도 디버깅 가능하게 만들었습니다
요약
로그 분석을 수행하는 AI 코파일럿을 구축하고, AI의 동작 과정을 관측 가능하게 만들기 위해 OpenTelemetry와 SigNoz를 통합하는 방법을 다룹니다. AI 호출을 일급 시민으로 취급하여 모델 응답 시간과 속성을 추적하는 엔지니어링 과정을 설명합니다.
핵심 포인트
- 로그 분석 AI의 블랙박스 문제를 해결하기 위해 AI 호출에 계측(instrumentation) 적용
- OpenTelemetry를 사용하여 LLM 호출 과정을 관측 가능한 스팬(span)으로 구현
- Groq의 Llama 3.3 70B 모델을 활용한 근본 원인 및 해결책 분석 기능
- AI 모델 정보와 응답 시간을 커스텀 속성으로 캡처하여 가시성 확보
몇 주 전, 저는 서비스가 왜 계속 503 에러를 내뱉는지 알아내기 위해 벽처럼 쌓인 애플리케이션 로그를 뚫어지게 쳐다보고 있었습니다. 그리고 새벽 1시에 모든 엔지니어가 하는 똑같은 생각을 했습니다. 이 일을 더 빠르게 할 수 있는 방법이 분명히 있을 거야. 그래서 WeMakeDevs의 "Agents of SigNoz" 해커톤을 위해 저는 하나를 만들었습니다. 바로 원시 로그(raw logs)를 읽고 근본 원인(root cause), 심각도(severity), 그리고 해결책(fix)을 알려주는 AI 코파일럿(copilot)입니다. 그 후, 해커톤의 주제가 관측 가능성(observability)이었기에, 저는 거의 건너뛸 뻔했던 일을 실행했습니다. 앱 주변뿐만 아니라 AI 자체에 계측(instrumentation)을 수행한 것입니다.
이 포스트는 그 두 번째 부분, 즉 LLM 호출 주변에 OpenTelemetry와 SigNoz를 실제로 어떻게 연결했는지, 그 과정에서 무엇을 배웠는지, 그리고 어떤 부분에서 번거로웠는지에 관한 것입니다.
제가 실제로 해결하려 했던 문제
[여기에 자신만의 오프닝 디테일을 추가하세요 — 예: 이것을 만들고 싶게 만든 특정 사건, 로그, 또는 순간. 이 부분은 포스트가 일반적이지 않고 실제처럼 느껴지게 만드는 데 가장 중요한 단락입니다. 한두 문장이면 충분합니다.]
AI SRE 코파일럿(Copilot)의 핵심 아이디어는 간단합니다. 애플리케이션 로그를 붙여넣고 "분석(Analyze)"을 누르면, 스택 트레이스(stack traces)를 한 줄씩 수동으로 파싱하는 대신 근본 원인, 심각도 등급, 그리고 구체적인 다음 단계(next steps)를 돌려받는 것입니다. 내부적으로는 로그 텍스트를 Groq의 Llama 3.3 70B 모델로 보내고 응답을 실행 가능한 형태로 포맷팅하는 Streamlit 앱으로 구성되어 있습니다.
그 부분만으로도 충분히 괜찮은 해커톤 프로젝트였을 것입니다. 하지만 어떻게 그 결과에 도달했는지에 대한 가시성(visibility) 없이 답만 주는 AI 도구는 여전히 블랙박스(black box)입니다. 그리고 장애 대응(incident response)을 돕기 위한 도구로서 그것은 문제입니다. 만약 AI가 느리거나, 틀리거나, 특정 로그 형식에서 조용히 실패한다면, 일이 발생하는 순간 터미널을 뚫어지게 쳐다보고 있지 않는 한 알 방법이 없습니다.
따라서 실제 엔지니어링 과제는 다음과 같았습니다: 어떻게 하면 AI 호출 자체를 데이터베이스 쿼리나 제3자 API 호출을 다루는 것과 동일하게, 일급 시민(first-class)이자 관측 가능한 작업(observable operation)으로 만들 수 있을까?
Groq 호출 주변에 OpenTelemetry 연결하기
[ADD: 실제 telemetry.py 설정 — exporter 설정, 사용한 SDK 초기화 코드, 그리고 이를 SigNoz 인스턴스에 어떻게 연결했는지(self-hosted vs SigNoz Cloud, 어떤 OTLP 엔드포인트/포트를 사용했는지)를 추가하세요. 실제 코드 스니펫을 포함하세요 — 이 부분은 독자들이 실제로 복사하고 싶어 할 부분입니다.]
전반적인 형태는 다음과 같습니다: 사용자가 "Analyze Logs"를 클릭할 때마다, 로그 텍스트가 수신되는 순간부터 AI의 응답이 돌아오는 순간까지 전체 요청을 감싸는 스팬 (span)을 시작합니다. 해당 스팬 내부에서 실제 Groq API 호출을 감싸도록 하여, AI의 응답 시간(response time)이 Streamlit/앱 레벨의 오버헤드와 분리되어 측정 가능한 별도의 요소로 캡처되도록 했습니다.
스팬 위에 다음과 같은 일련의 커스텀 속성 (custom attributes)을 부착합니다:
| 속성 (Attribute) | 캡처 내용 |
|---|---|
ai.model | 요청을 처리한 모델 (Llama 3.3 70B) |
| ... | |
[ADD: 이러한 속성들을 설정하는 실제 코드 — 예: span.set_attribute(...) 호출을 추가하세요] |
SigNoz에서 실제로 확인한 것
[ADD A REAL SCREENSHOT: 몇 개의 ai_log_analysis 트레이스 (trace)가 보이는 SigNoz의 트레이스 목록 뷰 스크린샷을 추가하세요]
트레이스 (trace)가 들어오기 시작하자, 여기서부터 흥미로워졌습니다. [ADD: 실제로 관찰한 내용을 설명하세요 — 예: "짧은 로그의 경우 평균 Groq 지연 시간 (latency)이 약 Xms였으나, 입력이 길어지면 눈에 띄게 급증하는 것을 확인했습니다" 또는 "분석 결과가 조용히 잘못된 형식의 응답을 반환한 사례를 발견했는데, UI에서 실패를 확인하기도 전에 analysis.status 속성이 이를 잡아냈습니다." 실제적이고 구체적인 관찰 결과가 바로 해커톤 가이드에서 요구하는 핵심입니다 — 이 부분을 생략하지 마세요.]
[ADD A SECOND SCREENSHOT: 단일 트레이스의 스팬 상세 정보 / 속성 패널 스크린샷을 추가하세요]
솔직히 이 부분이 관측 가능성 (observability) 측면의 가치를 깨닫게 해준 지점이었습니다. 트레이스 속성 (trace attributes)이 없었다면, "내 AI가 실제 장애 상황에서 충분히 빠를까?" 또는 "모델이 지저분한 로그 입력과 깨끗한 로그 입력에 대해 다르게 동작할까?"와 같은 기본적인 질문에 답할 방법이 없었을 것입니다. 그저 직감에 의존해 추측만 했을 것입니다.
나를 당황하게 했던 것
[ADD: 최소 하나 이상의 실제 문제 상황 — 예: 처음에 작동하지 않았던 exporter 설정, 속성 명명(attribute naming) 문제, 지연 시간(latency) 측정 버그, SigNoz 수집(ingestion) 지연 등 실제로 겪었던 문제. 이 섹션은 해커톤 가이드에서 가장 중요하게 여기는 부분입니다 — "포스트가 의미 있다는 신호"는 구체적으로 직접 해본 사람만이 알 수 있는 세부 사항을 명시하고 있습니다.]
내가 다르게 했을 것
[ADD: 2~3개의 솔직한 문장 — 예: 다음에 무엇을 계측(instrument)할 것인지(아마도 에러 트레이스(error traces), 재시도(retries), 또는 여러 로그 분석을 하나의 인시던트 타임라인(incident timeline)으로 상관 분석하는 것 등), 또는 실제 데이터를 확인한 후 지금의 스팬(span) 구조에서 무엇을 변경할 것인지.]
교훈
AI 기능을 구축하는 것은 쉬운 부분이었습니다. Groq의 API는 빠르고 프롬프트 엔지니어링 (prompt engineering)도 복잡하지 않았습니다. 더 어렵고 유용한 교훈은 "관측성 (observability)"이 애플리케이션 경계에서 멈추지 않는다는 점을 깨달은 것이었습니다. 만약 당신의 앱이 AI 모델을 호출한다면, 그 호출은 데이터베이스나 결제 게이트웨이와 마찬가지로 하나의 의존성 (dependency)이며, 동일한 대우를 받아야 합니다. 즉, 추적(traced)되고, 측정(measured)되며, 가시화(visible)되어야 합니다. SigNoz는 제가 직접 추적 인프라 (tracing infrastructure)를 구축하지 않고도 이를 수행할 수 있는 구체적인 방법을 제공했습니다. 저는 그저 OpenTelemetry를 제대로 사용하기만 하면 되었고, 이것이 이번 해커톤을 통해 제가 실제로 습득한 진짜 기술이었습니다.
만약 현재 AI 기반의 무언가를 구축하고 있다면, 저의 솔직한 제안은 이렇습니다. AI 레이어가 내내 블랙박스(black box)였다는 사실을 운영 환경(production)에서 장애가 발생한 후에야 알게 될 때까지 기다리지 마세요. 구축하는 동안 미리 계측(instrument)하세요. 나중에 눈을 가린 채 디버깅하는 것보다 훨씬 비용이 적게 듭니다.
*WeMakeDevs "Agents of SigNoz" 해커톤을 위해 제작되었습니다.
*github 리포지토리 링크: kusumaranikusumarani3232-hub/AI-SRE-Copilot
*라이브 앱: https://ai-sre-copilot-pusprhbhw2vtaa62ojxnjo.streamlit.app/
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기