RIC Alarm System
High level architecture
Overview
RIC alarm system implements two components: Alarm Adapter and application library interface
The AlarmAdapter is responsible for managing alarm situations in RIC cluster and interfacing with Northbound applications such as Prometheus AlertManager to post the alarms as alerts. AlertManager takes care of deduplicating, silencing and inhibition (suppressing) of alerts, and routing them to the VESAgent, which, in turn, takes care of converting alerts to faults and sending them to ONAP as VES events.
The Alarm Library provides a simple interface for RIC applications (both platform application and xApps) to raise, clear and re-raise. The Alarm Library interacts with the AlarmAdapter via RMR interface.
Alarm Adapter
TODO
Alarm Library
Initialization
A new alarm instance is created with InitAlarm()-function. ManagedObject (mo) and Application (ap) identities are given as a parameter
Alarm Context/Object
The Alarm object contains following parameters:
* SpecificProblem: problem that is the cause of the alarm
PerceivedSeverity: The severity of the alarm, see above for possible values
* ManagedObjectId: The name of the managed object that is the cause of the fault
* ApplicationId: The name of the process raised the alarm
AdditionalInfo: Additional information given by the application
* IdentifyingInfo: Identifying additional information, which is part of alarm identity
Ietms marked with , i.e., ManagedObjectId (mo), SpecificProblem (sp), ApplicationId (ap) and IdentifyingInfo (IdentifyingInfo) make up the identity of the alarm. All parameters must be according to the alarm definition, i.e. all mandatory parameters should be present, and parameters should have correct value type or be from some predefined range. Addressing the same alarm instance in a clear() or reraise() call is done by making sure that all four values are the same is in the original raise() / reraise() call.
Alarm APIs
Raise: Raises the alarm instance given as a parameter
Clear: Clears the alarm instance given as a parameter, if it the alarm active
Reraise: Attempts to re-raise the alarm instance given as a parameter
ClearAll: Clears all alarms matching moId and appId given as parameters
Example on how to use the API
```go
package main
import (
alarm "gerrit.o-ran-sc.org/r/ric-plt/alarm-go/alarm"
)
func main() {
// Initialize the alarm component
alarmer, err := alarm.InitAlarm("my-pod", "my-app")
// Create a new Alarm object (SP=8004, etc)
alarm := alarmer.NewAlarm(8004, alarm.SeverityMajor, "NetworkDown", "eth0")
// Raise an alarm (SP=8004, etc)
err := alarmer.Raise(alarm)
// Clear an alarm (SP=8004)
err := alarmer.Clear(alarm)
// Re-raise an alarm (SP=8004)
err := alarmer.Reraise(alarm)
// Clear all alarms raised by the application - discussion ongoing if to be deprecated.
err := alarmer.ClearAll()
}
```
Example VES event
INFO[2020-06-08T07:50:10Z]
{
"event": {
"commonEventHeader": {
"domain": "fault",
"eventId": "fault0000000001",
"eventName": "Fault_ricp_E2 CONNECTIVITY LOST TO G-NODEB",
"lastEpochMicrosec": 1591602610944553,
"nfNamingCode": "ricp",
"priority": "Medium",
"reportingEntityId": "035EEB88-7BA2-4C23-A349-3B6696F0E2C4",
"reportingEntityName": "Vespa",
"sequence": 1,
"sourceName": "RIC",
"startEpochMicrosec": 1591602610944553,
"version": 3
},
"faultFields": {
"alarmCondition": "E2 CONNECTIVITY LOST TO G-NODEB",
"eventSeverity": "MAJOR",
"eventSourceType": "virtualMachine",
"faultFieldsVersion": 2,
"specificProblem": "eth12",
"vfStatus": "Active"
}
}
}
INFO[2020-06-08T07:50:10Z] Schema validation succeeded
Additional information
The README.md file in the ric-plt/alarm-go repository contains additional information about the alarm system.