KoderKoder.ai
Bảng giáDoanh nghiệpGiáo dụcDành cho nhà đầu tư
Đăng nhậpBắt đầu

Sản phẩm

Bảng giáDoanh nghiệpDành cho nhà đầu tư

Tài nguyên

Liên hệHỗ trợGiáo dụcBlog

Pháp lý

Chính sách bảo mậtĐiều khoản sử dụngBảo mậtChính sách sử dụng chấp nhận đượcBáo cáo vi phạm

Mạng xã hội

LinkedInTwitter
Koder.ai
Ngôn ngữ

© 2026 Koder.ai. Bảo lưu mọi quyền.

Trang chủ›Blog›Cách xây ứng dụng web để theo dõi sự cố & postmortem
06 thg 11, 2025·8 phút

Cách xây ứng dụng web để theo dõi sự cố & postmortem

Bản hướng dẫn thực tế để thiết kế, xây dựng và ra mắt ứng dụng web theo dõi sự cố và postmortem — từ workflow đến mô hình dữ liệu và UX.

Cách xây ứng dụng web để theo dõi sự cố & postmortem

Làm rõ mục tiêu, người dùng và chỉ số thành công

Trước khi phác thảo màn hình hoặc chọn cơ sở dữ liệu, hãy thống nhất xem nhóm bạn hiểu thế nào về ứng dụng web theo dõi sự cố — và “quản lý postmortem” nên đạt được điều gì. Các nhóm thường dùng cùng từ ngữ nhưng với ý khác nhau: với nhóm này, một incident là bất kỳ vấn đề do khách hàng báo; với nhóm khác, chỉ là outage Sev-1 có escalation on-call.

Định nghĩa “theo dõi sự cố” cho nhóm bạn

Viết một định nghĩa ngắn trả lời:

  • Điều gì đủ điều kiện là một incident (ảnh hưởng khách hàng, chỉ nội bộ, sự kiện bảo mật, vi phạm SLA)?
  • Khi nào một incident “bắt đầu” và “kết thúc” (cảnh báo đầu tiên vs xác nhận bởi con người; đã sửa xong vs đang giám sát)?
  • Dữ liệu nào là bắt buộc (dịch vụ bị ảnh hưởng, severity, owner, dấu thời gian, cập nhật trạng thái)?

Định nghĩa này quyết định quy trình phản ứng sự cố và ngăn app trở nên quá chặt (không ai dùng) hoặc quá lỏng (dữ liệu không nhất quán).

Định nghĩa “quản lý postmortem” (và lý do bạn làm)

Quyết định postmortem là gì trong tổ chức của bạn: một bản tóm tắt nhẹ cho mọi sự cố, hay RCA đầy đủ chỉ cho các sự cố mức cao. Rõ ràng mục tiêu là học hỏi, tuân thủ, giảm tái diễn, hay cả ba.

Một quy tắc hữu ích: nếu bạn mong đợi postmortem phải dẫn đến thay đổi, công cụ của bạn phải hỗ trợ theo dõi action items, không chỉ lưu trữ tài liệu.

Liệt kê các vấn đề bạn đang giải quyết

Hầu hết các đội xây app kiểu này để khắc phục một vài nỗi đau lặp lại:

  • Tầm nhìn: “Hiện tại xảy ra gì?” “Dịch vụ này hỏng bao nhiêu lần?”
  • Phối hợp: ownership rõ ràng, bàn giao, và timeline sự cố chung
  • Học hỏi: mẫu RCA nhất quán và quy trình review thực sự diễn ra
  • Theo dõi thực thi: action items không biến mất sau cuộc họp

Giữ danh sách này gọn. Mỗi tính năng thêm vào nên giải quyết ít nhất một trong những vấn đề này.

Chọn chỉ số thành công phù hợp với hành vi

Chọn vài chỉ số bạn có thể đo tự động từ mô hình dữ liệu app:

  • Thời gian phát hiện, xác nhận, giảm thiểu và giải quyết (timeline sự cố nên ghi lại các mốc này)
  • Tần suất theo severity, dịch vụ và nhóm nguyên nhân gốc
  • Tỷ lệ đóng action-item và thời gian trung vị để đóng
  • Tín hiệu chất lượng: tỷ lệ sự cố có postmortem hoàn thành trong N ngày; tỷ lệ có owner rõ ràng và cập nhật trạng thái

Những thứ này trở thành chỉ số vận hành và “định nghĩa hoàn thành” cho bản phát hành đầu tiên.

Làm rõ người dùng của bạn (và nhu cầu của từng vai trò)

Cùng một app phục vụ nhiều vai trò trong vận hành on-call:

  • Kỹ sư on-call: intake nhanh, trường tối thiểu, cập nhật trạng thái dễ dàng
  • Incident commander: view để điều phối, trạng thái hiện tại, owner, checkpoint
  • Quản lý: xu hướng, sự cố lặp, theo dõi thực thi action items
  • Stakeholder: cập nhật trạng thái rõ ràng không có tiếng ồn nội bộ

Nếu bạn thiết kế cho tất cả cùng lúc, UI sẽ lộn xộn. Thay vào đó, chọn người dùng chính cho v1 — và đảm bảo những người còn lại vẫn có thể lấy thông tin họ cần qua các view, dashboard và quyền truy cập phù hợp sau này.

