func TestKeepAlive(t *testing.T) {
	x := runningTestContext()
	x.runTest(func(p *Pipeline) {

		u := &config.User{}
		u.Permissions = config.WRITE

		ta := test.NewTestAlert()

		// add a escalation policy that will catch a keep alive
		p.UpdateConfig(func(c *config.AppConfig) error {
			esc := &escalation.EscalationPolicy{}
			esc.Crit = true
			esc.Escalations = []escalation.Escalation{ta}
			esc.Match = event.NewTagset(0)
			esc.Match.Set(INTERNAL_TAG_NAME, ".*")
			c.Escalations["test"] = esc
			esc.Compile()

			// create a condition for the KeepAlive
			pol := &escalation.Policy{}
			pol.Match = event.NewTagset(0)
			pol.Match.Set(INTERNAL_TAG_NAME, KEEP_ALIVE_INTERNAL_TAG)

			cond := &escalation.Condition{}
			cond.Simple = true
			cond.Greater = test_f(0)
			cond.WindowSize = 2
			cond.Occurences = 1
			pol.Crit = cond
			c.Policies["test"] = pol

			return nil

		}, u)

		// create an event
		e := event.NewEvent()
		e.Tags.Set("host", "test")
		p.PassEvent(e)
		e.WaitForState(event.StateComplete, time.Millisecond)

		time.Sleep(20 * time.Millisecond)
		p.checkExpired()
		time.Sleep(50 * time.Millisecond)

		if len(ta.Incidents) != 1 {
			t.Error(ta.Incidents)
		}

		ka := ta.Incidents[0].GetEvent()
		if ka.Get("host") != "test" {
			t.Fail()
		}

		if ka.Get(INTERNAL_TAG_NAME) != KEEP_ALIVE_INTERNAL_TAG {
			t.Fail()
		}
	})
}
Beispiel #2
0
			Upgrader: func(old *bolt.DB) error {
				return nil
			},
		},
		{
			Version: Version{
				0, 12, 0,
			},
			Buckets: []string{
				"app",
				"user",
			},
			Upgrader: func(old *bolt.DB) error {
				convertToKV := func(i interface{}) *event.TagSet {
					if i == nil {
						return event.NewTagset(0)
					}
					m := i.(map[string]interface{})
					kv := event.NewTagset(len(m))
					for k, v := range m {
						kv.Set(k, v.(string))
					}

					return kv
				}
				upgradeRawSnapshot := func(buff []byte) ([]byte, error) {
					// old
					oldSnap := make(map[string]interface{})
					err := json.Unmarshal(buff, &oldSnap)
					if err != nil {
						return nil, err
func TestResolve(t *testing.T) {
	x := runningTestContext()
	x.runTest(func(p *Pipeline) {
		u := &config.User{}
		u.Permissions = config.WRITE

		ta := test.NewTestAlert()

		// add a escalation policy that will catch our metrics
		p.UpdateConfig(func(c *config.AppConfig) error {
			esc := &escalation.EscalationPolicy{}
			esc.Crit = true
			esc.Ok = true
			esc.Escalations = []escalation.Escalation{ta}
			esc.Match = event.NewTagset(0)
			esc.Match.Set("host", ".*")
			c.Escalations["test"] = esc
			esc.Compile()

			// create a policy that will match against this host
			pol := &escalation.Policy{}
			pol.Match = event.NewTagset(0)
			pol.Match.Set("host", ".*")

			cond := &escalation.Condition{}
			cond.Simple = true
			cond.Greater = test_f(1)
			cond.WindowSize = 2
			cond.Occurences = 1
			pol.Crit = cond
			c.Policies["test"] = pol

			return nil

		}, u)

		// create an event
		e := event.NewEvent()

		e.Metric = 4
		e.Tags.Set("host", "test")
		p.PassEvent(e)
		e.WaitForState(event.StateComplete, time.Millisecond)

		// TODO get rid of waiting for things to pass through the pipeline
		time.Sleep(20 * time.Millisecond)
		if len(ta.Incidents) != 1 {
			t.Error(ta.Incidents)
		}

		time.Sleep(20 * time.Millisecond)

		e.Metric = 0
		p.PassEvent(e)
		e.WaitForState(event.StateComplete, time.Millisecond)
		time.Sleep(10 * time.Millisecond)
		if len(ta.Incidents) != 2 {
			t.Error(ta.Incidents[0])
		}
	})
}