1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

コンテナのことを全く知らない一般人がRaspberry pi上でInfluxDB +Grafanaコンテナを作ってグラフ表示

Last updated at Posted at 2024-10-14

基本的に私は怠惰です。
よってコードなんか一から作りたくないし、できることならコピペで行きたい!!!!
でもって生活豊かにしたい!!!!

な状況でいままでSwitchbotのAPIをかまってきていなかったのですが、ちょっとかまってみようかな、その結果蓄積してグラフを見てみたいなと思いついた次第。

基本的には初心者(私)の

  1. コンテナってどういうもの?
  2. 過去事例の見返し
  3. 各ソフトに関しての知見

がこの投稿の目的です。
初心者なので認識等がすごく曲解/間違っている可能性が高いですが指摘等していただけると知見の積み上げになります

なぜなに

  • なぜコンテナ上で?
    ざっと検索したところコンテナ作成例が多くみられた。
    今までかまっていなかったため、便利なら使いたいなー程度のノリ
  • なぜRaspberrypi?
    データベースの蓄積が重要です。ということは常時稼働(消費電力)が必要です。
    よってRaspberry pi 4(Linux)上で作成できれば64Bit対応したらしい2Wでも稼働できるかもしれないし、NAS稼働もできるかもしれない。
    ただ初回からNAS稼働だと最悪NASの初期化も考えなければいけない可能性もあるので、それだったらSD初期化で済むRaspberry piは知見を学ぶには良。

コンテナとは?

初期定義何もないWebソフトウェア。
よってそのまま起動しただけではほぼ役に立つことはないが、そこのところはいろいろ便利なことが考えられている

  • ポートの割り付けが自由自在
  • データの保存場所設定が可能
  • ネットワークの分離等の設定が可能
  • 初期設定なども文章設定できる

だがこれをコマンドで打とうとすると覚えてられるかぁぁ!!!( ノ ゚ー゚)ノ
となるのは当然である。しかも一つ一つにこれが必要なわけで…
そんなあなたに朗報です。
DockerのLinux版にはDocker composeというソフトがあります。
どこかに./dockerフォルダを作りましょう(名称は任意)
その下部にcompose.yamlを作成します。
これの中に任意の設定を入れてdocker compose up -dをすればあら不思議!
ソフトが立ち上がるではありませんか!!!
ちなみにこのyamlファイルですが、

services:
  software1:
    image:image1
  software2:
    image:image2

と記載すればすべてのイメージが立ち上がります。便利!!
ちなみに検索するとdocker-composeというコマンドがQiitaの中で大量に見つかりますが、今はdocker composeに置き換わっています。(VersionがV1→V2になりました。)

とりあえずいろいろインストールから起動まで

まずは何よりインストール

sudo apt install docker.io
sudo usermod -aG docker $USER

先ほど前項のようにフォルダを作成後、
とりあえずyamlには以下を記載して実行してみましょう

compose.yaml
services:
  grafana:
    image: grafana/grafana
    container_name: grafana
    environment:
      - GF_AUTH_ANONYMOUS_ENABLED=true
    volumes:
      - grafana-storage:/var/lib/grafana
    ports:
      - 3000:3000
    networks:
      - frontend

  influxdb:
    image: influxdb:2.7.6
    container_name: influxdb
    volumes:
      - ./influxdb2/data/:/var/lib/influxdb2/
      - ./influxdb2/config/:/etc/influxdb2/
    ports:
      - 8086:8086
    environment:
      - DOCKER_INFLUXDB_INIT_MODE=setup
      - DOCKER_INFLUXDB_INIT_USERNAME=xxxxxxxxx
      - DOCKER_INFLUXDB_INIT_PASSWORD=xxxxxxxxx
      - DOCKER_INFLUXDB_INIT_ORG=xxxxxxxxx
      - DOCKER_INFLUXDB_INIT_BUCKET=xxxxxxxxx
    networks:
      - frontend

networks:
  frontend:
    driver: bridge
    ipam:
      driver: default

volumes:
  grafana-storage:

そうすれば対象のポートでWebアプリが開かれているはずです。
たまにポートが開かれていない場合はdocker compose ps -aで立ち上がっているか確認しましょう。
volumesの作成がrootになっていたりする場合があり、書き込めなくてexitedになっている可能性が高いです。