Thiết kế workflow sự cố và vai trò

Một workflow rõ ràng ngăn hai lỗi phổ biến: sự cố bị treo vì không ai biết “bước tiếp theo là gì,” và sự cố được xem là “xong” nhưng không sinh ra bài học. Bắt đầu bằng cách vẽ lifecycle end-to-end rồi gắn vai trò và quyền cho từng bước.

Lập bản đồ vòng đời sự cố

Hầu hết các đội theo vòng đơn giản: phát hiện → phân loại → giảm thiểu → giải quyết → học hỏi. App của bạn nên phản ánh điều này bằng một tập bước dự đoán, không phải menu vô tận.

Định nghĩa thế nào là “xong” cho mỗi giai đoạn. Ví dụ, mitigation có thể có nghĩa là ảnh hưởng tới khách hàng đã bị ngăn lại, dù nguyên nhân gốc còn chưa rõ.

Xác định vai trò và trách nhiệm

Giữ vai trò rõ ràng để mọi người có thể hành động mà không chờ họp:

  • Reporter: tạo incident, thêm ngữ cảnh ban đầu, đính kèm link/log
  • Responder: điều tra, thêm cập nhật, thực hiện mitigation
  • Incident Commander: chịu trách nhiệm điều phối, phân công responder, phê duyệt severity, kiểm soát cập nhật cho stakeholder
  • Reviewer: dẫn dắt review sau sự cố, đảm bảo chất lượng postmortem

UI nên làm nổi bật “owner hiện tại”, và workflow nên hỗ trợ ủy quyền (reassign, thêm responder, quay vòng commander).

Trạng thái và chuyển đổi

Chọn các trạng thái cần thiết và chuyển đổi được phép, ví dụ Investigating → Mitigated → Resolved. Thêm hàng rào:

  • Yêu cầu severity trước khi đi qua triage.
  • Yêu cầu tóm tắt resolution trước khi đánh dấu Resolved.
  • Ngăn “Resolved → Investigating” trừ khi có lý do mở lại được ghi lại.

Lên kế hoạch kênh liên lạc

Tách cập nhật nội bộ (nhanh, chiến thuật, có thể lộn xộn) khỏi cập nhật cho stakeholder (rõ ràng, có dấu thời gian, được tuyển chọn). Xây hai luồng cập nhật với mẫu, phạm vi hiển thị và quy tắc phê duyệt khác nhau — thường commander là người duy nhất xuất bản cho stakeholder.

Mô hình dữ liệu: thực thể, quan hệ và lịch sử

Một công cụ sự cố tốt có cảm giác “đơn giản” ở UI vì mô hình dữ liệu phía sau nhất quán. Trước khi build màn hình, quyết định object nào tồn tại, cách chúng liên hệ và dữ liệu nào phải lưu chính xác theo lịch sử.

Thực thể cốt lõi (đối tượng bạn lưu)

Bắt đầu với tập nhỏ các đối tượng first-class:

  • Incident: container cho mọi thứ đã xảy ra.
  • Service: thứ bạn vận hành (API, database, mobile app), dùng cho báo cáo và xác định ảnh hưởng.
  • Update: cập nhật trạng thái dạng văn bản (dùng cho ghi chú nội bộ và trạng thái công khai).
  • Timeline Event: sự kiện có dấu thời gian chính xác (“alert fired”, “rolled back”, “đã áp dụng mitigation”).
  • Action Item: việc theo dõi với owner và ngày đáo hạn.
  • Postmortem: bản viết có cấu trúc (ảnh hưởng, phân tích nguyên nhân gốc, bài học, link).

Quan hệ và định danh

Hầu hết quan hệ là một-nhiều:

  • Một Incident → nhiều Updates / Timeline Events / Action Items
  • Một Incident → một (hoặc không) Postmortem
  • Một Incident ↔ nhiều Services (thường many-to-many qua bảng join “affected_services”)

Dùng định danh ổn định (UUID) cho incidents và events. Con người vẫn cần một khoá thân thiện như INC-2025-0042, bạn có thể sinh từ chuỗi số.

Metadata bạn sẽ cần sau này

Mô hình hoá từ sớm để có thể lọc, tìm và báo cáo:

  • Severity, status (open/mitigated/resolved), tags
  • Thời gian bắt đầu, kết thúc, thời gian phát hiện
  • Incident commander, team owner, on-call rotation (tùy chọn)
  • Dịch vụ bị ảnh hưởng, tóm tắt ảnh hưởng khách hàng

Lịch sử, lưu giữ và truy vết

Dữ liệu sự cố nhạy cảm và thường được xem lại sau này. Xử lý chỉnh sửa như dữ liệu — không ghi đè:

  • Lưu created_at/created_by trên mọi bản ghi.
  • Với chỉnh sửa, giữ audit log (thay đổi trường + người thực hiện + timestamp), hoặc version các tài liệu quan trọng (postmortem, updates).
  • Quyết định chính sách lưu trữ từ đầu (ví dụ: giữ incidents vĩnh viễn, xoá transcript chat sau N ngày).

Cấu trúc này giúp những tính năng sau — tìm kiếm, chỉ số, quyền — dễ triển khai mà không phải làm lại.

Xây phần tạo incident, cập nhật và timeline

Khi có sự cố, nhiệm vụ của app là giảm gõ phím và tăng độ rõ ràng. Phần này nói về “đường viết”: cách người ta tạo incident, cập nhật nó và tái dựng sự kiện sau này.

Intake sự cố: trường tối thiểu, mặc định thông minh

Giữ form intake đủ ngắn để hoàn thành khi đang gỡ sự cố. Bộ trường bắt buộc tốt là:

  • Title (ngôn ngữ thường: “Lỗi thanh toán trên mobile”)
  • Service/System (chọn từ danh sách để tránh lỗi chính tả)
  • Severity (mặc định dựa trên service hoặc thời điểm, nhưng có thể chỉnh)
  • Reporter (tự động điền từ user đăng nhập)

Các thứ khác nên là tuỳ chọn khi tạo (ảnh hưởng, link ticket khách hàng, nguyên nhân nghi ngờ). Dùng mặc định thông minh: đặt start time là “now”, chọn trước on-call team của người dùng, và có hành động một chạm “Create & open incident room”.

Cập nhật nhanh: trạng thái, ảnh hưởng, bước tiếp theo

UI cập nhật nên tối ưu cho các sửa nhỏ lặp lại. Cung cấp panel cập nhật gọn với:

  • Status (Investigating / Identified / Mitigated / Resolved)
  • Tóm tắt ảnh hưởng (1–2 câu)
  • Ghi chú chính (điểm thay đổi kể từ cập nhật trước)
  • Bước tiếp theo (ai làm gì)

Thiết kế cập nhật theo kiểu append: mỗi cập nhật trở thành một mục có timestamp, không ghi đè văn bản trước.

Timeline: lịch sử tự động và sự kiện thủ công

Xây timeline trộn:

  • Sự kiện tự ghi nhận: thay đổi trường (severity, status), thay đổi assignee, thêm link, thời gian resolution
  • Sự kiện thủ công: “Deploy hotfix”, “Rolled back”, “DB failover started”

Điều này tạo nên câu chuyện đáng tin cậy mà không buộc mọi người nhớ ghi lại mỗi hành động.

Thiết kế cho tốc độ trên mobile

Trong outage, nhiều cập nhật xảy ra từ điện thoại. Ưu tiên màn hình nhanh, ít cản trở: target chạm lớn, một trang cuộn, nháp offline-friendly, và hành động một chạm như “Post update” và “Copy incident link”.

Thêm severity, checklist và ngữ cảnh hỗ trợ

Severity là “nút chỉnh tốc” của phản ứng sự cố: nó cho biết mức ưu tiên hành động, phạm vi truyền thông và những đánh đổi chấp nhận được.

Định nghĩa các cấp severity (và ý nghĩa)

Tránh nhãn mơ hồ như “cao/trung bình/thấp.” Làm cho mỗi mức severity tương ứng với kỳ vọng vận hành rõ ràng — đặc biệt là thời gian phản hồi và tần suất truyền thông.

Ví dụ:

  • SEV1 (Critical): outage gây ảnh hưởng người dùng hoặc rủi ro an toàn/bảo mật lớn. Page ngay, mở cầu họp/chat, cập nhật stakeholders mỗi 15–30 phút, cân nhắc cập nhật trạng thái công khai.
  • SEV2 (Major): suy giảm nghiêm trọng hoặc outage từng phần. Phản hồi nhanh, phối hợp trong chat, cập nhật stakeholders mỗi 30–60 phút.
  • SEV3 (Minor): ảnh hưởng hạn chế, có workaround. Xử lý trong giờ làm việc nếu phù hợp, cập nhật ở mốc quan trọng.
  • SEV4 (Info): không ảnh hưởng trực tiếp; theo dõi như vấn đề vận hành.

Hiển thị các quy tắc này trong UI nơi chọn severity để responder không phải tìm tài liệu bên ngoài khi đang outage.

Thêm checklist cho responder khớp workflow

Checklist giảm tải nhận thức khi mọi người căng thẳng. Giữ chúng ngắn, hành động được và gắn với vai trò.

Một mẫu hữu ích có vài mục:

  • Triage: xác nhận ảnh hưởng khách hàng, xác định blast radius, đặt severity, phân công incident lead.
  • Mitigation: xác nhận rollback/feature flag, kiểm tra tín hiệu phục hồi, giám sát regressions.
  • Comms: thông báo support, đăng cập nhật nội bộ, quyết định /status update, soạn thông điệp cho khách hàng.

Ghi thời gian và người thực hiện cho từng mục checklist để chúng trở thành phần của hồ sơ sự cố.

Liên kết artifacts hỗ trợ (để không mất ngữ cảnh)

Sự cố hiếm khi sống một nơi. App của bạn nên cho phép đính kèm link tới:

  • Dashboard và biểu đồ cụ thể
  • Truy vấn log
  • Ticket/issue
  • Chuỗi chat hoặc kênh war-room
  • Runbook và playbook

Ưu tiên “typed links” (ví dụ: Runbook, Ticket) để có thể lọc sau này.

