Skip to content

クライアントエラーのログ収集(プロトタイプ) - #393

Draft
Sachiaki-Kasuya wants to merge 4 commits into
developfrom
tmp/test-output-log
Draft

クライアントエラーのログ収集(プロトタイプ)#393
Sachiaki-Kasuya wants to merge 4 commits into
developfrom
tmp/test-output-log

Conversation

@Sachiaki-Kasuya

@Sachiaki-Kasuya Sachiaki-Kasuya commented Mar 24, 2026

Copy link
Copy Markdown
Collaborator

概要

ブラウザ上でエラーが発生した時にコンソールログとfrontendコンテナにログ出力するように対応
ログ収集対象者として、ログインしているユーザと管理者を想定
/client-errorとしてPOSTし、成功時は204を返す

ペイロードの概要

以下の3項目を出力

  • actionLog: 操作ログ(ヘッダーやラベルのクリック、ルーティングを過去20件分記録)
    • ユーザ操作が関連する個所にどのような操作をしたのかを設定した、url(の一部)や実行時の日時を保存
    • 現状 apiCallclickmapInteraction(地図関連の操作)routeChange(画面遷移)actionLog.entries[x].typeに設定
  • enviroment: 使用デバイスやブラウザを表示
  • error: 発生したエラーの詳細
    • message、発生日時、URL、スタック時のログを表示

実行例

image image

actionLog.entriesのリスト内容は左のデータ(先頭)が古く、右(最後尾)が最新の情報です
直後に記載のerrorに至るまでのユーザー操作を表しており、原因を調査する補助情報として想定しています

確認したエラーパターン

位置情報をOFFにして以下の動作でエラーが出ることを確認

  • ログイン後初期表示 一般ユーザ・管理者
  • 幸福度一覧表示 一般ユーザ
  • 幸福度登録(通常、画像添付) 一般ユーザ
  • 幸福度削除 一般ユーザ
  • 幸福度インポート 管理者
  • 幸福度エクスポート 管理者
  • 地図タイル読み込み失敗時
  • アクセストークン期限切れ後に操作

try-catch外で発生したエラーの検知について

ブラウザで error / unhandledrejection として通知するものはキャッチ可能

frontend/src/components/client-error-reporter.tsx

window.addEventListener('error', handleError)
window.addEventListener('unhandledrejection', handleUnhandledRejection)

https://github.com/c-3lab/oasismap/pull/393/changes#diff-8a4eff86f584ef8bf08f0dad00a85554fe9e7bfe6e35528fe1d8fbaa1cca86b7R49-R50

上記の handleErrorとhandleUnhandledRejection でキャッチできていることを確認

各呼び出しでログ出力を設定し、開発者ツールのコンソールで動作確認

  • handleError
image image image
  • handleUnhandledRejection
image image image

グローバルエラーハンドラと /api/client-errors の受信経路を整備し、
操作ログ・位置情報状態・重複送信抑止を含む報告基盤を実装する。

Made-with: Cursor
fetch層と主要画面の catch ブロックから reportError を呼び出し、
未捕捉エラーだけでなく処理済みエラーも調査ログとして収集する。

Made-with: Cursor
タイルフォールバック発火時に reportError を実行し、
OSM タイル障害をクライアントエラー収集経路で追跡可能にする。

Made-with: Cursor
parseFloat(process.env.NEXT_PUBLIC_MAP_DEFAULT_LONGITUDE!) || 139.7413637

// geolocation が http に対応していないため固定値を返却
if (location.protocol === 'http:') {

@Sachiaki-Kasuya Sachiaki-Kasuya Mar 27, 2026

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

申し訳ありません、今回実装分の setGeolocationStatus('not_supported') が漏れていました
後ほど修正コミットプッシュいたします

(追記):修正コミットプッシュ済み

setGeolocationStatus('not_supported')

@keita-yasuda

Copy link
Copy Markdown
Contributor

エラー収集ツールであるSentryでは、届いたエラーレポートを種類毎に集約するIssuesという機能がありました。
https://docs.sentry.io/product/issues/

当PRの実装にも、エラー種別を表す情報がログ出力されるような機能追加を検討してはいかがでしょうか。

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.

2 participants