
데이터 파이프라인 에이전트 — 어디서든 데이터를 받아서, 필요하면 가공하고, 어디든 보낼 수 있는 범용 수집기
Alloy는 컴포넌트를 연결하는 방식으로 동작함.
[소스 컴포넌트] → [처리 컴포넌트] → [목적지 컴포넌트]
(input) (process) (output)
설정 파일(.alloy)에서 컴포넌트를 선언하고 연결하면, Alloy가 그 흐름대로 데이터를 처리함.
앱 서버에 에이전트로 설치되어 로그/메트릭을 읽어서 Kafka 등으로 전송.
파일 로그, stdout, 메트릭
→ Alloy (읽기 + 변환)
→ Kafka
loki.source.file "app" {
targets = [{ __path__ = "/var/log/app.log" }]
forward_to = [otelcol.exporter.kafka.default.input]
}
otelcol.exporter.kafka "default" {
brokers = ["kafka:9092"]
topic = "logs"
encoding = "otlp_proto"
}
Kafka 토픽의 메시지를 읽어서 ClickHouse / Loki 등 백엔드로 적재.
Kafka 토픽
→ Alloy (소비 + 변환)
→ ClickHouse / Loki
otelcol.receiver.kafka "default" {
brokers = ["kafka:9092"]
topic = "logs"
encoding = "otlp_proto"
output {
logs = [otelcol.exporter.otlphttp.clickhouse.input]
}
}
/var/log/...)앱 서버 ──(직접 produce)──→ Kafka ──→ ClickHouse
앱 서버
→ Alloy (에이전트, 각 서버에 설치)
→ Kafka
→ Alloy (게이트웨이, 중앙 서버)
→ ClickHouse
앱은 로그만 쓰고, 수집/변환/적재는 Alloy가 담당.
| 항목 | 설명 |
|---|---|
| 수집 분리 | 앱 코드에서 Kafka 의존성 제거 |
| 변환/정규화 | 포맷 통일, 불필요한 필드 제거를 파이프라인에서 처리 |
| 멀티 소스 통합 | 파일, stdout, OTel 등 다양한 소스를 하나로 수렴 |
| 라우팅 | 로그 종류에 따라 다른 토픽/백엔드로 분기 가능 |
| 표준화 | 모든 서버에 Alloy만 설치하면 수집 파이프라인 일원화 |
| 항목 | 설명 |
|---|---|
| 추가 홉 | 앱 → Alloy → Kafka → ClickHouse로 레이턴시 소폭 증가 |
| 운영 복잡도 | 관리할 컴포넌트가 늘어남 |
| Alloy 장애 | Alloy가 죽으면 수집 중단 (로컬 버퍼로 일부 완화 가능) |
| 오버엔지니어링 | 앱이 적고 구조가 단순하면 직접 produce가 더 나을 수 있음 |
앱 코드를 건드리기 싫다 → Alloy 유용
여러 소스를 통합 수집해야 한다 → Alloy 유용
Kafka 전송 전에 변환이 필요하다 → Alloy 유용
앱이 1~2개이고 포맷이 단순하다 → 앱에서 직접 Kafka producer 써도 충분