ヘルスチェック
docker ps で分かるのはプロセスがクラッシュしていないことだけで,スケジューラのループがハングしていても正常時と見分けがつきません.chime は,「直近の Discord への送信が成功したか」ではなく,「スケジューラが実際に tick しているか」 に答える liveness シグナルを提供します.
仕組み
- デーモンは tick ごとに現在のタイムスタンプを heartbeat ファイルに書き込みます (デフォルトは
/tmp/chime.heartbeat,CHIME_HEARTBEAT_PATHで変更可能).書き込みは Discord へのリクエストより前に行われるため,シグナルはネットワークの到達性に左右されません.また Discord へのリクエストのたびに再度書き込まれるため,遅い Discord に複数のメッセージを送る tick がハングと誤認されることもありません. chime healthサブコマンドはそのファイルの mtime を読み,新しければ (now - mtime <= 2 * tick_interval_sec)0で終了します.それ以外 (古い,存在しない,読み取れない) の場合は,stderr に 1 行のメッセージを出して非 0 で終了します.tick 間隔は同じCHIME_CONFIGから読み取り,webhook の env 変数は不要です.
コンテナイメージにはすでにこれが HEALTHCHECK (distroless にはシェルがないため exec 形式) として組み込まれており,docker ps / docker inspect で自動的にヘルス状態が報告されます.docker/compose.yml で明示的に設定するには次のようにします.
yaml
healthcheck:
test: ["CMD", "/usr/local/bin/chime", "health"]
interval: 30s
timeout: 5s
start_period: 10s
retries: 3Docker を使わない場合は,任意のスーパーバイザや監視プローブから chime health を呼び出せます.契約となるのは終了コードです.