コンテンツにスキップ

sync-data-stuck

サービス
クラウド - アプリ
severity
criticalurgency high
出所
worker
スコープ
ALL
dedup_key
workos:sync-data-stuck:mirror

一次対応

agg.org / agg.app_user / agg.org_membership / agg.invitation の sync_error を読む。JobRunr で reconcile-data-to-workos が動いているか、失敗した sync-data-to-workos ジョブが残っていないか、agg.workos.apiKey と agg.workos.enabled が入っているかを確認

custom_details.tables にテーブルごとの pending / failed / oldest_pending_seconds が入っている。読む順は failed が先で、両者は別の障害を指す。

failed > 0 — その行は一度以上 push されて WorkOS に拒否されている。push は成功時に sync_error を消すので、残っているものは再試行しても同じ本文で拒否され続ける。閾値なしで発報するのはこのため。何を拒否されたかは行に書いてある。

SELECT id, updated_at, synced_at, sync_error FROM agg.org WHERE sync_error IS NOT NULL;
-- agg.app_user / agg.org_membership / agg.invitation も同じ形

failed = 0 で oldest_pending_seconds だけ伸びている — 押し出しそのものが止まっている。行を書いた側が sync-data-to-workos を enqueue するのが通常経路で、そこが落ちた行は毎時の reconcile-data-to-workos が拾う。つまり最大 1 時間は自力で復旧する余地があり、閾値 15 分はその途中で鳴る。JobRunr ダッシュボードで見るのは 3 つ。

  • reconcile-data-to-workos が recurring job として動いているか(0 * * * *、paused でないか)
  • sync-data-to-workos の失敗ジョブが溜まっていないか
  • どちらも動いていて pending が減らないなら agg.workos.enabled と agg.workos.apiKey(未設定なら push は即 return する)

pending の数そのものは判断材料にならない。reconcile は 1 テーブル 1 回あたり agg.workos.maxRowsPerRun(200)行までしか出さないので、招待の一括投入は数時間かけて正常に捌ける。伸び続ける oldest_pending_seconds だけが異常のしるし。

拒否された行は本文を直すのが復旧で、再試行ではない。sync_error が指す項目を管理画面から修正すると updated_at が動き、次の push 対象に戻る。

押し出しが止まっていた場合は原因を取り除いたうえで、JobRunr から reconcile-data-to-workos を手動実行すれば待たずに流れる。個別の行だけを急ぐなら sync-data-to-workos を (resource, id) 指定で再実行する。

メンバー画面の 未同期 / 同期済 / 失敗 バッジは同じ列を見ているので、復旧の確認はその画面でもよい。

WorkOS 側が受け付けない(API が 4xx を返し続ける、ロールが workspace に存在しない)ところまで切り分けたら、WorkOS のダッシュボードを触れる担当に渡す。権限変更が反映されていない状態が続くので、緊急なら該当ユーザーの操作を止める判断を先に取る。

まだない。