S3 + Grafana + DuckDB を otel-lgtm イメージで簡単に試した。難航したけどなんとかした
巷で話題の S3 + Grafana + DuckDB でAthena要らずというやつを試しました。
S3接続部分はDuckDBの機能なので Evidence でも使えそうです(未検証)。
S3だけでなくS3互換オブジェクトストレージで利用できるので、AWSだけでなくGoogle Cloudやさくらインターネットなんかでも使えると思います(未検証)。
さてさて、Grafana Labs発のプロダクト群は LGTMスタック と呼ばれています。
Loki: ログ, Grafana: 可視化, Tempo: トレース, Mimir: メトリクスです。
これらを簡単に試すDockerイメージの otel-lgtm があります。
- GitHub – grafana/docker-otel-lgtm: OpenTelemetry backend in a Docker image
- grafana/otel-lgtm – Docker Image | Docker Hub
このotel-lgtmイメージを使えば S3 + Grafana + DuckDB も簡単に試せるんじゃないか、ということでやってみたら難航したけどなんとかなったので共有します。
Table of Contents
短いまとめ
- S3 + Grafana + DuckDB で利用するプラグインの motherduckdb/grafana-duckdb-datasource は動作に GLIBCXX_3.4.30 が必要
- otel-lgtm イメージは GLIBCXX_3.4.29 まで対応している
- プラグインをotel-lgtmイメージ内でビルドすれば使えるようになる
はい。力技です。
試す手順
- 1.
.env
ファイルを作る - 2.
Dockerfile
を作る - 3.build して run する
1..env
ファイルを作る
こんな感じの .env
ファイルを置きます。
使う項目は適宜コメントアウトを解除したり、書き換えたりしてください。
APIキーで試すのが簡単なのでここではそのように。 AWS内で動作させていたりで認証情報が環境から受け取れる場合は不要かも🦆
#AWS_ACCESS_KEY_ID=
#AWS_SECRET_ACCESS_KEY=
#AWS_REGION=
#ENABLE_LOGS_ALL=true
#ENABLE_LOGS_GRAFANA=true
#ENABLE_LOGS_LOKI=true
#ENABLE_LOGS_OTELCOL=true
#ENABLE_LOGS_PROMETHEUS=true
#ENABLE_LOGS_TEMPO=true
2.Dockerfile
を作る
motherduckdb/grafana-duckdb-datasourceに従ってビルドします。
なんとなく上書きしてますが、きちんとビルドできているなら上書きじゃなくてもいいかも🦆
# Dockerfile
# build stage
FROM docker.io/grafana/otel-lgtm:latest AS builder
# requirements
RUN dnf -y install gcc gcc-c++ make git
# nodejs
RUN dnf -y install xz \
&& curl -L https://nodejs.org/dist/v22.14.0/node-v22.14.0-linux-x64.tar.xz | xz -d - | tar xf - -C /usr/local \
&& ln -s /usr/local/node-v22*/bin/* /usr/local/bin/.
# golang
RUN curl -L https://go.dev/dl/go1.24.0.linux-amd64.tar.gz | tar zxf - -C /usr/local \
&& ln -s /usr/local/go/bin/* /usr/local/bin/.
# mage
RUN go install github.com/magefile/mage@latest
# motherduck-duckdb-datasource
RUN mkdir -p /data/motherduck-duckdb-datasource || : \
&& curl -LO https://github.com/motherduckdb/grafana-duckdb-datasource/releases/download/0.1.0-b/motherduck-duckdb-datasource-0.1.0.zip \
&& unzip motherduck-duckdb-datasource-0.1.0.zip -d /data/motherduck-duckdb-datasource
# motherduck-duckdb-datasource build, overwrite
RUN cd /tmp \
&& git clone https://github.com/motherduckdb/grafana-duckdb-datasource.git \
&& cd grafana-duckdb-datasource/ \
&& git submodule update --init \
&& /root/go/bin/mage -v build:Linux build:GenerateManifestFile \
&& npm install \
&& npm run build \
&& yes | cp -rf dist/* /data/motherduck-duckdb-datasource/.
# enable motherduck-duckdb-datasource(unsigned)
RUN sed -i -E 's/^(allow_loading_unsigned_plugins =)/\1 motherduck-duckdb-datasource/' /otel-lgtm/grafana/conf/defaults.ini
# final stage
FROM docker.io/grafana/otel-lgtm:latest
COPY --from=builder /data/motherduck-duckdb-datasource /data/motherduck-duckdb-datasource
COPY --from=builder /otel-lgtm/grafana/conf/defaults.ini /otel-lgtm/grafana/conf/defaults.ini
CMD ["bash", "-c", "mkdir -p /data/grafana/plugins/ || : ; ln -s /data/motherduck-duckdb-datasource /data/grafana/plugins/. ; /otel-lgtm/run-all.sh"]
3.build して run する
# build
docker pull docker.io/grafana/otel-lgtm:latest
docker build -t otel-lgtm-duck .
# run
docker run \
--rm \
--name lgtm \
-p 3000:3000 \
-p 4317:4317 \
-p 4318:4318 \
-ti \
-v "$PWD"/container/grafana:/data/grafana \
-v "$PWD"/container/prometheus:/data/prometheus \
-v "$PWD"/container/loki:/data/loki \
-e GF_PATHS_DATA=/data/grafana \
-e GF_PLUGIN_DIR=/data/grafana/plugins \
--env-file .env \
otel-lgtm-duck:latest
デバッグするとどうなる
まず.env
で ENABLE_LOGS_GRAFANA=true にしてログを見る。
するとプラグイン実行に失敗していることがわかるので docker exec -it lgtm /bin/bash
でコンテナーに入ってプラグインを実行してみるとエラーになる。
./gpx_duckdb_datasource_linux_amd64: /lib64/libstdc++.so.6: version `GLIBCXX_3.4.30' not found (required by ./gpx_duckdb_datasource_linux_amd64)
動き出すと軽快で楽ちんなのでご活用ください。
Grafanaまで使わずとも、DuckDBだけ使うのも大いにアリかな。
CloudShellでDuckDB使ってログ解析はすごく体験が良いのですが、前提としてログバケット内のプレフィックス設計とかログフォーマットがいい感じに分析しやすくなっていることが重要ですね。