mirror of
https://github.com/Dvorinka/beszel.git
synced 2026-06-04 21:32:57 +00:00
Initial commit: Beszel fork with Domain Locker integration
This commit is contained in:
@@ -0,0 +1,127 @@
|
||||
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"
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user