postmortem/collect.go
2026-03-24 17:56:59 +03:00

73 lines
4.4 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package main
import "time"
// collect проводит пользователя через все секции и возвращает заполненный PostMortem.
func collect() PostMortem {
var pm PostMortem
// ── Основная информация ──────────────────────────────────────────────────
section("📋 Основная информация")
pm.Title = ask("Название инцидента:")
pm.Status = choose("Статус документа:", []string{
"🟡 Draft",
"🔵 In Review",
"🟢 Resolved",
})
pm.Severity = choose("Severity:", []string{
"SEV-1 (критический)",
"SEV-2 (высокий)",
"SEV-3 (средний)",
"SEV-4 (низкий)",
})
pm.IncidentDate = askDefault("Дата инцидента (ДД.ММ.ГГГГ):", time.Now().Format("02.01.2006"))
pm.PostmortemDate = time.Now().Format("02.01.2006")
pm.Author = ask("Автор (@имя):")
pm.Participants = ask("Участники разбора (через запятую):")
// ── Краткое резюме ───────────────────────────────────────────────────────
section("📝 Краткое резюме")
pm.Summary = ask("Опишите инцидент в 23 предложениях:")
// ── Impact ───────────────────────────────────────────────────────────────
section("💥 Влияние (Impact)")
pm.Duration = ask("Длительность (напр. 2ч 33мин):")
pm.AffectedUsers = ask("Затронутые пользователи (напр. ~5000 / 100% трафика):")
pm.AffectedServices = ask("Затронутые сервисы:")
pm.FinancialLoss = askDefault("Финансовые потери:", "не оценивались")
pm.SLABreach = choose("Нарушение SLA:", []string{"Да", "Нет", "Под вопросом"})
pm.SupportTickets = askDefault("Обращений в поддержку:", "—")
// ── Хронология ───────────────────────────────────────────────────────────
section("🕐 Хронология")
pm.Timeline = collectTimeline()
// ── Корневая причина ─────────────────────────────────────────────────────
section("🔍 Корневая причина")
pm.RootCause = ask("Опишите корневую причину:")
pm.WhyAnalysis = collectWhyAnalysis()
// ── Сопутствующие факторы ────────────────────────────────────────────────
section("⚠️ Сопутствующие факторы")
pm.Contributing = collectList("Что усугубило ситуацию?", "Фактор")
// ── Что сработало / что улучшить ─────────────────────────────────────────
section("✅ Что сработало хорошо")
pm.WentWell = collectList("Что сработало хорошо?", "Пункт")
section("🔧 Что можно улучшить")
pm.ToImprove = collectList("Что можно улучшить?", "Пункт")
// ── Action Items ─────────────────────────────────────────────────────────
section("📌 Action Items")
pm.ActionItems = collectActionItems()
// ── Ссылки ───────────────────────────────────────────────────────────────
section("🔗 Ссылки")
pm.TicketLink = askDefault("Тикет инцидента (URL):", "[LINK]")
pm.LogsLink = askDefault("Логи / дашборд (URL):", "[LINK]")
pm.PRLink = askDefault("PR / деплой (URL):", "[LINK]")
pm.MeetingLink = askDefault("Запись встречи (URL):", "[LINK]")
return pm
}