X-Git-Url: https://gerrit.o-ran-sc.org/r/gitweb?a=blobdiff_plain;f=manager%2Fcmd%2Fmanager.go;h=6ccf4ac39d36768254a2bed95f63770d10e309ca;hb=ba2ef5b86bc352e6a9dd931ac27a9abe1386d87f;hp=789093cdcbcb59228f8b90f551f860681a209f73;hpb=2336a84ee4d6f4596c0c4556040396022f8f08a2;p=ric-plt%2Falarm-go.git diff --git a/manager/cmd/manager.go b/manager/cmd/manager.go index 789093c..6ccf4ac 100755 --- a/manager/cmd/manager.go +++ b/manager/cmd/manager.go @@ -39,13 +39,49 @@ import ( "github.com/spf13/viper" ) +func (a *AlarmManager) ClearExpiredAlarms(m AlarmNotification, idx int, mLocked bool) bool { + d, ok := alarm.RICAlarmDefinitions[m.Alarm.SpecificProblem] + if !ok || d.TimeToLive == 0 { + return false + } + + elapsed := (time.Now().UnixNano() - m.AlarmTime) / 1e9 + if int(elapsed) >= d.TimeToLive { + app.Logger.Info("Alarm (sp=%d id=%d) with TTL=%d expired, clearing ...", m.Alarm.SpecificProblem, m.AlarmId, d.TimeToLive) + + m.AlarmAction = alarm.AlarmActionClear + m.AlarmTime = time.Now().UnixNano() + + if !mLocked { // For testing purpose + a.mutex.Lock() + } + a.ProcessClearAlarm(&m, d, idx) + return true + } + return false +} + +func (a *AlarmManager) StartTTLTimer(interval int) { + tick := time.Tick(time.Duration(interval) * time.Second) + for range tick { + a.mutex.Lock() + for idx, m := range a.activeAlarms { + if a.ClearExpiredAlarms(m, idx, true) { + a.mutex.Lock() // ClearExpiredAlarms unlocks the mutex, so re-lock here + continue + } + } + a.mutex.Unlock() + } +} + func (a *AlarmManager) StartAlertTimer() { tick := time.Tick(time.Duration(a.alertInterval) * time.Millisecond) for range tick { a.mutex.Lock() for _, m := range a.activeAlarms { app.Logger.Info("Re-raising alarm: %v", m) - a.PostAlert(a.GenerateAlertLabels(m.Alarm, AlertStatusActive, m.AlarmTime)) + a.PostAlert(a.GenerateAlertLabels(m.AlarmId, m.Alarm, AlertStatusActive, m.AlarmTime)) } a.mutex.Unlock() } @@ -149,7 +185,7 @@ func (a *AlarmManager) ProcessRaiseAlarm(m *AlarmNotification, alarmDef *alarm.A if app.Config.GetBool("controls.noma.enabled") { return a.PostAlarm(m) } - return a.PostAlert(a.GenerateAlertLabels(m.Alarm, AlertStatusActive, m.AlarmTime)) + return a.PostAlert(a.GenerateAlertLabels(m.AlarmId, m.Alarm, AlertStatusActive, m.AlarmTime)) } func (a *AlarmManager) ProcessClearAlarm(m *AlarmNotification, alarmDef *alarm.AlarmDefinition, idx int) (*alert.PostAlertsOK, error) { @@ -230,7 +266,7 @@ func (a *AlarmManager) GenerateThresholdAlarm(sp int, data string) bool { thresholdMessage := alarm.AlarmMessage{ Alarm: thresholdAlarm, AlarmAction: alarm.AlarmActionRaise, - AlarmTime: (time.Now().UnixNano()), + AlarmTime: time.Now().UnixNano(), } alarmDef := alarm.RICAlarmDefinitions[sp] alarmId := a.GenerateAlarmId() @@ -285,7 +321,7 @@ func (a *AlarmManager) PostAlarm(m *AlarmNotification) (*alert.PostAlertsOK, err return nil, err } -func (a *AlarmManager) GenerateAlertLabels(newAlarm alarm.Alarm, status AlertStatus, alarmTime int64) (models.LabelSet, models.LabelSet) { +func (a *AlarmManager) GenerateAlertLabels(alarmId int, newAlarm alarm.Alarm, status AlertStatus, alarmTime int64) (models.LabelSet, models.LabelSet) { alarmDef := alarm.RICAlarmDefinitions[newAlarm.SpecificProblem] amLabels := models.LabelSet{ "status": string(status), @@ -295,7 +331,7 @@ func (a *AlarmManager) GenerateAlertLabels(newAlarm alarm.Alarm, status AlertSta "system_name": "RIC", } amAnnotations := models.LabelSet{ - "alarm_id": fmt.Sprintf("%d", alarmDef.AlarmId), + "alarm_id": fmt.Sprintf("%d", alarmId), "specific_problem": fmt.Sprintf("%d", newAlarm.SpecificProblem), "event_type": alarmDef.EventType, "identifying_info": newAlarm.IdentifyingInfo, @@ -375,6 +411,7 @@ func (a *AlarmManager) ReadAlarmDefinitionFromJson() { ricAlarmDefintion.OperationInstructions = alarmDefinition.OperationInstructions ricAlarmDefintion.RaiseDelay = alarmDefinition.RaiseDelay ricAlarmDefintion.ClearDelay = alarmDefinition.ClearDelay + ricAlarmDefintion.TimeToLive = alarmDefinition.TimeToLive alarm.RICAlarmDefinitions[alarmDefinition.AlarmId] = ricAlarmDefintion } } @@ -410,8 +447,10 @@ func (a *AlarmManager) WriteAlarmInfoToPersistentVolume() { alarmpersistentinfo.UniqueAlarmId = a.uniqueAlarmId alarmpersistentinfo.ActiveAlarms = make([]AlarmNotification, len(a.activeAlarms)) alarmpersistentinfo.AlarmHistory = make([]AlarmNotification, len(a.alarmHistory)) + copy(alarmpersistentinfo.ActiveAlarms, a.activeAlarms) copy(alarmpersistentinfo.AlarmHistory, a.alarmHistory) + wdata, err := json.MarshalIndent(alarmpersistentinfo, "", " ") if err != nil { app.Logger.Error("alarmpersistentinfo json marshal error %v", err) @@ -423,7 +462,7 @@ func (a *AlarmManager) WriteAlarmInfoToPersistentVolume() { } } -func (a *AlarmManager) Run(sdlcheck bool) { +func (a *AlarmManager) Run(sdlcheck bool, ttlInterval int) { app.Logger.SetMdc("alarmManager", fmt.Sprintf("%s:%s", Version, Hash)) app.SetReadyCB(func(d interface{}) { a.rmrReady = true }, true) app.Resource.InjectStatusCb(a.StatusCB) @@ -432,19 +471,12 @@ func (a *AlarmManager) Run(sdlcheck bool) { alarm.RICAlarmDefinitions = make(map[int]*alarm.AlarmDefinition) a.ReadAlarmDefinitionFromJson() - app.Resource.InjectRoute("/ric/v1/alarms", a.RaiseAlarm, "POST") - app.Resource.InjectRoute("/ric/v1/alarms", a.ClearAlarm, "DELETE") - app.Resource.InjectRoute("/ric/v1/alarms/active", a.GetActiveAlarms, "GET") - app.Resource.InjectRoute("/ric/v1/alarms/history", a.GetAlarmHistory, "GET") - app.Resource.InjectRoute("/ric/v1/alarms/config", a.SetAlarmConfig, "POST") - app.Resource.InjectRoute("/ric/v1/alarms/config", a.GetAlarmConfig, "GET") - app.Resource.InjectRoute("/ric/v1/alarms/define", a.SetAlarmDefinition, "POST") - app.Resource.InjectRoute("/ric/v1/alarms/define/{alarmId}", a.DeleteAlarmDefinition, "DELETE") - app.Resource.InjectRoute("/ric/v1/alarms/define", a.GetAlarmDefinition, "GET") - app.Resource.InjectRoute("/ric/v1/alarms/define/{alarmId}", a.GetAlarmDefinition, "GET") + a.InjectRoutes() // Start background timer for re-raising alerts go a.StartAlertTimer() + go a.StartTTLTimer(ttlInterval) + a.alarmClient, _ = alarm.InitAlarm("SEP", "ALARMMANAGER") a.ReadAlarmInfoFromPersistentVolume() @@ -481,5 +513,5 @@ func NewAlarmManager(amHost string, alertInterval int, clearAlarm bool) *AlarmMa // Main function func main() { - NewAlarmManager("", 0, true).Run(true) + NewAlarmManager("", 0, true).Run(true, 10) }