Skip to content

地図の依存サービスの応答を毎日確認し、異常時に Slack へ通知する - #41

Merged
yasulab merged 1 commit into
mainfrom
monitor-geolonia-deps
Jul 13, 2026
Merged

yasulab merged 1 commit into
mainfrom
monitor-geolonia-deps

Conversation

@yasulab

@yasulab yasulab commented Jul 13, 2026

Copy link
Copy Markdown
Member

課題

過去 2 回、サイト自体は HTTP 200 を返しているのに地図が表示されない状態が発生し、気づくのが遅れた。自サイトの死活監視では検知できないため、地図の表示に必要な依存先の応答を毎日確認する。

時期 状況 症状
2026/06 スプライト サーバが 502 マーカーが 1 件も描画されなかった
2026/07 埋め込み v1 が参照する旧インフラの不具合 世界地図が描画されなかった

設計:依存先の HTTP 応答を確認する

ヘッドレス Chrome での描画検証は採用しない。 一見理想的だが、実験の結果世界地図(zoom 0)はヘッドレスでは描画が完了しない(v1 / v5 とも同じ)。つまり 2026/07 型の状態をそもそも検知できない。検知したい対象を検知できない手段に投資する意味はない。加えて SwiftShader 描画は遅く不安定で、偽陽性がアラートの信頼を損なう。

過去 2 件はどちらも HTTP 層で検知できるので、依存先の応答を直接確認する。

  1. 埋め込みスクリプト(_config.ymlgeolonia_embed_url から読む)→ 200 かつ中身が空でないこと
  2. スプライト サーバ(tests/sprite_status_test.rb。標準ライブラリのみなので bundle install 不要)

独立ワークフローは作らず scheduler_daily.yml に相乗りする(YAGNI)。1 日 1 回でも現状からは大きな改善で、分離は実際に必要になってからでよい。

2 つのガードレール

① 外部要因でデプロイを止めない。 デプロイのに置き、continue-on-error でジョブを失敗させない。依存先に異常がある時こそ marker: default への切替をデプロイしたいので、外部要因でデプロイが止まったら本末転倒。

② アラートで原因の切り分けができるようにする。 既存の通知は「Failed to build DojoMap」だけで、自分のビルド失敗と依存先の異常を区別できない。監視専用の通知を用意し、本文に復旧手順を明記した。

暫定復旧の手順: マーカーが表示されない場合、_config.ymlmarker: coderdojomarker: default に変更して再デプロイすると、スプライト サーバに依存しない circle マーカーに切り替わります。

sprite_status_test.rb の修正(誤報を出す状態だった)

このテストは「作ったが CI に入っていない」状態で放置されており、実行してみたら失敗した。そのまま監視に載せていたら毎日誤報が飛んでいた。

  • リダイレクトを追っていなかったapi.geolonia.comcdn.geolonia.com へ 302 を返すが、テストはそれを異常と判定していた
  • 検査対象が古かった。埋め込み v5 が使うのは basic-v2 だが、テストは basic-v1 を見ていた
  • 「スプライトに coderdojo シンボルが含まれるか」の検査を削除した。実測したところ basic-v1 / basic-v2 のいずれにも(API キーの有無にかかわらず)coderdojo存在しないが、マーカーは正常に CoderDojo ロゴで描画されている(スクリーンショットで確認済み)。前提が現実と食い違っており、残すと毎日誤報が飛ぶ

未解明: ロゴがどの経路で読み込まれているかは特定できなかった。推測で埋めず、コード内に NOTE として残した。判明したら適切な監視を足す。

検証

  • ✅ 埋め込みスクリプトのチェックをローカルで実行(200 / 1,235,244 bytes)
  • ✅ スプライト テストが正常時に通る(2 runs / 0 failures / 0 skips)
  • 異常を模擬すると復旧手順つきのメッセージで正しく失敗する(RED → GREEN)
  • ✅ YAML パース成功

@yasulab yasulab changed the title Geolonia の障害を毎日検知して Slack に通知する Geolonia の障害を検知して Slack に通知する Jul 13, 2026
過去2回、サイト自体は HTTP 200 を返しているのに地図が表示されない状態が
発生し、気づくのが遅れた。自サイトの死活監視では検知できないため、
地図の表示に必要な依存先の応答を毎日確認する。

  2026/06: スプライト サーバが 502 → マーカーが1件も描画されなかった
  2026/07: 埋め込み v1 が参照する旧インフラの不具合 → 世界地図が描画されなかった

## 設計

依存先の HTTP 応答を確認する。過去2件はどちらも HTTP 層で検知できる。
ヘッドレス Chrome での描画検証は採用しない。世界地図 (zoom 0) はヘッドレスでは
描画が完了せず(実験で確認)、検知したい状態をそもそも検知できないうえ、
偽陽性がアラートの信頼を損なうため。

独立ワークフローは作らず scheduler_daily.yml に相乗りする(YAGNI)。
1日1回でも現状からは大きな改善。分離は必要になってから。

## 2つのガードレール

1. デプロイの「後」に置き、continue-on-error でジョブを失敗させない。
   依存先に異常がある時こそ marker: default への切替をデプロイしたいので、
   外部要因でデプロイを止めてはならない。
2. 監視専用の Slack 通知を用意し、本文に復旧手順を書く。既存の通知は
   「Failed to build DojoMap」だけで、自分のビルド失敗と区別できないため。

## sprite_status_test.rb の修正(誤報を出す状態だった)

- リダイレクトを追うようにした。api.geolonia.com は cdn.geolonia.com へ 302 を返す。
  追わないと 302 を異常と誤検知し、毎日誤報が飛ぶ状態だった。
- 検査対象を basic-v1 から basic-v2 に変更(埋め込み v5 が使うスタイル)。
- 「スプライトに coderdojo シンボルが含まれるか」の検査を削除した。
  実測したところ basic-v1 / basic-v2 のいずれにも(API キーの有無にかかわらず)
  coderdojo は存在しないが、マーカーは正常に描画されている(スクショで確認)。
  前提が現実と食い違っており、残すと毎日誤報が飛ぶ。ロゴの読み込み経路は未解明。

## 文言について

Slack 通知やコード コメントは第三者の目にも触れうる。提供元への敬意を欠く
表現は使わず、自分たちの地図の状態を主語にした中立な言い回しに統一した
(❌「Geolonia の障害を検知」→ ✅「依存サービスから正常な応答が得られていません」)。

障害を模擬して実際にテストが失敗すること (RED → GREEN) を確認済み。
@yasulab
yasulab force-pushed the monitor-geolonia-deps branch from 81d2179 to e815b65 Compare July 13, 2026 06:52
@yasulab yasulab changed the title Geolonia の障害を検知して Slack に通知する 地図の依存サービスの応答を毎日確認し、異常時に Slack へ通知する Jul 13, 2026
@yasulab
yasulab merged commit de2882f into main Jul 13, 2026
2 checks passed
@yasulab
yasulab deleted the monitor-geolonia-deps branch July 13, 2026 07:03
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant