2022年現在、Rubyのsnapshot tarballはGitHub Actionsで更新しています。
これは何らかの原因で更新が失敗して止まってしまうことがあるので、少しでも気がつきやすくするために、Zabbixで更新状況を監視しています。
動作確認バージョン
- Zabbix 5.0 と 6.0 (5.0 から 6.0 への移行中のため)
アイテム設定
アイテムはHTTPエージェントでJSONを取得して、依存アイテムで個別の情報を取り出して、そこにトリガーを設定するようにしています。
HTTPエージェント
名前やキーは適当にわかりやすいものにしています。
汎用的なものではないですが、とりあえずテンプレートとして作成して cache.ruby-lang.org
というホストに設定しているので、URLの一部は {HOST.DNS}
を使っています。
- 名前:
snapshot-master.json
- タイプ: HTTPエージェント
- キー:
pub.ruby.snapshot.master.json
- データ型: テキスト
- URL:
https://{HOST.DNS}/pub/ruby/snapshot/snapshot-master.json
- 取得モード: ボディとヘッダー
- JSONへの変換: チェック
- 監視間隔: 1h
他はほぼデフォルトです。
更新日時
依存アイテムで HTTP応答ヘッダーの last-modified
を取り出しています。サーバーによって Last-Modified
だったり、いつの間にか全部小文字に変わったりすることがあるようです。
ZabbixのJavaScriptエンジンはDuktapeというものを使っているらしく、HTTPの日付のパースは用意されていなかったので、Date.parse
でうまくいかなかったときは自前でパースしています。
- 名前:
snapshot-master last-modified
- タイプ: 依存アイテム
- キー:
pub.ruby.snapshot.master.last-modified
- データ型: 数値(整数)
- マスターアイテム: HTTPエージェントで作成したアイテム
- 単位:
unixtime
保存前処理:
var lastmod = JSON.parse(value).header['last-modified'];
var date = Date.parse(lastmod);
if (date) return date/1000;
// Sat, 03 Aug 2019 12:35:34 GMT
var a = /^\w+, (\d\d) (\w+) (\d\d\d\d) (\d\d):(\d\d):(\d\d) GMT$/.exec(lastmod);
var months = {"Jan":0, "Feb":1, "Mar":2, "Apr":3, "May":4, "Jun":5, "Jul":6, "Aug":7, "Sep":8, "Oct":9, "Nov":10, "Dec":11};
date = Date.UTC(a[3], months[a[2]], a[1], a[4], a[5], a[6]);
return date/1000;
ファイルサイズ
ファイルサイズが急に変わると何か問題が起きている可能性があるので、それも監視するようにしています。
閾値の設定が難しいのと、意図的な変化の場合もあるので、今のところトリガーは設定していません。
ファイルサイズは gz
, xz
, zip
をそれぞれ作成しています。
保存前処理はボディで返ってくるJSONから取り出すだけで、中身の形式は自分たちで決めた独自のものなので、良い感じにキーなどを指定するだけです。
- 名前:
snapshot-master size gz
- タイプ: 依存アイテム
- キー:
pub.ruby.snapshot.master.size.gz
- データ型: 数値(整数)
- マスターアイテム: HTTPエージェントで作成したアイテム
- 単位:
B
保存前処理:
return JSON.parse(value).body[0]['size']['gz'];
トリガー設定
条件式では条件式ビルダーの説明で以下のような説明の関数を使いました。
1日だけなら生成や取得タイミングの誤差の可能性もあるので2日間更新がなさそう、というのをトリガーにしています。
- 名前:
snapshot-master stopped
- 深刻度: 軽度の障害
- 条件式:
or
-
max(last-modified,2d)-min(last-modified,2d)=0
- アイテム: last-modified
- 関数: max() - 期間Tでの最大値
- 関数: min() - 期間Tでの最小値
- 最新の (T): 2d 時間
- nodata(last-modified,2d)=1
- アイテム: last-modified
- 関数: nodata() - 期間Tの間取得データなし (1 - 取得データなし、 0 - それ以外)
- 最新の (T): 2d 時間
-
他のsnapshot
master と同様に現在メンテナンス中の ruby_2_7, ruby_3_0, ruby_3_1 の snapshot も監視しています。
ruby_2_7 までは bz2 もあるので、それも監視しています。
まとめ
今までは個人的なサーバーの中でこのような監視をしていて、たまに役に立つということがわかっています。
今は他の個人的な監視も混ざっていて自分しか見えない場所にあるのですが、Zabbix 6.0 への移行をきっかけに外部から見えるような場所に移動して、Rubyコミッターの他の関係者にも見えるようにしたいと思っています。