Closed9

Grafanaを改めてやってみる

kun432kun432

過去の業務でもGrafanaは使ってきたのだけど、体系的に触ったことは一度もなくて、見様見真似・都度都度必要になったら調べて、という感じで、ぜんぜん身についた感がない。。。

以下の記事をきっかけにしてちょっと改めて体系的に触ってみようと思う。
https://dev.classmethod.jp/articles/grafana-mac-integrations/

一応最終ゴールとしては、JRAが毎週の開催前・開催中に発表している馬場情報データをGrafanaで表示するところまでやりたいと思う。

https://www.jra.go.jp/keiba/baba/

kun432kun432

クラメソさんの記事にあるのは、ホストのリソース可視化にあたると思う。自分が最終的にやりたいのは独自メトリクスの可視化になるのでちょっと異なる。

が、Grafana IntegrationsとかGrafana Alloyとかぜんぜん知らない事が増えているし、Grafana Cloudもあまり使ってないし、もはやいろんなことを忘れている。とりあえずまずはクラメソさん記事を写経する。

Grafana Cloudにログインしてスタックを(なければ)作成する。

インスタンスURLとリージョンを指定してスタックを作成

スタックが作成されるでしばらく待つ。

以下が表示されればスタックの作製は完了。作成したインスタンスにアクセス。

別タブでログイン画面が開くのでログイン。

ログインできた。

次はMacメトリクスの連携を行ってみる。

kun432kun432

ところでメトリクスの収集は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に比べて劣る部分があります。

kun432kun432

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した際のエラーログ見ても同じものがでていた。
これと何やら関連してそう? ちょっとよくわからない。。。。

https://github.com/grafana/agent/issues/6972

kun432kun432

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"

アラート。

あとは元記事にもある通り、いろいろ設定を見ていけばどのように設定すればいいか?ということもわかる。

kun432kun432

Alloyは、Agentに代わるものではあるけど、使う分にはそれほどAgentと違いはないと思って良さそう。

kun432kun432

ということで雰囲気だけ思い出したところで、Get Startedをやっていく。ちなみにOSS版のGet Started。
https://grafana.com/docs/grafana/latest/getting-started/build-first-dashboard/

インストール

https://grafana.com/docs/grafana/latest/setup-grafana/installation/

インストール方法は色々あるが、今回はDockerでやる。dockerコマンド一発でもいいのだが、やはりdocker composeを使いたいので、こちら。

https://grafana.com/docs/grafana/latest/setup-grafana/installation/docker/#run-grafana-via-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が埋まっていたので変えた。

docker-compose.yaml
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でタイトル等を生成させるという機能もあるらしい(プラグインが必要)。

ダッシュボードが作成された。

kun432kun432

次にデータソースを用意して連携させる。Get StartedにはPrometheus/InfluxDB/MSSQLサーバとの連携例が記載されている。

https://grafana.com/docs/grafana/latest/getting-started/get-started-grafana-prometheus/

https://grafana.com/docs/grafana/latest/getting-started/get-started-grafana-influxdb/

https://grafana.com/docs/grafana/latest/getting-started/get-started-grafana-ms-sql-server/

自分の場合は独自のメトリクスを時系列的に入れて可視化したいというニーズなので、InfluxDBが一番シンプルにできそう。

ということでInfluxDBについてはこちらで。

https://zenn.dev/kun432/scraps/ff26833a2f9498

一通りInfluxDBの雰囲気を掴んだので、Grafanaと連携できるようにする。

docker-compose.yamlを作成。

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。

あとは適宜保存して、他のデータについても同様に追加していけば良い。

kun432kun432

ドキュメント見てるとInfluxQLのほうがGUI的に設定はしやすいかもしれない。自分が過去Grafanaでパネルの設定する場合はこれに似たやり方が多かった記憶。


referred from https://grafana.com/docs/grafana/latest/getting-started/get-started-grafana-influxdb/

InfluxDB的にはInfluxQLとFluxはどう棲み分ける感じなのかな?InfluxDBのドキュメント見る限りは、InfluxQLは旧バージョンで使用されていたものという記載があることを踏まえると今後はFluxにしていきたいのかな?という印象を持ったのだけども。

このスクラップは3ヶ月前にクローズされました