OpenObserve - 페타바이트 규모 관찰성 플랫폼 치트시트
OpenObserve (O2)는 로그, 메트릭, 트레이스를 위한 Rust로 작성된 오픈소스 관찰성 플랫폼입니다. 정의하는 설계 선택은 객체 저장소 (S3, GCS, MinIO)에 압축된 Parquet 형식으로 데이터를 저장합니다. 비싼 로컬 디스크 대신 이는 Elasticsearch 기반 스택보다 극적으로 낮은 저장소 비용 주장의 기초입니다. 내장 UI가 있는 단일 바이너리로 제공되고, OpenTelemetry를 기본적으로 지원하고, SQL로 쿼리합니다.
설치
| 방법 | 명령 |
|---|
| 바이너리 | GitHub Releases에서 다운로드한 후 ./openobserve |
| Docker | docker run -d -p 5080:5080 -e ZO_ROOT_USER_EMAIL=a@b.c -e ZO_ROOT_USER_PASSWORD=pass public.ecr.aws/zinclabs/openobserve:latest |
| Kubernetes | Helm 차트 사용 가능 |
| UI | http://localhost:5080 |
| 확인 | 설정한 루트 자격 증명으로 로그인 |
저장소 모드
| 모드 | 사용 |
|---|
| 로컬 디스크 | 단일 노드, dev/작은 배포 |
| S3 / GCS / Azure Blob | 프로덕션, 저렴한 장기 보관 |
| MinIO | 자체 호스팅 객체 저장소 |
# 프로덕션 저장소를 위해 S3을 지정
export ZO_LOCAL_MODE=false
export ZO_S3_BUCKET_NAME=my-o2-bucket
export ZO_S3_REGION_NAME=us-east-1
데이터 수집
| 소스 | 방법 |
|---|
| OpenTelemetry | OTLP를 /api/{org}/v1/traces, /v1/logs, /v1/metrics로 전송 |
| HTTP JSON | POST /api/{org}/{stream}/_json |
| Fluent Bit / Vector | O2 HTTP 엔드포인트로 출력 플러그인 |
| Prometheus 원격 쓰기 | /api/{org}/prometheus/api/v1/write |
| Syslog | TCP/UDP 리스너 |
# JSON 로그 대량 수집
curl -u "$USER:$PASS" -X POST \
"http://localhost:5080/api/default/app_logs/_json" \
-H "Content-Type: application/json" \
-d '[{"level":"error","message":"db timeout","service":"api"}]'
쿼리 (SQL)
-- 하나의 서비스에 대한 최근 오류 찾기
SELECT * FROM app_logs
WHERE level = 'error' AND service = 'api'
ORDER BY _timestamp DESC
LIMIT 100;
-- 시간에 따라 서비스당 오류 개수
SELECT service, count(*) AS errors
FROM app_logs
WHERE level = 'error'
GROUP BY service
ORDER BY errors DESC;
| 기능 | 참고 |
|---|
| SQL 쿼리 | 로그 스트림에 대한 친숙한 구문 |
| 전체 텍스트 검색 | match_all('timeout') |
| 시간 범위 | UI에서 선택하거나 _timestamp 필터를 통해 |
| 저장된 검색 | 재사용 가능한 쿼리 |
핵심 개념
| 용어 | 의미 |
|---|
| 조직 | 최상위 테넌트 |
| 스트림 | 명명된 데이터 스트림 (인덱스처럼) |
| 스키마 | 수집된 데이터에서 추론됨 |
| 함수 | 수집 또는 쿼리 시 적용된 VRL 변환 |
| 알림 | 예약된 쿼리 + 대상 |
알림 및 대시보드
| 기능 | 방법 |
|---|
| 예약된 알림 | 쿼리 + 임계값 + 평가 간격 |
| 실시간 알림 | 매칭된 수집 레코드에 대해 트리거 |
| 대상 | Webhook, Slack, 이메일, PagerDuty |
| 대시보드 | SQL 쿼리에서 패널 구축 |
| 템플릿 | 재사용 가능한 알림 메시지 형식 |
수집 시간 함수 (VRL)
# 수집 시 필드를 수정하고 새로운 것 파생
.email = "REDACTED"
.status_class = floor(.status / 100)
함수를 사용하면 저장소 전에 PII를 스크럽하거나 레코드를 강화할 수 있습니다. 쿼리 시 수행하는 것보다 저렴합니다.
OpenObserve vs 대안
| 측면 | OpenObserve | Elasticsearch/ELK | Grafana Loki |
|---|
| 저장소 | 객체 저장소 (Parquet) | 로컬 디스크 인덱스 | 객체 저장소 (청크) |
| 비용 프로필 | 매우 낮음 | 높음 | 낮음 |
| 쿼리 | SQL | Query DSL / KQL | LogQL |
| 범위 | 로그 + 메트릭 + 트레이스 | 로그 (+ APM) | 로그 (나머지용 Grafana 스택) |
| 설정 | 단일 바이너리 | 다중 구성요소 | 다중 구성요소 |
OpenTelemetry로 계측을 위해 쌍을 이루고; Grafana Loki 및 Elasticsearch와 비교합니다.
리소스