このページを正しく表示するにはJavascriptを有効にしてください。
AppEngineでサーバー死活監視をする(Stashboard)
作ったWebサービスやAPIがちゃんと動いているか確かめたい時ってありますよね。
業務などでしっかり監視する必要があるのであればSensuやZabbixなりで監視すればいいと思うのですが、
個人で作ったちょっとしたサービスだとそこまで大げさに監視する必要がなかったりします。
URLを指定すれば500エラーを返さないか定期的にチェックしてくれる
くらいシンプルなものがあれば十分間に合ってしまいます。
無料の死活監視サービスもいくつかありますが、
監視数に制限があったり、サービスの存続性が怪しかったりして、
いまいち使う気になれませんでした。
そこで自前で監視ツールをホストすることにしたのですが、
普段AppEngineばかり利用するので安定稼働できるマイサーバーというものを持ってません。
(Raspberry Piがあるにはありますが…)
だったらAppEngine上で動かせる監視ツールはないのかと思い探してみました。
もし動かせるものがあれば、無料で自由に動かせますし、
監視システムの安定性についても心配する必要がほとんどありません。
## stashboard
探してみたところそれっぽいものがありました。
Twilioがオープンソースとして作ったStashboardというシステムです。
管理者専用の監視システムとは若干性質が異なり、
APIやシステムの稼働状況を数日分見やすく
(エンドユーザ向けに)表示してくれるシステムみたいです。
[stashboard デモページ](http://stashboard.appspot.com/)
GoogleAppengine専用のプロジェクトなので、
Gitで落としてきてapp.yaml, settings.pyを修正すれば簡単に動かせます。
ただ動かしてみたところ、管理画面でURLを設定して監視を開始するみたいな事は出来ませんでした。
(サービスというものを管理画面から投稿できるものの、URL等を設定する箇所なし)
## URLを監視する
[http://www.shockoe.com/blog/using-stashboard-for-server-monitoring/](http://www.shockoe.com/blog/using-stashboard-for-server-monitoring/)
調べてみたところ、URLを監視するには以下の編集をする必要があるみたいです。
### 1. 監視実行スクリプトを作る
Appengineのルートに
[https://gist.github.com/neiltron/780379](https://gist.github.com/neiltron/780379)
こんな感じのスクリプトを作成します。
serversは自分が行いたいように監視対象を列挙していきます。
```"service"```は管理画面から作成したservice名を指定しないとダメみたいです。
なければ先に作りましょう。
### 2. app.yaml編集
今作成したstashboard.pyにアクセスできるようapp.yamlに追記します。
```
- url: /check
script: stashboard.py
secure: optional
```
admin必須とかの属性を加えてもいいかもしれません。
### 3. cron.yaml
cron.yamlを編集して定期的にスクリプトを叩くようにします。
```
cron:
- description: periodic server checks
url: /check
schedule: every 30 minutes
```
インターバルとかはお好みで。
### 4. 確認
編集が終わったらデプロイしてみます。
cronを待つか、直接/checkを叩いて動作を見てみます。
```/services/{$サービス名}```
にアクセスしてメッセージが残っていたら成功です。
動かなかったらAppEngineのコンソールからエラーがないかチェックしてみてください。
無事設定できればcronで一定時間ごとに自動でメッセージを残しておいてくれます。
一覧の方にもメッセージに応じたアイコンが出るようになるので
複数サービスがあるときはとても見やすく管理できます。
## カスタマイズ
先ほどのスクリプトをよく見てみると
```
# サービス名からサービスを取得
service = Service.get_by_slug(service)
# 状態名(up)からステータスを取得
status = Status.get_by_slug("up")
# サービス、ステータスを紐付けたイベントを作成
e = Event(service=service, status=status, message="The server is responding.")
# サービスを保存
e.put()
```
がこのStashboardを使う上での肝みたいですね。
サービスに紐ついたイベントを作成すればあとはstashboardでいい感じに表示してくれるみたいです。
このサンプルだとurlfetchして
* 取得時にエラー
* ステータスが500
だったらサービスがdownと判定するみたいなロジックになっていますが、
これをレスポンスBodyに応じて切り替えるみたいなことも簡単そうです。
## 要調査
### サービスダウン時の通知
デフォルトだとサービスがダウンしても通知が飛んできたりするわけではないみたいです。
ダッシュボードにアクセスして動いているかどうかをいちいち確認する必要があります。
Twitterと連動してつぶやくみたいなことは出来るみたいですが、
プライベートなサービス監視もしているため試していません。
メールか何かで通知出来るようカスタマイズする必要がありそうです。
### サービスリストの使い道
管理画面からserviceとは別にservice listというものが存在するのですが、
使い方がよく分かりませんでした。
serviceと親子関係になるみたいですが、
ダッシュボード上で特に変化もないので使い道がよく分からないです。
1つのサイトで複数URL監視したい場合に纏められたりすると便利なのですが…。
要調査が必要です。