30 KiB
30 KiB
JR四国非公式アプリ データ取得経路マップ
作成日: 2026-07-07
目的
Sentryで観測している endpoint=positions / operation_info / train_operation / timetable が、実際にどのURL、hook、画面、バックエンド、外部取得元に対応するかを整理する。
この文書は調査結果のみ。既存コードの変更案は含めるが、実装変更は行っていない。
対象範囲
- React Native / Expo アプリ側の
fetch,observedFetchJson,observedFetchText - WebViewに注入しているJavaScript内の
fetch - WebView内の公式サイトXHR、およびmock XHR interceptor
lib/mockApistateBox配下のfetch- n8n webhook
- Google Apps Script fallback
jr-shikoku-backend-api-v1.haruk.injr-shikoku-backend-mock-api-v1.haruk.injr-shikoku-api-data-storage.haruk.in- JR四国公式走行位置
https://train.jr-shikoku.co.jp/sp.html - JR四国公式運行情報
https://www.jr-shikoku.co.jp/info/ - 鉄道運用Hub / えれサイトの集約JSON
Sentry観測対象の取得一覧
| 論理endpoint | 呼び出し元ファイル | 関数/hook | 実URL/host | path | root_tab/screen | 取得タイミング | 更新間隔 | timeout | retry | cache | fallback | Sentry tag endpoint | 備考 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| positions current mock | lib/mockApi/positionMasters.ts |
fetchMockTrainPositions |
jr-shikoku-backend-mock-api-v1.haruk.in |
/train-positions/current |
positions / startup provider | mock API有効時、useCurrentTrain と useTrainMenu から呼ばれる |
15秒 | 8000ms | 最大1回 | module memory last-good | 前回成功データを返す | positions_current / source=mock_api / user_visible=true / preload=false / fetch_priority=high |
Sentryでtimeout確認済みの主対象。バックエンド側計測が必要。 |
| positions master mock | lib/mockApi/positionMasters.ts |
fetchPositionMasters |
jr-shikoku-backend-mock-api-v1.haruk.in |
/position-masters |
positions / settings-dependent | mock API有効化時、または起動時にmock有効なら取得 | 基本1回 | 8000ms | 最大1回 | module memory _cache |
なし | positions_master / source=mock_api / user_visible=false / preload=true / fetch_priority=medium |
PosNum+LineからPos文字列を補完。頻度は低い。 |
| positions n8n | stateBox/useCurrentTrain.tsx |
getCurrentTrain |
n8n.haruk.in |
/webhook/c501550c-7d1b-4e50-927b-4429fe18931a |
positions | 起動時、mock切替時、interval | 15秒 | 8000ms | 最大1回 | なし | Google Apps Script fallback | positions_current / source=n8n / user_visible=true / preload=false / fetch_priority=high |
mock API無効時の主経路。成功時は録画snapshotにも使う。 |
| positions GAS fallback | stateBox/useCurrentTrain.tsx |
getCurrentTrain catch内 |
script.google.com |
/macros/s/AKfyc.../exec |
positions | n8n走行位置取得失敗時のみ | n8n失敗時のみ | 8000ms | 最大1回 | 既存データとmerge | 前回表示データ維持 | positions_gas_fallback / source=gas / user_visible=true / preload=false / fetch_priority=high |
Direction等が欠けるため既存データとmerge。 |
| timetable today | stateBox/useAllTrainDiagram.tsx |
getTrainDiagram |
jr-shikoku-api-data-storage.haruk.in |
/tmp/diagram-today.json または /tmp/diagram-today-beta.json |
provider全体 / timetable consumers | provider mount直後 | 30秒、background継続指定あり。ただしobservedFetch側はbackground開始を抑制 | 15000ms | 最大1回 | AsyncStorage ALL_TRAIN_DIAGRAM |
cache失敗時はalert | timetable_today / source=static_storage / user_visible=false / preload=true / fetch_priority=medium |
ダイヤ・発車標・列車詳細で広く使用。 |
| train operation data | stateBox/useAllTrainDiagram.tsx |
getCustomTrainData |
jr-shikoku-backend-api-v1.haruk.in または beta |
/train-data |
provider全体 / train detail / diagram | provider mount直後 | 30秒、background継続指定あり。ただしobservedFetch側はbackground開始を抑制 | 15000ms | 最大1回 | なし | 失敗は握りつぶし | train_operation_data / source=backend_api / user_visible=false / preload=true / fetch_priority=medium |
約1MB級。WebView内でも別途取得される。 |
| operation logs | stateBox/useAllTrainDiagram.tsx |
getTodayOperation |
jr-shikoku-backend-api-v1.haruk.in または beta |
/operation-logs |
provider全体 / topMenu / train detail | provider mount直後 | 30秒、background継続指定あり。ただしobservedFetch側はbackground開始を抑制 | 15000ms | 最大1回 | なし | 失敗は握りつぶし | operation_logs / source=backend_api / user_visible=false / preload=true / fetch_priority=medium |
列車別運行ログ。WebView内でも別途取得される。 |
| operation flag | stateBox/useAreaInfo.tsx |
getAreaData |
n8n.haruk.in |
/webhook/jr-shikoku-trainfo-flag |
topMenu / information / provider全体 | mount後、InteractionManager後に1200ms遅延 | 60秒 | 10000ms | 最大1回 | なし | 失敗は握りつぶし | operation_info_flag / source=n8n / user_visible=true / preload=true / fetch_priority=medium |
topMenuのバッジ・対象エリア判定。 |
| operation text GAS | stateBox/useAreaInfo.tsx |
fetchAreaDescription |
script.google.com |
/macros/s/AKfycbz80.../exec |
topMenu / information | operation flagで対象駅ありの場合だけ800ms遅延 | flag結果依存 | 15000ms | なし | なし | 失敗は握りつぶし | operation_info_text / source=gas / user_visible=true / preload=false / fetch_priority=medium |
第1回観測でtimeout。現在は通常時の実行を抑制。 |
WebView内の取得一覧
| 論理endpoint | 呼び出し元ファイル | 関数/hook | 実URL/host | path | root_tab/screen | 取得タイミング | 更新間隔 | timeout | retry | cache | fallback | Sentry tag endpoint | 備考 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| positions official page | components/Apps/WebView.tsx |
AppsWebView |
train.jr-shikoku.co.jp |
/sp.html |
positions | 走行位置root初回activate時 | WebView lifecycle依存 | WebView標準 | WebView標準 | WebView page cache / OS依存 | remount watchdog | 未計測 | RN SentryではWebView navigation breadcrumbのみ。 |
| positions official XHR live | JR四国公式ページ内 | 公式サイトXHR | train.jr-shikoku.co.jp |
/g?arg1=train&arg2=train |
positions WebView | 公式ページロード後、公式サイト側ポーリング | 公式サイト実装依存。概ね数秒単位 | 公式サイト/ブラウザ依存 | 不明 | 公式サイト/ブラウザ依存 | mock interceptor可能 | 未計測 / 候補 positions_webview |
RN wrapperを通らない。現状Sentryで通信詳細が見えない。 |
| positions official XHR static | JR四国公式ページ内 | 公式サイトXHR | train.jr-shikoku.co.jp |
/g?arg1=lang..., /g?arg1=station..., etc |
positions WebView | 公式ページロード時 | 基本初回 | 公式サイト/ブラウザ依存 | 不明 | 公式サイト/ブラウザ依存 | mock static intercept optional | 未計測 | lib/mockApi/webviewXhrInterceptor.ts に一覧コメントあり。 |
| positions WebView injected train-data | lib/webViewInjectjavascript.ts |
startPolling/DatalistUpdate |
jr-shikoku-backend-api-v1.haruk.in |
/train-data |
positions WebView | Phase 2後、polling開始 | 30秒 | なし | なし | WebView localStorage 1日 | 失敗は無視 | 未計測 / RN側は train_operation |
RN側Providerと重複取得。WebView内なのでRN Sentryにspanなし。 |
| positions WebView injected operation-logs | lib/webViewInjectjavascript.ts |
operationListUpdate |
jr-shikoku-backend-api-v1.haruk.in |
/operation-logs |
positions WebView | Phase 1、Phase 3 polling、visibility復帰 | 30秒 | なし | なし | WebView localStorage 1日 | 失敗は無視 | 未計測 / RN側は operation_info |
RN側Providerと重複取得。 |
| positions WebView injected diagram | lib/webViewInjectjavascript.ts |
TrainDiagramData2Update |
jr-shikoku-api-data-storage.haruk.in |
/tmp/diagram-today.json |
positions WebView | Phase 2、polling | 30秒 | なし | なし | WebView localStorage 1時間 | 失敗は無視 | 未計測 / RN側は timetable |
RN側Providerと重複取得。環境切替URLが注入optionにあるが、現コード内fetch文字列は定数参照。 |
| positions WebView injected station-list | lib/webViewInjectjavascript.ts |
Phase 1 | n8n.haruk.in |
/webhook/jr-shikoku-station-list |
positions WebView | WebView注入script起動時 | 初回中心 | なし | なし | WebView localStorage 1週間 | 失敗は無視 | 未計測 / 候補 station_info |
走行位置WebView表示の補助データ。 |
| positions WebView injected problems | lib/webViewInjectjavascript.ts |
getProblemsData |
n8n.haruk.in |
/webhook/jrshikoku-position-problems |
positions WebView | Phase 1、polling、visibility復帰 | 30秒 | なし | なし | WebView localStorage 1分 | 失敗は無視 | 未計測 / 候補 positions_problem |
位置情報問題データ。 |
| positions WebView unyohub | lib/webViewInjectjavascript.ts |
unyohubDataUpdate |
jr-shikoku-api-data-storage.haruk.in |
/thirdparty/unyohub-unyo.json |
positions WebView | 設定ON時、Phase 3 | 30秒 | なし | なし | WebView localStorage 1時間 | 失敗はconsole | 未計測 / 候補 thirdparty_unyohub |
鉄道運用Hub由来の集約JSON。 |
| positions WebView elesite | lib/webViewInjectjavascript.ts |
elesiteDataUpdate |
jr-shikoku-api-data-storage.haruk.in |
/thirdparty/elesite-unyo.json |
positions WebView | 設定ON時、Phase 3 | 30秒 | なし | なし | WebView localStorage 1時間 | 失敗はconsole | 未計測 / 候補 thirdparty_elesite |
えれサイト由来の集約JSON。 |
| operation official page | ndView.tsx |
operation WebView | www.jr-shikoku.co.jp |
/info/ |
information | 運行情報root初回activate時 | WebView lifecycle依存 | WebView標準 | WebView標準 | OS/WebView依存 | remount watchdog | 未計測 | injected scriptでページ内容を加工し、画像生成結果をpostMessage。 |
| operation hidden preload | Apps.tsx |
HiddenStartupPreloadWebViews |
www.jr-shikoku.co.jp |
/info/ |
startup hidden preload | 起動時preload条件成立時 | 1回 | WebView標準 | なし | OS/WebView依存 | なし | 未計測 | Sentry breadcrumb/contextのみ。 |
| positions hidden preload | Apps.tsx |
HiddenStartupPreloadWebViews |
train.jr-shikoku.co.jp |
/ |
startup hidden preload | 起動時preload条件成立時 | 1回 | WebView標準 | なし | OS/WebView依存 | なし | 未計測 | 走行位置WebViewの事前ウォームアップ。 |
Sentry endpoint対象外だが存在するRN fetch
| 用途 | 呼び出し元ファイル | 実URL/host | path | タイミング | 更新間隔 | cache | 備考 |
|---|---|---|---|---|---|---|---|
| update権限 / 外部データ利用権限 | stateBox/useTrainMenu.tsx |
jr-shikoku-backend-api-v1.haruk.in または beta |
/check-permission?user_id=... |
push token取得後 | token/backend変更時 | なし | Sentry未計測。queryにuser_idあり。 |
| バス・列車データ | stateBox/useBusAndTrainData.tsx |
script.google.com |
GAS | mount時、AsyncStorage miss時 | 基本1回 | AsyncStorage BUS_AND_TRAIN |
Sentry未計測。 |
| train pair data | stateBox/useBusAndTrainData.tsx |
script.google.com |
GAS | mount時 | 基本1回 | なし | Sentry未計測。 |
| 遅延速報EX | stateBox/useTrainDelayData.tsx |
script.google.com |
GAS | loadingDelayData変化時 |
手動/状態依存 | なし | Sentry未計測。Android widgetにも同URLあり。 |
| 特急列車情報 | components/Menu/SpecialTrainInfoBox.tsx |
n8n.haruk.in |
/webhook/sptrainfo |
component mount | 1回 | なし | Sentry未計測。 |
| 位置ID補助情報 GET | components/発車時刻表/LED_inside_Component/TrainPosition.tsx, components/ActionSheetComponents/EachTrainInfo/TrainDataView.tsx |
n8n.haruk.in |
/webhook/JR-shikoku-PosID-v3?PosId=... |
列車詳細/LED表示時 | 表示対象変更ごと | なし | Sentry未計測。UI細部表示用。 |
| 位置ID補助情報 POST/DELETE | TrainPositionDataPush.tsx, TrainPositionDataDelete.tsx |
n8n.haruk.in |
/webhook/JR-shikoku-PosID-v3 |
ユーザー投稿/削除要求 | 操作時 | なし | Sentry未計測。mutating request。 |
| 通知設定登録 | components/Settings/NotificationSettings.tsx |
n8n.haruk.in |
/webhook/jr-shikoku-notification-configurations |
設定保存操作時 | 操作時 | AsyncStorageに設定保存 | Sentry未計測。tokenを送る。 |
| unyohub RN hook | stateBox/useUnyohub.tsx |
jr-shikoku-api-data-storage.haruk.in |
/thirdparty/unyohub-unyo.json |
設定ON時 | 10分 | AsyncStorage | WebView内でも別取得あり。 |
| elesite RN hook | stateBox/useElesite.tsx |
jr-shikoku-api-data-storage.haruk.in |
/thirdparty/elesite-unyo.json |
設定ON時 | 10分 | AsyncStorage | WebView内でも別取得あり。 |
| 駅住所LOD | components/駅名表/AddressText.tsx |
station別 jslodApi |
.json |
駅名標表示時 | 表示対象変更ごと | なし | 外部LOD。Sentry未計測。 |
| Anpanman列車状態 | components/ActionSheetComponents/EachTrainInfoCore/trainIconStatus.tsx |
n8n.haruk.in |
/webhook/{anpanmanApiPath}?trainNum=... |
対象列車詳細表示時 | 対象変更ごと | なし | Sentry未計測。 |
| Android operation widget | components/AndroidWidget/InfoWidget.tsx |
script.google.com |
operation info GAS | widget更新時 | widget runtime依存 | なし | RN画面外。 |
| Android delay widget | components/AndroidWidget/TraInfoEXWidget.tsx |
script.google.com |
delay GAS | widget更新時 | widget runtime依存 | なし | RN画面外。 |
| GeneralWebView recording import | GeneralWebView.tsx |
arbitrary / blob / resolvedUri内 | download URL | 録画importリンク操作時 | 操作時 | なし | 任意URL由来。Sentry endpoint化すべきではない。 |
endpoint別依存関係
positions
positions screen
├─ RN provider: useCurrentTrain
│ ├─ mock ON: jr-shikoku-backend-mock-api-v1 /train-positions/current
│ │ └─ fallback: module memory last-good cache
│ └─ mock OFF: n8n /webhook/c501550c...
│ └─ fallback: Google Apps Script positions fallback
│ └─ fallback: currentTrain previous state if present
├─ RN provider: useTrainMenu
│ ├─ mock ON: /position-masters
│ └─ mock ON: /train-positions/current, then inject to WebView mock XHR
└─ WebView: train.jr-shikoku.co.jp/sp.html
├─ official XHR /g?arg1=train&arg2=train
├─ official XHR static /g?... station/lang/etc
└─ injected enhancement fetches backend/storage/n8n auxiliary data
表示対象:
- 走行位置画面
- 列車詳細ActionSheet
- 発車標/LED系
- fixed position box
現Sentry tag:
endpoint=positions- WebView公式XHRは未計測。候補は
positions_webview。
operation_info
topMenu / information / train detail
├─ useAreaInfo
│ ├─ n8n /webhook/jr-shikoku-trainfo-flag
│ └─ if active area exists: Google Apps Script operation text
├─ useAllTrainDiagram
│ └─ jr-shikoku-backend-api-v1 /operation-logs
├─ information WebView
│ └─ www.jr-shikoku.co.jp/info/ official page
│ └─ injected script parses/captures page and postMessage to RN
└─ widgets / delay providers
├─ operation info GAS
└─ delay GAS
表示対象:
- topMenuバッジ・運行情報カード
- informationタブ
- 列車詳細内の運行ログ表示
- Android widgets
現Sentry tag:
endpoint=operation_info- WebView公式ページは未計測。
train_operation
train detail / diagram / WebView enhancement
├─ RN: useAllTrainDiagram -> backend /train-data
└─ WebView injected JS -> backend /train-data
└─ localStorage cache 1 day
表示対象:
- 列車詳細
- ダイヤ/発車標
- 走行位置WebViewの列車アイコン・編成/運用装飾
現Sentry tag:
- RN fetch:
endpoint=train_operation - WebView fetch: 未計測
timetable
timetable / station diagram / train detail
├─ RN: useAllTrainDiagram -> data-storage /tmp/diagram-today.json
│ └─ fallback: AsyncStorage ALL_TRAIN_DIAGRAM
└─ WebView injected JS -> data-storage /tmp/diagram-today.json
└─ localStorage cache 1 hour
表示対象:
- 時刻表
- 発車標
- 列車詳細停車駅/通過駅
- 走行位置WebView内の補助表示
現Sentry tag:
- RN fetch:
endpoint=timetable - WebView fetch: 未計測
画面別fetch一覧
アプリ起動直後
Providerがmountされるため、現在の構成では表示タブに関係なく以下が走り得る。
| 取得 | 起動時挙動 | 備考 |
|---|---|---|
useCurrentTrain.getCurrentTrain |
即時1回、その後15秒interval | positions。mock ON/OFFで経路が変わる。 |
useAllTrainDiagram.getTrainDiagram |
即時1回、その後30秒interval | timetable。AsyncStorage fallbackあり。 |
useAllTrainDiagram.getCustomTrainData |
即時1回、その後30秒interval | train_operation。 |
useAllTrainDiagram.getTodayOperation |
即時1回、その後30秒interval | operation_info。 |
useAreaInfo.getAreaData |
InteractionManager後 + 1200ms遅延。その後60秒interval | operation_info flag。対象ありならGAS textも800ms遅延。 |
useTrainMenu.check-permission |
push token取得後 | Sentry未計測。 |
| hidden preload WebViews | preload条件成立時 | positions公式/operation公式を不可視WebViewでロード。 |
topMenu表示中
| 取得 | 発生源 | 備考 |
|---|---|---|
| positions RN polling | useCurrentTrain provider |
表示タブに関係なく継続。ただしbackgroundではinterval停止。 |
| timetable / train_operation / operation_logs | useAllTrainDiagram provider |
表示タブに関係なく30秒ごと。 |
| operation flag / text | useAreaInfo |
topMenu表示内容に直結。 |
| special train info | SpecialTrainInfoBox |
該当Sheet表示時のみ。 |
positions表示中
| 取得 | 発生源 | 備考 |
|---|---|---|
| positions RN polling | useCurrentTrain |
15秒。画面表示に必須。 |
| train.jr-shikoku公式WebView | AppsWebView |
公式XHRはRN Sentry不可視。 |
| WebView injected train-data / operation-logs / diagram / station-list / problems | webViewInjectjavascript |
RN providerと重複取得あり。WebView localStorage cacheあり。 |
| unyohub / elesite | WebView injected JS、またはRN hooks | 設定ON時のみ。 |
information表示中
| 取得 | 発生源 | 備考 |
|---|---|---|
| JR四国公式運行情報WebView | ndView.tsx |
https://www.jr-shikoku.co.jp/info/。RN Sentryではpage load breadcrumb中心。 |
| operation flag/text | useAreaInfo |
バッジ/本文補助。 |
| operation logs | useAllTrainDiagram |
列車別運行ログ。 |
バックグラウンド復帰時
| 取得 | 発生源 | 備考 |
|---|---|---|
useInterval |
AppState active復帰時に即時実行 | userStoppedでなければ即時fetch。observedFetch側はbackground開始を抑制。 |
| positions WebView | useWebViewRemount / WebView lifecycle |
iOSはunfocused時watchdog pause設定あり。 |
WebView injected refreshAllData |
document visibilitychange/pageshow | WebView内で train-data / operation-logs / position-problems を再取得。RN Sentry不可視。 |
| GeneralWebView | background 10秒超でremount | 汎用WebViewのみ。 |
起動時/タブ切替時fetchタイムライン
T+0ms app providers mount
├─ useCurrentTrain -> positions current fetch
├─ useAllTrainDiagram -> timetable fetch
├─ useAllTrainDiagram -> train_operation fetch
├─ useAllTrainDiagram -> operation_logs fetch
└─ useTrainMenu -> settings/env load, maybe check-permission after token
T+after interactions + 1200ms
└─ useAreaInfo -> operation_info_flag
└─ if active area exists: +800ms -> operation_info_text GAS
TopMenu first screen
└─ no page-specific heavy WebView, but provider fetches above continue
positions first activation
├─ AppsWebView loads train.jr-shikoku.co.jp/sp.html
├─ official site starts /g?... XHRs
├─ injected JS Phase 0: WebView localStorage cache read
├─ injected JS Phase 1: station-list, operation-logs, position-problems
├─ injected JS Phase 2: train-data, diagram-today
└─ injected JS Phase 3: 30s polling, optional unyohub/elesite
information first activation
├─ ndView WebView loads www.jr-shikoku.co.jp/info/
└─ injected script parses/captures page and postMessage to RN when user capture actions occur
Tab switch back to positions/information
├─ root component is kept after activation
├─ WebView retention depends on current navigation/root gating and OS WebView process
└─ provider-level RN fetches generally continue independent of active tab
危険度・制御方針
High priority
| 取得 | 分類理由 | 推奨方針 |
|---|---|---|
/train-positions/current |
表示中timeoutがユーザー体感に直結。Sentryで実測済み。 | server-side duration/upstream/cacheログ、backend last-known-good、app persistent stale cache。 |
useCurrentTrain n8n positions |
mock OFF時の主経路。走行位置画面に必須。 | stale cache導入、失敗時UI全体error回避、endpoint細分化。 |
JR公式WebView /g?arg1=train&arg2=train |
走行位置WebViewの本体だがRN Sentry不可視。 | WebView postMessage計測、またはRN側 proxy/cache化を検討。 |
/operation-logs |
WebView/RNで重複、列車詳細表示に影響。 | backend span/cache hit/miss、WebView側計測。 |
/train-data |
大きいレスポンス、RN/WebViewで重複。 | stale cache、conditional fetch、WebView/RN共有設計。 |
Medium priority
| 取得 | 分類理由 | 推奨方針 |
|---|---|---|
diagram-today.json |
広範囲で使うがAsyncStorage fallbackあり。 | stale cache明示、WebView側との重複削減。 |
operation_info_flag |
topMenuバッジ/運行情報表示に影響。 | endpoint細分化、失敗時は前回状態維持。 |
operation_info_text GAS |
遅延/timeout履歴あり。必須ではない詳細本文。 | preloadではなく遅延維持、stale cache、cellular抑制候補。 |
| station-list / position-problems WebView | 表示補助。WebView内でのみ見えにくい。 | WebView breadcrumb/postMessage計測。 |
| unyohub / elesite | 設定ON時のみだがWebView内は30秒polling。 | cellular抑制、10分程度へ間引き、Sentry breadcrumb。 |
Low priority
| 取得 | 分類理由 | 推奨方針 |
|---|---|---|
| bus/train GAS | 初回またはcache miss中心。 | observedFetch化は後回し。 |
| train pair GAS | 補助データ。 | cache導入候補。 |
| special train info | Sheet表示時のみ。 | 失敗UIだけ整備。 |
| notification config | ユーザー操作時のみ。 | mutationとして個別エラーハンドリング。 |
| station LOD address | 駅名標詳細のみ。 | 失敗しても無表示でよい。 |
| Anpanman status | 装飾表示。 | 失敗してもUI全体に影響させない。 |
stale cacheを入れるべき取得
| 優先度 | 取得 | 理由 | 推奨cache |
|---|---|---|---|
| High | /train-positions/current |
走行位置表示が直接壊れる | backend last-known-good + app persistent cache。TTL 30-120秒。 |
| High | n8n positions | mock OFF時の主経路 | app persistent last-good。TTL 30-120秒。 |
| High | JR公式WebView train XHR | WebView表示本体 | 公式XHRをRN/proxy化できるならstale。難しければWebView localStorage/postMessage。 |
| Medium | /operation-logs |
列車詳細/運行情報補助 | backend/app cache。TTL 1-5分。 |
| Medium | /train-data |
大容量かつ重複取得 | app/WebView共有cache。TTL 1日でも許容しやすい。 |
| Medium | diagram-today.json |
既にAsyncStorage fallbackあり | 既存cacheをstale表示として明示。TTL 1日。 |
| Medium | operation_info_flag |
バッジ/エリア判定 | 前回状態維持。TTL 1-5分。 |
| Medium | operation_info_text |
GAS遅延に弱い | 前回本文保持。TTL 5-30分。 |
| Low | unyohub / elesite | 設定ON時の補助 | 既存AsyncStorage/WebView localStorageを活用。TTL 10-60分。 |
バックエンド側に計測を入れるべきAPI
| API | host | 理由 | 必要な計測 |
|---|---|---|---|
/train-positions/current |
jr-shikoku-backend-mock-api-v1.haruk.in |
Sentryでforeground timeout確認済み。 | handler duration, upstream duration, cache hit/miss, stale served, status, bytes, upstream error kind。 |
/position-masters |
jr-shikoku-backend-mock-api-v1.haruk.in |
mock経路の基礎データ。頻度低いが失敗時mock表示品質に影響。 | handler duration, cache hit/miss, db/storage duration。 |
/train-data |
jr-shikoku-backend-api-v1.haruk.in |
大容量・RN/WebView重複取得。 | handler duration, data source duration, response bytes, compression, cache status。 |
/operation-logs |
jr-shikoku-backend-api-v1.haruk.in |
operation_infoとしてRN/WebView重複取得。 | handler duration, query/upstream duration, cache status, filtered count。 |
/check-permission |
jr-shikoku-backend-api-v1.haruk.in |
user_id queryあり、失敗しても表示は続くが権限UIに影響。 | duration, auth/lookup duration, no PII logging。 |
diagram-today.json publish pipeline |
jr-shikoku-api-data-storage.haruk.in |
静的配信だが生成元障害は広範囲影響。 | CDN/storage access log, generation timestamp, object age, size。 |
thirdparty/unyohub-unyo.json |
jr-shikoku-api-data-storage.haruk.in |
外部由来の集約結果。 | generation timestamp, upstream scrape duration, source error count。 |
thirdparty/elesite-unyo.json |
jr-shikoku-api-data-storage.haruk.in |
外部由来の集約結果。 | generation timestamp, upstream scrape duration, source error count。 |
Sentry endpoint tag改善案
RN側observedFetchについては、4分類から以下の低カーディナリティな論理endpointへ細分化済み。area=data_fetch, result, root_tab, status は維持し、source, user_visible, preload, fetch_priority を追加した。
現在のRN側endpoint分類
低カーディナリティを維持するため、URL単位ではなく論理単位で増やす。
| 旧endpoint | 現endpoint | 対象 |
|---|---|---|
positions |
positions_current |
現在位置本体。n8n current / mock currentを含めるかは要検討。 |
positions |
positions_master |
/position-masters。 |
positions |
positions_gas_fallback |
Google Apps Script fallback。 |
| 未計測 | positions_webview |
JR公式WebView XHR / postMessage計測。 |
operation_info |
operation_info_flag |
n8n flag。 |
operation_info |
operation_info_text |
Google Apps Script text。 |
operation_info |
operation_logs |
backend /operation-logs。 |
train_operation |
train_operation_data |
backend /train-data。 |
timetable |
timetable_today |
diagram-today.json。 |
| 未計測 | thirdparty_unyohub |
unyohub集約JSON。 |
| 未計測 | thirdparty_elesite |
elesite集約JSON。 |
追加tag
source=rn_fetch|mock_api|n8n|gas|backend_api|static_storage|webview_fetchuser_visible=true|falsepreload=true|falsefetch_priority=high|medium|low
注意
endpointtagにURL全文やID入りpathは入れない。urlHostとurlPathTemplateはcontextに維持する。positions_currentをn8n/mock/GASで分けすぎるとissue数は追いやすいが、全体のpositions失敗率は見にくくなる。sourcetagまたはcontextでmock_api / n8n / gasを分ける案も有効。
変更案の優先順位
High
positions_currentのendpoint細分化、またはsource=mock_api|n8n|gas追加。- WebView公式XHR
/g?arg1=train&arg2=trainのpostMessage計測。 - backend mock API
/train-positions/currentにserver-side span/cache/upstream durationを追加。 - positionsのpersistent stale cache。
Medium
operation_infoをoperation_info_flag / operation_info_text / operation_logsに分離。- WebView injected JS fetchの軽量postMessage計測。
/train-dataとdiagram-today.jsonのRN/WebView重複取得を整理。- unyohub/elesiteのWebView polling間隔を30秒から設定/TTLベースへ見直し。
Low
- LED/駅詳細/通知/Widget系の直接fetchをobservedFetch化。
- 任意URLを扱うGeneralWebView importはSentry endpoint化せず、操作エラーとして別分類。
- station LOD address fetchの失敗をUI非表示に統一。
現時点の結論
- Sentryで見えている
positionsのtimeoutは、RN側のmock currentまたはn8n/GAS経路のどれかに紐づく。今回観測されたurlHost=jr-shikoku-backend-mock-api-v1.haruk.in,urlPathTemplate=/train-positions/currentはmock currentで確定。 - 走行位置画面ではRN provider fetchとWebView公式XHR、さらにWebView injected fetchが並行して走る。見えているSentry spanはRN provider側だけで、WebView内の公式取得は不可視。
operation_infoはflag、GAS text、backend operation logs、公式WebViewの4系統が混在しているため、細分化した方が原因追跡しやすい。train_operationとtimetableはRNとWebViewで重複取得している。ユーザー体感の安定化には、stale cacheと重複削減が効きやすい。- バックエンド側で最優先に計測すべきは
/train-positions/current。次点で/train-dataと/operation-logs。