(お知らせ) Basic Appsが落ちたら通知するようにした
Live With Linux::info
- TOP
- Articles
- Live With Linux
- (お知らせ) Basic Appsが落ちたら通知するようにした
お知らせ
Basic Web Apps (ChienomiやPiecesなどで、いいねやコメント機能を司っているwebアプリケーションサーバー) が落ちていることが結構多い1状況を改善するため、Basic Web Appsが落ちたら通知するようにしました。
解説
このお知らせだけだと記事としてさすがになので、なにをどうしたか簡単に解説。
前提
Basic Web AppsはRubyで書かれており、Pumaを用いたアプリケーションサーバーになっている。
このサーバーはSystemdによって起動される。
リクエストはNginxがリバースプロキシとしてディスパッチする。
使うもの
- Basic Web Apps
- Basic Web Appsの.serviceユニット
- 通知用のスクリプト
- 通知にカスタマイズした通知を送るためのスクリプト (NEW)
- ユニットがこけたときに呼ばれるユニット (NEW)
Systemdによって動いている前提だから、上ふたつは既にあるという状態から話を始める。
通知用スクリプト
メールなり何らかのwebhookなり、なんでもいいから引数を送りつけるスクリプト。
webhookだとJSONを整形するのがシェルスクリプトだとめんどいのでRubyで。
#!/usr/bin/ruby
require 'json'
URL = 'https://hook.example.com/webhook/abcdefg'
system("curl", "-X", "POST", "-H", "Content-Type: application/json", "-d", JSON.dump({"text" => ARGV[0]}), URL)
RubyのエラーをRubyで通知するのが怖いならPythonとか。
#!/usr/bin/python
import json
import sys
import subprocess
= 'https://hook.example.com/webhook/abcdefg'
url
"curl", "-X", "POST", "-H", "Content-Type: application/json", "-d", json.dumps({"text": sys.argv[1]}), url]) subprocess.run([
(sys.argv[0]
がスクリプト名なのは、お前引数じゃないだろの気持ちになるよね)
カスタム通知スクリプト
通知スクリプトは引数をそのまま通知するのだけど、Systemdで通知するのにそれだと扱いにくいので、専用にラップしたものを用意してあげる。
#!/bin/zsh
generic-notify.rb "Systemd Unit $1 got failure."
Fail用ユニット
そのカスタム通知スクリプトを呼ぶためのユニット。
@.service
の形をとる。
[Unit]
Description=Inform Systemd unit failed to system info.
[Service]
Type=oneshot
ExecStart=/usr/local/bin/systemd-failure.zsh %i
OnFailureの追記
Basic Web AppsのユニットのUnit
セクションに追記。
OnFailure=unitfailure@basic-web-apps.service
もっときれいにまとまらないの?
まとめられるけど、Systemdの場合は運用を考えるとあまりまとめないほうが良い。
主にGemまわりのエラーが出るため。Archlinuxのアプデによって発生してることが多いっぽい。↩︎