OpenObserve を使ってみよう
ストレージ
OpenObserveはデータをインデックせず、圧縮してローカルだけではなくS3などオブジェクトストレージに保存することができる。
S3に保存することで、大容量のEBSを用意する場合と比べてコストが下げられるということのようで、HA構成にした場合でもあがらないと言いたいらしい。
アーキテクチャ
https://openobserve.ai/docs/architecture/
単一ノード
1台のノードで、2TB/day までのデータ量であれば扱うことができる。
全データをローカルディスクストレージに保存することもできるし、メタデータをetcd、データをS3に保存するということもできる。
拡張性を考えると単一ノードでもオブジェクトストレージを使ったほうがよさそう。
HA構成
HAモードではローカルディスクは使用できないので、必ずS3などが保存先になる。
以下複数の役割のノードで構成される。
- Ingester: 投入されたデータをparquetフォーマットに変換して、オブジェクトストレージに保存する。受け取ったデータを即オブジェクトストレージに転送するのではなく、ある程度ローカルに貯めてから転送するようだ。
- Querier: クエリを実行する。
- Compactor: 複数の小さいファイルを一つの大きいファイルにマージして、検索の効率を上げる
- Router: リクエストをingesterやquerierに分配する、proxyの役割。
- AlertManager: 定期実行やアラート通知
デプロイは https://openobserve.ai/docs/ha_deployment/ を参照。
今のところ Kubernetes にhelmでデプロイする手順のみが用意されている。
EC2やECSでもやれなくはない が公式手順はないので、自分でkubernetesのマニフェスト見ながら頑張るしかなさそう。
データ摂取(ingestion)
https://openobserve.ai/docs/ingestion/logs/python/#python
ログやメトリクスはFluent-bitやKinesis Firehose、curlなどさまざまなソースからHTTP APIで投入できる。
すでに構築済みのデータ投入機構があれば、投入先をOpenObserveにすればよさそう
セットアップ(セルフホスト)
https://openobserve.ai/docs/quickstart/
Dockerで簡単に起動できる
⇒ localhost:5080 で開く
サンプルデータも用意してくれているのでそれを投入すれば閲覧できる
サンプルデータを作成する
本題ではないが、今後役立ちそうなのでfakeデータをつくってみる。
fakeの作成には https://github.com/brianvoe/gofakeit を使った。
大量に作ってぶっこんでパフォーマンス検証
while true; do JSON=fake_$(date +%s).json; ./faker -count 10000 > $JSON; curl http://localhost:5080/api/default/fake/_json -i -u "root@example.com:Complexpass#123" -d "@${JSON}"; rm "${JSON}"; sleep 1; done
HA構成をKubernetesで動かす
Rancher Desktop の Kubernetes にデプロイして、HA構成を試してみる。
HA構成の場合はオブジェクトストレージが必須なので、事前に MinIOをローカルのkubernetesで動かす
⇒ OpenObserveのhelm内にminioが内包されていたので不要だった。。気づくの遅かった
そうしたらhelm chartが用意されているのでデプロイする
GitHub - openobserve/openobserve-helm-chart: Helm charts for OpenObserve
Helm charts for OpenObserve. Contribute to openobserve/openobserve-helm-chart development by creating an account on GitHub.
values.yaml
デプロイ
localhost:5080 で開く
minioの中身確認
HA構成をDocker composeで動かす
helmでデプロイされたリソースから、ある程度動くようにDocker composeに落とし込む。
⇒ docker compose up -d
で動いた
シングルノード+S3で動かす
シングルノード(一つのコンテナで全機能を動かす)モードで、ストレージはS3を使った場合の実行例
注意点
- シングルノードだとデフォルトでローカルのディスクストレージを使用するため、
ZO_LOCAL_MODE=false
を設定した。
[default]
region = ap-northeast-1
credential_source=Ec2InstanceMetadata
ElasticsearchのAPIでデータ投入する
Elasticsearchとコンパチのインターフェースを備えており、 /api/{organization}/_bulk
のAPIで投入することができる。
https://openobserve.ai/docs/api/ingestion/logs/bulk/
ES8のクライアント(https://github.com/elastic/go-elasticsearch)を使って作成する