mirror of https://github.com/grafana/loki
Improve pipeline stages ast errors. (#2805)
They would throw 500 instead of 4xx before. Signed-off-by: Cyril Tovena <cyril.tovena@gmail.com>pull/2807/head
parent
071a20803b
commit
ecc4022d6c
@ -0,0 +1,70 @@ |
||||
package logql |
||||
|
||||
import ( |
||||
"fmt" |
||||
|
||||
"github.com/grafana/loki/pkg/logql/log" |
||||
"github.com/prometheus/prometheus/pkg/labels" |
||||
) |
||||
|
||||
// ParseError is what is returned when we failed to parse.
|
||||
type ParseError struct { |
||||
msg string |
||||
line, col int |
||||
} |
||||
|
||||
func (p ParseError) Error() string { |
||||
if p.col == 0 && p.line == 0 { |
||||
return fmt.Sprintf("parse error : %s", p.msg) |
||||
} |
||||
return fmt.Sprintf("parse error at line %d, col %d: %s", p.line, p.col, p.msg) |
||||
} |
||||
|
||||
func newParseError(msg string, line, col int) ParseError { |
||||
return ParseError{ |
||||
msg: msg, |
||||
line: line, |
||||
col: col, |
||||
} |
||||
} |
||||
|
||||
func newStageError(expr Expr, err error) ParseError { |
||||
return ParseError{ |
||||
msg: fmt.Sprintf(`stage '%s' : %s`, expr, err), |
||||
line: 0, |
||||
col: 0, |
||||
} |
||||
} |
||||
|
||||
// IsParseError returns true if the err is a ast parsing error.
|
||||
func IsParseError(err error) bool { |
||||
_, ok := err.(ParseError) |
||||
return ok |
||||
} |
||||
|
||||
type pipelineError struct { |
||||
metric labels.Labels |
||||
errorType string |
||||
} |
||||
|
||||
func newPipelineErr(metric labels.Labels) *pipelineError { |
||||
return &pipelineError{ |
||||
metric: metric, |
||||
errorType: metric.Get(log.ErrorLabel), |
||||
} |
||||
} |
||||
|
||||
func (e pipelineError) Error() string { |
||||
return fmt.Sprintf( |
||||
"pipeline error: '%s' for series: '%s'.\n"+ |
||||
"Use a label filter to intentionally skip this error. (e.g | __error__!=\"%s\").\n"+ |
||||
"To skip all potential errors you can match empty errors.(e.g __error__=\"\")\n"+ |
||||
"The label filter can also be specified after unwrap. (e.g | unwrap latency | __error__=\"\" )\n", |
||||
e.errorType, e.metric, e.errorType) |
||||
} |
||||
|
||||
// IsPipelineError tells if the error is generated by a Pipeline.
|
||||
func IsPipelineError(err error) bool { |
||||
_, ok := err.(*pipelineError) |
||||
return ok |
||||
} |
Loading…
Reference in new issue