keyboard_double_arrow_up

Blog X-Tech5エンジニアがお送りするテックブログ
SREやDevOpsをはじめ、インフラエンジニアリングの実践情報を届けします。

S3 + Grafana + DuckDB を otel-lgtm イメージで簡単に試した。難航したけどなんとかした

2025年2月21日 

巷で話題の S3 + Grafana + DuckDB でAthena要らずというやつを試しました。

S3接続部分はDuckDBの機能なので Evidence でも使えそうです(未検証)。

S3だけでなくS3互換オブジェクトストレージで利用できるので、AWSだけでなくGoogle Cloudやさくらインターネットなんかでも使えると思います(未検証)。


さてさて、Grafana Labs発のプロダクト群は LGTMスタック と呼ばれています。

Loki: ログ, Grafana: 可視化, Tempo: トレース, Mimir: メトリクスです。

これらを簡単に試すDockerイメージの otel-lgtm があります。

このotel-lgtmイメージを使えば S3 + Grafana + DuckDB も簡単に試せるんじゃないか、ということでやってみたら難航したけどなんとかなったので共有します。

短いまとめ

  • 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使ってログ解析はすごく体験が良いのですが、前提としてログバケット内のプレフィックス設計とかログフォーマットがいい感じに分析しやすくなっていることが重要ですね。