Skip to content

Commit 4ca9d3f

Browse files
authored
Merge pull request vitessio#48 from planetscale/remove-duplicated-errors
Group same failed queries together in keys's output
2 parents 2dab5f8 + 83e7df6 commit 4ca9d3f

5 files changed

Lines changed: 45 additions & 40 deletions

File tree

go/keys/keys.go

Lines changed: 31 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ func run(out io.Writer, cfg Config) error {
4848
}
4949
ql := &queryList{
5050
queries: make(map[string]*QueryAnalysisResult),
51+
failed: make(map[string]*QueryFailedResult),
5152
}
5253
queries, err := cfg.Loader.Load(cfg.FileName)
5354
if err != nil {
@@ -78,11 +79,7 @@ func run(out io.Writer, cfg Config) error {
7879
func process(q data.Query, si *schemaInfo, ql *queryList) {
7980
ast, bv, err := sqlparser.NewTestParser().Parse2(q.Query)
8081
if err != nil {
81-
ql.failed = append(ql.failed, QueryFailedResult{
82-
Query: q.Query,
83-
LineNumber: q.Line,
84-
Error: err.Error(),
85-
})
82+
ql.addFailedQuery(q, err)
8683
return
8784
}
8885

@@ -102,40 +99,28 @@ type Output struct {
10299

103100
type queryList struct {
104101
queries map[string]*QueryAnalysisResult
105-
failed []QueryFailedResult
102+
failed map[string]*QueryFailedResult
106103
}
107104

108105
func (ql *queryList) processQuery(si *schemaInfo, ast sqlparser.Statement, q data.Query, bv sqlparser.BindVars) {
109106
// handle panics
110107
defer func() {
111108
if r := recover(); r != nil {
112-
ql.failed = append(ql.failed, QueryFailedResult{
113-
Query: q.Query,
114-
LineNumber: q.Line,
115-
Error: fmt.Sprintf("panic: %v", r),
116-
})
109+
ql.addFailedQuery(q, fmt.Errorf("panic: %v", r))
117110
}
118111
}()
119112

120113
mapBv := make(map[string]*querypb.BindVariable)
121114
reservedVars := sqlparser.NewReservedVars("", bv)
122115
err := sqlparser.Normalize(ast, reservedVars, mapBv)
123116
if err != nil {
124-
ql.failed = append(ql.failed, QueryFailedResult{
125-
Query: q.Query,
126-
LineNumber: q.Line,
127-
Error: err.Error(),
128-
})
117+
ql.addFailedQuery(q, err)
129118
return
130119
}
131120

132121
st, err := semantics.Analyze(ast, "ks", si)
133122
if err != nil {
134-
ql.failed = append(ql.failed, QueryFailedResult{
135-
Query: q.Query,
136-
LineNumber: q.Line,
137-
Error: err.Error(),
138-
})
123+
ql.addFailedQuery(q, err)
139124
return
140125
}
141126
ctx := &plancontext.PlanningContext{
@@ -173,20 +158,40 @@ func (ql *queryList) processQuery(si *schemaInfo, ast sqlparser.Statement, q dat
173158
}
174159
}
175160

161+
func (ql *queryList) addFailedQuery(q data.Query, err error) {
162+
key := q.Query + err.Error()
163+
if v, exists := ql.failed[key]; exists {
164+
v.LineNumbers = append(v.LineNumbers, q.Line)
165+
} else {
166+
ql.failed[key] = &QueryFailedResult{
167+
Query: q.Query,
168+
LineNumbers: []int{q.Line},
169+
Error: err.Error(),
170+
}
171+
}
172+
}
173+
176174
// writeJsonTo writes the query list, sorted by the first line number of the query, to the given writer.
177175
func (ql *queryList) writeJSONTo(w io.Writer) error {
178176
values := make([]QueryAnalysisResult, 0, len(ql.queries))
179177
for _, result := range ql.queries {
180178
values = append(values, *result)
181179
}
182-
183180
sort.Slice(values, func(i, j int) bool {
184181
return values[i].LineNumbers[0] < values[j].LineNumbers[0]
185182
})
186183

184+
failedQueries := make([]QueryFailedResult, 0, len(ql.failed))
185+
for _, result := range ql.failed {
186+
failedQueries = append(failedQueries, *result)
187+
}
188+
sort.Slice(failedQueries, func(i, j int) bool {
189+
return failedQueries[i].LineNumbers[0] < failedQueries[j].LineNumbers[0]
190+
})
191+
187192
res := Output{
188193
Queries: values,
189-
Failed: ql.failed,
194+
Failed: failedQueries,
190195
}
191196

192197
jsonData, err := json.MarshalIndent(res, " ", " ")
@@ -216,7 +221,7 @@ type QueryAnalysisResult struct {
216221
}
217222

218223
type QueryFailedResult struct {
219-
Query string `json:"query"`
220-
LineNumber int `json:"lineNumber"`
221-
Error string `json:"error"`
224+
Query string `json:"query"`
225+
LineNumbers []int `json:"lineNumbers"`
226+
Error string `json:"error"`
222227
}

go/keys/keys_test.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,10 @@ import (
2121
"strings"
2222
"testing"
2323

24+
"github.com/stretchr/testify/require"
25+
2426
"github.com/vitessio/vt/go/data"
2527
"github.com/vitessio/vt/go/typ"
26-
27-
"github.com/stretchr/testify/require"
2828
)
2929

3030
func TestKeys(t *testing.T) {
@@ -50,6 +50,7 @@ func TestKeysNonAuthoritativeTable(t *testing.T) {
5050
si := &schemaInfo{}
5151
ql := &queryList{
5252
queries: make(map[string]*QueryAnalysisResult),
53+
failed: make(map[string]*QueryFailedResult),
5354
}
5455
process(q, si, ql)
5556

go/summarize/summarize-keys.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ type (
5858
FailuresSummary struct {
5959
Query string
6060
Error string
61+
Count int
6162
}
6263

6364
graphKey struct {
@@ -296,10 +297,10 @@ func renderFailures(md *markdown.MarkDown, failures []FailuresSummary) {
296297
}
297298
md.PrintHeader("Failures", 2)
298299

299-
headers := []string{"Query", "Error"}
300+
headers := []string{"Query", "Error", "Count"}
300301
var rows [][]string
301302
for _, failure := range failures {
302-
rows = append(rows, []string{failure.Query, failure.Error})
303+
rows = append(rows, []string{failure.Query, failure.Error, strconv.Itoa(failure.Count)})
303304
}
304305
md.PrintTable(headers, rows)
305306
}
@@ -368,6 +369,7 @@ func summarizeKeysQueries(queries *keys.Output) ([]TableSummary, []FailuresSumma
368369
failures = append(failures, FailuresSummary{
369370
Query: query.Query,
370371
Error: query.Error,
372+
Count: len(query.LineNumbers),
371373
})
372374
}
373375

go/summarize/testdata/keys-log.json

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -525,12 +525,10 @@
525525
"failed": [
526526
{
527527
"query": "I am a failing query;",
528-
"lineNumber": 463,
529-
"error": "syntax error at position 2 near 'I'"
530-
},
531-
{
532-
"query": "I am a failing query;",
533-
"lineNumber": 781,
528+
"lineNumbers": [
529+
463,
530+
781
531+
],
534532
"error": "syntax error at position 2 near 'I'"
535533
}
536534
]

go/summarize/testdata/keys-summary.md

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -148,8 +148,7 @@ partsupp ↔ supplier (Occurrences: 1)
148148
149149
```
150150
## Failures
151-
|Query|Error|
152-
|---|---|
153-
|I am a failing query;|syntax error at position 2 near 'I'|
154-
|I am a failing query;|syntax error at position 2 near 'I'|
151+
|Query|Error|Count|
152+
|---|---|---|
153+
|I am a failing query;|syntax error at position 2 near 'I'|2|
155154

0 commit comments

Comments
 (0)