Observability: Vector
개요
- 공식 사이트 / GitHub
- 고성능 관측 가능성 데이터 파이프라인 — 로그·메트릭·트레이스를 수집, 변환, 라우팅
- 핵심 흐름:
sources → transforms → sinks - Rust로 구현 → 단일 바이너리, 의존성 없음, 메모리 안전, 빠른 처리량
- 벤더 중립 — 특정 플랫폼에 종속되지 않고 어떤 소스·목적지와도 연결 가능
특징
| 특징 | 설명 |
|---|---|
| 단일 바이너리 | 런타임·의존성 없음, 배포 간단 |
| 고성능 | Rust, 비동기 I/O, 벡터화 처리로 수백만 이벤트/초 처리 가능 |
| 유연한 배포 | Daemon(에이전트), Sidecar, Aggregator 역할 전환 가능 |
| VRL | 자체 변환 언어로 안전하고 빠른 로그 파싱·변환 |
| End-to-End ACK | 이벤트 전달 보장, 정확히-한-번 또는 최소-한-번 보증 |
| Hot reload | SIGHUP으로 무중단 설정 변경 적용 |
| Backpressure | 싱크 지연 시 업스트림까지 자동 전파 |
| 민감 데이터 처리 | VRL로 PII 스캔·마스킹·삭제 |
개념
Events
- Vector가 처리하는 개별 데이터 단위
- Logs: 키/값 구조의 일반 로그 이벤트
- Metrics: 시계열 수치 데이터 (Counter, Gauge, Histogram, Summary 등)
- Traces: 로그 이벤트의 특수형 (alpha)
Components
- Sources: 데이터 수집 지점 (파일, Kafka, HTTP, syslog, Kubernetes 로그 등)
- Transforms: 이벤트 파싱·필터링·샘플링·집계·라우팅
- Sinks: 이벤트 목적지 (Elasticsearch, S3, Kafka, Prometheus, Datadog 등)
Pipeline
- Components의 방향성 비순환 그래프(DAG)
- 이벤트는 Sources → Sinks 단방향 흐름, 순환 불가
- 독립 하위 그래프 포함 가능 (팬아웃, 멀티 라우팅)
Buffers & Backpressure
- Sinks가 처리 불가 시 인메모리(기본) 또는 디스크 버퍼에 보관
when_full = block설정 시 버퍼 포화 → Backpressure를 transforms·sources로 전파- Sources는 업스트림 시스템까지 Backpressure 전달 (HTTP 429, Kafka fetch 속도 조정 등)
Roles
- Agent (Daemon/Sidecar): 호스트·파드에 붙어 로컬 데이터 수집·선처리 후 전송
- Aggregator: 여러 Agent·업스트림에서 데이터를 받아 중앙 처리 후 최종 목적지로 전달
아키텍처
Data Model
- Log 이벤트: 특정 시점의 구조적 키/값 표현
- Metric 이벤트: Prometheus / StatsD 등 실세계 메트릭 타입을 반영한 이념보다 실용성 우선 설계
- Counter, Gauge, Set, Distribution, Histogram, Summary
End-to-End Acknowledgements
- 소스 이벤트 수신 → batch notifier 생성 (소스 보관 + 이벤트 연결 두 부분)
- 싱크 처리 완료 후 응답 상태로 batch notifier 업데이트
- 이벤트가 삭제·필터링되어도 notifier 반드시 업데이트 → 전달 보장 추적
- 소스가 notifier 업데이트 수신 → 업스트림 시스템에 ACK 전파
Pipeline Model
- YAML / TOML / JSON 구성 파일로 정의
- 구성 컴파일 시(시작 시)에 검증 → 실수 조기 발견, DAG 속성 보장
- Hot reload:
SIGHUP신호로 무중단 파이프라인 수정 적용 - GraphQL API: 실행 중 인스턴스를 실시간 관찰·조작
설치
-
Linux (스크립트)
curl --proto '=https' --tlsv1.2 -sSfL https://sh.vector.dev | bash -
apt (Debian / Ubuntu)
apt-get install -y vector -
Docker
docker run \ -v $PWD/vector.toml:/etc/vector/vector.toml:ro \ timberio/vector:latest-alpine -
Helm (Kubernetes)
helm repo add vector https://helm.vector.dev helm install vector vector/vector \ --namespace vector --create-namespace \ -f values.yaml
설정 (vector.toml)
기본 구조
# Sources
[sources.nginx_logs]
type = "file"
include = ["/var/log/nginx/access.log"]
# Transforms
[transforms.parse_nginx]
type = "remap"
inputs = ["nginx_logs"]
source = '''
. = parse_nginx_log!(.message, format: "combined")
'''
# Sinks
[sinks.out_elasticsearch]
type = "elasticsearch"
inputs = ["parse_nginx"]
endpoints = ["http://localhost:9200"]
index = "nginx-%Y.%m.%d"
주요 Sources
| Source | 설명 |
|---|---|
file |
파일 tail (glob 패턴 지원) |
kubernetes_logs |
K8s 파드 로그 자동 수집 |
kafka |
Kafka Consumer |
http_server |
HTTP 엔드포인트로 푸시 수신 |
syslog |
UDP/TCP syslog |
stdin |
표준 입력 |
prometheus_scrape |
Prometheus exporter 스크래핑 |
vector |
다른 Vector 인스턴스에서 수신 |
주요 Transforms
| Transform | 설명 |
|---|---|
remap |
VRL로 이벤트 파싱·변환·보강 |
filter |
조건에 맞는 이벤트만 통과 |
route |
조건별로 이벤트를 다른 출력으로 분기 |
sample |
지정 비율로 이벤트 샘플링 |
aggregate |
일정 기간 이벤트 집계 |
lua |
Lua 스크립트로 변환 (고급 커스텀) |
reduce |
여러 로그를 하나의 이벤트로 병합 |
주요 Sinks
| Sink | 설명 |
|---|---|
elasticsearch |
Elasticsearch / OpenSearch |
kafka |
Kafka Producer |
aws_s3 |
Amazon S3 (배치 업로드) |
prometheus_remote_write |
Prometheus Remote Write |
datadog_logs |
Datadog Logs |
loki |
Grafana Loki |
clickhouse |
ClickHouse |
http |
범용 HTTP 엔드포인트 |
console |
콘솔 출력 (디버그용) |
Vector Remap Language (VRL)
- Vector 전용 이벤트 변환 도메인 특화 언어(DSL)
- 안전성: 런타임 오류 없음(컴파일 시 타입 검증), 샌드박스 실행
- 성능: AOT 컴파일, Rust 수준 처리 속도
VRL 예시
-
Nginx 접근 로그 파싱
. = parse_nginx_log!(.message, format: "combined") .timestamp = parse_timestamp!(.timestamp, format: "%d/%b/%Y:%T %z") -
필드 추가·삭제·수정
.environment = "production" del(.sensitive_field) .status_code = to_int!(.status) -
조건부 필터링 (transforms.filter 대신 VRL 내 abort)
if .status < 400 { abort } -
IP 익명화 (PII 처리)
.client_ip = ip_cidr_contains!("10.0.0.0/8", .client_ip) ? "internal" : "external" -
JSON 파싱 + 필드 보강
parsed = parse_json!(.message) . = merge!(., parsed) .host = get_hostname!()
배포 패턴
Agent + Aggregator (권장 대규모)
[호스트/파드] → Vector Agent → Vector Aggregator → Elasticsearch / S3 / ...
- Agent: 경량, 로컬 수집·전처리
- Aggregator: 중앙 집계, 중복 제거, 분기 라우팅
단독 Aggregator
[Kafka / HTTP Push] → Vector → 다수 목적지
Kubernetes DaemonSet (Agent)
# Helm values.yaml 핵심 설정
role: Agent
customConfig:
sources:
kubernetes_logs:
type: kubernetes_logs
sinks:
loki:
type: loki
inputs: ["kubernetes_logs"]
endpoint: "http://loki:3100"
유사 도구 비교
| 도구 | 특징 | 적합 환경 |
|---|---|---|
| Vector | 고성능, Rust, VRL, 벤더 중립, 단일 바이너리 | 범용 관측 가능성 파이프라인 |
| Fluentd | Ruby 기반, 풍부한 플러그인, 다소 무거움 | K8s 로그 수집 |
| Fluent Bit | C 기반 경량, 플러그인 제한 | 엣지·임베디드 환경 |
| Logstash | JVM 기반, Elastic 생태계 최적화, 무거움 | ELK 스택 중심 |
| OpenTelemetry Collector | OTLP 중심, 트레이스 강점, 벤더 중립 | OTel 표준 파이프라인 |
활용 사례
- 로그 중앙화: 다수 서비스 로그 수집 → Elasticsearch / Loki 저장
- 비용 최적화: 고빈도·저가치 로그 샘플링, 중복 제거 후 S3 장기 보관
- 다중 목적지 라우팅: 에러 로그 → PagerDuty + Elasticsearch, 나머지 → S3
- 메트릭 집계: Prometheus exporter 스크래핑 → Grafana Cloud / Datadog
- PII 마스킹: VRL로 이메일·신용카드·IP 정보 익명화 후 전송
- Kafka 릴레이: 로그 생산자 → Kafka → Vector → 다수 목적지 동시 전달