Skip to main content

Error handling & observability ở production

Không nên có một catch(error) => toast('Có lỗi') cho mọi trường hợp. Với Inertia, phần lớn error semantics vẫn đến từ backend framework.

4 nhóm cần tách

Laravel exception rendering

Tùy version Laravel, hãy cấu hình exception response theo cơ chế framework đang dùng. Ý tưởng là với status production như 403/404/500/503, trả một Inertia error page thay vì HTML debug response.

React error page

Log tối thiểu nên có

  • request/correlation ID;
  • authenticated user ID nếu có;
  • route + method;
  • exception class/message;
  • DB/service context không chứa secret;
  • timing của dependency quan trọng;
  • deployment/version identifier.
Không log password, token, session cookie hoặc toàn bộ request body vô điều kiện.

Debug development

Inertia có cơ chế hiển thị non-Inertia response trong modal để developer vẫn thấy error page của backend khi request chạy qua XHR. Production thì cần error response thân thiện và observability thật sự, không dựa vào dev modal.

Validation error khác exception

Validation là expected business/input flow:
Không gửi validation failure vào Sentry như một exception server. Ngược lại, 500/network failure cần telemetry khác:

419/session expiry

Một UX production tốt nên trả message người dùng hiểu được thay vì raw exception:
Với form dài, cân nhắc history-restorable draft để user không mất toàn bộ dữ liệu.

Correlation ID

Middleware có thể gắn request id:
Shared flash/error page chỉ nên expose ID hỗ trợ nếu cần:
Như vậy screenshot của user có thể map về server log mà không expose stack trace.

Failure test matrix


Tài liệu chính thức

Nội dung thực chiến trong bài được xây dựng dựa trên API và nguyên lý của Inertia.js v3 Documentation. Khi áp dụng vào dự án, hãy đối chiếu API cụ thể với tài liệu chính thức theo phiên bản bạn đang sử dụng.