마이크로서비스 기반 로그 및 트레이스 분석 시스템 개발기

문한성·2025년 5월 2일
0

안녕하세요! 오늘은 최근에 완성한 마이크로서비스 기반 로그 및 트레이스 분석 시스템의 개발 과정과 아키텍처에 대해 공유하려고 합니다. 특히 Model Context Protocol(MCP)을 활용한 접근 방식이 어떻게 효율적인 모니터링 솔루션으로 이어졌는지 설명드리겠습니다.


시스템 개요

본 시스템은 마이크로서비스 아키텍처 환경에서 발생하는 로그와 트레이스 데이터를 통합적으로 수집하고, 분석하는 플랫폼입니다. 여기에 대규모 언어 모델(LLM)을 접목해 복잡한 시스템 로그와 트레이스 데이터를 자연어로 해석하고, 운영자가 직관적으로 이해할 수 있도록 지원합니다.

주요 기능

  • 🧠 자연어 기반 로그/트레이스 검색: 운영자는 LogQL이나 TraceQL을 몰라도 "지난 3시간 동안의 오류 로그 보여줘" 같은 자연어로 검색 가능
  • 🔍 로그-트레이스 연계 분석: 특정 에러 로그와 관련된 트레이스를 추적해 원인 파악
  • 🚨 이상 탐지 및 진단: AI가 이상 징후를 감지하고, 원인을 요약해 제공
  • 📊 시각화 대시보드: Grafana 및 Streamlit을 활용한 인터랙티브 UI 제공

시스템 아키텍처

아래는 시스템 전반의 구성 요소와 데이터 흐름을 간단한 블록 다이어그램 형식으로 표현한 이미지입니다.

구성 계층 요약

  • UI 계층: Streamlit 기반 자연어 쿼리 입력 및 결과 시각화
  • 분석 계층: LangGraph가 자연어 쿼리를 분석하고 의도 추출 및 LogQL/TraceQL 생성
  • MCP 계층: Loki/Tempo MCP 서버가 클라이언트 요청을 중계하고 응답 포맷 가공
  • API 계층: Loki/Tempo API 서버가 원시 로그/트레이스 쿼리를 수행
  • 데이터 소스: Loki/Tempo DB가 실제 데이터를 저장 및 제공
  • 시각화 대시보드: Grafana를 통해 실시간 모니터링 UI 제공

MCP란 무엇인가?

모니터링 시스템을 개발하면서 가장 먼저 고민했던 것은 "컴포넌트 간 상호작용을 어떻게 일관되게 관리할 것인가?"였습니다. 이에 도입한 것이 Model Context Protocol(MCP)입니다.

MCP의 특징

  • 컨텍스트 관리: 세션, 이전 요청, 사용자 의도를 유지해 일관성 있는 분석
  • 데이터 변환: 프론트 요청을 백엔드에서 처리 가능한 포맷으로 변환
  • 세션 기반 인터랙션: 단발성 요청이 아닌, 지속적인 대화형 상호작용 가능

JSON-RPC를 선택한 이유

MCP와 LangGraph 간, 그리고 MCP와 API 서버 간 통신에는 JSON-RPC 2.0을 사용했습니다.

선택 이유

  • 🧩 메서드 기반 인터페이스: method, params, id가 명확하게 구조화
  • 📉 가벼운 오버헤드: REST 대비 적은 메타데이터로 속도와 효율성 향상
  • 🔁 양방향 통신 구조: 이벤트 기반 응답, SSE, 배치 처리 지원
{
  "jsonrpc": "2.0",
  "method": "query_loki",
  "params": {
    "query": "{service=\"order-service\"}",
    "start": "2023-05-01T10:00:00Z",
    "end": "2023-05-01T11:00:00Z"
  },
  "id": 1
}

구성 요소 상세 설명

LangGraph

  • Google Gemini 기반 자연어 해석 및 LogQL/TraceQL 생성
  • 로그/트레이스 통합 분석, 인사이트 추출, 샘플 생성
  • FastAPI, LangChain 기반 Python 서버

Loki/Tempo API 서버

  • 로그/트레이스 원시 데이터 처리 전담
  • FastAPI로 작성, HTTPX로 Loki/Tempo와 통신

MCP 서버

  • MCP-Loki / MCP-Tempo 서버는 API 요청 중계 + 컨텍스트 관리
  • 요청 변환, 응답 포맷팅, 캐싱, 세션 연계 기능 포함

Streamlit UI

  • 자연어 질의 입력 및 분석 결과 시각화
  • 로그 레벨, 서비스명, 시간 범위 필터링 지원

주요 시나리오 예시

✅ 로그 분석 예시

"지난 3시간 동안 order-service에서 발생한 에러 로그 보여줘"

  • LangGraph는 이를 LOG_QUERY로 인식, service=\"order-service\" 및 시간 범위 추출
  • LogQL 쿼리 생성 → Loki-MCP → Loki API → Loki DB
  • 분석된 로그와 요약 결과가 Streamlit UI에 표시됨

✅ 트레이스 분석 예시

"product-service의 API 호출 지연이 있는 트레이스 보여줘"

  • LangGraph가 TRACE_QUERY로 분류하고 쿼리 수행
  • Tempo MCP를 통해 Tempo DB 조회 → 지연 시간 기반 트레이스 필터링 및 요약 제공

✅ 통합 분석 예시

"order-service의 에러 로그와 관련된 트레이스를 찾아서 분석해줘"

  • LangGraph가 복합 쿼리로 분류
  • 로그에서 트레이스 ID 추출 → Tempo에 트레이스 요청
  • 로그-트레이스 연관 분석 결과 제공

Docker Compose 기반 배포

services:
  langgraph:
    build: ./langgraph
    ports:
      - "8001:8001"
    environment:
      - GOOGLE_API_KEY=${GOOGLE_API_KEY}
      - MCP_URL=http://loki-mcp:8003
      - TEMPO_MCP_URL=http://tempo-mcp:8004

  loki-api:
    build: ./loki-api
    ports:
      - "8002:8002"
    environment:
      - LOKI_URL=${LOKI_URL}

  loki-mcp:
    build: ./loki-mcp
    ports:
      - "8003:8003"
    environment:
      - LOKI_API_URL=http://loki-api:8002

  tempo-api:
    build: ./tempo-api
    ports:
      - "8005:8005"
    environment:
      - TEMPO_URL=${TEMPO_URL}

  tempo-mcp:
    build: ./tempo-mcp
    ports:
      - "8004:8004"
    environment:
      - TEMPO_API_URL=http://tempo-api:8005

  streamlit:
    build: ./streamlit
    ports:
      - "8501:8501"
    environment:
      - LANGGRAPH_URL=http://langgraph:8001

확장성 및 향후 계획

  • 📈 메트릭 데이터 통합: Prometheus 연동을 통해 CPU, Memory, Network 등 실시간 메트릭 분석까지 지원 예정
  • 🌐 멀티 클러스터 확장: 여러 마이크로서비스 클러스터에 대한 통합 분석을 위한 수평 확장 설계 적용
  • 🧠 AI 기반 Root Cause Analysis: LangGraph에 사고 시나리오 학습 기능 추가로 더 정밀한 원인 분석 가능

이상으로 LLM 기반 마이크로서비스 로그/트레이스 분석 시스템에 대한 개발기를 마칩니다. MCP의 도입과 JSON-RPC 구조화 통신 방식이 모니터링의 직관성과 확장성을 크게 향상시켰습니다.

profile
기록하고 공유하려고 노력하는 DevOps 엔지니어

0개의 댓글