func TestRuleTriggeringE2E(t *testing.T) { testutils.SkipIfShort(t) d := clearDB(t) defer d.Close(t) am, err := alerting.MakeAlertManager(50*time.Millisecond, nil) assert.Nil(t, err) getAlerts := func() []*alerting.Alert { b := bytes.NewBuffer([]byte{}) assert.Nil(t, am.WriteActiveAlertsJson(b, func(*alerting.Alert) bool { return true })) var active []*alerting.Alert assert.Nil(t, json.Unmarshal(b.Bytes(), &active)) return active } getAlert := func() *alerting.Alert { active := getAlerts() assert.Equal(t, 1, len(active)) return active[0] } assert.Equal(t, 0, len(getAlerts())) // Ensure that the rule triggers an alert. r := getRule() assert.Nil(t, r.tick(am)) getAlert() // Ensure that the rule auto-dismisses. // Hack the condition so that it's no longer true with the fake query results. r.Condition = "x > 10" assert.Nil(t, r.tick(am)) time.Sleep(2 * time.Second) assert.Equal(t, 0, len(getAlerts())) // Stop the AlertManager. am.Stop() }
func main() { defer common.LogPanic() alertDBConf := alerting.DBConfigFromFlags() buildbotDBConf := buildbot.DBConfigFromFlags() common.InitWithMetrics("alertserver", graphiteServer) v, err := skiaversion.GetVersion() if err != nil { glog.Fatal(err) } glog.Infof("Version %s, built at %s", v.Commit, v.Date) Init() if *validateAndExit { if _, err := rules.MakeRules(*alertsFile, nil, time.Second, nil, *testing); err != nil { glog.Fatalf("Failed to set up rules: %v", err) } return } parsedPollInterval, err := time.ParseDuration(*alertPollInterval) if err != nil { glog.Fatalf("Failed to parse -alertPollInterval: %s", *alertPollInterval) } if *testing { *useMetadata = false } if *useMetadata { *influxDbName = metadata.Must(metadata.ProjectGet(metadata.INFLUXDB_NAME)) *influxDbPassword = metadata.Must(metadata.ProjectGet(metadata.INFLUXDB_PASSWORD)) } dbClient, err := client.New(&client.ClientConfig{ Host: *influxDbHost, Username: *influxDbName, Password: *influxDbPassword, Database: *influxDbDatabase, HttpClient: nil, IsSecure: false, IsUDP: false, }) if err != nil { glog.Fatalf("Failed to initialize InfluxDB client: %s", err) } serverURL := "https://" + *host if *testing { serverURL = "http://" + *host + *port } usr, err := user.Current() if err != nil { glog.Fatal(err) } tokenFile, err := filepath.Abs(usr.HomeDir + "/" + GMAIL_TOKEN_CACHE_FILE) if err != nil { glog.Fatal(err) } // By default use a set of credentials setup for localhost access. var cookieSalt = "notverysecret" var clientID = "31977622648-1873k0c1e5edaka4adpv1ppvhr5id3qm.apps.googleusercontent.com" var clientSecret = "cw0IosPu4yjaG2KWmppj2guj" var redirectURL = serverURL + "/oauth2callback/" var emailClientId = *emailClientIdFlag var emailClientSecret = *emailClientSecretFlag if *useMetadata { cookieSalt = metadata.Must(metadata.ProjectGet(metadata.COOKIESALT)) clientID = metadata.Must(metadata.ProjectGet(metadata.CLIENT_ID)) clientSecret = metadata.Must(metadata.ProjectGet(metadata.CLIENT_SECRET)) emailClientId = metadata.Must(metadata.ProjectGet(metadata.GMAIL_CLIENT_ID)) emailClientSecret = metadata.Must(metadata.ProjectGet(metadata.GMAIL_CLIENT_SECRET)) cachedGMailToken := metadata.Must(metadata.ProjectGet(metadata.GMAIL_CACHED_TOKEN)) err = ioutil.WriteFile(tokenFile, []byte(cachedGMailToken), os.ModePerm) if err != nil { glog.Fatalf("Failed to cache token: %s", err) } } login.Init(clientID, clientSecret, redirectURL, cookieSalt, login.DEFAULT_SCOPE, login.DEFAULT_DOMAIN_WHITELIST, false) var emailAuth *email.GMail if !*testing { if !*useMetadata && (emailClientId == "" || emailClientSecret == "") { glog.Fatal("If -use_metadata=false, you must provide -email_clientid and -email_clientsecret") } emailAuth, err = email.NewGMail(emailClientId, emailClientSecret, tokenFile) if err != nil { glog.Fatalf("Failed to create email auth: %v", err) } } // Initialize the database. if !*testing && *useMetadata { if err := alertDBConf.GetPasswordFromMetadata(); err != nil { glog.Fatal(err) } if err := buildbotDBConf.GetPasswordFromMetadata(); err != nil { glog.Fatal(err) } } if err := alertDBConf.InitDB(); err != nil { glog.Fatal(err) } if err := buildbotDBConf.InitDB(); err != nil { glog.Fatal(err) } // Create the AlertManager. alertManager, err = alerting.MakeAlertManager(parsedPollInterval, emailAuth) if err != nil { glog.Fatalf("Failed to create AlertManager: %v", err) } rulesList, err = rules.MakeRules(*alertsFile, dbClient, parsedPollInterval, alertManager, *testing) if err != nil { glog.Fatalf("Failed to set up rules: %v", err) } StartAlertRoutines(alertManager, 10*parsedPollInterval, dbClient) runServer(serverURL) }