moira

Форк
0
/
metric_stats.go 
77 строк · 2.1 Кб
1
package controller
2

3
import (
4
	"sort"
5
	"time"
6

7
	"go.avito.ru/DO/moira"
8
	"go.avito.ru/DO/moira/api"
9
	"go.avito.ru/DO/moira/api/dto"
10
)
11

12
func GetMetricStats(database moira.Database, intervalLength int64, onlyErrors bool, filterTags []string) (*dto.MetricStats, *api.ErrorResponse) {
13
	var (
14
		intervalEnd   = time.Now().Unix()
15
		intervalStart = intervalEnd - intervalLength
16
	)
17
	allEvents, err := database.GetAllNotificationEvents(intervalStart, intervalEnd)
18
	if err != nil {
19
		return nil, api.ErrorInternalServer(err)
20
	}
21

22
	triggerIDList, err := database.GetTriggerCheckIDs(filterTags, onlyErrors)
23
	if err != nil {
24
		return nil, api.ErrorInternalServer(err)
25
	}
26
	// get trigger data
27
	triggerDataList, err := database.GetTriggers(triggerIDList)
28
	if err != nil {
29
		return nil, api.ErrorInternalServer(err)
30
	}
31
	// make a Trigger ID-to-data map
32
	triggerData := make(map[string]*moira.Trigger, len(triggerDataList))
33
	for _, trigger := range triggerDataList {
34
		triggerData[trigger.ID] = trigger
35
	}
36

37
	type metricKey struct {
38
		Metric    string
39
		TriggerID string
40
	}
41
	errorCounts := make(map[metricKey]int64)
42
	currentStates := make(map[metricKey]string)
43
	for _, event := range allEvents {
44
		if event.IsTriggerEvent {
45
			continue
46
		}
47
		if _, found := triggerData[event.TriggerID]; found {
48
			// this trigger does have the tags we want
49
			key := metricKey{Metric: event.Metric, TriggerID: event.TriggerID}
50
			if event.OldState == moira.OK && event.State != moira.OK {
51
				// this is a flap, add it to the stats
52
				errorCounts[key] += 1
53
			}
54
			currentStates[key] = event.State
55
		}
56
	}
57

58
	result := dto.MetricStats{
59
		List: make([]*dto.MetricStatModel, 0, len(errorCounts)),
60
	}
61
	for key, errorCount := range errorCounts {
62
		if onlyErrors && currentStates[key] == moira.OK {
63
			continue
64
		}
65
		stat := dto.MetricStatModel{
66
			Metric:       key.Metric,
67
			Trigger:      dto.CreateTriggerModel(triggerData[key.TriggerID]),
68
			ErrorCount:   errorCount,
69
			CurrentState: currentStates[key],
70
		}
71
		result.List = append(result.List, &stat)
72
	}
73
	sort.SliceStable(result.List, func(i, j int) bool {
74
		return result.List[i].ErrorCount > result.List[j].ErrorCount
75
	})
76
	return &result, nil
77
}
78

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.