forked from moira-alert/moira
-
Notifications
You must be signed in to change notification settings - Fork 0
/
triggers.go
124 lines (109 loc) · 3.64 KB
/
triggers.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
package handler
import (
"fmt"
"net/http"
"net/url"
"strconv"
"github.com/go-chi/chi"
"github.com/go-chi/render"
"github.com/moira-alert/moira"
"github.com/moira-alert/moira/remote"
"github.com/moira-alert/moira/api"
"github.com/moira-alert/moira/api/controller"
"github.com/moira-alert/moira/api/dto"
"github.com/moira-alert/moira/api/middleware"
"github.com/moira-alert/moira/expression"
"github.com/moira-alert/moira/target"
)
func triggers(cfg *remote.Config, searcher moira.Searcher) func(chi.Router) {
return func(router chi.Router) {
router.Use(middleware.RemoteConfigContext(cfg))
router.Use(middleware.SearchIndexContext(searcher))
router.Get("/", getAllTriggers)
router.Put("/", createTrigger)
router.Route("/{triggerId}", trigger)
router.With(middleware.Paginate(0, 10)).Get("/search", searchTriggers)
// ToDo: DEPRECATED method. Remove in Moira 2.5
router.With(middleware.Paginate(0, 10)).Get("/page", searchTriggers)
}
}
func getAllTriggers(writer http.ResponseWriter, request *http.Request) {
triggersList, errorResponse := controller.GetAllTriggers(database)
if errorResponse != nil {
render.Render(writer, request, errorResponse)
return
}
if err := render.Render(writer, request, triggersList); err != nil {
render.Render(writer, request, api.ErrorRender(err))
return
}
}
func createTrigger(writer http.ResponseWriter, request *http.Request) {
trigger := &dto.Trigger{}
if err := render.Bind(request, trigger); err != nil {
switch err.(type) {
case target.ErrParseExpr, target.ErrEvalExpr, target.ErrUnknownFunction:
render.Render(writer, request, api.ErrorInvalidRequest(fmt.Errorf("invalid graphite targets: %s", err.Error())))
case expression.ErrInvalidExpression:
render.Render(writer, request, api.ErrorInvalidRequest(fmt.Errorf("invalid expression: %s", err.Error())))
case remote.ErrRemoteTriggerResponse:
render.Render(writer, request, api.ErrorRemoteServerUnavailable(err))
default:
render.Render(writer, request, api.ErrorInternalServer(err))
}
return
}
timeSeriesNames := middleware.GetTimeSeriesNames(request)
response, err := controller.CreateTrigger(database, &trigger.TriggerModel, timeSeriesNames)
if err != nil {
render.Render(writer, request, err)
return
}
if err := render.Render(writer, request, response); err != nil {
render.Render(writer, request, api.ErrorRender(err))
return
}
}
func searchTriggers(writer http.ResponseWriter, request *http.Request) {
request.ParseForm()
onlyErrors := getOnlyProblemsFlag(request)
filterTags := getRequestTags(request)
searchString := getSearchRequestString(request)
page := middleware.GetPage(request)
size := middleware.GetSize(request)
triggersList, errorResponse := controller.SearchTriggers(database, searchIndex, page, size, onlyErrors, filterTags, searchString)
if errorResponse != nil {
render.Render(writer, request, errorResponse)
return
}
if err := render.Render(writer, request, triggersList); err != nil {
render.Render(writer, request, api.ErrorRender(err))
return
}
}
func getRequestTags(request *http.Request) []string {
var filterTags []string
i := 0
for {
tag := request.FormValue(fmt.Sprintf("tags[%v]", i))
if tag == "" {
break
}
filterTags = append(filterTags, tag)
i++
}
return filterTags
}
func getOnlyProblemsFlag(request *http.Request) bool {
onlyProblemsStr := request.FormValue("onlyProblems")
if onlyProblemsStr != "" {
onlyProblems, _ := strconv.ParseBool(onlyProblemsStr)
return onlyProblems
}
return false
}
func getSearchRequestString(request *http.Request) string {
searchText := request.FormValue("text")
searchText, _ = url.PathUnescape(searchText)
return searchText
}