Skip to content

Commit

Permalink
ErrWrongTriggerTarget
Browse files Browse the repository at this point in the history
  • Loading branch information
kamaev committed Dec 21, 2017
2 parents bea1f8c + 53b7ba2 commit 669f26b
Show file tree
Hide file tree
Showing 4 changed files with 99 additions and 37 deletions.
55 changes: 35 additions & 20 deletions checker/check.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,14 +9,29 @@ import (

var checkPointGap int64 = 120

// ErrTriggerHasNoTimeSeries used if trigger no metrics
var ErrTriggerHasNoTimeSeries = fmt.Errorf("Trigger has no metrics")
// ErrTriggerHasNoTimeSeries used if trigger has no metrics
type ErrTriggerHasNoTimeSeries struct{}

// ErrTriggerHasNoTimeSeries implementation with constant error message
func (err ErrTriggerHasNoTimeSeries) Error() string {
return fmt.Sprintf("Trigger has no metrics, check your target")
}

// ErrTriggerHasOnlyWildcards used if trigger has only wildcard metrics
var ErrTriggerHasOnlyWildcards = fmt.Errorf("Trigger has only wildcards")
type ErrTriggerHasOnlyWildcards struct{}

// ErrTriggerHasOnlyWildcards implementation with constant error message
func (err ErrTriggerHasOnlyWildcards) Error() string {
return fmt.Sprintf("Trigger never received metrics")
}

// ErrTriggerHasSameTimeSeriesNames used if trigger has two timeseries with same name
var ErrTriggerHasSameTimeSeriesNames = fmt.Errorf("Trigger has same timeseries names")
type ErrTriggerHasSameTimeSeriesNames struct{}

// ErrTriggerHasSameTimeSeriesNames implementation with constant error message
func (err ErrTriggerHasSameTimeSeriesNames) Error() string {
return fmt.Sprintf("Trigger has same timeseries names")
}

// Check handle trigger and last check and write new state of trigger, if state were change then write new NotificationEvent
func (triggerChecker *TriggerChecker) Check() error {
Expand Down Expand Up @@ -53,11 +68,11 @@ func (triggerChecker *TriggerChecker) handleTrigger() (moira.CheckData, error) {
triggerChecker.cleanupMetricsValues(metrics, triggerChecker.Until)

if len(triggerTimeSeries.Main) == 0 {
return checkData, ErrTriggerHasNoTimeSeries
return checkData, ErrTriggerHasNoTimeSeries{}
}

if triggerTimeSeries.hasOnlyWildcards() {
return checkData, ErrTriggerHasOnlyWildcards
return checkData, ErrTriggerHasOnlyWildcards{}
}

timeSeriesNamesMap := make(map[string]bool, len(triggerTimeSeries.Main))
Expand All @@ -68,7 +83,7 @@ func (triggerChecker *TriggerChecker) handleTrigger() (moira.CheckData, error) {
triggerChecker.Logger.Debugf("[TriggerID:%s][TimeSeries:%s] Checking interval: %v - %v (%vs), step: %v", triggerChecker.TriggerID, timeSeries.Name, timeSeries.StartTime, timeSeries.StopTime, timeSeries.StepTime, timeSeries.StopTime-timeSeries.StartTime)

if _, ok := timeSeriesNamesMap[timeSeries.Name]; ok {
checkingError = ErrTriggerHasSameTimeSeriesNames
checkingError = ErrTriggerHasSameTimeSeriesNames{}
triggerChecker.Logger.Infof("[TriggerID:%s][TimeSeries:%s] Trigger has same timeseries names", triggerChecker.TriggerID, timeSeries.Name)
continue
}
Expand Down Expand Up @@ -111,37 +126,37 @@ func (triggerChecker *TriggerChecker) checkTimeSeries(timeSeries *target.TimeSer
}

func (triggerChecker *TriggerChecker) handleErrorCheck(checkData moira.CheckData, checkingError error) (moira.CheckData, error) {
if checkingError == ErrTriggerHasNoTimeSeries {

switch checkingError.(type){
case ErrTriggerHasNoTimeSeries:
triggerChecker.Logger.Debugf("Trigger %s: %s", triggerChecker.TriggerID, checkingError.Error())
checkData.State = NODATA
checkData.Message = "Trigger has no metrics, check your target"
checkData.Message = checkingError.Error()
if triggerChecker.ttl == 0 {
return checkData, nil
}
return triggerChecker.compareChecks(checkData)
}
if checkingError == ErrTriggerHasOnlyWildcards {
case ErrTriggerHasOnlyWildcards:
triggerChecker.Logger.Debugf("Trigger %s: %s", triggerChecker.TriggerID, checkingError.Error())
if len(checkData.Metrics) == 0 && triggerChecker.ttlState != OK && triggerChecker.ttlState != DEL {
checkData.State = NODATA
checkData.Message = "Trigger never received metrics"
checkData.Message = checkingError.Error()
if triggerChecker.ttl == 0 || triggerChecker.ttlState == DEL {
return checkData, nil
}
}
return triggerChecker.compareChecks(checkData)
}
if _, ok := checkingError.(target.ErrUnknownFunction); ok {
case target.ErrUnknownFunction:
triggerChecker.Logger.Warningf("Trigger %s: %s", triggerChecker.TriggerID, checkingError.Error())
checkData.State = EXCEPTION
checkData.Message = checkingError.Error()
} else if checkingError == ErrTriggerHasSameTimeSeriesNames {
checkData.State = EXCEPTION
checkData.Message = "Trigger has same timeseries names"
} else {
triggerChecker.Metrics.CheckError.Mark(1)
triggerChecker.Logger.Errorf("Trigger %s check failed: %s", triggerChecker.TriggerID, checkingError.Error())
case ErrWrongTriggerTarget, ErrTriggerHasSameTimeSeriesNames:
checkData.State = EXCEPTION
checkData.Message = checkingError.Error()
default:
triggerChecker.Metrics.CheckError.Mark(1)
triggerChecker.Logger.Errorf("Trigger %s check failed: %s", triggerChecker.TriggerID, checkingError.Error())
checkData.State = EXCEPTION
}
return triggerChecker.compareChecks(checkData)
}
Expand Down
52 changes: 43 additions & 9 deletions checker/check_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -600,7 +600,7 @@ func TestHandleTrigger(t *testing.T) {
lastCheck.Timestamp = 4267
dataBase.EXPECT().GetPatternMetrics(pattern).Return([]string{}, nil)
checkData, err := triggerChecker.handleTrigger()
So(err, ShouldResemble, ErrTriggerHasOnlyWildcards)
So(err, ShouldResemble, ErrTriggerHasOnlyWildcards{})
So(checkData, ShouldResemble, moira.CheckData{
Metrics: lastCheck.Metrics,
Timestamp: triggerChecker.Until,
Expand Down Expand Up @@ -645,7 +645,7 @@ func TestHandleTrigger(t *testing.T) {
dataBase.EXPECT().RemoveMetricsValues([]string{metric1, metric2}, gomock.Any())
dataBase.EXPECT().PushNotificationEvent(gomock.Any(), true).Return(nil)
checkData, err := triggerChecker1.handleTrigger()
So(err, ShouldResemble, ErrTriggerHasSameTimeSeriesNames)
So(err, ShouldResemble, ErrTriggerHasSameTimeSeriesNames{})
So(checkData, ShouldResemble, moira.CheckData{
Metrics: map[string]moira.MetricState{
"super": {
Expand Down Expand Up @@ -713,7 +713,7 @@ func TestHandleErrorCheck(t *testing.T) {
Timestamp: time.Now().Unix(),
Message: "Trigger has no metrics, check your target",
}
actual, err := triggerChecker.handleErrorCheck(checkData, ErrTriggerHasNoTimeSeries)
actual, err := triggerChecker.handleErrorCheck(checkData, ErrTriggerHasNoTimeSeries{})
So(err, ShouldBeNil)
So(actual, ShouldResemble, checkData)
})
Expand Down Expand Up @@ -745,7 +745,7 @@ func TestHandleErrorCheck(t *testing.T) {
}

dataBase.EXPECT().PushNotificationEvent(event, true).Return(nil)
actual, err := triggerChecker.handleErrorCheck(checkData, ErrTriggerHasNoTimeSeries)
actual, err := triggerChecker.handleErrorCheck(checkData, ErrTriggerHasNoTimeSeries{})
expected := moira.CheckData{
State: NODATA,
Timestamp: checkData.Timestamp,
Expand Down Expand Up @@ -777,7 +777,7 @@ func TestHandleErrorCheck(t *testing.T) {
}

dataBase.EXPECT().PushNotificationEvent(gomock.Any(), true).Return(nil)
actual, err := triggerChecker.handleErrorCheck(checkData, ErrTriggerHasOnlyWildcards)
actual, err := triggerChecker.handleErrorCheck(checkData, ErrTriggerHasOnlyWildcards{})
expected := moira.CheckData{
State: NODATA,
Timestamp: checkData.Timestamp,
Expand Down Expand Up @@ -810,7 +810,7 @@ func TestHandleErrorCheck(t *testing.T) {
Timestamp: time.Now().Unix(),
}

actual, err := triggerChecker.handleErrorCheck(checkData, ErrTriggerHasOnlyWildcards)
actual, err := triggerChecker.handleErrorCheck(checkData, ErrTriggerHasOnlyWildcards{})
expected := moira.CheckData{
Metrics: checkData.Metrics,
State: OK,
Expand Down Expand Up @@ -840,7 +840,7 @@ func TestHandleErrorCheck(t *testing.T) {
Timestamp: time.Now().Unix(),
}

actual, err := triggerChecker.handleErrorCheck(checkData, ErrTriggerHasOnlyWildcards)
actual, err := triggerChecker.handleErrorCheck(checkData, ErrTriggerHasOnlyWildcards{})
expected := moira.CheckData{
Metrics: checkData.Metrics,
State: OK,
Expand Down Expand Up @@ -872,7 +872,7 @@ func TestHandleErrorCheck(t *testing.T) {
Timestamp: now,
}

actual, err := triggerChecker.handleErrorCheck(checkData, ErrTriggerHasOnlyWildcards)
actual, err := triggerChecker.handleErrorCheck(checkData, ErrTriggerHasOnlyWildcards{})
expected := moira.CheckData{
Metrics: checkData.Metrics,
State: OK,
Expand Down Expand Up @@ -935,7 +935,7 @@ func TestHandleErrorCheck(t *testing.T) {

dataBase.EXPECT().PushNotificationEvent(gomock.Any(), true).Return(nil)

actual, err := triggerChecker.handleErrorCheck(checkData, ErrTriggerHasSameTimeSeriesNames)
actual, err := triggerChecker.handleErrorCheck(checkData, ErrTriggerHasSameTimeSeriesNames{})
expected := moira.CheckData{
State: EXCEPTION,
Timestamp: checkData.Timestamp,
Expand All @@ -946,4 +946,38 @@ func TestHandleErrorCheck(t *testing.T) {
So(actual, ShouldResemble, expected)
mockCtrl.Finish()
})

Convey("Handle additional trigger target has more than one timeseries", t, func() {
triggerChecker := TriggerChecker{
TriggerID: "SuperId",
Database: dataBase,
Logger: logger,
ttl: 60,
trigger: &moira.Trigger{
Targets: []string{"aliasByNode(some.data.*,2)", "aliasByNode(some.more.data.*,2)"},
},
ttlState: NODATA,
lastCheck: &moira.CheckData{
Timestamp: time.Now().Unix(),
State: NODATA,
},
}
checkData := moira.CheckData{
State: NODATA,
Timestamp: time.Now().Unix(),
}

dataBase.EXPECT().PushNotificationEvent(gomock.Any(), true).Return(nil)

actual, err := triggerChecker.handleErrorCheck(checkData, ErrWrongTriggerTarget(2))
expected := moira.CheckData{
State: EXCEPTION,
Timestamp: checkData.Timestamp,
EventTimestamp: checkData.Timestamp,
Message: "Target t2 has more than one timeseries",
}
So(err, ShouldBeNil)
So(actual, ShouldResemble, expected)
mockCtrl.Finish()
})
}
26 changes: 19 additions & 7 deletions checker/timeseries.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,14 @@ type triggerTimeSeries struct {
Additional []*target.TimeSeries
}

// ErrWrongTriggerTarget represents inconsistent number of timeseries
type ErrWrongTriggerTarget int

// ErrWrongTriggerTarget implementation for given number of found timeseries
func (err ErrWrongTriggerTarget) Error() string {
return fmt.Sprintf("Target t%v has more than one timeseries", int(err))
}

func (triggerChecker *TriggerChecker) getTimeSeries(from, until int64) (*triggerTimeSeries, []string, error) {
triggerTimeSeries := &triggerTimeSeries{
Main: make([]*target.TimeSeries, 0),
Expand All @@ -30,13 +38,17 @@ func (triggerChecker *TriggerChecker) getTimeSeries(from, until int64) (*trigger
if targetIndex == 0 {
triggerTimeSeries.Main = result.TimeSeries
} else {
if len(result.TimeSeries) == 0 && len(result.Metrics) != 0 {
return nil, nil, fmt.Errorf("Target #%v has no timeseries", targetIndex+1)
} else if len(result.TimeSeries) > 1 {
return nil, nil, fmt.Errorf("Target #%v has more than one timeseries", targetIndex+1)
} else if len(result.TimeSeries) == 0 {
triggerTimeSeries.Additional = append(triggerTimeSeries.Additional, nil)
} else {
timeSeriesCount := len(result.TimeSeries)
switch {
case timeSeriesCount == 0:
if len(result.Metrics) == 0 {
triggerTimeSeries.Additional = append(triggerTimeSeries.Additional, nil)
} else {
return nil, nil, fmt.Errorf("Target t%v has no timeseries", targetIndex+1)
}
case timeSeriesCount > 1:
return nil, nil, ErrWrongTriggerTarget(targetIndex+1)
default:
triggerTimeSeries.Additional = append(triggerTimeSeries.Additional, result.TimeSeries[0])
}
}
Expand Down
3 changes: 2 additions & 1 deletion checker/timeseries_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -184,7 +184,8 @@ func TestGetTimeSeries(t *testing.T) {

actual, metrics, err := triggerChecker.getTimeSeries(from, until)
So(err, ShouldBeError)
So(err, ShouldResemble, fmt.Errorf("Target #2 has more than one timeseries"))
So(err, ShouldResemble, ErrWrongTriggerTarget(2))
So(err.Error(), ShouldResemble, "Target t2 has more than one timeseries")
So(actual, ShouldBeNil)
So(metrics, ShouldBeNil)
})
Expand Down

0 comments on commit 669f26b

Please sign in to comment.