上記ではさっくり流しましたが、上のgrafanaとinfluxdbではデータの保管方法が違います。
grafanaではDockerのVolume機能使ってgrafana-storage(実態は別名称に保存されるっぽい?)を使ってvar/lib/docker/volumes/内にデータが保存されますが、
influxdbではyamlのある場所~/dockerに保存されます。
大抵は上のDockerのVolume機能を使うほうが(所有者問題等の)問題は少ないと思われますが、var/lib/docker/内はrootが占有していますので悩みどころかと思われます。

さくっと作成したら次はInfluxDBに移りましょう

InfluxDB

時系列データベースとあるように時間は送れません。
つまりは送った時間が記録時間です。
逆に言えば時間は送らなくていいのであとは何を測定してどの結果だったかだけ送ればいいのでなかなか便利です。

しかもInfluxDBには代表的な4つのIoT言語のサンプルが載っています。
image.png

注意点として
API忘れた&コードなんだっけ?とGetTokenやInitialize Clientをむやみやたらに開かないようにしましょう
LoadData>API TokensでAPIを確認できますが、このページを開くたびにAPIが発行されるので気づいたら使ってるAPIが埋もれてる、なんてことがあるかも(逆にAPIを忘れたら?LoadData>API Tokensから再発行しましょう)
スクリーンショット 2024-10-14 013126.png

例題としてPythonの例題を上げます

  point = (
    Point("measurement1") // 測定の対象個体名称
    .tag("tagname1", "tagvalue1") // なくてもかまわない任意複数OK
    .field("field1", value) // 測定の結果任意複数OK
  )

何らかのデータを送ると結果としてDataExplorerで受信データが観測できるはずです。
image.png
先ほども言ったように時系列なので、初回はしばらく時間をおかないと結果として見えてきませんね

Grafana

さて。グラフ化ツールのお話です。
ここに来るまでに何個かcomposeに仕掛けをしました。
例えば下記です

compose.yaml
services:
  grafana:
    environment:
      - GF_AUTH_ANONYMOUS_ENABLED=true

これによってGrafanaの閲覧権限を外すことができます。
毎度ログインしなくていいなんて!!!
ただし書き込み制限はあるのでGradinaに入ったらSign inで初回アカウント登録やログインをしましょう。

image.png

初回のパスワードは
User:admin
Password:admin
で入力に成功すると下記の新規パスワード入力が出てきます。
image.png

入ると中央付近に下記が見えるはずです。
image.png
まずはinfluxdbと連携させなければいけないのでDatasourceからですね
image.png
ここで注意が二つほど。

  • Query language
    Query languageが選択できますが、今回インストールしたのはinfluxdb:2.7.6なのでSQLは使えません。
    そのため、FluxかinfluxQLのどちらかになります。
    image.png
    そしてもう一つ。ここで選択されるのはどうやってデータを取り出すかの質問なので、後述の実装が全くと言っていいほど変わっています。
    これはGurafanaの実装によるものなので、おそらくはGrafanaのVersionによって変更されるはずです。(当該のスクリーンショットはGrafana v11.2.0 (2a88694fd3))

influxQLによるQuery
image.png

FluxによるQuery
image.png

  • URL
    URLにはhttp://localhost:8086とあります。
    コンテナ由来の条件となりますが、compose.yamlでnetworksなどを設定したはずです。
compose.yaml
services:
  grafana:
    networks:
      - frontend
  influxdb:
    networks:
      - frontend
networks:
  frontend:
    driver: bridge
    ipam:
      driver: default

上記のように設定するとhttp://<container_name>:8086とすると接続できます。
この場合はhttp://influxdb:8086ですね。

Connections>Data sourcesで記載する場所は

  • Query languageの選択(今回はFlux)
  • HTTP>URL
  • InfluxDB Details> Organization & Token & Default Bucket

の箇所のみです。
datasource is workingと表示されたなら
image.png

ダッシュボードに行き、Add>Visualizationを見てみましょう。
先ほどのFluxによるQueryの書式記入ができるはずです。
image.png

下記を入力して中央付近のリフレッシュマークを押します。

Flux
from(bucket: "<データを保存したDOCKER_INFLUXDB_INIT_BUCKETの名前>")
  |> range(start: 0)

image.png

さっくり表示できたはずです。
Fluxの言語については下記を参照してください。Flux language syntaxからも飛べます。

2024/10/27:Grafanaデータストレー関連等追加

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?