CNCF連載 3日目はHyperDXを試してみたという記事です。とはいっても、HyperDX自体はCNCFに登録されたプロダクトでもなんでもないのですが(OpenTelemetry関連という接点はあり)、興味あったので試してみました。
HyperDXはいわゆるオブザーバービリティに属すプロダクトです。この領域のプロダクトはかなりのデータ量を扱う必要があったり、可用性のために、ストレージとビューアが分かれていたり、大量のツールと連携させる必要があったりします。
ELKスタックだと、ElasticsearchとLokiとKibana。GrafanaはLokiとPrometheusを連携させたり。OpenTelemetryのときによくデモされたJaegerはDBとビューを持ってトレースの機能を備えていてオールインワンです。
本番環境はSaaSにまるっと運用をお任せというのが良いとは思いますが、ローカルの作ったり壊したりする環境用良さそうなツールを探してみて見つけたのがHyperDXでした。
- ログ、メトリックス、トレースに対応
- ストレージもUIも持っている
- OpenTelemetry対応
HyperDX自身はプロダクション環境でも使えるレベルのプロダクトのようです。管理画面のユーザー管理も厳しいパスワード条件の要求などもしてきます。今回はローカル開発で気軽に使いたい、という目的だったので、管理ユーザーもないローカル版を入れます。ユーザー管理付きのオールインワン版とか、クラウドのClickHouseストレージを使うバージョンとかもあります。
以下のDockerコマンドで起動します。
$ docker run -p 4318:4318 -p 4317:4317 -p 8080:8080 |
ウェブのインタフェースが8080ポート、gRPCの情報受付が4317ポートです。
なお、このイメージは永続化可能なパスが3つあります。ローカルで気軽に使いたいという用途なのでログ自身は消えても良いので管理画面のデータだけ永続化するようにしています。
/data/db
(HyperDXの管理画面で設定する情報を保持するMongoDBのデータ)/var/lib/clickhouse
(バックエンドのDBのClickHouseのデータ)/var/log/clickhouse-server
(バックエンドのDBのClickHouseのログ)
Pythonアプリケーションを作る
OpenTelemetryで情報を出力するPythonアプリケーションを作ります。FastAPIで作ります。
mkdir pysample |
OpenTelemetryのトレースのspanを追加するために、traceパッケージを利用します。いまどきのOpenTelemetryはゼロコードコンフィグということで、接続先の情報はプログラムに書いたりしないという方法が追加されたようです。言語によって手法は違うようですが、モンキーパッチやeBPFなんかを利用するようです。なので接続情報はこのコードにはありません。
uv add opentelemetry-api opentelemetry-sdk |
import logging |
今回はuvを使っていますが、uvの場合はちょっと問題があって回避の手順が別のページにあります。その手順の通りに行います。uv pip install
はuv add
とは異なりpyproject.toml
にパッケージは追加しません。opentelemetry-bootstrapというコマンドが有名どころのPythonライブラリを検知して、それに対応した計装ライブラリをピックアップします。なかなか力技。
uv pip install opentelemetry-distro opentelemetry-exporter-otlp |
これはuv pip install
で入れているのでuv pip compile pyproject.toml
には出てきません。uv pip freeze > requirements.txt
でrequirements.txt
を作る必要があります。
以下のコマンドで起動して、 http://localhost:8000/ で起動してログを送ります。設定は環境変数とopentelemetry-instrument
コマンドラッパーの--service_name
といった引数で渡す方法が選べますが、真設定は環境変数にしといた方がDockerとかにするときに便利かと思って環境変数にしています。
デフォルトのOTLPのプロトコルはgrpcですが、この場合はhttpsになってしまい証明書エラーが出てしまいます。今回はローカルなので証明書はいらないhttp/protobufもしくはhttp/jsonにします。
export OTEL_SERVICE_NAME=hyperdx-demo |
結構はまったのですが、fastapi dev
の開発モードだとログとかは出てこないですね。ちょっと不便。
UIの設定
ローカルモードだとユーザー設定などはありませんので、いきなりコネクション選択が表示されます。オールインワンのイメージだとパスワード設定などがあります。このコネクションは緑のCreateを押せばOKです。

引き続きデータソース入力が表示されます。最初は二進も三進もわからなかったのですが、こちらの情報を見れば少しは歯が立ちます。

以下の2つのソースを設定しました。名前、ソースタイプ、テーブル以外はデフォルトのままです。
- Name: Logs
- Data Source Type: Logs
- Table:
otel_logs
- Name: Traces
- Data Source Type: Trace
- Table:
otel_traces
ログを見てみる
左上のメニューでSearchを選び、データソースを選択すると出力したログ一覧が見れます。クリックすると時間や出力したサービスなど詳細な情報が見れます。いちいちデータソース選択とか面倒と思われるかもしれませんが、プロダクションで超大規模サービスを想定してでしょうね。同じ種類のデータでも日ごとにパーティションを切って別テーブルに、とかそういうのを想定しているのかと思います。

トレースは、それぞれのログをクリックしたあとに、トレースのタグを選択します。右側でトレースのデータソースを選択すると、いつものトレースが見られます。ログのデータソース設定のオプショナル中くれている設定に関連するトレースデータソースを設定できるので、そこを設定しておくとクリックは不要になります。動作は軽快です。

まとめ
ローカルでログやトレースが見れるHyperDXを試してみました。メトリクスも本当は見られたりするのですがダッシュボード設定が難しくまた今度にしようかと。あと、ウェブの操作画面を記録するセッション機能とやらもあるのですが、機能とかが多くてちょっとこちらも時間を設けてゆっくり調べてみようと思います。
OpenTelemetryでデータ投入できるので、本番環境のクラウドサービスのログ基盤とかにもスムーズに遷移できる気がします。
設定がyamlかなにかで軽く共有できれば開発用Dockerとかで気軽に立ち上げてみんなで見るとかやりたいところですが、ちょっとそこはローカル専用にするにはちょっと不便。