From c2b4de3611a64bc65187547b8da8798ac6f71726 Mon Sep 17 00:00:00 2001 From: Matthieu MOREL Date: Mon, 27 Jun 2022 21:29:19 +0200 Subject: [PATCH] refactor (package model): move from github.com/pkg/errors to 'errors' and 'fmt' packages (#10747) Signed-off-by: Matthieu MOREL Co-Authored-By: Julien Pivotto Co-authored-by: Julien Pivotto --- model/labels/test_utils.go | 5 +- model/relabel/relabel.go | 21 ++++---- model/rulefmt/rulefmt.go | 63 ++++++++++++++---------- model/rulefmt/rulefmt_test.go | 8 ++- model/textparse/openmetricslex.l.go | 60 ++++++++++++++++------ model/textparse/openmetricsparse.go | 9 ++-- model/textparse/openmetricsparse_test.go | 3 +- model/textparse/promlex.l | 3 ++ model/textparse/promlex.l.go | 55 +++++++++++++++------ model/textparse/promparse.go | 13 +++-- model/textparse/promparse_test.go | 9 ++-- 11 files changed, 159 insertions(+), 90 deletions(-) diff --git a/model/labels/test_utils.go b/model/labels/test_utils.go index 319ee6184..a683588d1 100644 --- a/model/labels/test_utils.go +++ b/model/labels/test_utils.go @@ -15,11 +15,10 @@ package labels import ( "bufio" + "fmt" "os" "sort" "strings" - - "github.com/pkg/errors" ) // Slice is a sortable slice of label sets. @@ -81,7 +80,7 @@ func ReadLabels(fn string, n int) ([]Labels, error) { } if i != n { - return mets, errors.Errorf("requested %d metrics but found %d", n, i) + return mets, fmt.Errorf("requested %d metrics but found %d", n, i) } return mets, nil } diff --git a/model/relabel/relabel.go b/model/relabel/relabel.go index 687ac03d0..05c32a41b 100644 --- a/model/relabel/relabel.go +++ b/model/relabel/relabel.go @@ -19,7 +19,6 @@ import ( "strings" "github.com/grafana/regexp" - "github.com/pkg/errors" "github.com/prometheus/common/model" "github.com/prometheus/prometheus/model/labels" @@ -71,7 +70,7 @@ func (a *Action) UnmarshalYAML(unmarshal func(interface{}) error) error { *a = act return nil } - return errors.Errorf("unknown relabel action %q", s) + return fmt.Errorf("unknown relabel action %q", s) } // Config is the configuration for relabeling of target label sets. @@ -105,25 +104,25 @@ func (c *Config) UnmarshalYAML(unmarshal func(interface{}) error) error { c.Regex = MustNewRegexp("") } if c.Action == "" { - return errors.Errorf("relabel action cannot be empty") + return fmt.Errorf("relabel action cannot be empty") } if c.Modulus == 0 && c.Action == HashMod { - return errors.Errorf("relabel configuration for hashmod requires non-zero modulus") + return fmt.Errorf("relabel configuration for hashmod requires non-zero modulus") } if (c.Action == Replace || c.Action == HashMod || c.Action == Lowercase || c.Action == Uppercase) && c.TargetLabel == "" { - return errors.Errorf("relabel configuration for %s action requires 'target_label' value", c.Action) + return fmt.Errorf("relabel configuration for %s action requires 'target_label' value", c.Action) } if (c.Action == Replace || c.Action == Lowercase || c.Action == Uppercase) && !relabelTarget.MatchString(c.TargetLabel) { - return errors.Errorf("%q is invalid 'target_label' for %s action", c.TargetLabel, c.Action) + return fmt.Errorf("%q is invalid 'target_label' for %s action", c.TargetLabel, c.Action) } if (c.Action == Lowercase || c.Action == Uppercase) && c.Replacement != DefaultRelabelConfig.Replacement { - return errors.Errorf("'replacement' can not be set for %s action", c.Action) + return fmt.Errorf("'replacement' can not be set for %s action", c.Action) } if c.Action == LabelMap && !relabelTarget.MatchString(c.Replacement) { - return errors.Errorf("%q is invalid 'replacement' for %s action", c.Replacement, c.Action) + return fmt.Errorf("%q is invalid 'replacement' for %s action", c.Replacement, c.Action) } if c.Action == HashMod && !model.LabelName(c.TargetLabel).IsValid() { - return errors.Errorf("%q is invalid 'target_label' for %s action", c.TargetLabel, c.Action) + return fmt.Errorf("%q is invalid 'target_label' for %s action", c.TargetLabel, c.Action) } if c.Action == LabelDrop || c.Action == LabelKeep { @@ -132,7 +131,7 @@ func (c *Config) UnmarshalYAML(unmarshal func(interface{}) error) error { c.Modulus != DefaultRelabelConfig.Modulus || c.Separator != DefaultRelabelConfig.Separator || c.Replacement != DefaultRelabelConfig.Replacement { - return errors.Errorf("%s action requires only 'regex', and no other fields", c.Action) + return fmt.Errorf("%s action requires only 'regex', and no other fields", c.Action) } } @@ -265,7 +264,7 @@ func relabel(lset labels.Labels, cfg *Config) labels.Labels { } } default: - panic(errors.Errorf("relabel: unknown relabel action type %q", cfg.Action)) + panic(fmt.Errorf("relabel: unknown relabel action type %q", cfg.Action)) } return lb.Labels() diff --git a/model/rulefmt/rulefmt.go b/model/rulefmt/rulefmt.go index 46e008007..c838e840e 100644 --- a/model/rulefmt/rulefmt.go +++ b/model/rulefmt/rulefmt.go @@ -16,12 +16,13 @@ package rulefmt import ( "bytes" "context" + "errors" + "fmt" "io" "os" "strings" "time" - "github.com/pkg/errors" "github.com/prometheus/common/model" yaml "gopkg.in/yaml.v3" @@ -40,12 +41,16 @@ type Error struct { // Error prints the error message in a formatted string. func (err *Error) Error() string { - if err.Err.nodeAlt != nil { - return errors.Wrapf(err.Err.err, "%d:%d: %d:%d: group %q, rule %d, %q", err.Err.node.Line, err.Err.node.Column, err.Err.nodeAlt.Line, err.Err.nodeAlt.Column, err.Group, err.Rule, err.RuleName).Error() - } else if err.Err.node != nil { - return errors.Wrapf(err.Err.err, "%d:%d: group %q, rule %d, %q", err.Err.node.Line, err.Err.node.Column, err.Group, err.Rule, err.RuleName).Error() + if err.Err.err == nil { + return "" } - return errors.Wrapf(err.Err.err, "group %q, rule %d, %q", err.Group, err.Rule, err.RuleName).Error() + if err.Err.nodeAlt != nil { + return fmt.Sprintf("%d:%d: %d:%d: group %q, rule %d, %q: %v", err.Err.node.Line, err.Err.node.Column, err.Err.nodeAlt.Line, err.Err.nodeAlt.Column, err.Group, err.Rule, err.RuleName, err.Err.err) + } + if err.Err.node != nil { + return fmt.Sprintf("%d:%d: group %q, rule %d, %q: %v", err.Err.node.Line, err.Err.node.Column, err.Group, err.Rule, err.RuleName, err.Err.err) + } + return fmt.Sprintf("group %q, rule %d, %q: %v", err.Group, err.Rule, err.RuleName, err.Err.err) } // WrappedError wraps error with the yaml node which can be used to represent @@ -58,10 +63,14 @@ type WrappedError struct { // Error prints the error message in a formatted string. func (we *WrappedError) Error() string { + if we.err == nil { + return "" + } if we.nodeAlt != nil { - return errors.Wrapf(we.err, "%d:%d: %d:%d", we.node.Line, we.node.Column, we.nodeAlt.Line, we.nodeAlt.Column).Error() - } else if we.node != nil { - return errors.Wrapf(we.err, "%d:%d", we.node.Line, we.node.Column).Error() + return fmt.Sprintf("%d:%d: %d:%d: %v", we.node.Line, we.node.Column, we.nodeAlt.Line, we.nodeAlt.Column, we.err) + } + if we.node != nil { + return fmt.Sprintf("%d:%d: %v", we.node.Line, we.node.Column, we.err) } return we.err.Error() } @@ -81,13 +90,13 @@ func (g *RuleGroups) Validate(node ruleGroups) (errs []error) { for j, g := range g.Groups { if g.Name == "" { - errs = append(errs, errors.Errorf("%d:%d: Groupname must not be empty", node.Groups[j].Line, node.Groups[j].Column)) + errs = append(errs, fmt.Errorf("%d:%d: Groupname must not be empty", node.Groups[j].Line, node.Groups[j].Column)) } if _, ok := set[g.Name]; ok { errs = append( errs, - errors.Errorf("%d:%d: groupname: \"%s\" is repeated in the same file", node.Groups[j].Line, node.Groups[j].Column, g.Name), + fmt.Errorf("%d:%d: groupname: \"%s\" is repeated in the same file", node.Groups[j].Line, node.Groups[j].Column, g.Name), ) } @@ -146,7 +155,7 @@ type RuleNode struct { func (r *RuleNode) Validate() (nodes []WrappedError) { if r.Record.Value != "" && r.Alert.Value != "" { nodes = append(nodes, WrappedError{ - err: errors.Errorf("only one of 'record' and 'alert' must be set"), + err: fmt.Errorf("only one of 'record' and 'alert' must be set"), node: &r.Record, nodeAlt: &r.Alert, }) @@ -154,12 +163,12 @@ func (r *RuleNode) Validate() (nodes []WrappedError) { if r.Record.Value == "" && r.Alert.Value == "" { if r.Record.Value == "0" { nodes = append(nodes, WrappedError{ - err: errors.Errorf("one of 'record' or 'alert' must be set"), + err: fmt.Errorf("one of 'record' or 'alert' must be set"), node: &r.Alert, }) } else { nodes = append(nodes, WrappedError{ - err: errors.Errorf("one of 'record' or 'alert' must be set"), + err: fmt.Errorf("one of 'record' or 'alert' must be set"), node: &r.Record, }) } @@ -167,31 +176,31 @@ func (r *RuleNode) Validate() (nodes []WrappedError) { if r.Expr.Value == "" { nodes = append(nodes, WrappedError{ - err: errors.Errorf("field 'expr' must be set in rule"), + err: fmt.Errorf("field 'expr' must be set in rule"), node: &r.Expr, }) } else if _, err := parser.ParseExpr(r.Expr.Value); err != nil { nodes = append(nodes, WrappedError{ - err: errors.Wrapf(err, "could not parse expression"), + err: fmt.Errorf("could not parse expression: %w", err), node: &r.Expr, }) } if r.Record.Value != "" { if len(r.Annotations) > 0 { nodes = append(nodes, WrappedError{ - err: errors.Errorf("invalid field 'annotations' in recording rule"), + err: fmt.Errorf("invalid field 'annotations' in recording rule"), node: &r.Record, }) } if r.For != 0 { nodes = append(nodes, WrappedError{ - err: errors.Errorf("invalid field 'for' in recording rule"), + err: fmt.Errorf("invalid field 'for' in recording rule"), node: &r.Record, }) } if !model.IsValidMetricName(model.LabelValue(r.Record.Value)) { nodes = append(nodes, WrappedError{ - err: errors.Errorf("invalid recording rule name: %s", r.Record.Value), + err: fmt.Errorf("invalid recording rule name: %s", r.Record.Value), node: &r.Record, }) } @@ -200,13 +209,13 @@ func (r *RuleNode) Validate() (nodes []WrappedError) { for k, v := range r.Labels { if !model.LabelName(k).IsValid() || k == model.MetricNameLabel { nodes = append(nodes, WrappedError{ - err: errors.Errorf("invalid label name: %s", k), + err: fmt.Errorf("invalid label name: %s", k), }) } if !model.LabelValue(v).IsValid() { nodes = append(nodes, WrappedError{ - err: errors.Errorf("invalid label value: %s", v), + err: fmt.Errorf("invalid label value: %s", v), }) } } @@ -214,7 +223,7 @@ func (r *RuleNode) Validate() (nodes []WrappedError) { for k := range r.Annotations { if !model.LabelName(k).IsValid() { nodes = append(nodes, WrappedError{ - err: errors.Errorf("invalid annotation name: %s", k), + err: fmt.Errorf("invalid annotation name: %s", k), }) } } @@ -260,7 +269,7 @@ func testTemplateParsing(rl *RuleNode) (errs []error) { for k, val := range rl.Labels { err := parseTest(val) if err != nil { - errs = append(errs, errors.Wrapf(err, "label %q", k)) + errs = append(errs, fmt.Errorf("label %q: %w", k, err)) } } @@ -268,7 +277,7 @@ func testTemplateParsing(rl *RuleNode) (errs []error) { for k, val := range rl.Annotations { err := parseTest(val) if err != nil { - errs = append(errs, errors.Wrapf(err, "annotation %q", k)) + errs = append(errs, fmt.Errorf("annotation %q: %w", k, err)) } } @@ -287,7 +296,7 @@ func Parse(content []byte) (*RuleGroups, []error) { decoder.KnownFields(true) err := decoder.Decode(&groups) // Ignore io.EOF which happens with empty input. - if err != nil && err != io.EOF { + if err != nil && !errors.Is(err, io.EOF) { errs = append(errs, err) } err = yaml.Unmarshal(content, &node) @@ -306,11 +315,11 @@ func Parse(content []byte) (*RuleGroups, []error) { func ParseFile(file string) (*RuleGroups, []error) { b, err := os.ReadFile(file) if err != nil { - return nil, []error{errors.Wrap(err, file)} + return nil, []error{fmt.Errorf("%s: %w", file, err)} } rgs, errs := Parse(b) for i := range errs { - errs[i] = errors.Wrap(errs[i], file) + errs[i] = fmt.Errorf("%s: %w", file, errs[i]) } return rgs, errs } diff --git a/model/rulefmt/rulefmt_test.go b/model/rulefmt/rulefmt_test.go index 21afb0b46..408638f48 100644 --- a/model/rulefmt/rulefmt_test.go +++ b/model/rulefmt/rulefmt_test.go @@ -182,8 +182,12 @@ groups: ` _, errs := Parse([]byte(group)) require.Len(t, errs, 2, "Expected two errors") - err0 := errs[0].(*Error).Err.node - err1 := errs[1].(*Error).Err.node + var err00 *Error + require.True(t, errors.As(errs[0], &err00)) + err0 := err00.Err.node + var err01 *Error + require.True(t, errors.As(errs[1], &err01)) + err1 := err01.Err.node require.NotEqual(t, err0, err1, "Error nodes should not be the same") } diff --git a/model/textparse/openmetricslex.l.go b/model/textparse/openmetricslex.l.go index 6093c9f59..9f17cfd43 100644 --- a/model/textparse/openmetricslex.l.go +++ b/model/textparse/openmetricslex.l.go @@ -58,8 +58,6 @@ yystate0: goto yystart61 } - goto yystate0 // silence unused label error - goto yystate1 // silence unused label error yystate1: c = l.next() yystart1: @@ -94,7 +92,6 @@ yystate4: goto yystate4 } - goto yystate5 // silence unused label error yystate5: c = l.next() yystart5: @@ -262,7 +259,6 @@ yystate24: c = l.next() goto yyrule4 - goto yystate25 // silence unused label error yystate25: c = l.next() yystart25: @@ -282,7 +278,6 @@ yystate26: goto yystate26 } - goto yystate27 // silence unused label error yystate27: c = l.next() yystart27: @@ -308,7 +303,6 @@ yystate29: c = l.next() goto yyrule7 - goto yystate30 // silence unused label error yystate30: c = l.next() yystart30: @@ -346,7 +340,6 @@ yystate34: c = l.next() goto yyrule11 - goto yystate35 // silence unused label error yystate35: c = l.next() yystart35: @@ -383,7 +376,6 @@ yystate38: goto yystate36 } - goto yystate39 // silence unused label error yystate39: c = l.next() yystart39: @@ -418,7 +410,6 @@ yystate42: c = l.next() goto yyrule9 - goto yystate43 // silence unused label error yystate43: c = l.next() yystart43: @@ -479,7 +470,6 @@ yystate49: c = l.next() goto yyrule18 - goto yystate50 // silence unused label error yystate50: c = l.next() yystart50: @@ -517,7 +507,6 @@ yystate54: c = l.next() goto yyrule20 - goto yystate55 // silence unused label error yystate55: c = l.next() yystart55: @@ -574,7 +563,6 @@ yystate60: goto yystate58 } - goto yystate61 // silence unused label error yystate61: c = l.next() yystart61: @@ -747,16 +735,58 @@ yyrule25: // {S}[^ \n]+ return tTimestamp } yyrule26: // \n - { + if true { // avoid go vet determining the below panic will not be reached l.state = sInit return tLinebreak goto yystate0 } panic("unreachable") - goto yyabort // silence unused label error - yyabort: // no lexem recognized + // + // silence unused label errors for build and satisfy go vet reachability analysis + // + { + if false { + goto yyabort + } + if false { + goto yystate0 + } + if false { + goto yystate1 + } + if false { + goto yystate5 + } + if false { + goto yystate25 + } + if false { + goto yystate27 + } + if false { + goto yystate30 + } + if false { + goto yystate35 + } + if false { + goto yystate39 + } + if false { + goto yystate43 + } + if false { + goto yystate50 + } + if false { + goto yystate55 + } + if false { + goto yystate61 + } + } return tInvalid } diff --git a/model/textparse/openmetricsparse.go b/model/textparse/openmetricsparse.go index 6c5fde78c..be1ffcd09 100644 --- a/model/textparse/openmetricsparse.go +++ b/model/textparse/openmetricsparse.go @@ -18,6 +18,7 @@ package textparse import ( "bytes" + "errors" "fmt" "io" "math" @@ -25,8 +26,6 @@ import ( "strings" "unicode/utf8" - "github.com/pkg/errors" - "github.com/prometheus/prometheus/model/exemplar" "github.com/prometheus/prometheus/model/labels" "github.com/prometheus/prometheus/model/value" @@ -276,7 +275,7 @@ func (p *OpenMetricsParser) Next() (Entry, error) { case "unknown": p.mtype = MetricTypeUnknown default: - return EntryInvalid, errors.Errorf("invalid metric type %q", s) + return EntryInvalid, fmt.Errorf("invalid metric type %q", s) } case tHelp: if !utf8.Valid(p.text) { @@ -293,7 +292,7 @@ func (p *OpenMetricsParser) Next() (Entry, error) { u := yoloString(p.text) if len(u) > 0 { if !strings.HasSuffix(m, u) || len(m) < len(u)+1 || p.l.b[p.offsets[1]-len(u)-1] != '_' { - return EntryInvalid, errors.Errorf("unit not a suffix of metric %q", m) + return EntryInvalid, fmt.Errorf("unit not a suffix of metric %q", m) } } return EntryUnit, nil @@ -353,7 +352,7 @@ func (p *OpenMetricsParser) Next() (Entry, error) { return EntrySeries, nil default: - err = errors.Errorf("%q %q is not a valid start token", t, string(p.l.cur())) + err = fmt.Errorf("%q %q is not a valid start token", t, string(p.l.cur())) } return EntryInvalid, err } diff --git a/model/textparse/openmetricsparse_test.go b/model/textparse/openmetricsparse_test.go index 350523829..c032dfd1a 100644 --- a/model/textparse/openmetricsparse_test.go +++ b/model/textparse/openmetricsparse_test.go @@ -14,6 +14,7 @@ package textparse import ( + "errors" "io" "testing" @@ -223,7 +224,7 @@ foo_total 17.0 1520879607.789 # {xx="yy"} 5` for { et, err := p.Next() - if err == io.EOF { + if errors.Is(err, io.EOF) { break } require.NoError(t, err) diff --git a/model/textparse/promlex.l b/model/textparse/promlex.l index c3c5c3bb0..c1bc8e776 100644 --- a/model/textparse/promlex.l +++ b/model/textparse/promlex.l @@ -27,6 +27,9 @@ const ( sLValue sValue sTimestamp + sExemplar + sEValue + sETimestamp ) // Lex is called by the parser generated by "go tool yacc" to obtain each diff --git a/model/textparse/promlex.l.go b/model/textparse/promlex.l.go index 690ec4e05..4076aae61 100644 --- a/model/textparse/promlex.l.go +++ b/model/textparse/promlex.l.go @@ -1,4 +1,4 @@ -// CAUTION: Generated file - DO NOT EDIT. +// Code generated by golex. DO NOT EDIT. // Copyright 2017 The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,7 +16,7 @@ package textparse import ( - "github.com/pkg/errors" + "fmt" ) const ( @@ -47,7 +47,7 @@ yystate0: switch yyt := l.state; yyt { default: - panic(errors.Errorf(`invalid start condition %d`, yyt)) + panic(fmt.Errorf(`invalid start condition %d`, yyt)) case 0: // start condition: INITIAL goto yystart1 case 1: // start condition: sComment @@ -66,8 +66,6 @@ yystate0: goto yystart36 } - goto yystate0 // silence unused label error - goto yystate1 // silence unused label error yystate1: c = l.next() yystart1: @@ -130,7 +128,6 @@ yystate7: goto yystate7 } - goto yystate8 // silence unused label error yystate8: c = l.next() yystart8: @@ -235,7 +232,6 @@ yystate18: goto yystate18 } - goto yystate19 // silence unused label error yystate19: c = l.next() yystart19: @@ -257,7 +253,6 @@ yystate20: goto yystate20 } - goto yystate21 // silence unused label error yystate21: c = l.next() yystart21: @@ -290,7 +285,6 @@ yystate23: goto yystate22 } - goto yystate24 // silence unused label error yystate24: c = l.next() yystart24: @@ -330,7 +324,6 @@ yystate28: c = l.next() goto yyrule13 - goto yystate29 // silence unused label error yystate29: c = l.next() yystart29: @@ -369,7 +362,6 @@ yystate32: goto yystate30 } - goto yystate33 // silence unused label error yystate33: c = l.next() yystart33: @@ -397,7 +389,6 @@ yystate35: c = l.next() goto yyrule11 - goto yystate36 // silence unused label error yystate36: c = l.next() yystart36: @@ -521,16 +512,50 @@ yyrule18: // {D}+ return tTimestamp } yyrule19: // \n - { + if true { // avoid go vet determining the below panic will not be reached l.state = sInit return tLinebreak goto yystate0 } panic("unreachable") - goto yyabort // silence unused label error - yyabort: // no lexem recognized + // + // silence unused label errors for build and satisfy go vet reachability analysis + // + { + if false { + goto yyabort + } + if false { + goto yystate0 + } + if false { + goto yystate1 + } + if false { + goto yystate8 + } + if false { + goto yystate19 + } + if false { + goto yystate21 + } + if false { + goto yystate24 + } + if false { + goto yystate29 + } + if false { + goto yystate33 + } + if false { + goto yystate36 + } + } + // Workaround to gobble up comments that started with a HELP or TYPE // prefix. We just consume all characters until we reach a newline. // This saves us from adding disproportionate complexity to the parser. diff --git a/model/textparse/promparse.go b/model/textparse/promparse.go index 946cd2bc8..758ea5a66 100644 --- a/model/textparse/promparse.go +++ b/model/textparse/promparse.go @@ -17,6 +17,7 @@ package textparse import ( + "errors" "fmt" "io" "math" @@ -26,8 +27,6 @@ import ( "unicode/utf8" "unsafe" - "github.com/pkg/errors" - "github.com/prometheus/prometheus/model/exemplar" "github.com/prometheus/prometheus/model/labels" "github.com/prometheus/prometheus/model/value" @@ -252,7 +251,7 @@ func (p *PromParser) nextToken() token { } func parseError(exp string, got token) error { - return errors.Errorf("%s, got %q", exp, got) + return fmt.Errorf("%s, got %q", exp, got) } // Next advances the parser to the next sample. It returns false if no @@ -301,11 +300,11 @@ func (p *PromParser) Next() (Entry, error) { case "untyped": p.mtype = MetricTypeUnknown default: - return EntryInvalid, errors.Errorf("invalid metric type %q", s) + return EntryInvalid, fmt.Errorf("invalid metric type %q", s) } case tHelp: if !utf8.Valid(p.text) { - return EntryInvalid, errors.Errorf("help text is not a valid utf8 string") + return EntryInvalid, fmt.Errorf("help text is not a valid utf8 string") } } if t := p.nextToken(); t != tLinebreak { @@ -364,7 +363,7 @@ func (p *PromParser) Next() (Entry, error) { return EntrySeries, nil default: - err = errors.Errorf("%q is not a valid start token", t) + err = fmt.Errorf("%q is not a valid start token", t) } return EntryInvalid, err } @@ -388,7 +387,7 @@ func (p *PromParser) parseLVals() error { return parseError("expected label value", t) } if !utf8.Valid(p.l.buf()) { - return errors.Errorf("invalid UTF-8 label value") + return fmt.Errorf("invalid UTF-8 label value") } // The promlexer ensures the value string is quoted. Strip first diff --git a/model/textparse/promparse_test.go b/model/textparse/promparse_test.go index c6762b545..005a3d410 100644 --- a/model/textparse/promparse_test.go +++ b/model/textparse/promparse_test.go @@ -16,6 +16,7 @@ package textparse import ( "bytes" "compress/gzip" + "errors" "io" "os" "testing" @@ -176,7 +177,7 @@ testmetric{label="\"bar\""} 1` for { et, err := p.Next() - if err == io.EOF { + if errors.Is(err, io.EOF) { break } require.NoError(t, err) @@ -378,7 +379,7 @@ func BenchmarkParse(b *testing.B) { t, err := p.Next() switch t { case EntryInvalid: - if err == io.EOF { + if errors.Is(err, io.EOF) { break Outer } b.Fatal(err) @@ -406,7 +407,7 @@ func BenchmarkParse(b *testing.B) { t, err := p.Next() switch t { case EntryInvalid: - if err == io.EOF { + if errors.Is(err, io.EOF) { break Outer } b.Fatal(err) @@ -439,7 +440,7 @@ func BenchmarkParse(b *testing.B) { t, err := p.Next() switch t { case EntryInvalid: - if err == io.EOF { + if errors.Is(err, io.EOF) { break Outer } b.Fatal(err)