helen's blog

ずっとおもしろいことしてたいな。

ハムスターのために監視導入したら人間のための監視もしたほうが良さそうなことがわかりました

Mackerel Advent Calendar 2017 - Qiita の12/20の記事です

以前、【増枠】紅白 Milkcocoa 合戦!【祭り】 Milkcocoa Meetup vol12 - connpassでLTしたこれを

(要約:3時間で勝手にエアコンが切れるアパートで、
ハムスターのために温度が一定以上になったらラズパイでエアコンつけて夏を乗り切りました)

いろいろと事情が変わったので、今回はMackerelを使って改造してみました!

前回より

変わったこと

実は当時のアパートから引っ越ししたので事情がとても変わりました

  • エアコンが勝手に切れない!!
  • ハムスターたちとエアコンが遠いので、ハムスターのそばで温度を取ると赤外線が届かない
  • もしかして実はもう必要ないのでは...
当時の課題
  • 湿度を取っているのに表示していない、SPだと崩れてる
    • 得意でないフロントゴリゴリ実装でもう1個グラフを増やす気力が沸かなかった😂
  • 後追いでグラフを見て確認できるけど、状況をPushしていない
    • 当時をよく覚えていないけどHubot周りがうまくいかず諦めちゃった😂

ここにMackerelを導入してみました

Mackerelにカスタムメトリック投稿

物理的な実装はセンサーつないだだけなので割愛します

温度と湿度を取得して出力

ホストのカスタムメトリックを投稿する - Mackerel ヘルプ を参考にタブ区切りで出力

import time
import get_environment as env # 温度取得はmilkcocoa送信用に実装済みなので流用

# vars
epoch_seconds = str(time.time())

try:
    # get host_id
    with open('/var/lib/mackerel-agent/id') as mackerel_agent_id:
      host_id = mackerel_agent_id.read()

    # output datas
    print('\t'.join(['env.temp', env.temperature, epoch_seconds]))
    print('\t'.join(['env.hum', env.humidity, epoch_seconds]))

except Exception as e:
    print('failed in sending to mackerel')
    print(e)
実行結果
$ sudo /usr/bin/python /PATH_TO_SOURCE/mackerel_monitor_temperature.py
env.temp	22.40	1512901475.44
env.hum	36.40	1512901475.44
mackerel-agent.confに追記
# 追記内容
[plugin.metrics.raspi]
command = "sudo /usr/bin/python /PATH_TO_SOURCE/mackerel_monitory_temperature/mackerel_monitor_temperature.py"
agent起動
$ nohup sudo /usr/local/bin/mackerel-agent >> /var/log/mackerel-agent.log &
こうなる

青いグラフが湿度、オレンジが温度です

f:id:heleeen:20171211015744p:plain
※12/9の21時ごろに湿度がいきなりあがったのは冷しゃぶしたからです

監視を入れます

ハムスターにとって快適な温度は20〜26度で、
冬場は風邪を引かないための湿度は40〜60%が良いらしいのでこんな監視設定をします

$ mkr monitors
[
    {
        "id": "3bwDVM8jm1h",
        "name": "custom.env.hum over 60%",
        "memo": "ジメジメだよ(。>﹏<。)",
        "type": "host",
        "metric": "custom.env.hum",
        "operator": ">",
        "warning": 60,
        "critical": 65,
        "duration": 3
    },
    {
        "id": "3bwDQLE4bTS",
        "name": "custom.env.hum under 40%",
        "memo": "干からびちゃうよ(。ŏ﹏ŏ)",
        "type": "host",
        "metric": "custom.env.hum",
        "operator": "<",
        "warning": 45,
        "critical": 40,
        "duration": 3
    },
    {
        "id": "3bw5wNYbhN5",
        "name": "custom.env.temp over 26℃",
        "memo": "暑いよ(;´Д`)",
        "type": "host",
        "metric": "custom.env.temp",
        "operator": ">",
        "warning": 25,
        "critical": 26,
        "duration": 3
    },
    {
        "id": "3bw5memzmP3",
        "name": "custom.env.temp under 20℃",
        "memo": "寒いよ:;(∩´﹏`∩);:",
        "type": "host",
        "metric": "custom.env.temp",
        "operator": "<",
        "warning": 21,
        "critical": 20,
        "duration": 3
    }
]

監視設定した途端いきなりCRITICAL来た

f:id:heleeen:20171214005457p:plain

温度とか言ってる場合じゃない!!
(温度は無事20〜26度をさまよっていました)

朝の喉のイガイガ感の原因がはっきりしました

ここまでで

  • ちょっとPython書いたらメトリック投稿できた
  • フロント頑張らなくてもグラフ表示できる!!!
  • 簡単に湿度まで可視化できた!!
  • しかも実はラズパイの死活監視までできている

はまったところ

invalid JSONされる
2017/12/03 11:54:14 WARNING <command> metadata plugin "raspi": outputs invalid JSON: env.temp	22.50	1512302054.61

mackerel-agent.confの書き方がだめでした

# これでエラー
[plugin.metadata.raspi]
command = "sudo /usr/bin/python /home/pi/work/mackerel_monitory_temperature/mackerel_monitor_temperature.py"

# "plugin.metrics."ではじめないといけない
[plugin.metrics.raspi]
command = "sudo /usr/bin/python /home/pi/work/mackerel_monitory_temperature/mackerel_monitor_temperature.py"

ドキュメントろくに呼んでない自分が完全に悪いけど
エラーメッセージがもうちょっと親切だとありがたかったかも...
エージェント経由ってタブ文字区切りだとだめなの...?で数日悩みました( ;∀;)

カスタムメトリックってJSON書かないと監視できないのかと思っちゃった(●´ϖ`●)

f:id:heleeen:20171214000914p:plain

下まで見ても見つからず...

f:id:heleeen:20171214000928p:plain

入力すればよかったのか😂

おわりに

f:id:heleeen:20171219234519p:plain

アドベントカレンダー書くぞと帰ってきて加湿器つけてこんな感じで
湿度がCRITICALとWARNINGを行き来しています
お湯を800mlくらい蒸発させたときは湿度20%くらいあがって、すごい即効性がありました
やったことが数字になってわかるのもおもしろいね(●´ϖ`●)