7
"go.avito.ru/DO/moira/expression"
8
"go.avito.ru/DO/moira/target"
11
type triggerTimeSeries struct {
12
Main []*target.TimeSeries `json:"main,omitempty"`
13
Additional []*target.TimeSeries `json:"additional,omitempty"`
16
// ErrWrongTriggerTarget represents inconsistent number of timeseries
17
type ErrWrongTriggerTarget int
19
// ErrWrongTriggerTarget implementation for given number of found timeseries
20
func (err ErrWrongTriggerTarget) Error() string {
21
return fmt.Sprintf("Target t%v has more than one timeseries", int(err))
24
func (triggerChecker *TriggerChecker) getTimeSeries(from, until int64) (*triggerTimeSeries, []string, error) {
25
triggerTimeSeries := &triggerTimeSeries{
26
Main: make([]*target.TimeSeries, 0),
27
Additional: make([]*target.TimeSeries, 0),
29
metricsArr := make([]string, 0)
31
isSimpleTrigger := triggerChecker.trigger.IsSimple()
32
for targetIndex, tar := range triggerChecker.trigger.Targets {
33
result, err := target.EvaluateTarget(triggerChecker.Database, tar, from, until, isSimpleTrigger)
39
triggerTimeSeries.Main = result.TimeSeries
41
timeSeriesCount := len(result.TimeSeries)
43
case timeSeriesCount == 0:
44
if len(result.Metrics) == 0 {
45
triggerTimeSeries.Additional = append(triggerTimeSeries.Additional, nil)
47
return nil, nil, fmt.Errorf("Target t%v has no timeseries", targetIndex+1)
49
case timeSeriesCount > 1:
50
return nil, nil, ErrWrongTriggerTarget(targetIndex + 1)
52
triggerTimeSeries.Additional = append(triggerTimeSeries.Additional, result.TimeSeries[0])
56
metricsArr = append(metricsArr, result.Metrics...)
59
triggerChecker.cleanupMetrics(metricsArr, triggerChecker.Until)
60
return triggerTimeSeries, metricsArr, nil
63
func (triggerChecker *TriggerChecker) getRemoteTimeSeries(from, until int64) (*triggerTimeSeries, error) {
64
triggerTimeSeries := &triggerTimeSeries{
65
Main: make([]*target.TimeSeries, 0),
66
Additional: make([]*target.TimeSeries, 0),
69
pullURL := triggerChecker.Config.PullURL
70
for i, tar := range triggerChecker.trigger.Targets {
71
timeseries, err := triggerChecker.PullRemote(pullURL, from, until, []string{tar}) // TODO pull all with one query
77
triggerTimeSeries.Main = timeseries
79
switch len(timeseries) {
81
triggerTimeSeries.Additional = append(triggerTimeSeries.Additional, nil)
83
//if len(timeseries.Metrics) == 0 {
84
// triggerTimeSeries.Additional = append(triggerTimeSeries.Additional, nil)
86
// return nil, fmt.Errorf("target t%v has no timeseries", i+1)
89
triggerTimeSeries.Additional = append(triggerTimeSeries.Additional, timeseries[0])
91
return nil, ErrWrongTriggerTarget(i + 1)
95
return triggerTimeSeries, nil
98
func (*triggerTimeSeries) getMainTargetName() string {
102
func (*triggerTimeSeries) getAdditionalTargetName(targetIndex int) string {
103
return fmt.Sprintf("t%v", targetIndex+2)
106
func (triggerTimeSeries *triggerTimeSeries) getExpressionValues(firstTargetTimeSeries *target.TimeSeries, valueTimestamp int64) (*expression.TriggerExpression, bool) {
107
expressionValues := &expression.TriggerExpression{
108
AdditionalTargetsValues: make(map[string]float64, len(triggerTimeSeries.Additional)),
110
firstTargetValue := firstTargetTimeSeries.GetTimestampValue(valueTimestamp)
111
if IsInvalidValue(firstTargetValue) {
112
return expressionValues, false
114
expressionValues.MainTargetValue = firstTargetValue
116
for targetNumber := 0; targetNumber < len(triggerTimeSeries.Additional); targetNumber++ {
117
additionalTimeSeries := triggerTimeSeries.Additional[targetNumber]
118
if additionalTimeSeries == nil {
119
return expressionValues, false
121
tnValue := additionalTimeSeries.GetTimestampValue(valueTimestamp)
122
if IsInvalidValue(tnValue) {
123
return expressionValues, false
125
expressionValues.AdditionalTargetsValues[triggerTimeSeries.getAdditionalTargetName(targetNumber)] = tnValue
127
return expressionValues, true
130
// IsInvalidValue checks trigger for Inf and NaN. If it is then trigger is not valid
131
func IsInvalidValue(val float64) bool {
135
if math.IsInf(val, 0) {
141
// hasOnlyWildcards checks given targetTimeSeries for only wildcards
142
func (triggerTimeSeries *triggerTimeSeries) hasOnlyWildcards() bool {
143
for _, timeSeries := range triggerTimeSeries.Main {
144
if !timeSeries.Wildcard {
148
return len(triggerTimeSeries.Main) > 0