Grafanaを改めてやってみる
過去の業務でもGrafanaは使ってきたのだけど、体系的に触ったことは一度もなくて、見様見真似・都度都度必要になったら調べて、という感じで、ぜんぜん身についた感がない。。。
以下の記事をきっかけにしてちょっと改めて体系的に触ってみようと思う。
一応最終ゴールとしては、JRAが毎週の開催前・開催中に発表している馬場情報データをGrafanaで表示するところまでやりたいと思う。
クラメソさんの記事にあるのは、ホストのリソース可視化にあたると思う。自分が最終的にやりたいのは独自メトリクスの可視化になるのでちょっと異なる。
が、Grafana IntegrationsとかGrafana Alloyとかぜんぜん知らない事が増えているし、Grafana Cloudもあまり使ってないし、もはやいろんなことを忘れている。とりあえずまずはクラメソさん記事を写経する。
Grafana Cloudにログインしてスタックを(なければ)作成する。
インスタンスURLとリージョンを指定してスタックを作成
スタックが作成されるでしばらく待つ。
以下が表示されればスタックの作製は完了。作成したインスタンスにアクセス。
別タブでログイン画面が開くのでログイン。
ログインできた。
次はMacメトリクスの連携を行ってみる。
ところでメトリクスの収集はGrafana Agentから今後はGrafana Alloyに変わるとのことだが、Agentがダメな理由がいまいちピンとこなかったので、gensparkで聞いてみたらこんな感じだった。
Q: grafana agentとgrafana alloyの違いは何でしょうか?
A: Grafana AgentとGrafana Alloyの違いについて詳しく説明します。基本的な概要と目的
- Grafana Agent:
- Grafana Agentは、オープンソースのテレメトリ収集ツールで、PrometheusやOpenTelemetryなどのエコシステムと互換性があります。主にメトリクス、ログ、トレース、プロファイルのデータを収集し、処理し、送信するために使用されます12。
- Grafana Agentは、Static mode、Static mode Kubernetes operator、Flow modeの3つのバリアントがあり、それぞれ異なる機能を提供します1。
- Grafana Alloy:
- Grafana Alloyは、OpenTelemetry Collectorのディストリビューションであり、Grafana Agentの後継として設計されています。Alloyは完全にOTLP互換であり、OpenTelemetryおよびPrometheusのテレメトリフォーマットをネイティブにサポートします23。
- Alloyは、メトリクス、ログ、トレース、およびプロファイルをサポートし、Grafana Agentおよび他のエージェントが提供するすべての機能を統合しています2。
デプロイメントとサポート
- Grafana Agent:
- Grafana Agentは2025年10月31日まで長期サポート(LTS)フェーズに入り、新しい機能更新は行われず、重要なバグ修正とセキュリティ修正のみが提供されます。2025年11月1日にエンドオブライフ(EOL)を迎えます123。
- Flow modeやStatic mode Kubernetes operatorなど複数のデプロイメントオプションがありますが、新しいデプロイメントには推奨されません13。
- Grafana Alloy:
- Alloyは新しいデプロイメントに推奨されており、多くの機能が統合されています。Helmを使用して簡単にデプロイできるようになっており、クラスタリング機能もサポートしています23。
- Grafana Cloudとの統合もスムーズであり、新しいインストールにはAlloyを使用することが推奨されています23。
機能と互換性
- Grafana Agent:
- PrometheusやOpenTelemetryなどのエコシステムと互換性があり、多様なテレメトリデータを収集できます。特にFlow modeでは、ベンダーニュートラルな設定やデバッグ機能が強化されています13。
- eBPFやGolangプロファイリングなどもサポートしていますが、新しい機能追加は行われません2。
- Grafana Alloy:
- OpenTelemetry Collectorとして設計されており、PrometheusやOpenTelemetryのネイティブパイプラインをサポートします。これにより、一貫したテレメトリデータ収集が可能です23。
- eBPFやGolangプロファイリングも引き続きサポートされており、新しい機能や改善が継続的に追加される予定です2。
移行ガイド
- Grafana AgentからAlloyへの移行:
- Grafana Labsは移行ツールやガイドを提供しており、現在Grafana Agentを使用しているユーザーにはAlloyへの移行が推奨されています。具体的な移行手順やコンバータも用意されています23。
結論
Grafana Agentは長期サポートフェーズに入り、新しいインストールには推奨されません。一方で、Grafana Alloyはその後継として設計されており、多くの新機能と改善が含まれています。現在Grafana Agentを使用している場合は、Alloyへの移行を検討することが推奨されます。
Q: 将来的なサポートと言う観点は理解するとして、それ以外に、agentからalloyに変わる理由はありますか?
A: 将来的なサポート以外にも、Grafana AgentからGrafana Alloyに移行する理由はいくつかあります。1. 統合された機能
Grafana Alloyは、Grafana Agentのすべての機能を統合し、さらに多くの機能を提供します。これにより、メトリクス、ログ、トレース、およびプロファイルを一元的に管理できるため、運用が簡素化されます12。
2. 100% OTLP互換
AlloyはOpenTelemetry Protocol (OTLP) に完全に対応しており、標準化された方法でデータを収集・送信できます。これにより、異なるシステム間でのデータ互換性が向上し、データの一貫性が保たれます1。
3. ネイティブパイプラインのサポート
AlloyはOpenTelemetryおよびPrometheusのネイティブパイプラインをサポートしており、一貫したテレメトリデータ収集が可能です。これにより、データ収集と処理の効率が向上します12。
4. クラスタリング機能
Alloyはクラスタリング機能をサポートしており、高可用性と負荷分散を実現します。これにより、大規模な運用環境でも安定したパフォーマンスを提供できます23。
5. 簡素化された設定
Grafana AgentのFlowモードやRiverコンセプトは廃止され、新しいAlloy構文を使用した.alloyファイルで設定が行われます。これにより、設定が簡素化され、管理が容易になります1。
6. 移行ツールとガイドの提供
Grafana Labsは移行ツールやガイドを提供しており、現在Grafana Agentを使用しているユーザーにはAlloyへの移行が推奨されています。具体的な移行手順やコンバータも用意されているため、スムーズな移行が可能です13。
これらの理由から、Grafana AgentからGrafana Alloyへの移行は多くの利点があります。
Q: んー、ちょっとよくわかりませんね、聞き方を変えましょう、agentがalloyに比べて劣る部分ってなんでしょうか?
A: Grafana AgentがGrafana Alloyに比べて劣る部分について説明します。統合された機能の欠如
Grafana Agentは、メトリクス、ログ、トレース、およびプロファイルのデータを収集するために設計されていますが、これらの機能が完全に統合されていません。一方、Grafana Alloyはこれらすべての機能を一元的に管理できるため、運用が簡素化されます12。
OTLP互換性の不足
Grafana AgentはOpenTelemetry Protocol (OTLP) に完全には対応していません。これに対し、Grafana Alloyは100% OTLP互換であり、標準化された方法でデータを収集・送信できます。これにより、異なるシステム間でのデータ互換性が向上し、データの一貫性が保たれます1。
クラスタリング機能の欠如
Grafana Agentはクラスタリング機能をサポートしていません。これに対し、Grafana Alloyはクラスタリング機能をサポートしており、高可用性と負荷分散を実現します。これにより、大規模な運用環境でも安定したパフォーマンスを提供できます23。
設定の複雑さ
Grafana Agentの設定は複雑であり、特にFlowモードやStaticモードKubernetesオペレーターなど複数のモードが存在します。これに対し、Grafana Alloyは新しいAlloy構文を使用した.alloyファイルで設定が行われるため、設定が簡素化され、管理が容易になります1。
移行ツールとガイドの提供不足
Grafana AgentからGrafana Alloyへの移行を支援するためのツールやガイドが提供されていますが、Grafana Agent自体には移行ツールやガイドが不足しています。これにより、移行プロセスがスムーズに進まない可能性があります13。
これらの理由から、Grafana AgentはGrafana Alloyに比べて劣る部分があります。
Macメトリクスの連携。初回だと"Add New connections"が開いていると思う。そのままmacOS
で検索すると表示される。
設定の仕方が表示されるので、それに従って設定すれば良い。
プラットフォームの設定。自分はApple Silicon MacなのでArm64
、そしてインストールはなれたHomebrew
を選択。
Grafana Alloyのインストール。
トークンを作成。
以下のようにトークンが作成され、それに基づいた設定および設定手順が表示される。これに従ってMac側でGrafana Alloyをインストール・設定していく。
Grafana AlloyをHomebrewでインストール
$ brew install grafana/grafana/alloy
設定手順に表示されている"Set up the Alloy configuration"のコマンドをコピーして実行。
実行するとパスワードを聞かれるので入力すれば実行準備完了。
--- Retrieving config and placing in '/opt/homebrew/etc/alloy/config.alloy'
Password:
--- Alloy is ready to run
Grafana Alloyをサービスとして起動する
$ brew services start alloy
接続テスト
失敗
brewで確認してみるとどうもサービスが上がっていない。。。
$ brew services info alloy
alloy (homebrew.mxcl.alloy)
Running: ✘
Loaded: ✔
Schedulable: ✘
色々調べてみたけど原因がわからない、直接あげてみる。Homebrewでインストールした際に表示されていたコマンドを実行。
To start grafana/grafana/alloy now and restart at login:
brew services start grafana/grafana/alloy
Or, if you don't want/need a background service you can just run:
/opt/homebrew/opt/alloy/bin/alloy run /opt/homebrew/etc/alloy/config.alloy --server.http.listen-addr\=127.0.0.1:12345 --storage.path\=/opt/homebrew/var/lib/alloy/data
$ /opt/homebrew/opt/alloy/bin/alloy run /opt/homebrew/etc/alloy/config.alloy --server.http.listen-addr\=127.0.0.1:12345 --storage.path\=/opt/homebrew/var/lib/alloy/data
panic: pattern "GET /debug/pprof/" (registered at net/http/pprof/pprof.go:100) conflicts with pattern "/debug/pprof/delta_heap" (registered at github.com/grafana/pyroscope-go/godeltaprof@v0.1.7/http/pprof/pprof.go:24):
GET /debug/pprof/ matches fewer methods than /debug/pprof/delta_heap, but has a more general path pattern
goroutine 1 [running]:
net/http.(*ServeMux).register(...)
net/http/server.go:2797
net/http.HandleFunc({0x1400246b2c0?, 0x107286130?}, 0x1092389c0?)
net/http/server.go:2791 +0x9c
net/http/pprof.init.0()
net/http/pprof/pprof.go:100 +0x94
brew services startした際のエラーログ見ても同じものがでていた。
これと何やら関連してそう? ちょっとよくわからない。。。。
Homebrewをやめてバイナリインストールする
一旦HomebrewでインストールしたGrafana Alloyをアンインストール。設定ファイルも一旦消しておく。
$ brew uninstall grafana/grafana/alloy
$ rm -rf /opt/homebrew/etc/alloy /opt/homebrew/etc/alloy/config.alloy
インストール方法をBinaryに変更。
"Run Grafana Alloy"をクリック
バイナリインストールの場合の手順が表示されるのでこれに従って進める。
バイナリのダウンロード
$ curl -O -L "https://github.com/grafana/alloy/releases/latest/download/alloy-darwin-arm64.zip" \
&& unzip "alloy-darwin-arm64.zip" \
&& chmod a+x "alloy-darwin-arm64"
$ ls -lt alloy-darwin-arm64
-rwxr-xr-x@ 1 kun432 staff 214306226 8 5 22:03 alloy-darwin-arm64
設定手順に表示されている"Set up the Alloy configuration"のコマンドをコピーして実行。
起動
$ ./alloy-darwin-arm64 run /etc/alloy/config.alloy
以下のように表示されればOK。今回はお試しなのでターミナルはこのままにしておく。
ts=2024-08-22T19:08:00.432648Z level=info msg="now listening for http traffic" service=http addr=127.0.0.1:12345
接続テスト
OK!設定の続きを進める。
収集するメトリクスの設定
各項目はこんな感じ。
-
Extended Metrix
- デフォルトでは、ビルトインで事前に用意されたダッシュボードとアラートに必要なメトリクスのみが含まれる。
- 拡張メトリクスでは、標準のダッシュボードやアラートに必要なもの以外の追加メトリクスが含まれ、カスタムダッシュボードの作成や、より複雑なクエリの実行に使用できる。
-
Include Logs
- ログを送信するかどうか
-
Include Alerts
- アラートをインストールするかどうか
- セットアップタイプ
-
Simple set-up
- Alloyを単一のホストまたはマシンで実行する場合は、このオプションを選択
-
Advanced set-up
- Alloyをリモートホストで実行している場合、または複数のノードをスクレイピングしている場合は、このオプションを選択
-
今回は元記事と同じようにしてみた。
次にメトリクス設定を反映する。表示されている設定をコピーして/etc/alloy/config.alloy
に「追記」する。
$ vi /etc/alloy/config.alloy
追記したら反映。先程のターミナルに戻ってCtrl+Cで一旦止めて、再度実行。
$ ./alloy-darwin-arm64 run /etc/alloy/config.alloy
テスト接続
テストもOK
ダッシュボードとアラートをインストールする。
ではリンクからダッシュボードとアラートをそれぞれ確認する。Commandキー+クリックで新しいタブで開いたほうがいいかも。
ダッシュボード。"overview"と"logs"をそれぞれクリック。
"overview"
"logs"
アラート。
あとは元記事にもある通り、いろいろ設定を見ていけばどのように設定すればいいか?ということもわかる。
Alloyは、Agentに代わるものではあるけど、使う分にはそれほどAgentと違いはないと思って良さそう。
ということで雰囲気だけ思い出したところで、Get Startedをやっていく。ちなみにOSS版のGet Started。
インストール
インストール方法は色々あるが、今回はDockerでやる。dockerコマンド一発でもいいのだが、やはりdocker composeを使いたいので、こちら。
$ mkdir grafana-test && cd grafana-test
データはバインドマウントさせたいので、事前に作成してUID/GIDも確認。
$ mkdir data
$ id -u
1000
$ id -g
1000
docker-compose.yamlを作成
$ vi docker-compose.yaml
中身はこんな感じで。ポートは3000が埋まっていたので変えた。
services:
grafana:
image: grafana/grafana-enterprise
container_name: grafana
restart: unless-stopped
ports:
- 3333:3000
volumes:
- "./data:/var/lib/grafana"
user: "1000:1000"
起動
$ docker compose up -d
ブラウザでアクセスするとログイン画面が表示されるので、admin
/admin
でログイン。
パスワードの変更を求められるので適宜変更
ログイン完了
ダッシュボードの作成
メニューから"Dashboards"をクリック
"+ Create dashboard"をクリック
"+ Add visualization"をクリック
今回はGrafanaが用意しているモックデータを使う。"-- Grafana --"をクリック。
モックデータのグラフが表示される。
リフレッシュしてみる。
グラフの表示が代わる。ちなみに毎回変わるみたい。
保存
適当な名前と説明を追加して保存する。なお、生成AIでタイトル等を生成させるという機能もあるらしい(プラグインが必要)。
ダッシュボードが作成された。
次にデータソースを用意して連携させる。Get StartedにはPrometheus/InfluxDB/MSSQLサーバとの連携例が記載されている。
自分の場合は独自のメトリクスを時系列的に入れて可視化したいというニーズなので、InfluxDBが一番シンプルにできそう。
ということでInfluxDBについてはこちらで。
一通りInfluxDBの雰囲気を掴んだので、Grafanaと連携できるようにする。
docker-compose.yamlを作成。
services:
grafana:
image: grafana/grafana-enterprise
container_name: grafana
restart: unless-stopped
ports:
- 3333:3000
volumes:
- grafana-data:/var/lib/grafana
user: "1000:1000"
networks:
- grafana-network
influxdb:
image: influxdb:2
container_name: influxdb
restart: unless-stopped
ports:
- 8086:8086
environment:
DOCKER_INFLUXDB_INIT_MODE: setup
DOCKER_INFLUXDB_INIT_USERNAME_FILE: /run/secrets/influxdb-admin-username
DOCKER_INFLUXDB_INIT_PASSWORD_FILE: /run/secrets/influxdb-admin-password
DOCKER_INFLUXDB_INIT_ADMIN_TOKEN_FILE: /run/secrets/influxdb-admin-token
DOCKER_INFLUXDB_INIT_ORG: docs
DOCKER_INFLUXDB_INIT_BUCKET: home
secrets:
- influxdb-admin-username
- influxdb-admin-password
- influxdb-admin-token
volumes:
- type: volume
source: influxdb-data
target: /var/lib/influxdb2
- type: volume
source: influxdb-config
target: /etc/influxdb2
networks:
- grafana-network
secrets:
influxdb-admin-username:
file: .env.influxdb-admin-username
influxdb-admin-password:
file: .env.influxdb-admin-password
influxdb-admin-token:
file: .env.influxdb-admin-token
volumes:
grafana-data:
influxdb-data:
influxdb-config:
networks:
grafana-network:
InfluxDBの管理者ユーザの設定ファイルを作成
$ echo "admin" > .env.influxdb-admin-username
$ echo "admin" > .env.influxdb-admin-password
$ echo "MyInitialAdminToken0==" > .env.influxdb-admin-token
起動。
$ docker compose up -d
$ docker compose ps
NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS
grafana grafana/grafana-enterprise "/run.sh" grafana 12 seconds ago Up 11 seconds 0.0.0.0:3333->3000/tcp, :::3333->3000/tcp
influxdb influxdb:2 "/entrypoint.sh infl…" influxdb 12 seconds ago Up 11 seconds 0.0.0.0:8086->8086/tcp, :::8086->8086/tcp
InfluxDBにデータを投入。本来はきちんとInfluxDBの初期設定を行うだが、今回は簡単のため初期設定をスキップして、デフォルトのものを使う。
- Organization名:
docs
- バケット名:
home
- APIトークン:
.env.influxdb-admin-token
で設定したMyInitialAdminToken0==
データの投入はInflux CLIで。
$ docker compose exec -ti influxdb bash
root@299a8c065aac:/#
サンプルはInfluxDBのサンプルに準じたものを使った。自宅内センサーで温度・湿度・二酸化炭素濃度を部屋ごとに記録するといったものになっている(タイムスタンプは2024/08/25)
$ influx write \
--bucket home \
--precision s "
home,room=リビング temp=21.1,hum=35.9,co=0i 1724572800
home,room=キッチン temp=21.0,hum=35.9,co=0i 1724572800
home,room=リビング temp=21.4,hum=35.9,co=0i 1724576400
home,room=キッチン temp=23.0,hum=36.2,co=0i 1724576400
home,room=リビング temp=21.8,hum=36.0,co=0i 1724580000
home,room=キッチン temp=22.7,hum=36.1,co=0i 1724580000
home,room=リビング temp=22.2,hum=36.0,co=0i 1724583600
home,room=キッチン temp=22.4,hum=36.0,co=0i 1724583600
home,room=リビング temp=22.2,hum=35.9,co=0i 1724587200
home,room=キッチン temp=22.5,hum=36.0,co=0i 1724587200
home,room=リビング temp=22.4,hum=36.0,co=0i 1724590800
home,room=キッチン temp=22.8,hum=36.5,co=1i 1724590800
home,room=リビング temp=22.3,hum=36.1,co=0i 1724594400
home,room=キッチン temp=22.8,hum=36.3,co=1i 1724594400
home,room=リビング temp=22.3,hum=36.1,co=1i 1724598000
home,room=キッチン temp=22.7,hum=36.2,co=3i 1724598000
home,room=リビング temp=22.4,hum=36.0,co=4i 1724601600
home,room=キッチン temp=22.4,hum=36.0,co=7i 1724601600
home,room=リビング temp=22.6,hum=35.9,co=5i 1724605200
home,room=キッチン temp=22.7,hum=36.0,co=9i 1724605200
home,room=リビング temp=22.8,hum=36.2,co=9i 1724608800
home,room=キッチン temp=23.3,hum=36.9,co=18i 1724608800
home,room=リビング temp=22.5,hum=36.3,co=14i 1724612400
home,room=キッチン temp=23.1,hum=36.6,co=22i 1724612400
"
$ exit
InfluxDBはこれでOK。
次にGrafana。管理画面ログインしてパスワード再設定等は実施しておく。
最初にInfluxDBをデータソースとして追加する。左のメニューから、"Add new connection"をクリック。
InfluxDBを検索してクリック
"Add new data source"をクリック
InfluxDBコンテナへの接続設定を行う。
設定内容は以下
項目 | 値 | 備考 |
---|---|---|
Query Language | Flux |
InfluxQLを使う場合、InfluxDB側でも設定が必要&以下の設定項目も多少変わる |
HTTP - URL | http://influxdb:8086 |
InfluxDBコンテナは同じネットワークに接続されているのでサービス名だけでOK |
Auth - With Credential | オフ | トークンで接続するのでオフ |
InfluxDB Details - Oranization | docs |
|
InfluxDB Details - Token | MyInitialAdminToken0== |
|
InfluxDB Details - Default Bucket | home |
”Save & test”をクリックして以下のように表示されればOK
ダッシュボードを作成する。
データソースの指定でInfluxDBが表示されていると思うのでこれを選択。
パネルの設定画面になる。ここで可視化したいデータごとにFluxクエリを設定していく。
以下のクエリを追加する。複数のクエリを追加する場合は"Add query"をクリックすればよい。
from(bucket: "home")
|> range(start: v.timeRangeStart, stop: v.timeRangeStop)
|> filter(fn: (r) => r["_measurement"] == "home")
|> filter(fn: (r) => r["_field"] == "co")
|> filter(fn: (r) => r["room"] == "リビング" )
from(bucket: "home")
|> range(start: v.timeRangeStart, stop: v.timeRangeStop)
|> filter(fn: (r) => r["_measurement"] == "home")
|> filter(fn: (r) => r["_field"] == "co")
|> filter(fn: (r) => r["room"] == "リビング" )
ダッシュボードをリフレッシュ,適当に時間軸を変更して、以下のように表示されればOK。
あとは適宜保存して、他のデータについても同様に追加していけば良い。
ドキュメント見てるとInfluxQLのほうがGUI的に設定はしやすいかもしれない。自分が過去Grafanaでパネルの設定する場合はこれに似たやり方が多かった記憶。
referred from https://grafana.com/docs/grafana/latest/getting-started/get-started-grafana-influxdb/
InfluxDB的にはInfluxQLとFluxはどう棲み分ける感じなのかな?InfluxDBのドキュメント見る限りは、InfluxQLは旧バージョンで使用されていたものという記載があることを踏まえると今後はFluxにしていきたいのかな?という印象を持ったのだけども。