This repository has been archived by the owner on Dec 1, 2021. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 62
/
eventgen_handler.go
125 lines (110 loc) · 4.27 KB
/
eventgen_handler.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
125
package server
import (
"encoding/json"
"fmt"
"net/http"
"strconv"
"strings"
"code.cloudfoundry.org/app-autoscaler/src/autoscaler/db"
"code.cloudfoundry.org/app-autoscaler/src/autoscaler/eventgenerator/aggregator"
"code.cloudfoundry.org/app-autoscaler/src/autoscaler/models"
"code.cloudfoundry.org/cfhttp/handlers"
"code.cloudfoundry.org/lager"
)
type EventGenHandler struct {
logger lager.Logger
queryAppMetric aggregator.QueryAppMetricsFunc
}
func NewEventGenHandler(logger lager.Logger, queryAppMetric aggregator.QueryAppMetricsFunc) *EventGenHandler {
return &EventGenHandler{
logger: logger,
queryAppMetric: queryAppMetric,
}
}
func (h *EventGenHandler) GetAggregatedMetricHistories(w http.ResponseWriter, r *http.Request, vars map[string]string) {
appID := vars["appid"]
metricType := vars["metrictype"]
startParam := r.URL.Query()["start"]
endParam := r.URL.Query()["end"]
orderParam := r.URL.Query()["order"]
h.logger.Debug("get-aggregated-metric-histories", lager.Data{"appid": appID, "metrictype": metricType, "start": startParam, "end": endParam, "order": orderParam})
var err error
start := int64(0)
end := int64(-1)
order := db.ASC
if len(startParam) == 1 {
start, err = strconv.ParseInt(startParam[0], 10, 64)
if err != nil {
h.logger.Error("get-aggregated-metric-histories-parse-start-time", err, lager.Data{"start": startParam})
handlers.WriteJSONResponse(w, http.StatusBadRequest, models.ErrorResponse{
Code: "Bad-Request",
Message: "Error parsing start time"})
return
}
} else if len(startParam) > 1 {
h.logger.Error("get-aggregated-metric-histories-get-start-time", err, lager.Data{"start": startParam})
handlers.WriteJSONResponse(w, http.StatusBadRequest, models.ErrorResponse{
Code: "Bad-Request",
Message: "Incorrect start parameter in query string"})
return
}
if len(endParam) == 1 {
end, err = strconv.ParseInt(endParam[0], 10, 64)
if err != nil {
h.logger.Error("get-aggregated-metric-histories-parse-end-time", err, lager.Data{"end": endParam})
handlers.WriteJSONResponse(w, http.StatusBadRequest, models.ErrorResponse{
Code: "Bad-Request",
Message: "Error parsing end time"})
return
}
} else if len(endParam) > 1 {
h.logger.Error("get-aggregated-metric-histories-get-end-time", err, lager.Data{"end": endParam})
handlers.WriteJSONResponse(w, http.StatusBadRequest, models.ErrorResponse{
Code: "Bad-Request",
Message: "Incorrect end parameter in query string"})
return
}
if len(orderParam) == 1 {
orderStr := strings.ToUpper(orderParam[0])
if orderStr == db.DESCSTR {
order = db.DESC
} else if orderStr == db.ASCSTR {
order = db.ASC
} else {
h.logger.Error("get-aggregated-metric-histories-parse-order", err, lager.Data{"order": orderParam})
handlers.WriteJSONResponse(w, http.StatusBadRequest, models.ErrorResponse{
Code: "Bad-Request",
Message: fmt.Sprintf("Incorrect order parameter in query string, the value can only be %s or %s", db.ASCSTR, db.DESCSTR),
})
return
}
} else if len(orderParam) > 1 {
h.logger.Error("get-aggregated-metric-histories-parse-order", err, lager.Data{"order": orderParam})
handlers.WriteJSONResponse(w, http.StatusBadRequest, models.ErrorResponse{
Code: "Bad-Request",
Message: "Incorrect order parameter in query string"})
return
}
var mtrcs []*models.AppMetric
mtrcs, err = h.queryAppMetric(appID, metricType, start, end, order)
if err != nil {
h.logger.Error("get-aggregated-metric-histories-retrieve-metrics", err, lager.Data{"appid": appID, "metrictype": metricType, "start": start, "end": end, "order": order})
handlers.WriteJSONResponse(w, http.StatusInternalServerError, models.ErrorResponse{
Code: "Internal-Server-Error",
Message: "Error getting aggregated metric histories"})
return
}
var body []byte
body, err = json.Marshal(mtrcs)
if err != nil {
h.logger.Error("get-aggregated-metric-histories-marshal", err, lager.Data{"appid": appID, "metrictype": metricType, "metrics": mtrcs})
handlers.WriteJSONResponse(w, http.StatusInternalServerError, models.ErrorResponse{
Code: "Internal-Server-Error",
Message: "Error marshaling aggregated metric histories"})
return
}
_, err = w.Write(body)
if err != nil {
h.logger.Error("unable to write body", err)
}
}