Ghi lại tác động SLA/SLO khi cần

Nếu tổ chức theo dõi mục tiêu độ tin cậy, thêm trường nhẹ như SLO affected (yes/no), ước tính tiêu hao error budget, và rủi ro vi phạm SLA khách hàng. Giữ chúng tuỳ chọn — nhưng dễ điền trong hoặc ngay sau sự cố, khi thông tin còn tươi.

Tạo mẫu postmortem và luồng review

Iterate Safely With Snapshots
Lưu phiên bản ổn định trước thay đổi lớn và rollback nếu cần.
Tạo snapshot

Một postmortem tốt dễ bắt đầu, khó quên và nhất quán giữa các đội. Cách đơn giản là cung cấp một mẫu mặc định (với các trường bắt buộc tối thiểu) và tự điền từ record incident để người viết tập trung suy nghĩ chứ không gõ lại.

Mẫu postmortem thực tế (nên có)

Mẫu tích hợp nên cân bằng cấu trúc và linh hoạt:

  • Summary: chuyện gì đã xảy ra bằng ngôn ngữ đơn giản (2–5 câu).
  • Impact: ai/cái gì bị ảnh hưởng, bao lâu, triệu chứng nhìn thấy bởi người dùng, ảnh hưởng kinh doanh (đơn hàng bị chậm, tỷ lệ lỗi, SLA bị vi phạm).
  • Root cause: nguyên nhân chính kỹ thuật/quy trình. Giữ sự kiện mang tính sự thật, tránh đổ lỗi.
  • Contributing factors: vấn đề phụ (khoảng trống giám sát, ownership không rõ, thay đổi rủi ro về thời gian).
  • What went well / what went wrong / where we got lucky: các prompt giúp suy ngẫm chân thành và có hành động.

Có thể để “Root cause” là tuỳ chọn ban đầu để xuất bản nhanh, nhưng bắt buộc trước khi phê duyệt cuối.

Tự động liên kết postmortem với timeline incident

Postmortem không nên là tài liệu riêng lẻ. Khi tạo postmortem, tự động đính kèm:

  • Timeline incident (các cập nhật chính, thay đổi trạng thái, bước giảm thiểu)
  • Người tham gia (incident commander, responder, comms)
  • Artifacts (ticket liên quan, dashboard, log — lưu dưới dạng tham chiếu)

Dùng những thứ này để tự điền các phần postmortem. Ví dụ, block “Impact” có thể bắt đầu bằng start/end time và severity, trong khi “What we did” có thể kéo từ các mục timeline.

Luồng review và phê duyệt hỗ trợ học hỏi

Thêm workflow nhẹ để postmortem không bị mắc kẹt:

  1. Draft (tạo tự động khi đóng incident, hoặc tạo thủ công)
  2. In Review (giao reviewer — thường IC + service owner)
  3. Approved (khóa phần tóm tắt + ghi chú quyết định)
  4. Published (chia sẻ nội bộ; tùy chọn liên kết tới cập nhật cho khách hàng)

Ở mỗi bước, lưu ghi chú quyết định: đã thay gì, vì sao, và ai phê duyệt. Điều này tránh “chỉnh sửa im lặng” và giúp kiểm tra/audit hay review sau này dễ hơn.

Nếu muốn giữ UI đơn giản, coi review như comment với outcome rõ ràng (Approve / Request changes) và lưu lại phê duyệt cuối cùng như bản ghi không thể sửa.

Với những đội cần, liên kết “Published” tới workflow cập nhật trạng thái (xem /blog/integrations-status-updates) mà không sao chép nội dung thủ công.

Theo dõi action items đến khi hoàn thành

Postmortem chỉ giảm sự cố trong tương lai nếu công việc follow-up thực sự được thực hiện. Xử lý action items như đối tượng first-class trong app — không để chúng là đoạn văn cuối tài liệu.

Định nghĩa action items là bản ghi có cấu trúc

Mỗi action item nên có trường thống nhất để theo dõi và đo lường:

  • Owner (một người chịu trách nhiệm, dù thực thi có thể chia sẻ)
  • Due date (và tuỳ chọn “bắt đầu không trước”)
  • Priority (ví dụ P0–P3 hoặc High/Medium/Low)
  • Status (Open, In progress, Blocked, Done, Won’t do)
  • Verification criteria (cách xác minh fix đã hiệu quả)

Thêm metadata hữu ích: tags (ví dụ “monitoring”, “docs”), component/service, và “created from” (incident ID và postmortem ID).

Làm cho công việc dễ tìm giữa các incident

Đừng khóa action items trong một trang postmortem. Cung cấp:

  • Tìm kiếm toàn cục theo owner, service, tag và status
  • Bộ lọc như “overdue”, “due this week”, “blocked”, “high priority”
  • Báo cáo đơn giản: số lượng theo team/service, tỷ lệ hoàn thành, thời gian trung bình để đóng

Điều này biến follow-up thành hàng đợi vận hành thay vì ghi chú rải rác.

Công việc định kỳ và link ngoài (tuỳ chọn)

Một số nhiệm vụ lặp lại (đào tạo games, review runbook). Hỗ trợ mẫu định kỳ tạo item mới theo lịch, trong khi mỗi lần vẫn theo dõi riêng.

