概要
Azureでサービス監視するのに、Azure statusからAzureそのもののヘルスステータスを確認したい。
ただ、プッシュ通知では教えてくれないので、RSSをクロールしてHipchatに通知して欲しいなと作ってみた。
作ってみた
pythonでRSS読むならfeedparserがいいと聞いたので使ってみる。
hipchatはroomのtoken使ってrest api叩いてるだけ。
諸事情でproxy越しのアクセスなのでちょっと設定したり。
# !/usr/bin/env python
# -*- coding: utf-8 -*-
import requests
import json
import urllib2
import feedparser
proxies = {
"http": "hoge:8080",
"https": "hoge:8080",
}
def hipchat_post_to_room(room_id, auth_token, msg):
global proxies
data = {
"color": "red",
"message_format": "text",
"message": msg,
}
headers = {'Content-type': 'application/json', 'Accept': 'text/plain'}
request_url = "https://api.hipchat.com/v2/room/" + room_id + "/notification?auth_token=" + auth_token
return requests.post(request_url, proxies=proxies, data=json.dumps(data), headers=headers)
def get_azure_status():
global proxies
proxy = urllib2.ProxyHandler(proxies)
data = feedparser.parse("http://azure.microsoft.com/ja-jp/status/feed/", handlers = [proxy])
res = ""
for e in data["entries"]:
if e:
res += e.summary_detail.value
return res
if __name__ == "__main__":
status = get_azure_status()
room_id = "XXXXXX"
auth_token="XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
if status:
msg = "@all %s" % status
hipchat_post_to_room(room_id, auth_token, msg)
何もなければ通知しないようif文かませておく。
ちなみにhipchatはhtml形式でも投稿できるけど、それだと@allとかメンションが効かないので注意。
Hipchatに通知したらその中からAzure statusにリンクあるとすぐ開けて便利かな?と思ったけど、それやるなら形式が異なるので2度投稿する必要があるな、と。
あとは作ったスクリプトを毎時くらいでcron仕込んでおく。
00 * * * * python /home/hoge/azure_status_notificator.py
できた。
まとめ
RSSって普段feedlyとかリーダーからしか見ないので、実体としてフィードがどういう風なデータn構造で流れてくるのか知るいい機会ではあった。
RSSのスキーマ?みたいなのって実際にフィードが流れてないといまいち検証しづらいなと。
また、クラウド使ってると、自分のとこのインスタンスだけうっかり落ちたのか、
あるいはAzureそのものの障害なのか、を切り分けて考慮する必要があるなとしみじみ。
ちなみにAzureのサポートプランというのはしかるべくあるので「金を払え」という話もあるが、
充実のサポートを期待するとそこそこのお値段がする。
自分が使ってるサービスとかAZとかに限定した方がいいかな?と思ったりはした。