Chienomi

(お知らせ) Basic Appsが落ちたら通知するようにした

Live With Linux::info

お知らせ

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

url = 'https://hook.example.com/webhook/abcdefg'

subprocess.run(["curl", "-X", "POST", "-H", "Content-Type: application/json", "-d", json.dumps({"text": sys.argv[1]}), url])

(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の場合は運用を考えるとあまりまとめないほうが良い。


  1. 主にGemまわりのエラーが出るため。Archlinuxのアプデによって発生してることが多いっぽい。↩︎