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 |
| 確認 | 設定した root 認証情報でログイン |
ストレージ モード
| モード | 使用 |
|---|
| ローカル ディスク | シングル ノード、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)
-- 1 つのサービスの最近のエラーを見つけ
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 | クエリ DSL / KQL | LogQL |
| スコープ | ログ + メトリクス + トレース | ログ (+ APM) | ログ (Grafana スタック用の残り) |
| セットアップ | シングル バイナリ | マルチ コンポーネント | マルチ コンポーネント |
インストルメンテーション用OpenTelemetryと組み合わせ;Grafana LokiおよびElasticsearchと比較。
リソース