Nếu đội đã dùng tracker khác, cho phép action item chứa tham chiếu bên ngoài và external ID, trong khi app bạn là nguồn liên kết incident và xác minh.

Nhắc nhở và quy tắc escalations

Tạo các nhắc nhẹ: thông báo owner khi đến hạn, đánh dấu quá hạn cho lead team, và làm nổi mô hình quá hạn thường xuyên trong báo cáo. Giữ quy tắc cấu hình được để các đội phù hợp với vận hành on-call và tải công việc thực tế.

Quyền, kiểm soát truy cập và truy vết

Use a Proven Tech Base
Nhận frontend React với backend Go và PostgreSQL từ một cuộc hội thoại.
Sinh stack

Incident và postmortem thường chứa chi tiết nhạy cảm — PII khách hàng, IP nội bộ, phát hiện bảo mật, hay vấn đề nhà cung cấp. Quy tắc truy cập rõ ràng giúp công cụ hữu dụng cho cộng tác mà không biến thành rò rỉ dữ liệu.

Định nghĩa mức quyền

Bắt đầu với tập vai trò nhỏ, dễ hiểu:

  • View-only (stakeholders): đọc tóm tắt, timeline và postmortem cuối cùng, nhưng không sửa. Phù hợp cho lãnh đạo, hỗ trợ khách hàng và đối tác.
  • Editors (responders): tạo incident, thêm cập nhật, quản lý timeline và soạn postmortem.
  • Admins (owners): quản lý vai trò, cấu hình mẫu, kết nối integrations và giải quyết tranh chấp truy cập.

Nếu có nhiều team, cân nhắc scope vai trò theo service/team (ví dụ “Payments Editors”) thay vì cấp quyền toàn cục.

Quyết định phần nào private vs shareable

Phân loại nội dung sớm, trước khi thói quen xấu hình thành:

  • Trường nội bộ: PII khách hàng, ghi chú điều tra bảo mật, raw logs, transcript chat.
  • Trường chia sẻ: tóm tắt mức cao, thời gian bắt đầu/kết thúc, các mitigation, cập nhật công khai.

Một mẫu thực tế là đánh dấu phần là Internal hoặc Shareable và áp dụng trong export và trang trạng thái. Sự cố bảo mật có thể cần loại incident riêng với mặc định nghiêm ngặt hơn.

Audit log đáng tin cậy

Với mọi thay đổi trên incidents và postmortems, ghi lại: ai thay đổi, thay đổi gì, và khi nào. Bao gồm edit severity, timestamps, ảnh hưởng và phê duyệt cuối. Làm cho audit log có thể tìm kiếm và không thể chỉnh sửa.

Xác thực và an toàn phiên

Hỗ trợ auth mạnh: email + MFA hoặc magic link, và thêm SSO (SAML/OIDC) nếu người dùng mong đợi. Dùng session ngắn hạn, cookie an toàn, CSRF protection và thu hồi session tự động khi thay đổi vai trò. Với các cân nhắc rollout, xem /blog/testing-rollout-continuous-improvement.

UX: Dashboard, tìm kiếm và điều hướng

Khi một incident đang diễn ra, mọi người lướt qua — không đọc kỹ. UX nên làm cho trạng thái hiện tại hiển thị rõ trong vài giây, đồng thời cho responder khoan sâu vào chi tiết mà không lạc hướng.

Màn hình cốt lõi cần thiết kế trước

Bắt đầu với ba màn hình bao phủ hầu hết workflow:

  • Danh sách incident (dashboard): bảng hoặc thẻ hiển thị badge trạng thái, severity, title, dịch vụ bị ảnh hưởng, owner/commander, thời gian cập nhật cuối và thời lượng.
  • Chi tiết incident: nơi tổng hợp mọi thứ về một incident — tóm tắt, trạng thái hiện tại, link quan trọng, người tham gia và panel hành động.
  • View timeline: feed theo thời gian của cập nhật và sự kiện (alert, ghi chú thủ công, thay đổi trạng thái) với timestamp rõ ràng.

Quy tắc đơn giản: trang chi tiết phải trả lời “Hiện tại đang xảy ra gì?” ở trên, và “Chúng ta đến đây như thế nào?” phía dưới.

Lọc và tìm kiếm mà responder thực sự dùng

Incident tích tụ nhanh, nên làm cho tìm kiếm nhanh và khoan dung:

  • Bộ lọc nhanh: service, severity, status (open/mitigating/resolved/postmortem due), tag, khoảng ngày, owner.
  • Tìm kiếm qua: title, incident ID, component bị ảnh hưởng và tags.

Cung cấp view lưu sẵn như My open incidents hoặc Sev-1 this week để kỹ sư on-call không phải tạo lại filter mỗi ca.

Badge trạng thái và nhất quán “trạng thái hiện tại”

Dùng badge màu thống nhất an toàn với màu (color-safe) trên toàn app (tránh sắc độ khó phân biệt khi căng thẳng). Giữ cùng từ vựng trạng thái ở mọi nơi: danh sách, header chi tiết và event timeline.

Trong nháy mắt, responder nên thấy:

  • Trạng thái hiện tại + severity
  • Thời gian cập nhật cuối (và người đăng)
  • Checkpoint tiếp theo (ví dụ “Next update due in 8 min” nếu bạn hỗ trợ cadence cập nhật)

Đọc dễ trong tình trạng áp lực

Ưu tiên khả năng quét:

  • Timestamp lớn và header section rõ ràng
  • Header incident cố định khi cuộn
  • Section có thể gấp cho dữ liệu ồn (alert raw, log dài)
  • Điều hướng thân thiện bàn phím (/, n/p cho next/prev incident)

Thiết kế cho thời điểm tồi tệ nhất: nếu ai đó thiếu ngủ và được page trên điện thoại, UI vẫn phải hướng họ tới hành động đúng nhanh.

Tích hợp: Alerts, Chat, Ticketing và cập nhật trạng thái

Integrations biến công cụ theo dõi sự cố từ “nơi ghi note” thành hệ thống mà đội thực sự vận hành sự cố trong đó. Bắt đầu bằng cách liệt kê hệ thống cần kết nối: monitoring/observability (PagerDuty/Opsgenie, Datadog, CloudWatch), chat (Slack/Teams), email, ticketing (Jira/ServiceNow), và trang trạng thái.

Chọn phong cách tích hợp

Hầu hết đội dùng hỗn hợp:

  • Inbound webhooks cho alerts và chat commands (nhanh, gần real-time, chi phí vận hành thấp).
  • Polling khi công cụ không push được, nhưng giữ interval thận trọng và cache kết quả.
  • Liên kết thủ công như phương án dự phòng (dán URL alert, đính kèm key ticket), cũng bảo vệ khi API bị down.

Ngăn duplicate incidents (idempotency)

Alerts ồn, retry và thường đến không theo thứ tự. Định nghĩa idempotency key ổn định cho mỗi sự kiện provider (ví dụ: provider + alert_id + occurrence_id), và lưu nó với constraint unique. Với dedup, quyết định quy tắc như “cùng service + cùng signature trong 15 phút” nên append vào incident hiện có thay vì tạo mới.

Xác định ranh giới và chế độ lỗi

Rõ ràng về phần app bạn quản lý so với công cụ nguồn:

  • App bạn có thể quản lý incident record, timeline, roles và postmortem.
  • Hệ thống ticket có thể quản lý thi hành công việc và phê duyệt.

Khi integration lỗi, giảm mức phục vụ: queue retries, hiển thị cảnh báo trên incident (“Slack posting delayed”), và luôn cho phép operator tiếp tục thủ công.

Cập nhật trạng thái mà không thêm công việc

Xem status update là output first-class: một hành động “Update” cấu trúc trong UI nên có thể publish tới chat, append vào timeline incident, và tùy chọn sync tới trang trạng thái — mà không bắt responder viết cùng một message ba lần.

Kiến trúc và lựa chọn tech stack

Keep Full Source Control
Sở hữu codebase để đội bạn có thể gia cố, mở rộng và rà soát mọi thứ.
Xuất mã

Công cụ sự cố là hệ thống “khi có outage”, nên ưu tiên đơn giản và độ tin cậy hơn sự mới lạ. Stack tốt nhất thường là thứ đội bạn có thể build, debug và vận hành lúc 2 a.m. với tự tin.

Chọn stack đội bạn có thể duy trì

Bắt đầu với những gì kỹ sư của bạn đã deploy vào production. Một web framework phổ biến (Rails, Django, Laravel, Spring, Express/Nest, ASP.NET) thường an toàn hơn framework mới mà chỉ một người hiểu.

Với lưu trữ dữ liệu, cơ sở dữ liệu quan hệ (PostgreSQL/MySQL) phù hợp cho bản ghi incident: incidents, updates, participants, action items và postmortems đều hưởng lợi từ transaction và quan hệ rõ ràng. Thêm Redis chỉ khi thật sự cần caching, queue hoặc locks tạm thời.

Hosting có thể đơn giản như managed platform (Render/Fly/Heroku-like) hoặc cloud hiện có (AWS/GCP/Azure). Ưu tiên managed databases và backup nếu có thể.

Real-time: websockets vs refresh định kỳ

Incident hoạt động trông tốt hơn với cập nhật real-time, nhưng không phải lúc nào cũng cần websockets ngày đầu.

  • Refresh định kỳ (polling) dễ triển khai và vận hành. Với nhiều đội, cập nhật timeline mỗi 10–30 giây là “đủ tốt”.
  • Websockets/SSE hữu ích khi nhiều viewer đồng thời, cập nhật nhanh, hoặc muốn cộng tác như chat.

Cách thực tế: thiết kế API/events để bắt đầu bằng polling và nâng cấp lên websockets sau mà không phải viết lại UI.

Observability cho chính công cụ sự cố

Nếu app này fail trong một sự cố, nó trở thành một phần của sự cố. Thêm:

  • Logs có cấu trúc (ai thay đổi gì, context request)
  • Metrics (latency, error rate, queue depth, websocket connections)
  • Error tracking (uncaught exceptions, frontend crash reporting)

Backup, migration và kế hoạch DR

Xử lý như hệ thống production:

  • Backup tự động hằng ngày (và kiểm tra restore định kỳ)
  • Migration an toàn (expand/contract pattern, migration CI checks)
  • Kế hoạch DR tối thiểu: cách khởi động ở region/account mới, và cách truy cập dữ liệu nếu môi trường chính down

Cách nhanh để prototype (không commit sai thiết kế)

Nếu muốn xác thực workflow và màn hình trước khi đầu tư lớn, phương pháp vibe-coding có thể hiệu quả: dùng công cụ như Koder.ai để sinh prototype hoạt động từ spec chat chi tiết, rồi lặp với responder trong tabletop exercises. Vì Koder.ai có thể tạo React frontend với backend Go + PostgreSQL (và hỗ trợ xuất source), bạn có thể coi phiên bản đầu là prototype dùng thử hoặc làm nền tảng để đội bạn củng cố — mà không mất các bài học thu được từ mô phỏng thực tế.

Kiểm thử, rollout và cải thiện liên tục

Phát hành app theo dõi sự cố mà không có diễn tập là một canh bạc. Các đội tốt nhất xử lý công cụ này như hệ thống vận hành khác: thử các đường dẫn quan trọng, chạy drills thực tế, rollout từng bước, và tiếp tục điều chỉnh dựa trên sử dụng thực.

Kiểm thử end-to-end các đường chính

Ưu tiên các flow mà người ta sẽ cần trong stress:

  • Tạo incident, đặt severity, thông báo responder
  • Đăng cập nhật (bao gồm thay đổi trạng thái), xác minh thứ tự trong timeline, và đảm bảo edit được ghi rõ
  • Giải quyết và đóng incident, rồi sinh postmortem từ trạng thái cuối
  • Xác nhận links và tham chiếu (service, owner, ticket, chat) vẫn tồn tại xuyên suốt

Thêm test hồi quy xác thực những thứ không được hỏng: timestamps, timezone, và thứ tự sự kiện. Incidents là câu chuyện — nếu timeline sai, niềm tin mất.

Xác minh quyền và truy vết

Bug quyền là rủi ro vận hành và an ninh. Viết tests chứng minh:

  • Chỉ vai trò được phép mới thay đổi severity, edit trường quan trọng, hoặc đóng incident
  • Người xem-only không truy cập incident bị hạn chế
  • Mọi hành động nhạy cảm đều để lại audit trail (ai, gì, khi nào), và audit log không thể chỉnh sửa

Cũng test các “gần lỗi” như người dùng mất quyền giữa chừng hoặc reorg team thay đổi membership.

Chạy tabletop exercises với responder thực tế

Trước khi rollout rộng, chạy mô phỏng tabletop dùng app làm nguồn sự thật. Chọn kịch bản tổ chức quen thuộc (outage từng phần, trễ dữ liệu, lỗi bên thứ ba). Quan sát friction: trường gây nhầm, thiếu ngữ cảnh, nhiều click, ownership không rõ.

Thu thập phản hồi ngay và chuyển thành cải tiến nhỏ, nhanh.

Rollout với pilot và vòng phản hồi

Bắt đầu với một team pilot và vài mẫu dựng sẵn (loại incident, checklist, format postmortem). Cung cấp đào tạo ngắn và một trang hướng dẫn một trang “cách chúng ta vận hành sự cố” liên kết từ app (ví dụ /docs/incident-process).

Theo dõi chỉ số áp dụng và lặp trên các điểm gây friction: thời gian tạo, % incidents có cập nhật, tỷ lệ hoàn thành postmortem, và thời gian đóng action-item. Xem đó là chỉ số sản phẩm — không phải chỉ số tuân thủ — và tiếp tục cải thiện mỗi release.

Câu hỏi thường gặp

How do we define an “incident” so the app doesn’t become unusable or inconsistent?

Bắt đầu bằng cách viết một định nghĩa cụ thể mà tổ chức đồng ý:

  • Điều gì đủ điều kiện (ảnh hưởng khách hàng, bảo mật, vi phạm SLA/SLO, chỉ nội bộ)
  • Khi nào nó bắt đầu/kết thúc (cảnh báo đầu tiên vs. xác nhận; đã sửa xong vs. đang giám sát)
  • Những trường nào bắt buộc (service, severity, owner, timestamp, trạng thái)

Định nghĩa này nên liên kết trực tiếp với trạng thái workflow và các trường bắt buộc để dữ liệu giữ nhất quán mà không gây gánh nặng.

What should “postmortem management” include in a v1 product?

Xem postmortem là một workflow, không chỉ là một tài liệu:

  • Quyết định những sự cố nào cần postmortem (tất cả hay chỉ Sev-1/2)
  • Dùng mẫu mặc định và tự điền từ dữ liệu incident (timeline, người tham gia, artifacts)
  • Thêm trạng thái review (Draft → In Review → Approved → Published)
  • Biến action item thành đối tượng riêng để theo dõi kết quả

Nếu bạn muốn có sự thay đổi thực sự, cần có theo dõi action-item và nhắc nhở — không chỉ lưu trữ tài liệu.

What are the must-have features for the first release of an incident tracking web app?

Một bộ tính năng v1 thực tế gồm:

  • Intake sự cố (title, service, severity, reporter; các trường khác là tuỳ chọn)
  • Cập nhật nhanh (trạng thái, tóm tắt ảnh hưởng, ghi chú chính, bước tiếp theo)
  • Timeline kết hợp (sự kiện tự động + sự kiện thủ công)
  • Vai trò/ownership cơ bản (commander/owner hiển thị rõ)
  • Tạo postmortem liên kết với đóng incident
  • Action items có owner, ngày đến hạn, trạng thái

Tránh tự động hoá nâng cao cho đến khi các quy trình này hoạt động mượt trong tình huống stress.

How should we design incident states and transitions?

Dùng một số trạng thái dễ dự đoán phù hợp với cách đội thực tế làm việc:

  • Detect → Triage → Mitigate → Resolve → Learn

Xác định “xong” cho mỗi giai đoạn, rồi thêm các hàng rào bảo vệ:

  • Yêu cầu severity trước khi rời triage
  • Yêu cầu tóm tắt resolution trước khi đánh dấu resolved
  • Yêu cầu lý do khi mở lại từ Resolved → Investigating

Điều này ngăn sự cố bị treo và nâng cao chất lượng phân tích sau này.

Which roles should the app support, and how do we keep responsibilities clear?

Mô hình vài vai trò rõ ràng và gắn chúng với quyền hạn:

  • Reporter: tạo incident và thêm ngữ cảnh ban đầu
  • Responder: thêm cập nhật, sự kiện timeline, thực hiện mitigations
  • Incident Commander: phân công responder, phê duyệt severity, điều phối cập nhật cho stakeholders
  • Reviewer: chịu trách nhiệm chất lượng và phê duyệt postmortem

Hiện owner/commander rõ ràng trong UI và cho phép ủy quyền (reassign, rotate commander).

What data entities should we model, and what relationships matter most?

Giữ mô hình dữ liệu nhỏ nhưng có cấu trúc:

  • Incident
  • Service
  • Update (nội bộ vs dùng cho stakeholders)
  • Timeline Event (sự kiện có timestamp)
  • Action Item
  • Postmortem

Dùng định danh ổn định (UUID) kèm khoá thân thiện với người dùng (ví dụ INC-2025-0042). Xử lý chỉnh sửa như lịch sử với created_at/created_by và audit log cho các thay đổi.

How do we handle internal notes versus stakeholder-facing status updates?

Tách luồng nội bộ và luồng dành cho stakeholders, áp dụng quy tắc khác nhau:

  • Internal updates: chiến thuật, tần suất cao, có thể lộn xộn
  • Stakeholder updates: được kiểm duyệt, có dấu thời gian, thường cần commander phê duyệt

Triển khai mẫu/visibility khác nhau và lưu cả hai vào record incident để có thể tái tạo quyết định mà không lộ thông tin nhạy cảm.

How should we define and use severity levels in the app?

Định nghĩa mức độ severity kèm kỳ vọng rõ ràng (khẩn cấp trả lời và tần suất truyền thông). Ví dụ:

  • SEV1: page ngay; cập nhật mỗi 15–30 phút
  • SEV2: phản hồi nhanh; cập nhật mỗi 30–60 phút
  • SEV3: ảnh hưởng hạn chế; cập nhật theo cột mốc
  • SEV4: theo dõi thông tin

Hiển thị quy tắc ở nơi chọn severity để responder không phải mò tài liệu ngoài ứng dụng.

How do we ensure postmortem action items actually get completed?

Xem action items là bản ghi có cấu trúc, không phải đoạn văn tự do:

  • Owner (một người chịu trách nhiệm)
  • Due date
  • Priority
  • Status (Open/In progress/Blocked/Done/Won’t do)
  • Verification criteria

Rồi cung cấp các view toàn cục (overdue, due soon, theo owner/service) và nhắc nhở/escalation nhẹ nhàng để follow-up không biến mất sau cuộc họp.

How do we prevent integrations (alerts/webhooks) from creating duplicate incidents?

Dùng khoá idempotency theo nhà cung cấp và quy tắc dedup:

  • Lưu khoá duy nhất như provider + alert_id + occurrence_id
  • Quyết định khi nào alert được append vào incident hiện có vs tạo mới (ví dụ: cùng service + cùng signature trong 15 phút)
  • Xử lý reorder và retry bằng cách làm cho xử lý webhook idempotent

Luôn cho phép liên kết thủ công khi API/integration gặp sự cố.

Mục lục
Làm rõ mục tiêu, người dùng và chỉ số thành côngThiết kế workflow sự cố và vai tròMô hình dữ liệu: thực thể, quan hệ và lịch sửXây phần tạo incident, cập nhật và timelineThêm severity, checklist và ngữ cảnh hỗ trợTạo mẫu postmortem và luồng reviewTheo dõi action items đến khi hoàn thànhQuyền, kiểm soát truy cập và truy vếtUX: Dashboard, tìm kiếm và điều hướngTích hợp: Alerts, Chat, Ticketing và cập nhật trạng tháiKiến trúc và lựa chọn tech stackKiểm thử, rollout và cải thiện liên tụcCâu hỏi thường gặp
Chia sẻ