안녕하세요. 인포그랩에서 DevOps 엔지니어로 일하는 Chad입니다. Grafana Labs가 2025년 2월 13일부로 Promtail을 장기 지원(LTS) 모드로 전환했습니다. Promtail은 Grafana Loki를 위한 로그 수집 에이전트로, 각 서버나 컨테이너에서 로그를 읽어 Loki로 전송합니다. LTS 모드로 전환되면서 Promtail의 신규 기능 개발은 종료됐으며, 보안 업데이트와 버그 수정만 지원되고 있습니다*.
대신 Grafana Labs는 Promtail 사용자에게 Grafana Alloy로 마이그레이션을 권장하고 있습니다. Alloy는 메트릭, 로그, 트레이스 등 주요 Observability 데이터를 통합 수집하는 범용 에이전트입니다. 이 도구는 OpenTelemetry Collector를 기반으로 한 Grafana Labs의 배포판으로, Promtail의 로그 수집 기능도 지원합니다.
저는 처음에 "Grafana Labs의 로그 수집 도구가 바뀐 건가?" 정도로 생각했습니다. 그러나 Alloy를 직접 사용해 보니 Promtail과 아키텍처 패러다임 자체가 다르고, 기능이 크게 확장돼 인상 깊었습니다.
이 글에서는 Promtail의 한계와 Alloy의 개선 방식을 살펴보려 합니다. 이어서 Alloy 첫인상과 Docker 환경에서 설치 방법, 로그·메트릭 수집 방법을 소개하고, Alloy 운영 시 유의 사항과 총평으로 글을 마무리하겠습니다. Promtail LTS 전환과 공식 지원 종료(EoL) 일정 때문에 마이그레이션을 고려 중인 분들에게 도움이 되는 내용입니다.
테스트 환경: 이 글에서는 Alloy가 Docker 컨테이너 로그를 수집하고 Prometheus 메트릭을 remote write로 전송하는 과정을 테스트했습니다.
- Alloy v1.9.2
- Prometheus v3.6.0
- Loki v3.5.6
- Grafana v12.2.0
- Docker 환경
*Promtail의 EoL 일정은 2026년 3월 2일로 예정
Promtail의 한계
Promtail은 Grafana Loki 생태계의 핵심 로그 수집 에이전트입니다. 각 서버나 컨테이너에 설치돼 로컬 로그 파일을 실시간으로 읽고, 라벨을 추가한 뒤 Loki로 전송합니다. Promtail은 Prometheus의 서비스 디스커버리 메커니즘을 차용해 Kubernetes 환경에서 서비스 디스커버리를 지원하고, relabel 규칙으로 메타데이터를 가공할 수 있습니다.
그러나 Promtail을 포함한 전통적인 Prometheus 관찰 스택에는 운영 측면에서 자주 지적되는 제약이 있습니다. 메트릭은 Prometheus가 각 타겟을 scrape 하는 pull 방식, 로그는 Promtail이 Loki로 전송하는 push 방식으로 동작하는 데서 비롯된 문제입니다. 이러한 이중 구조는 다음과 같은 문제를 일으킵니다.
전통적인 방식의 제약
- 복잡한 네트워크 구성: Prometheus 서버가 수십 ~ 수백 개의
/metrics엔드포인트에 접근 가능해야 하므로, 방화벽이나 NAT 환경에서 모니터링 구성이 복잡해집니다. 특히 내부망 또는 방화벽 뒤 타겟을 모니터링하려면 포트를 별도로 열어야 하는 부담이 있습니다. - 중앙 집중식 부하: 모든 scrape 작업이 Prometheus 서버에 집중돼, 타겟이 많을수록 부하가 커집니다.
- 수집 방식의 불일치: 메트릭은 pull, 로그는 push로 동작해 운영 프로세스가 이원화됩니다.
- 이원화된 에이전트 관리: 메트릭과 로그를 별도 에이전트로 관리해야 해 구성과 운영이 복잡합니다.
Grafana Labs는 이러한 운영 제약을 해소하기 위해 통합 에이전트 모델을 도입했습니다. 그 결과물이 바로 Alloy입니다.
Alloy의 문제 해결 방식
Alloy는 Promtail의 한계를 어떻게 해결할까요? 핵심은 수집 아키텍처의 근본적 전환에 있습니다.
로컬 에이전트 기반 push 전송 구조
Alloy는 로컬 에이전트에서 데이터를 수집한 후 중앙 저장소로 push 하는 아키텍처를 지원합니다. 메트릭의 경우, Alloy가 로컬에서 타겟을 scrape(pull)한 후, Prometheus Remote Write 프로토콜로 중앙 서버에 전송(push)합니다. 로그는 Alloy가 직접 수집해 Loki로 push 합니다.
잠깐, push 기반 수집은 이미 있지 않았나요?
맞습니다. OpenTelemetry Collector가 push 기반으로 메트릭, 로그, 트레이스를 전송합니다. 그렇다면 Alloy는 어떤 점에서 차별화됐을까요?
- OpenTelemetry Collector 기반으로 구축됐습니다.
- Grafana Agent의 기능과 운영 경험을 통합합니다.
- Prometheus 네이티브 파이프라인을 직접 지원합니다.
- 결과: OpenTelemetry 표준과 Prometheus 생태계를 동시에 공식 지원합니다.
개선된 점
이러한 아키텍처 전환은 앞서 언급한 전통적인 방식의 제약을 다음과 같이 완화합니다.
- 간소화된 네트워크 구성: Prometheus가 모든 타겟에 직접 접근할 필요가 없으며, Alloy → 중앙 서버 방향의 방화벽만 열면 됩니다.
- 분산 처리와 부하 경감: 각 노드의 Alloy가 로컬에서 데이터 수집, 필터링, 전처리를 수행해 중앙 서버 부하를 줄이고 네트워크 비용도 절감합니다.
- 통일된 전송 방식: 메트릭과 로그 모두 로컬 에이전트에서 중앙으로 push 하는 방식으로 운영 절차가 일관됩니다.
- 단일 에이전트 관리: 메트릭과 로그를 하나의 Alloy 에이전트로 통합 관리해 구성과 운영이 단순화됩니다.
Alloy는 트레이스(Tempo)와 프로파일링(Pyroscope)도 지원하지만, 이 글에서는 익숙한 메트릭과 로그 수집에 집중합니다.
Alloy 첫인상
Alloy를 실제로 사용해 보면 어떤 느낌일까요? 저는 메모리 사용량이 증가했지만, 확장된 기능과 개선된 환경이 이를 충분히 상쇄한다고 생각했습니다.
Promtail과 비교
Alloy를 사용해 보니 이미지 크기와 메모리 사용량은 크게 늘었습니다. 그러나 메트릭, 로그, 트레이스를 통합 수집할 수 있고, 내장 웹 UI도 이용할 수 있어 편리했습니다.
사용자 관점에서 Promtail과 Alloy를 비교한 내용은 다음과 같습니다.
| 항목 | Promtail | Alloy |
|---|---|---|
| 이미지 크기 | 약 217 MB | 약 447 MB |
| 수집 대상 | 로그 | 메트릭, 로그, 트레이스 |
| 설정 언어 | YAML | River (HCL에서 영감받은 구성 언어) |
| 메모리 사용량 (테스트 환경 기준) | ~40MB | ~120MB |
| UI | 없음 | 내장 웹 UI (기본 포트: :12345) |
| 상태 | 유지보수만 지원 | 활발히 개발 중 |
| 디버깅 방법 | docker logs+grep | 웹 UI (Components/Graph 시각화) |
| 설정 복잡도 | 간결함 (12줄) | 명시적이지만 김 (22줄) |
| 학습 곡선 | YAML은 익숙함 | River 문법 학습 필요 |