はじめに
1月から東京に移住したが、実家においてきた RaspberryPi2 のメトリクスを見る手段がなかった。
メトリクスは RaspberryPi 内にしか蓄積しておらず、アラートだけ Slack & LINE で送っていた。
過去にやったことは以下の記事。
今回は東京からメトリクスを見れるようにするための取り組み。
最近 Mackerel Meetup #10 に参加した縁もあるので、Mackerel 使ってみましたよ、というだけの話。
実装
RaspberryPi2 いじるのは年に数回なので、構成を後から追えるようにするために、最初からではないのだが ansible でデプロイできるようにしている。
なので、以下プレイブックベースで書く。
ベースの処理
ここでは温度・湿度の記録部分しか書かないが、実際は見守りカメラの反応の有無も録っているため、 yml を分けてある。
role でディレクトリ管理してなくて雑な運用。
main.yml
- hosts: pi
sudo: yes
vars:
colon: ':'
tasks:
- include: tasks/base.yml
- include: tasks/temperature.yml
handlers:
- name: restart mackerel-agent
service: name=mackerel-agent state=restarted
hosts
[pi]
xxx.xxx.xxx.xxx
[pi:vars]
ansible_connection=paramiko
ansible_ssh_user=pi
ansible_ssh_pass=xxxxxxx
ansible_sudo_pass=xxxxxxx
mackerel_apikey=xxxxxxxx
mackerel-agent のインストール
RaspberryPi2 では ARM 版のバイナリが必要なため、インストールした後にバイナリを上書きしている。
API Key も流し込む
tasks/base.yml
- name: install mackerel-agent
shell: |
curl -O https://mackerel.io/file/agent/deb/mackerel-agent_latest.all.deb
dpkg -i mackerel-agent_latest.all.deb
curl -LOk https://github.com/mackerelio/mackerel-agent/releases/download/v0.42.3/mackerel-agent_linux_arm.tar.gz
tar zxf mackerel-agent_linux_arm.tar.gz
cp mackerel-agent_linux_arm/mackerel-agent /usr/bin
args:
creates: /etc/mackerel-agent/mackerel-agent.conf
- name: mackerel-agent conf
lineinfile:
dest=/etc/mackerel-agent/mackerel-agent.conf
line='{{ item.line }}'
regexp='{{ item.regexp }}'
with_items:
- { line: 'apikey="{{ mackerel_apikey }}"', regexp: '^apikey="{{ mackerel_apikey }}"' }
notify: restart mackerel-agent
温度・湿度のメトリクス取得
公式ドキュメントを読めばわかるとおり、mackerel-agent.conf
にコマンドを書いて、コマンド内でメトリクスを標準出力に出せば完了。
ホストのカスタムメトリックを投稿する - Mackerel ヘルプ
tasks/temperature.yml
- name: mackerel temperature plugin
copy:
src=mackerel-temperature.sh
dest=/home/pi/mackerel-temperature.sh
mode=755
- name: mackerel humidity plugin
copy:
src=mackerel-humidity.sh
dest=/home/pi/mackerel-humidity.sh
mode=755
- name: mackerel-agent conf
lineinfile:
dest=/etc/mackerel-agent/mackerel-agent.conf
line='{{ item.line }}'
regexp='{{ item.regexp }}'
with_items:
- { line: '[plugin.metrics.temperature]', regexp: '^\[plugin.metrics.temperature\]' }
- { line: 'command = "/home/pi/mackerel-temperature.sh"', regexp: '^command = "/home/pi/mackerel-temperature.sh"' }
- { line: '[plugin.metrics.humidity]', regexp: '^\[plugin.metrics.humidity\]' }
- { line: 'command = "/home/pi/mackerel-humidity.sh"', regexp: '^command = "/home/pi/mackerel-humidity.sh"' }
notify: restart mackerel-agent
自分の場合は以下のサンプルコードをそのまま利用しているので、センサーからの取得処理は実装方法や RaspberryPi のピン番号によって異なる。
https://github.com/adafruit/Adafruit_Python_DHT
files/mackerel-humidity.sh
name="humidity.raspberrypi"
humidity=`/home/pi/Adafruit_Python_DHT/examples/Adahumit.py 22 4`
date=`env TZ=JST date +%s`
echo -e "${name}\t${humidity}\t${date}"
files/mackerel-temperature.sh
name="temperature.raspberrypi"
temperature=`/home/pi/Adafruit_Python_DHT/examples/Adatemp.py 22 4`
date=`env TZ=JST date +%s`
echo -e "${name}\t${temperature}\t${date}"
mackerel 画面
左から湿度、見守りカメラの反応、温度となっている。
センサーの負荷の問題か、mackerel-agent のタイムアウトが短いためか、取得に失敗することがときどきあり、グラフがぶつ切りになってしまっている。
このあたりはもうちょっと時間があるときに調べたい。
感想
認証を考慮して情報を見える化する場として、Mackerel のような SaaS はありがたい。
(フリー版で事足りてしまうので、Mackerel のビジネス的には貢献できないが・・)
1年くらい運用していて Raspberry Pi の問題は無線LANの再接続くらいしか起きていなかったが、Mackerel によって RaspberryPi ホストも監視できるようになったので、より運用しやすい状況が作れたのでよかった。