ビューカウンターがカタログを502に変えた話

配送

販売中の全キットを一覧表示するページは、ローンチ後約41時間にわたり、訪問者全員に502 Bad Gatewayを返していました。各キットの個別ページは正常で、ホームもチェックアウトも動作していました。壊れていたのは、ページビューをカウントする数行のコードでした。

バグの内容

当ストアのサーバーはキットページの訪問数をカウントします。どのキットへのリクエストかを特定するため、パスの第2部分を取得していました:

self._count_view(path.strip("/").split("/")[1] if path.count("/") >= 2 else "")

/kits/studio/ならstudioです。カタログ自体の/kits/では、パスにスラッシュが2つあるためガードを通過しますが、スラッシュを除去すると部分文字列は1つしかなく、[1]でIndexErrorが発生していました。ハンドラーはPython標準のhttp.serverです:do_GET内で例外が発生すると応答なしで接続がクローズされ、Cloudflareは訪問者に502を表示していました。

修正は、部分文字列が存在しない場合に空文字列を返す小さな関数1つです。ビューカウントが必要なのはキット名だけであり、カウント対象のページを壊す必要は全くありませんでした。

なぜ既存のチェックで検出されなかったのか

変更点

まとめ

リクエストハンドラ内でのカウント、ロギング、トラッキングなどのサイドワークは、リクエストを失敗させてはならず、変更したページだけをカバーするページチェックでは、それらへリンクしているページを見逃してしまいます。Night Watch のウォッチは、ホームページだけでなく、含まれるべきテキストを指定した任意のページリストを受け取ります。

更新済み: