mirror of
https://github.com/Dvorinka/beszel.git
synced 2026-06-03 21:02:56 +00:00
128 lines
4.1 KiB
Go
128 lines
4.1 KiB
Go
package incident
|
|
|
|
import "time"
|
|
|
|
// Incident represents a monitoring incident
|
|
type Incident struct {
|
|
ID string `json:"id" db:"id"`
|
|
Title string `json:"title" db:"title"`
|
|
Description string `json:"description" db:"description"`
|
|
Type string `json:"type" db:"type"` // monitor_down, domain_expiring, ssl_expiring, etc.
|
|
Severity string `json:"severity" db:"severity"` // critical, high, medium, low
|
|
Status string `json:"status" db:"status"` // open, acknowledged, resolved, closed
|
|
|
|
// Related entities
|
|
MonitorID *string `json:"monitor,omitempty" db:"monitor"`
|
|
DomainID *string `json:"domain,omitempty" db:"domain"`
|
|
SystemID *string `json:"system,omitempty" db:"system"`
|
|
|
|
// Assignment
|
|
AssignedTo *string `json:"assigned_to,omitempty" db:"assigned_to"`
|
|
|
|
// Timestamps
|
|
StartedAt time.Time `json:"started_at" db:"started_at"`
|
|
AcknowledgedAt *time.Time `json:"acknowledged_at,omitempty" db:"acknowledged_at"`
|
|
ResolvedAt *time.Time `json:"resolved_at,omitempty" db:"resolved_at"`
|
|
ClosedAt *time.Time `json:"closed_at,omitempty" db:"closed_at"`
|
|
|
|
// Resolution
|
|
Resolution string `json:"resolution,omitempty" db:"resolution"`
|
|
RootCause string `json:"root_cause,omitempty" db:"root_cause"`
|
|
|
|
// Metadata
|
|
UserID string `json:"user" db:"user"`
|
|
Created time.Time `json:"created" db:"created"`
|
|
Updated time.Time `json:"updated" db:"updated"`
|
|
}
|
|
|
|
// IncidentUpdate represents an update/note added to an incident
|
|
type IncidentUpdate struct {
|
|
ID string `json:"id" db:"id"`
|
|
IncidentID string `json:"incident" db:"incident"`
|
|
Message string `json:"message" db:"message"`
|
|
UpdateType string `json:"update_type" db:"update_type"` // note, status_change, assignment
|
|
OldStatus *string `json:"old_status,omitempty" db:"old_status"`
|
|
NewStatus *string `json:"new_status,omitempty" db:"new_status"`
|
|
CreatedBy string `json:"created_by" db:"created_by"`
|
|
CreatedAt time.Time `json:"created_at" db:"created_at"`
|
|
}
|
|
|
|
// IncidentMetrics represents incident statistics
|
|
type IncidentMetrics struct {
|
|
TotalIncidents int `json:"total_incidents"`
|
|
OpenIncidents int `json:"open_incidents"`
|
|
AcknowledgedIncidents int `json:"acknowledged_incidents"`
|
|
ResolvedIncidents int `json:"resolved_incidents"`
|
|
AvgResolutionTime string `json:"avg_resolution_time"`
|
|
MTTR float64 `json:"mttr_hours"` // Mean Time To Resolve
|
|
}
|
|
|
|
// Constants
|
|
const (
|
|
// Incident Types
|
|
TypeMonitorDown = "monitor_down"
|
|
TypeMonitorUp = "monitor_up"
|
|
TypeDomainExpiring = "domain_expiring"
|
|
TypeDomainExpired = "domain_expired"
|
|
TypeSSLExpiring = "ssl_expiring"
|
|
TypeSystemOffline = "system_offline"
|
|
TypeSystemOnline = "system_online"
|
|
|
|
// Severity Levels
|
|
SeverityCritical = "critical"
|
|
SeverityHigh = "high"
|
|
SeverityMedium = "medium"
|
|
SeverityLow = "low"
|
|
|
|
// Status
|
|
StatusOpen = "open"
|
|
StatusAcknowledged = "acknowledged"
|
|
StatusResolved = "resolved"
|
|
StatusClosed = "closed"
|
|
)
|
|
|
|
// IsOpen returns true if incident is not resolved/closed
|
|
func (i *Incident) IsOpen() bool {
|
|
return i.Status == StatusOpen || i.Status == StatusAcknowledged
|
|
}
|
|
|
|
// Duration returns how long the incident has been open
|
|
func (i *Incident) Duration() time.Duration {
|
|
if i.ResolvedAt != nil {
|
|
return i.ResolvedAt.Sub(i.StartedAt)
|
|
}
|
|
return time.Since(i.StartedAt)
|
|
}
|
|
|
|
// GetSeverityColor returns CSS color class for severity
|
|
func GetSeverityColor(severity string) string {
|
|
switch severity {
|
|
case SeverityCritical:
|
|
return "bg-red-600"
|
|
case SeverityHigh:
|
|
return "bg-orange-500"
|
|
case SeverityMedium:
|
|
return "bg-yellow-500"
|
|
case SeverityLow:
|
|
return "bg-blue-500"
|
|
default:
|
|
return "bg-gray-500"
|
|
}
|
|
}
|
|
|
|
// GetStatusColor returns CSS color class for status
|
|
func GetStatusColor(status string) string {
|
|
switch status {
|
|
case StatusOpen:
|
|
return "bg-red-500"
|
|
case StatusAcknowledged:
|
|
return "bg-yellow-500"
|
|
case StatusResolved:
|
|
return "bg-green-500"
|
|
case StatusClosed:
|
|
return "bg-gray-500"
|
|
default:
|
|
return "bg-gray-500"
|
|
}
|
|
}
|