+2
-2
cmd/querycheck/main.go
+2
-2
cmd/querycheck/main.go
···
49
49
&cli.StringFlag{
50
50
Name: "auth-token",
51
51
Usage: "auth token for accessing the querycheck api",
52
-
Value: "localdev",
52
+
Value: "",
53
53
EnvVars: []string{"AUTH_TOKEN"},
54
54
},
55
55
}
···
136
136
137
137
e.Use(func(next echo.HandlerFunc) echo.HandlerFunc {
138
138
return func(c echo.Context) error {
139
-
if c.Request().Header.Get("Authorization") != cctx.String("auth-token") {
139
+
if cctx.String("auth-token") != "" && c.Request().Header.Get("Authorization") != cctx.String("auth-token") {
140
140
return c.String(http.StatusUnauthorized, "unauthorized")
141
141
}
142
142
return next(c)
+28
-24
querycheck/check.go
+28
-24
querycheck/check.go
···
17
17
18
18
// Query is a query to check
19
19
type Query struct {
20
-
Name string
21
-
Query string
22
-
LastPlan *QueryPlan
23
-
LastChecked time.Time
24
-
LastError error
25
-
CheckEvery time.Duration
20
+
Name string
21
+
Query string
22
+
LatestPlan *QueryPlan
23
+
PreviousPlan *QueryPlan
24
+
LastChecked time.Time
25
+
LastError error
26
+
CheckEvery time.Duration
26
27
27
28
lk sync.RWMutex
28
29
in chan struct{}
···
103
104
for _, qu := range q.Queries {
104
105
if qu.Name == name {
105
106
return &Query{
106
-
Name: qu.Name,
107
-
Query: qu.Query,
108
-
LastPlan: qu.LastPlan,
109
-
LastChecked: qu.LastChecked,
110
-
LastError: qu.LastError,
111
-
CheckEvery: qu.CheckEvery,
107
+
Name: qu.Name,
108
+
Query: qu.Query,
109
+
LatestPlan: qu.LatestPlan,
110
+
PreviousPlan: qu.PreviousPlan,
111
+
LastChecked: qu.LastChecked,
112
+
LastError: qu.LastError,
113
+
CheckEvery: qu.CheckEvery,
112
114
}
113
115
}
114
116
}
···
125
127
queries := make([]*Query, len(q.Queries))
126
128
for i, qu := range q.Queries {
127
129
queries[i] = &Query{
128
-
Name: qu.Name,
129
-
Query: qu.Query,
130
-
LastPlan: qu.LastPlan,
131
-
LastChecked: qu.LastChecked,
132
-
LastError: qu.LastError,
133
-
CheckEvery: qu.CheckEvery,
130
+
Name: qu.Name,
131
+
Query: qu.Query,
132
+
LatestPlan: qu.LatestPlan,
133
+
PreviousPlan: qu.PreviousPlan,
134
+
LastChecked: qu.LastChecked,
135
+
LastError: qu.LastError,
136
+
CheckEvery: qu.CheckEvery,
134
137
}
135
138
}
136
139
···
177
180
ticker := time.NewTicker(query.CheckEvery)
178
181
defer ticker.Stop()
179
182
180
-
query.LastPlan, err = q.CheckQueryPlan(ctx, query.Query)
183
+
query.LatestPlan, err = q.CheckQueryPlan(ctx, query.Query)
181
184
if err != nil {
182
185
log.Errorf("failed to check query plan: %+v\n", err)
183
186
}
184
187
185
-
if query.LastPlan != nil {
186
-
log.Infof("Initial plan:\n%+v\n", query.LastPlan.String())
187
-
query.RecordPlanMetrics(*query.LastPlan)
188
+
if query.LatestPlan != nil {
189
+
log.Infof("Initial plan:\n%+v\n", query.LatestPlan.String())
190
+
query.RecordPlanMetrics(*query.LatestPlan)
188
191
query.LastChecked = time.Now()
189
192
}
190
193
···
216
219
}
217
220
218
221
query.lk.RLock()
219
-
lastPlan := *query.LastPlan
222
+
lastPlan := *query.LatestPlan
220
223
query.lk.RUnlock()
221
224
222
225
query.RecordPlanMetrics(*qp)
···
231
234
log.Infof("query plan has changed (%s%.03fms): \n%+v\n", sign, diff, qp.String())
232
235
233
236
query.lk.Lock()
234
-
query.LastPlan = qp
237
+
query.PreviousPlan = query.LatestPlan
238
+
query.LatestPlan = qp
235
239
query.lk.Unlock()
236
240
}
237
241
case <-query.in:
+21
-18
querycheck/handlers.go
+21
-18
querycheck/handlers.go
···
7
7
)
8
8
9
9
type RetQuery struct {
10
-
Name string `json:"name"`
11
-
Query string `json:"query"`
12
-
LastPlan *QueryPlan `json:"last_plan"`
13
-
LastChecked time.Time `json:"last_checked"`
14
-
LastError error `json:"last_error"`
15
-
CheckEvery string `json:"check_every"`
10
+
Name string `json:"name"`
11
+
Query string `json:"query"`
12
+
LatestPlan *QueryPlan `json:"latest_plan"`
13
+
PreviousPlan *QueryPlan `json:"previous_plan"`
14
+
LastChecked time.Time `json:"last_checked"`
15
+
LastError error `json:"last_error"`
16
+
CheckEvery string `json:"check_every"`
16
17
}
17
18
18
19
func (q *Querychecker) HandleGetQueries(c echo.Context) error {
···
20
21
retQueries := []RetQuery{}
21
22
for _, query := range queries {
22
23
retQueries = append(retQueries, RetQuery{
23
-
Name: query.Name,
24
-
Query: query.Query,
25
-
LastPlan: query.LastPlan,
26
-
LastChecked: query.LastChecked,
27
-
LastError: query.LastError,
28
-
CheckEvery: query.CheckEvery.String(),
24
+
Name: query.Name,
25
+
Query: query.Query,
26
+
LatestPlan: query.LatestPlan,
27
+
PreviousPlan: query.PreviousPlan,
28
+
LastChecked: query.LastChecked,
29
+
LastError: query.LastError,
30
+
CheckEvery: query.CheckEvery.String(),
29
31
})
30
32
}
31
33
···
41
43
}
42
44
43
45
retQuery := RetQuery{
44
-
Name: query.Name,
45
-
Query: query.Query,
46
-
LastPlan: query.LastPlan,
47
-
LastChecked: query.LastChecked,
48
-
LastError: query.LastError,
49
-
CheckEvery: query.CheckEvery.String(),
46
+
Name: query.Name,
47
+
Query: query.Query,
48
+
LatestPlan: query.LatestPlan,
49
+
PreviousPlan: query.PreviousPlan,
50
+
LastChecked: query.LastChecked,
51
+
LastError: query.LastError,
52
+
CheckEvery: query.CheckEvery.String(),
50
53
}
51
54
52
55
return c.JSON(200, retQuery)