+
+// NewAlarmClient returns a new AlarmClient.
+func NewAlarmClient(moId, appId string) *AlarmClient {
+ alarmInstance, err := alarm.InitAlarm(moId, appId)
+ if err == nil {
+ return &AlarmClient{
+ alarmer: alarmInstance,
+ }
+ }
+ fmt.Println("Failed to create alarmInstance", err)
+ return nil
+}
+
+// Conduct performance testing
+func conductperformancetest(flags map[string]commando.FlagValue) {
+ var readerror error
+ var senderror error
+ var readobjerror error
+ host, _ := flags["host"].GetString()
+ port, _ := flags["port"].GetString()
+ targetUrl := fmt.Sprintf("http://%s:%s/ric/v1/alarms/define", host, port)
+ readerror = readPerfAlarmDefinitionFromJson()
+ if readerror == nil {
+ senderror = sendPerfAlarmDefinitionToAlarmManager(targetUrl)
+ if senderror == nil {
+ fmt.Println("sent performance alarm definitions to alarm manager")
+ CLIPerfAlarmObjects = make(map[int]*alarm.Alarm)
+ readobjerror = readPerfAlarmObjectFromJson()
+ if readobjerror == nil {
+ profile, _ := flags["prf"].GetInt()
+ if profile == 1 {
+ fmt.Println("starting peak performance test")
+ peakPerformanceTest(flags)
+ } else if profile == 2 {
+ fmt.Println("starting endurance test")
+ enduranceTest(flags)
+ } else {
+ fmt.Println("Unknown profile, received profile = ", profile)
+ }
+ } else {
+ fmt.Println("reading performance alarm objects from json file failed ")
+ }
+ } else {
+ fmt.Println("sending performance alarm definitions to alarm manager failed ")
+ }
+
+ } else {
+ fmt.Println("reading performance alarm definitions from json file failed ")
+ }
+}
+
+func peakPerformanceTest(flags map[string]commando.FlagValue) {
+ nalarms, _ := flags["nal"].GetInt()
+ var count int = 0
+ for aid, obj := range CLIPerfAlarmObjects {
+ count = count + 1
+ if count <= nalarms {
+ fmt.Println("peakPerformanceTest: invoking worker routine ", count, aid, *obj)
+ wg.Add(1)
+ go raiseClearAlarmOnce(obj, flags)
+ } else {
+ break
+ }
+ }
+ fmt.Println("peakPerformanceTest: Waiting for workers to finish")
+ wg.Wait()
+ fmt.Println("peakPerformanceTest: Wait completed")
+}
+
+func enduranceTest(flags map[string]commando.FlagValue) {
+ alarmspersec, _ := flags["aps"].GetInt()
+ var count int = 0
+ for aid, obj := range CLIPerfAlarmObjects {
+ count = count + 1
+ if count <= alarmspersec {
+ fmt.Println("enduranceTest: invoking worker routine ", count, aid, *obj)
+ wg.Add(1)
+ go raiseClearAlarmOverPeriod(obj, flags)
+ } else {
+ break
+ }
+ }
+ fmt.Println("enduranceTest: Waiting for workers to finish")
+ wg.Wait()
+ fmt.Println("enduranceTest: Wait completed")
+}
+
+func readPerfAlarmObjectFromJson() error {
+
+ filename := os.Getenv("PERF_OBJ_FILE")
+ fmt.Printf("readPerfAlarmObjectFromJson: filename = %s\n", filename)
+
+ file, err := ioutil.ReadFile(filename)
+ if err == nil {
+ data := RicPerfAlarmObjects{}
+ err = json.Unmarshal([]byte(file), &data)
+ if err == nil {
+ for _, alarmObject := range data.AlarmObjects {
+ ricAlarmObject := new(alarm.Alarm)
+ ricAlarmObject.ManagedObjectId = alarmObject.ManagedObjectId
+ ricAlarmObject.ApplicationId = alarmObject.ApplicationId
+ ricAlarmObject.SpecificProblem = alarmObject.SpecificProblem
+ ricAlarmObject.PerceivedSeverity = alarmObject.PerceivedSeverity
+ ricAlarmObject.AdditionalInfo = alarmObject.AdditionalInfo
+ ricAlarmObject.IdentifyingInfo = alarmObject.IdentifyingInfo
+ CLIPerfAlarmObjects[alarmObject.SpecificProblem] = ricAlarmObject
+ }
+ } else {
+ fmt.Println("readPerfAlarmObjectFromJson: json.Unmarshal failed with error: ", err)
+ return err
+ }
+ } else {
+ fmt.Printf("readPerfAlarmObjectFromJson: ioutil.ReadFile failed with error: %v, filename: %s\n", err, filename)
+ fmt.Printf("readPerfAlarmObjectFromJson: current directory: %s\n", getCurrentDirectory())
+ return err
+ }
+ return nil
+}
+
+func readPerfAlarmDefinitionFromJson() error {
+
+ filename := os.Getenv("PERF_DEF_FILE")
+ fmt.Printf("ReadPerfAlarmDefinitionFromJson: filename = %s\n", filename)
+
+ file, err := ioutil.ReadFile(filename)
+ if err == nil {
+ data := CliAlarmDefinitions{}
+ err = json.Unmarshal([]byte(file), &data)
+ if err == nil {
+ for _, alarmDefinition := range data.AlarmDefinitions {
+ _, exists := alarm.RICAlarmDefinitions[alarmDefinition.AlarmId]
+ if exists {
+ fmt.Println("ReadPerfAlarmDefinitionFromJson: alarm definition already exists for ", alarmDefinition.AlarmId)
+ } else {
+ fmt.Println("ReadPerfAlarmDefinitionFromJson: alarm ", alarmDefinition.AlarmId)
+ ricAlarmDefintion := new(alarm.AlarmDefinition)
+ ricAlarmDefintion.AlarmId = alarmDefinition.AlarmId
+ ricAlarmDefintion.AlarmText = alarmDefinition.AlarmText
+ ricAlarmDefintion.EventType = alarmDefinition.EventType
+ ricAlarmDefintion.OperationInstructions = alarmDefinition.OperationInstructions
+ ricAlarmDefintion.RaiseDelay = alarmDefinition.RaiseDelay
+ ricAlarmDefintion.ClearDelay = alarmDefinition.ClearDelay
+ CliPerfAlarmDefinitions.AlarmDefinitions = append(CliPerfAlarmDefinitions.AlarmDefinitions, ricAlarmDefintion)
+ }
+ }
+ } else {
+ fmt.Println("ReadPerfAlarmDefinitionFromJson: json.Unmarshal failed with error: ", err)
+ return err
+ }
+ } else {
+ fmt.Printf("ReadPerfAlarmDefinitionFromJson: ioutil.ReadFile failed with error: %v, filename: %s\n", err, filename)
+ fmt.Printf("ReadPerfAlarmDefinitionFromJson: current directory: %s\n", getCurrentDirectory())
+
+ return err
+ }
+ return nil
+}
+
+func sendPerfAlarmDefinitionToAlarmManager(targetUrl string) error {
+
+ jsonData, err := json.Marshal(CliPerfAlarmDefinitions)
+ if err != nil {
+ fmt.Println("sendPerfAlarmDefinitionToAlarmManager: json.Marshal failed: ", err)
+ return err
+ }
+
+ resp, err := http.Post(targetUrl, "application/json", bytes.NewBuffer(jsonData))
+ if err != nil || resp == nil {
+ fmt.Println("sendPerfAlarmDefinitionToAlarmManager: Couldn't post alarm definition to targeturl due to error: ", targetUrl, err)
+ return err
+ }
+ return nil
+}
+
+func wakeUpAfterTime(timeinseconds int, chn chan string, action string) {
+ time.Sleep(time.Second * time.Duration(timeinseconds))
+ chn <- action
+}
+
+func raiseClearAlarmOnce(alarmobject *alarm.Alarm, flags map[string]commando.FlagValue) {
+ var alarmClient *AlarmClient = nil
+ defer wg.Done()
+ chn := make(chan string, 1)
+ rmr_or_http, _ := flags["if"].GetString()
+ if rmr_or_http == "rmr" {
+ alarmClient = NewAlarmClient("my-pod", "my-app")
+ }
+ postAlarm(flags, *alarmobject, alarm.AlarmActionRaise, alarmClient)
+ go wakeUpAfterTime(PeakTestDuration, chn, Clear)
+ select {
+ case res := <-chn:
+ if res == Clear {
+ postAlarm(flags, *alarmobject, alarm.AlarmActionClear, alarmClient)
+ go wakeUpAfterTime(PeakTestDuration, chn, End)
+ } else if res == End {
+ return
+ }
+ }
+}
+
+func raiseClearAlarmOverPeriod(alarmobject *alarm.Alarm, flags map[string]commando.FlagValue) {
+ var alarmClient *AlarmClient = nil
+ defer wg.Done()
+ timeinminutes, _ := flags["tim"].GetInt()
+ timeinseconds := timeinminutes * 60
+ chn := make(chan string, 1)
+ rmr_or_http, _ := flags["if"].GetString()
+ if rmr_or_http == "rmr" {
+ alarmClient = NewAlarmClient("my-pod", "my-app")
+ }
+ postAlarm(flags, *alarmobject, alarm.AlarmActionRaise, alarmClient)
+ go wakeUpAfterTime(OneSecondDuration, chn, Clear)
+ go wakeUpAfterTime(timeinseconds, chn, End)
+ for {
+ select {
+ case res := <-chn:
+ if res == Raise {
+ postAlarm(flags, *alarmobject, alarm.AlarmActionRaise, alarmClient)
+ go wakeUpAfterTime(OneSecondDuration, chn, Clear)
+ } else if res == Clear {
+ postAlarm(flags, *alarmobject, alarm.AlarmActionClear, alarmClient)
+ go wakeUpAfterTime(OneSecondDuration, chn, Raise)
+ } else if res == End {
+ return
+ }
+ }
+ }
+}
+
+func dispalyAlertAnnotations(t table.Writer, gettableAlert *models.GettableAlert) {
+ var annotationmap map[string]string
+ annotationmap = make(map[string]string)
+ for key, item := range gettableAlert.Annotations {
+ annotationmap[key] = item
+ }
+ t.AppendRow([]interface{}{"alarm_id", annotationmap["alarm_id"]})
+ t.AppendRow([]interface{}{"specific_problem", annotationmap["specific_problem"]})
+ t.AppendRow([]interface{}{"timestamp", annotationmap["timestamp"]})
+ t.AppendRow([]interface{}{"event_type", annotationmap["event_type"]})
+ t.AppendRow([]interface{}{"description", annotationmap["description"]})
+ t.AppendRow([]interface{}{"additional_info", annotationmap["additional_info"]})
+ t.AppendRow([]interface{}{"identifying_info", annotationmap["identifying_info"]})
+ t.AppendRow([]interface{}{"instructions", annotationmap["instructions"]})
+}
+
+func displayAlertLabels(t table.Writer, gettableAlert *models.GettableAlert) {
+ var labelmap map[string]string
+ labelmap = make(map[string]string)
+ for key, item := range gettableAlert.Alert.Labels {
+ labelmap[key] = item
+ }
+ t.AppendRow([]interface{}{"alertname", labelmap["alertname"]})
+ t.AppendRow([]interface{}{"status", labelmap["status"]})
+ t.AppendRow([]interface{}{"severity", labelmap["severity"]})
+ t.AppendRow([]interface{}{"system_name", labelmap["system_name"]})
+ t.AppendRow([]interface{}{"service", labelmap["service"]})
+}
+
+func displaySingleAlert(t table.Writer, gettableAlert *models.GettableAlert) {
+ t.AppendRow([]interface{}{"------------------------------------"})
+ dispalyAlertAnnotations(t, gettableAlert)
+ if gettableAlert.EndsAt != nil {
+ t.AppendRow([]interface{}{"EndsAt", *gettableAlert.EndsAt})
+ }
+ if gettableAlert.Fingerprint != nil {
+ t.AppendRow([]interface{}{"Fingerprint", *gettableAlert.Fingerprint})
+ }
+ for key, item := range gettableAlert.Receivers {
+ if gettableAlert.Receivers != nil {
+ t.AppendRow([]interface{}{key, *item.Name})
+ }
+ }
+ if gettableAlert.StartsAt != nil {
+ t.AppendRow([]interface{}{"StartsAt", *gettableAlert.StartsAt})
+ }
+ if gettableAlert.Status != nil {
+ t.AppendRow([]interface{}{"InhibitedBy", gettableAlert.Status.InhibitedBy})
+ t.AppendRow([]interface{}{"SilencedBy", gettableAlert.Status.SilencedBy})
+ t.AppendRow([]interface{}{"State", *gettableAlert.Status.State})
+ }
+ if gettableAlert.UpdatedAt != nil {
+ t.AppendRow([]interface{}{"UpdatedAt", *gettableAlert.UpdatedAt})
+ }
+ t.AppendRow([]interface{}{"GeneratorURL", gettableAlert.Alert.GeneratorURL})
+ displayAlertLabels(t, gettableAlert)
+}
+
+func displayAlerts(flags map[string]commando.FlagValue) {
+ resp, err := getAlerts(flags)
+ if err != nil {
+ fmt.Println(err)
+ return
+ }
+
+ if resp == nil {
+ fmt.Println("resp= nil")
+ return
+ }
+
+ t := table.NewWriter()
+ t.SetOutputMirror(os.Stdout)
+ t.AppendHeader(table.Row{"Alerts from Prometheus Alert Manager"})
+ for _, gettableAlert := range resp.Payload {
+ if gettableAlert == nil {
+ continue
+ }
+
+ displaySingleAlert(t, gettableAlert)
+ }
+ t.SetStyle(table.StyleColoredBright)
+ t.Render()
+}
+
+func getAlerts(flags map[string]commando.FlagValue) (*alert.GetAlertsOK, error) {
+ active, _ := flags["active"].GetBool()
+ inhibited, _ := flags["inhibited"].GetBool()
+ silenced, _ := flags["silenced"].GetBool()
+ unprocessed, _ := flags["unprocessed"].GetBool()
+ amHost, _ := flags["host"].GetString()
+ amPort, _ := flags["port"].GetString()
+ amAddress := amHost + ":" + amPort
+ amBaseUrl := "api/v2"
+ amSchemes := []string{"http"}
+
+ alertParams := alert.NewGetAlertsParams()
+ alertParams.Active = &active
+ alertParams.Inhibited = &inhibited
+ alertParams.Silenced = &silenced
+ alertParams.Unprocessed = &unprocessed
+ resp, err := newAlertManagerClient(amAddress, amBaseUrl, amSchemes).Alert.GetAlerts(alertParams)
+ if err != nil {
+ err = fmt.Errorf("GetAlerts from amAddress = %s with amBaseUrl = %s failed with error: %v", amAddress, amBaseUrl, err)
+ }
+ return resp, err
+}
+
+func newAlertManagerClient(amAddress string, amBaseUrl string, amSchemes []string) *client.Alertmanager {
+ cr := clientruntime.New(amAddress, amBaseUrl, amSchemes)
+ return client.New(cr, strfmt.Default)
+}
+
+func getCurrentDirectory() string {
+ dir, err := os.Getwd()
+ if err != nil {
+ fmt.Println(err)
+ }
+ return dir
+}