最新の気温情報をアメダスから取得し、Zabbixに取り込んで、Grafanaで可視化する

概要

  1. 気象庁が発表しているアメダスの情報から最新の気温を抽出する
  2. 抽出した気温データをZabbixで収集する
  3. Zabbixで収集したデータを可視化する(上記画像の緑の数値がアメダスから取得した外気温です)

取得対象

気象庁が発表しているアメダス(表形式)の気温のうち、最新のものを対象とします。
なお、この情報は1時間ごとに自動更新されると公式サイトに記載されていますが、実際はn時ピッタシに更新されるわけではないようで、熊谷市の場合は10分程度のタイムラグがあります。

スクレイピング行為について

今回は上記の通りタイムラグがあるため、1分に1回のアクセスで最新の気温データを取得します。過去にLibrahack事件などもありましたが、この程度のアクセスは問題無いはず。
ちなみに、気象庁がこの「表形式」のデータをWebで公開してから10年以上経ちますが、テーブルの構造が全く変わっていません。あくまで推測ですが、気象庁が暗に自動収集している人や団体を認めているのではないかと思っています。構造を変えるとスクレイピング出来なくなってしまうので。もちろん、現状の表形式で十分だからという理由もあるとは思いますが。推測です、推測。

気象庁が発表しているアメダスの情報から気温のみ抽出する

[arkey22@zabbix4]$ cat outside_temp.sh
#!/bin/bash

temperature_c=`curl -s 'https://www.jma.go.jp/jp/amedas_h/today-43056.html?areaCode=000&groupCode=29' | grep 'block middle' | tail -n +2 | tr -d '\t' | grep -oP "^<td class=\"block middle\">\-?[0-9]?[0-9]\.[0-9]" | grep -oP "\-?[0-9]?[0-9]\.[0-9]" | tail -n 1`

/usr/bin/echo ${temperature_c} > /tmp/outside_temp
[arkey22@zabbix4]$
[arkey22@zabbix4]$ cat /tmp/outside_temp
7.4
[arkey22@zabbix4]$
[arkey22@zabbix4]$ crontab -l | grep outside_temp.sh
*/1 * * * * /usr/local/src/outside_temp.sh > /dev/null 2>&1
[arkey22@zabbix4]$

さて、対象と頻度を決めたところで、データを取得していきます。いつものごとくbashです。肝心の気温が掲載されている表のHTMLを見ると、読みにくいです。パイプをつなぎまくって最新の気温を取得してみましたが、可読性がクソを極めています。ここに時間をあまりかけたくなかったので今回はこれで良しとしますが、もっとうまく書けないもんかと、ちょっと落ち込みました。
取得間隔はcronで設定し、1分ごとにスクリプトを実行して取得します。
さて、上記スクリプトですが、気温の出力先として/tmp/outside_tempに上書きしています。/tmp/outside_tempに吐き出された値をzabbixの vfs.file.contents を使って数値を収集します。

抽出した気温データをZabbixで取得する

スクリプトを作成したサーバ(Zabbix的にはホスト)で新しくアイテムを作成します。キーがポイントで、以下の値を設定しています。
vfs.file.contents[/tmp/outside_temp]
zabbix-agentが動いている必要があるので、要注意です。
データ型は、小数点以下も取得しているので「数値(浮動小数)」に設定します。
監視感覚はcronと合わせて1分にしています。
アプリケーションでilo4を選んでるのは特に意図ありません…新しくtemperatureとでも名付けてアプリケーションを作っても問題ありません。

値が正常に取得出来ると、このような感じに1時間ごとの気温がZabbixで収集されます。

Zabbixで取得したデータを可視化する

いつものごとくGrafanaを使います。

Grafanaの導入方法とかGrafana-Zabbix間の連携方法は省略します。
今回は最新の値のみを表示したかったのでこんな感じで設定しています。

あとは適当にダッシュボードに配置して、完了です。
余談ですが、横の2つは室温とサーバ周辺の気温を表示させてます。室温はRaspberry piのTemperを使って取得しています。その話はまた今度。

お疲れさまでした。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です