
Grafana 스택을 구축할 뻔했지만, AgentGateway가 필요한 모든 것을 제공했습니다
요약
개인용 AI 에이전트의 모니터링을 위해 Grafana, Prometheus 등 복잡한 스택을 구축하려던 계획이 AgentGateway의 새로운 내장 UI 업데이트로 해결된 사례를 다룹니다. 별도의 인프라 구축 없이도 분석 대시보드, 로그 탐색기, 비용 분석 기능을 즉시 사용할 수 있게 되었습니다.
핵심 포인트
- AgentGateway v1.3.0 업데이트로 강력한 내장 UI 제공
- 분석 대시보드, 실시간 로그 탐색, 비용 분석 기능 포함
- Prometheus, Grafana 등 복잡한 모니터링 스택 구축 불필요
- 에이전트의 라우팅 상태 및 API 비용에 대한 가시성 확보
Homelab AI 시리즈의 4부 — 1부 | 2부 | 3부
상황을 설명해 보겠습니다.
저의 개인용 AI 에이전트(AI agent)는 야간 크론 잡(cron jobs)을 실행하고 있습니다. 일정 요약, 이메일 요약, 작업 우선순위 지정 등입니다. 3부에서 vLLM Semantic Router를 통합한 이후 3주 동안 조용히 이 작업을 수행해 왔습니다.
그런데 이것이 제대로 작동하고 있는지 전혀 모르겠습니다.
고장 났기 때문이 아닙니다. 그것에 대한 가시성(visibility)이 전혀 없기 때문입니다. Mac Mini는 거실에 놓여 초록색 불빛을 조용히 깜빡이며 요청을 처리하고 있지만, 라우팅(routing)이 실제로 작동하고 있는지, API 비용이 폭발하고 있는지, 아니면 로컬 Ollama 모델이 Gemini로 갔어야 할 프롬프트들을 억지로 처리하느라 고군분투하고 있는지 전혀 알 길이 없습니다.
저는 완전히 눈을 가린 채 비행하고 있었습니다.
실현되지 않은 계획
3부 이후, 저의 원래 관측성(observability) 로드맵은 야심 찼습니다. 저는 다음과 같은 완전한 "빅테크(Big Tech)" 모니터링 스택을 배포할 계획이었습니다.
- Prometheus: AgentGateway의
/metrics엔드포인트를 스크래핑(scrape)하기 위해 - Jaeger: OpenTelemetry를 통한 분산 트레이싱(distributed tracing)을 위해
- Grafana: 토큰 비용과 지연 시간(latency)을 위한 커스텀 대시보드와 함께
- Loki: 로그 집계(log aggregation)를 위해, 기업형(enterprise) 수준을 제대로 갖춰보려고 말이죠
심지어 docker-compose.yaml 파일도 작성하기 시작했습니다. 4개의 서비스, 2개의 설정 볼륨, 공유 네트워크까지 — Grafana 프로비저닝(provisioning) 스크립트 단계에도 채 도달하지 못한 상태였습니다.
그러던 중 주간 AgentGateway 커뮤니티 회의 중에 Lin과 John이 v1.3.0의 새로운 UI를 발표했습니다.
저는 즉시 AgentGateway 저장소(repo)에서 git pull을 실행했습니다.
$ git pull origin main
...
crates/agentgateway/src/ui.rs | 423 ++++++++++++++++++++++++
...
팀에서는 분석 대시보드(Analytics dashboard), 실시간 로그 탐색기(live Logs Explorer), 비용 분석 보기(Cost Breakdown view)가 완벽하게 갖춰진 완전히 새로운 내장 UI를 출시했습니다. 제가 주말 동안 직접 구축하려던 모든 것이 이미 거기에 있었습니다. 네이티브로, 바이너리 안에, 포트 15000에서요.
저는 docker-compose.yaml 파일을 닫았습니다. 다시는 열지 않을 것 같았습니다.
YAML 세 줄이면 충분합니다.
내장 UI는 이미 http://localhost:15000/ui에서 서비스되고 있었습니다. 하지만 그곳으로 이동했을 때, 로그(Logs)와 분석 페이지에는 아무것도 표시되지 않았습니다. 빈 차트와 함께 다음과 같은 메시지만 보였습니다:
로그 API 오류 — 요청 로그 데이터베이스가 구성되지 않았습니다
맞습니다. UI는 요청 로그를 기록할 곳이 필요했습니다. 저는 여기에 Postgres 인스턴스를 설정하거나 최소한 SQLite용 Docker 컨테이너를 설정할 것이라고 예상했습니다.
대신, 저는 homelab_config.yaml에 이것을 추가했습니다:
config:
modelCatalog:
- file: base-costs.json
...
그게 전부였습니다.
제가 부딪힌 중요한 함정(gotcha)이 하나 있었습니다: database: 키는 반드시 config: 섹션 안에 중첩되어야 합니다. 저는 처음에 YAML의 최상위 레벨에 추가하려고 시도했고,
AgentGateway는 vLLM Semantic Router가 전달 전에 x-selected-model 헤더를 추가하기 때문에 어떤 모델이 각 요청을 처리했는지 알고 있습니다. 따라서 UI는 단순히 "요청이 발생했다"는 것만 보여주는 것이 아니라, 어떤 모델이 요청을 받았는지, 얼마나 많은 토큰을 소비했는지, 그리고 내장된 모델 가격 카탈로그(model pricing catalog)를 사용하여 추정된 달러 비용이 얼마인지를 보여줍니다.
위의 24시간 스냅샷을 보면: 60회 호출, 13,929 토큰, 총 $0.0340. 이것이 Pi의 밤샘 작업을 실행하는 데 드는 전체 비용입니다. 상호작용당 1센트의 아주 작은 일부 수준입니다.
그리고 라우팅(routing)이 제대로 작동하고 있다는 것을 확인할 수 있습니다. 오른쪽의 트래픽 급증은 Pi의 오전 3시 크론 배치(cron batch) 작업과 일치합니다. 모델별 상세 내역을 통해 코딩 작업이 클라우드 API 크레딧을 소모하지 않고 실제로 로컬 Ollama로 전달되고 있음을 확인할 수 있습니다.
로그 탐색기 (The Logs Explorer)
이 화면은 저를 진심으로 놀라게 했습니다.
모든 개별 LLM 호출은 다음과 같은 항목을 포함하는 하나의 행으로 표시됩니다:
- HTTP 상태 (HTTP Status) —
200,400,404— 잘못된 상태는 놓치기란 불가능합니다. - 지속 시간 (Duration) — 요청 수신부터 응답 전달까지의 총 시간
- 모델 (Model) — 제
MoM별칭이 아닌, 실제로 호출된 실제 모델 - 제공자 (Provider) —
gcp.gemini,openai,openai(Ollama는 OpenAI API 방식을 사용하므로openai로 표시됨) - 토큰 수 (Token counts) — 입력(input)과 출력(output)을 별도로 표시
- 추정 비용 (Estimated cost) — 모델 가격 카탈로그를 기준으로 한 요청당 달러 금액
위의 스크린샷을 보세요. 실제 요청들을 볼 수 있습니다: gemini-2.5-flash 호출은 각각 몇 센트의 십분의 일 수준이며, qwen2.5-coder:7b 호출은 비용이 0이고, 상단에는 non-existent-model에 대한 몇 개의 404 오류가 있습니다. 이것들은 제 트래픽 테스트에서 발생한 시뮬레이션된 오류 요청들이며, 예상했던 대로 정확히 나타나고 있습니다.
저는 어떤 행이든 클릭하여 전체 요청 상세 정보, 즉 Pi가 보낸 정확한 프롬프트와 받은 정확한 응답을 확인할 수 있습니다. Pi의 새벽 3시 캘린더 작업이 이상한 것을 보낼 때, 저는 가공되지 않은 JSON (raw JSON)을 볼 수 있습니다. 이전에는 결코 불가능했던 일입니다.
전체 설정 (The Full Config)
이것을 설정하려는 분들을 위해, 제 전체 홈랩 AI 스택을 실행하는 전체 homelab_config.yaml을 여기에 공개합니다:
# yaml-language-server: $schema=https://agentgateway.dev/schema/config
# 게이트웨이 레벨 정책: 사이드카 (sidecar)로서의 시맨틱 라우터 (Semantic Router) as ExtProc
...
관심사의 분리 (Separation of concerns)를 다시 한번 강조할 가치가 있습니다. 시맨틱 라우터 (Semantic Router)는 API 키에 절대 손을 대지 않습니다. 프롬프트를 분류하고, 헤더를 설정한 뒤, 바로 물러납니다. 다운스트림 인증 (downstream auth)은 전적으로 AgentGateway가 담당합니다. 이는 프로덕션 쿠버네티스 (Kubernetes) 클러스터에서 사용하는 것과 동일한 디자인 패턴입니다. 즉, 보안 태세 (security posture)와 분리된 라우팅 지능 (routing intelligence)을 사용하는 것입니다.
왜 Grafana가 아닌가? (Why Not Grafana?)
몇몇 분들이 물어보실 것을 알기에 이 부분을 직접 다루고 싶습니다.
전담 플랫폼 팀이 있는 엔터프라이즈 쿠버네티스 (Kubernetes) 클러스터를 운영 중이라면, 당연히 AgentGateway의 OpenTelemetry 데이터를 중앙 집중식 Datadog 또는 Prometheus 스택으로 내보내십시오. AgentGateway는 이를 기본적으로 지원합니다. OTLP 트레이스 (traces)와 /metrics 엔드포인트를 방출합니다. 프로덕션 관측성 (observability) 측면에서 매우 훌륭합니다.
하지만 홈랩을 운영 중이라면 어떨까요?
단일 노드 AI 게이트웨이를 위해 Prometheus + Grafana를 운영하는 것은 얻는 것에 비해 운영 부담이 엄청납니다. 두 개의 추가 서비스를 계속 실행하고 건강한 상태로 유지해야 하며, Grafana 대시보드 JSON을 작성 및 유지 관리해야 하고, Prometheus 경고 규칙 (alerting rules)을 구성해야 하며, 스키마 (schema)가 변경될 때 이 모든 것을 동기화된 상태로 유지해야 합니다.
AgentGateway의 내장 대시보드는 운영 오버헤드(operational overhead) 없이 제가 중요하게 생각하는 모든 지표 — 토큰 사용량 (token usage), 모델당 비용 (cost per model), 지연 시간 분포 (latency distribution), 오류율 (error rates) — 를 제공합니다. SQLite 파일은 바이너리 바로 옆에 위치합니다. 유지 관리할 것도, 재시작할 것도, 프로비저닝 (provision)할 것도 없습니다.
필요하지 않다면 관측성 스택 (observability stack)을 구축하지 마세요.
실제 가시성을 확보한 후 일주일간의 수치
실제 데이터를 갖게 되면 설정에 대한 사고방식이 바뀝니다:
| 지표 (Metric) | 보이지 않을 때 (이전) | 대시보드 사용 시 |
|---|---|---|
| 라우팅 정확도 (Routing correctness) | "아마 괜찮겠지?" | Analytics에서 모델별로 검증됨 |
| ... |
마지막 행이 가장 중요합니다. 제가 전혀 파악하지 못했던 세 가지 실제 문제들 — Gemini에 잘못된 형식의 날짜 범위를 보내는 캘린더 cron 작업, Pi의 요약 프롬프트(summarization prompt)에서 발생한 토큰화 (tokenization) 예외 케이스, 그리고 조용히 발생했던 API 키 로테이션 (rotation) 실패 건이었습니다. 대시보드는 단순히 숫자만 제공한 것이 아니라, 저에게 _답_을 주었습니다.
홈랩 (Homelab) 스택 완성
네 개의 포스트, 거실에 있는 Mac Mini 한 대. 전체 그림은 다음과 같습니다:
Pi (Personal Agent)
│
▼ POST /v1/chat/completions model: "MoM"
...
- 에이전트 (The Agent) — 거실의 Mac Mini에서 24시간 내내 cron 작업과 개인 업무를 수행하는 Pi.
- 지능 계층 (The Intelligence Layer) — mmBERT 임베딩 (embeddings)을 사용하여 모든 프롬프트를 분류하고 약 1ms 내에 라우팅 헤더 (routing headers)를 설정하는 vLLM Semantic Router.
- 데이터 평면 (The Data Plane) — 모든 API 키를 소유하고, 인증 (auth)을 처리하며, 경로를 매칭하는 Rust 기반의 AgentGateway.
- 제어 평면 (The Control Plane) — SQLite를 기반으로 실시간 토큰 사용량, 비용, 지연 시간 (latency), 에러를 보여주는 AgentGateway의 내장 UI.
전체 스택은 단일 바이너리(plus the SR container)로 실행됩니다. 인프라에 대한 클라우드 비용 지출이 전혀 없습니다. Mac Mini는 이미 제 거실에 놓여 있었습니다.
다음 단계
지금이 자연스러운 휴식기처럼 느껴집니다. 스택은 안정적이고, 관측 가능하며(observable), 솔직히 이 시리즈를 시작했을 때 기대했던 것보다 더 강력합니다.
현재 적극적으로 탐구하고 있는 몇 가지 사항은 다음과 같습니다:
- 스택의 Dockerizing (Dockerizing the stack) — 단일
docker-compose.yaml을 통해 Ollama, SR 컨테이너, 그리고 AgentGateway를 함께 부팅하여, 제가 아무것도 건드리지 않아도 Mac Mini가 재부팅 후 완전히 자가 치유(self-heals)될 수 있도록 구성하는 것입니다. - 더 많은 모델 카드 (More model cards) — 이제 라우팅(routing)이 시맨틱(semantic) 방식으로 이루어지므로, 새로운 특화 모델을 추가하는 것은 단순히 SR의
config.yaml에 새로운 설명을 작성하는 것뿐입니다. 나머지는 라우터가 알아서 처리합니다. - OTLP 내보내기 (OTLP export) — AgentGateway는 이미 OpenTelemetry 스팬(spans)을 방출합니다. 저는 이를 가벼운 alertmanager에 연결하여, 새벽 3시 실행 중에 Pi의 에러율이 임계값을 초과하여 급증할 때 알림을 받도록 만들고 싶습니다.
만약 여러분이 에이전트(agents)를 구축하고 있다면 — 홈랩(homelab)이든 프로덕션(production) 환경이든 — AgentGateway + vLLM Semantic Router + 내장된 SQLite 관측성(observability)의 조합은, 현재 제가 알고 있는 가장 완벽한 단일 노드 AI 인프라 스택입니다. YAML의 확산(sprawl)도 없고, 정상적인 경로(happy path)를 위한 외부 의존성도 없습니다. 그저 설정 파일 하나, 바이너리 하나, 그리고 초록색 불이 들어온 Mac Mini뿐입니다.
그리고 이것은 제 거실에서 24시간 7일 내내 조용히 작동하고 있습니다. 🏠
설정에 대해 궁금한 점이 있으신가요? 댓글로 남겨주세요 — 매일 확인합니다. 그리고 여러분도 비슷한 것을 구축했다면, 어떻게 적응시켜 사용 중인지 정말 보고 싶습니다.
#ai #agents #observability #homelab #agentgateway #vllm #sqlite #llm #opensource
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기