web : use Go standard package

Signed-off-by: Matthieu MOREL <matthieu.morel35@gmail.com>
This commit is contained in:
Matthieu MOREL 2023-11-08 04:49:39 +01:00
parent 6a124427fa
commit 05fba53e57
10 changed files with 51 additions and 80 deletions

View file

@ -41,13 +41,6 @@ issues:
text: "import 'github.com/pkg/errors' is not allowed" text: "import 'github.com/pkg/errors' is not allowed"
linters: linters:
- depguard - depguard
- path: web/
linters:
- errorlint
- path: web/
text: "import 'github.com/pkg/errors' is not allowed"
linters:
- depguard
- linters: - linters:
- godot - godot
source: "^// ===" source: "^// ==="

View file

@ -17,8 +17,6 @@ import (
"fmt" "fmt"
"math" "math"
"strings" "strings"
"github.com/pkg/errors"
) )
// FloatHistogram is similar to Histogram but uses float64 for all // FloatHistogram is similar to Histogram but uses float64 for all
@ -602,19 +600,19 @@ func (h *FloatHistogram) AllReverseBucketIterator() BucketIterator[float64] {
// create false positives here. // create false positives here.
func (h *FloatHistogram) Validate() error { func (h *FloatHistogram) Validate() error {
if err := checkHistogramSpans(h.NegativeSpans, len(h.NegativeBuckets)); err != nil { if err := checkHistogramSpans(h.NegativeSpans, len(h.NegativeBuckets)); err != nil {
return errors.Wrap(err, "negative side") return fmt.Errorf("negative side: %w", err)
} }
if err := checkHistogramSpans(h.PositiveSpans, len(h.PositiveBuckets)); err != nil { if err := checkHistogramSpans(h.PositiveSpans, len(h.PositiveBuckets)); err != nil {
return errors.Wrap(err, "positive side") return fmt.Errorf("positive side: %w", err)
} }
var nCount, pCount float64 var nCount, pCount float64
err := checkHistogramBuckets(h.NegativeBuckets, &nCount, false) err := checkHistogramBuckets(h.NegativeBuckets, &nCount, false)
if err != nil { if err != nil {
return errors.Wrap(err, "negative side") return fmt.Errorf("negative side: %w", err)
} }
err = checkHistogramBuckets(h.PositiveBuckets, &pCount, false) err = checkHistogramBuckets(h.PositiveBuckets, &pCount, false)
if err != nil { if err != nil {
return errors.Wrap(err, "positive side") return fmt.Errorf("positive side: %w", err)
} }
return nil return nil

View file

@ -14,11 +14,10 @@
package histogram package histogram
import ( import (
"errors"
"fmt" "fmt"
"math" "math"
"strings" "strings"
"github.com/pkg/errors"
) )
var ( var (
@ -361,18 +360,12 @@ func checkHistogramSpans(spans []Span, numBuckets int) error {
var spanBuckets int var spanBuckets int
for n, span := range spans { for n, span := range spans {
if n > 0 && span.Offset < 0 { if n > 0 && span.Offset < 0 {
return errors.Wrap( return fmt.Errorf("span number %d with offset %d: %w", n+1, span.Offset, ErrHistogramSpanNegativeOffset)
ErrHistogramSpanNegativeOffset,
fmt.Sprintf("span number %d with offset %d", n+1, span.Offset),
)
} }
spanBuckets += int(span.Length) spanBuckets += int(span.Length)
} }
if spanBuckets != numBuckets { if spanBuckets != numBuckets {
return errors.Wrap( return fmt.Errorf("spans need %d buckets, have %d buckets: %w", spanBuckets, numBuckets, ErrHistogramSpansBucketsMismatch)
ErrHistogramSpansBucketsMismatch,
fmt.Sprintf("spans need %d buckets, have %d buckets", spanBuckets, numBuckets),
)
} }
return nil return nil
} }
@ -391,10 +384,7 @@ func checkHistogramBuckets[BC BucketCount, IBC InternalBucketCount](buckets []IB
c = buckets[i] c = buckets[i]
} }
if c < 0 { if c < 0 {
return errors.Wrap( return fmt.Errorf("bucket number %d has observation count of %v: %w", i+1, c, ErrHistogramNegativeBucketCount)
ErrHistogramNegativeBucketCount,
fmt.Sprintf("bucket number %d has observation count of %v", i+1, c),
)
} }
last = c last = c
*count += BC(c) *count += BC(c)

View file

@ -18,7 +18,6 @@ import (
"math" "math"
"strings" "strings"
"github.com/pkg/errors"
"golang.org/x/exp/slices" "golang.org/x/exp/slices"
) )
@ -338,35 +337,29 @@ func (h *Histogram) ToFloat() *FloatHistogram {
// the total h.Count). // the total h.Count).
func (h *Histogram) Validate() error { func (h *Histogram) Validate() error {
if err := checkHistogramSpans(h.NegativeSpans, len(h.NegativeBuckets)); err != nil { if err := checkHistogramSpans(h.NegativeSpans, len(h.NegativeBuckets)); err != nil {
return errors.Wrap(err, "negative side") return fmt.Errorf("negative side: %w", err)
} }
if err := checkHistogramSpans(h.PositiveSpans, len(h.PositiveBuckets)); err != nil { if err := checkHistogramSpans(h.PositiveSpans, len(h.PositiveBuckets)); err != nil {
return errors.Wrap(err, "positive side") return fmt.Errorf("positive side: %w", err)
} }
var nCount, pCount uint64 var nCount, pCount uint64
err := checkHistogramBuckets(h.NegativeBuckets, &nCount, true) err := checkHistogramBuckets(h.NegativeBuckets, &nCount, true)
if err != nil { if err != nil {
return errors.Wrap(err, "negative side") return fmt.Errorf("negative side: %w", err)
} }
err = checkHistogramBuckets(h.PositiveBuckets, &pCount, true) err = checkHistogramBuckets(h.PositiveBuckets, &pCount, true)
if err != nil { if err != nil {
return errors.Wrap(err, "positive side") return fmt.Errorf("positive side: %w", err)
} }
sumOfBuckets := nCount + pCount + h.ZeroCount sumOfBuckets := nCount + pCount + h.ZeroCount
if math.IsNaN(h.Sum) { if math.IsNaN(h.Sum) {
if sumOfBuckets > h.Count { if sumOfBuckets > h.Count {
return errors.Wrap( return fmt.Errorf("%d observations found in buckets, but the Count field is %d: %w", sumOfBuckets, h.Count, ErrHistogramCountNotBigEnough)
ErrHistogramCountNotBigEnough,
fmt.Sprintf("%d observations found in buckets, but the Count field is %d", sumOfBuckets, h.Count),
)
} }
} else { } else {
if sumOfBuckets != h.Count { if sumOfBuckets != h.Count {
return errors.Wrap( return fmt.Errorf("%d observations found in buckets, but the Count field is %d: %w", sumOfBuckets, h.Count, ErrHistogramCountMismatch)
ErrHistogramCountMismatch,
fmt.Sprintf("%d observations found in buckets, but the Count field is %d", sumOfBuckets, h.Count),
)
} }
} }

View file

@ -15,6 +15,7 @@ package v1
import ( import (
"context" "context"
"errors"
"fmt" "fmt"
"math" "math"
"math/rand" "math/rand"
@ -33,7 +34,6 @@ import (
"github.com/grafana/regexp" "github.com/grafana/regexp"
jsoniter "github.com/json-iterator/go" jsoniter "github.com/json-iterator/go"
"github.com/munnerz/goautoneg" "github.com/munnerz/goautoneg"
"github.com/pkg/errors"
"github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/common/model" "github.com/prometheus/common/model"
"github.com/prometheus/common/route" "github.com/prometheus/common/route"
@ -317,7 +317,7 @@ func (api *API) ClearCodecs() {
} }
func setUnavailStatusOnTSDBNotReady(r apiFuncResult) apiFuncResult { func setUnavailStatusOnTSDBNotReady(r apiFuncResult) apiFuncResult {
if r.err != nil && errors.Cause(r.err.err) == tsdb.ErrNotReady { if r.err != nil && errors.Is(r.err.err, tsdb.ErrNotReady) {
r.err.typ = errorUnavailable r.err.typ = errorUnavailable
} }
return r return r
@ -415,7 +415,7 @@ type QueryData struct {
func invalidParamError(err error, parameter string) apiFuncResult { func invalidParamError(err error, parameter string) apiFuncResult {
return apiFuncResult{nil, &apiError{ return apiFuncResult{nil, &apiError{
errorBadData, errors.Wrapf(err, "invalid parameter %q", parameter), errorBadData, fmt.Errorf("invalid parameter %q: %w", parameter, err),
}, nil, nil} }, nil, nil}
} }
@ -624,17 +624,15 @@ func returnAPIError(err error) *apiError {
return nil return nil
} }
cause := errors.Unwrap(err) var eqc promql.ErrQueryCanceled
if cause == nil { var eqt promql.ErrQueryTimeout
cause = err var es promql.ErrStorage
} switch {
case errors.As(err, &eqc):
switch cause.(type) {
case promql.ErrQueryCanceled:
return &apiError{errorCanceled, err} return &apiError{errorCanceled, err}
case promql.ErrQueryTimeout: case errors.As(err, &eqt):
return &apiError{errorTimeout, err} return &apiError{errorTimeout, err}
case promql.ErrStorage: case errors.As(err, &es):
return &apiError{errorInternal, err} return &apiError{errorInternal, err}
} }
@ -709,7 +707,7 @@ func (api *API) labelValues(r *http.Request) (result apiFuncResult) {
name := route.Param(ctx, "name") name := route.Param(ctx, "name")
if !model.LabelNameRE.MatchString(name) { if !model.LabelNameRE.MatchString(name) {
return apiFuncResult{nil, &apiError{errorBadData, errors.Errorf("invalid label name: %q", name)}, nil, nil} return apiFuncResult{nil, &apiError{errorBadData, fmt.Errorf("invalid label name: %q", name)}, nil, nil}
} }
start, err := parseTimeParam(r, "start", MinTime) start, err := parseTimeParam(r, "start", MinTime)
@ -797,7 +795,7 @@ func (api *API) series(r *http.Request) (result apiFuncResult) {
ctx := r.Context() ctx := r.Context()
if err := r.ParseForm(); err != nil { if err := r.ParseForm(); err != nil {
return apiFuncResult{nil, &apiError{errorBadData, errors.Wrapf(err, "error parsing form values")}, nil, nil} return apiFuncResult{nil, &apiError{errorBadData, fmt.Errorf("error parsing form values: %w", err)}, nil, nil}
} }
if len(r.Form["match[]"]) == 0 { if len(r.Form["match[]"]) == 0 {
return apiFuncResult{nil, &apiError{errorBadData, errors.New("no match[] parameter provided")}, nil, nil} return apiFuncResult{nil, &apiError{errorBadData, errors.New("no match[] parameter provided")}, nil, nil}
@ -1028,7 +1026,7 @@ func (api *API) targets(r *http.Request) apiFuncResult {
case err == nil && lastErrStr == "": case err == nil && lastErrStr == "":
return "" return ""
case err != nil: case err != nil:
return errors.Wrapf(err, lastErrStr).Error() return fmt.Errorf("%s: %w", lastErrStr, err).Error()
default: default:
return lastErrStr return lastErrStr
} }
@ -1347,7 +1345,7 @@ type RecordingRule struct {
func (api *API) rules(r *http.Request) apiFuncResult { func (api *API) rules(r *http.Request) apiFuncResult {
if err := r.ParseForm(); err != nil { if err := r.ParseForm(); err != nil {
return apiFuncResult{nil, &apiError{errorBadData, errors.Wrapf(err, "error parsing form values")}, nil, nil} return apiFuncResult{nil, &apiError{errorBadData, fmt.Errorf("error parsing form values: %w", err)}, nil, nil}
} }
queryFormToSet := func(values []string) map[string]struct{} { queryFormToSet := func(values []string) map[string]struct{} {
@ -1367,7 +1365,7 @@ func (api *API) rules(r *http.Request) apiFuncResult {
typ := strings.ToLower(r.URL.Query().Get("type")) typ := strings.ToLower(r.URL.Query().Get("type"))
if typ != "" && typ != "alert" && typ != "record" { if typ != "" && typ != "alert" && typ != "record" {
return invalidParamError(errors.Errorf("not supported value %q", typ), "type") return invalidParamError(fmt.Errorf("not supported value %q", typ), "type")
} }
returnAlerts := typ == "" || typ == "alert" returnAlerts := typ == "" || typ == "alert"
@ -1453,7 +1451,7 @@ func (api *API) rules(r *http.Request) apiFuncResult {
Type: "recording", Type: "recording",
} }
default: default:
err := errors.Errorf("failed to assert type of rule '%v'", rule.Name()) err := fmt.Errorf("failed to assert type of rule '%v'", rule.Name())
return apiFuncResult{nil, &apiError{errorInternal, err}, nil, nil} return apiFuncResult{nil, &apiError{errorInternal, err}, nil, nil}
} }
@ -1560,7 +1558,7 @@ func (api *API) serveTSDBStatus(r *http.Request) apiFuncResult {
} }
metrics, err := api.gatherer.Gather() metrics, err := api.gatherer.Gather()
if err != nil { if err != nil {
return apiFuncResult{nil, &apiError{errorInternal, fmt.Errorf("error gathering runtime status: %s", err)}, nil, nil} return apiFuncResult{nil, &apiError{errorInternal, fmt.Errorf("error gathering runtime status: %w", err)}, nil, nil}
} }
chunkCount := int64(math.NaN()) chunkCount := int64(math.NaN())
for _, mF := range metrics { for _, mF := range metrics {
@ -1636,7 +1634,7 @@ func (api *API) deleteSeries(r *http.Request) apiFuncResult {
return apiFuncResult{nil, &apiError{errorUnavailable, errors.New("admin APIs disabled")}, nil, nil} return apiFuncResult{nil, &apiError{errorUnavailable, errors.New("admin APIs disabled")}, nil, nil}
} }
if err := r.ParseForm(); err != nil { if err := r.ParseForm(); err != nil {
return apiFuncResult{nil, &apiError{errorBadData, errors.Wrap(err, "error parsing form values")}, nil, nil} return apiFuncResult{nil, &apiError{errorBadData, fmt.Errorf("error parsing form values: %w", err)}, nil, nil}
} }
if len(r.Form["match[]"]) == 0 { if len(r.Form["match[]"]) == 0 {
return apiFuncResult{nil, &apiError{errorBadData, errors.New("no match[] parameter provided")}, nil, nil} return apiFuncResult{nil, &apiError{errorBadData, errors.New("no match[] parameter provided")}, nil, nil}
@ -1675,7 +1673,7 @@ func (api *API) snapshot(r *http.Request) apiFuncResult {
if r.FormValue("skip_head") != "" { if r.FormValue("skip_head") != "" {
skipHead, err = strconv.ParseBool(r.FormValue("skip_head")) skipHead, err = strconv.ParseBool(r.FormValue("skip_head"))
if err != nil { if err != nil {
return invalidParamError(errors.Wrapf(err, "unable to parse boolean"), "skip_head") return invalidParamError(fmt.Errorf("unable to parse boolean: %w", err), "skip_head")
} }
} }
@ -1687,10 +1685,10 @@ func (api *API) snapshot(r *http.Request) apiFuncResult {
dir = filepath.Join(snapdir, name) dir = filepath.Join(snapdir, name)
) )
if err := os.MkdirAll(dir, 0o777); err != nil { if err := os.MkdirAll(dir, 0o777); err != nil {
return apiFuncResult{nil, &apiError{errorInternal, errors.Wrap(err, "create snapshot directory")}, nil, nil} return apiFuncResult{nil, &apiError{errorInternal, fmt.Errorf("create snapshot directory: %w", err)}, nil, nil}
} }
if err := api.db.Snapshot(dir, !skipHead); err != nil { if err := api.db.Snapshot(dir, !skipHead); err != nil {
return apiFuncResult{nil, &apiError{errorInternal, errors.Wrap(err, "create snapshot")}, nil, nil} return apiFuncResult{nil, &apiError{errorInternal, fmt.Errorf("create snapshot: %w", err)}, nil, nil}
} }
return apiFuncResult{struct { return apiFuncResult{struct {
@ -1805,7 +1803,7 @@ func parseTimeParam(r *http.Request, paramName string, defaultValue time.Time) (
} }
result, err := parseTime(val) result, err := parseTime(val)
if err != nil { if err != nil {
return time.Time{}, errors.Wrapf(err, "Invalid time value for '%s'", paramName) return time.Time{}, fmt.Errorf("Invalid time value for '%s': %w", paramName, err)
} }
return result, nil return result, nil
} }
@ -1830,21 +1828,21 @@ func parseTime(s string) (time.Time, error) {
case maxTimeFormatted: case maxTimeFormatted:
return MaxTime, nil return MaxTime, nil
} }
return time.Time{}, errors.Errorf("cannot parse %q to a valid timestamp", s) return time.Time{}, fmt.Errorf("cannot parse %q to a valid timestamp", s)
} }
func parseDuration(s string) (time.Duration, error) { func parseDuration(s string) (time.Duration, error) {
if d, err := strconv.ParseFloat(s, 64); err == nil { if d, err := strconv.ParseFloat(s, 64); err == nil {
ts := d * float64(time.Second) ts := d * float64(time.Second)
if ts > float64(math.MaxInt64) || ts < float64(math.MinInt64) { if ts > float64(math.MaxInt64) || ts < float64(math.MinInt64) {
return 0, errors.Errorf("cannot parse %q to a valid duration. It overflows int64", s) return 0, fmt.Errorf("cannot parse %q to a valid duration. It overflows int64", s)
} }
return time.Duration(ts), nil return time.Duration(ts), nil
} }
if d, err := model.ParseDuration(s); err == nil { if d, err := model.ParseDuration(s); err == nil {
return time.Duration(d), nil return time.Duration(d), nil
} }
return 0, errors.Errorf("cannot parse %q to a valid duration", s) return 0, fmt.Errorf("cannot parse %q to a valid duration", s)
} }
func parseMatchersParam(matchers []string) ([][]*labels.Matcher, error) { func parseMatchersParam(matchers []string) ([][]*labels.Matcher, error) {

View file

@ -16,6 +16,7 @@ package v1
import ( import (
"context" "context"
"encoding/json" "encoding/json"
"errors"
"fmt" "fmt"
"io" "io"
"net/http" "net/http"
@ -33,7 +34,6 @@ import (
"github.com/prometheus/prometheus/util/stats" "github.com/prometheus/prometheus/util/stats"
"github.com/go-kit/log" "github.com/go-kit/log"
"github.com/pkg/errors"
"github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus"
config_util "github.com/prometheus/common/config" config_util "github.com/prometheus/common/config"
"github.com/prometheus/common/model" "github.com/prometheus/common/model"
@ -2974,7 +2974,7 @@ func (f *fakeDB) WALReplayStatus() (tsdb.WALReplayStatus, error) {
} }
func TestAdminEndpoints(t *testing.T) { func TestAdminEndpoints(t *testing.T) {
tsdb, tsdbWithError, tsdbNotReady := &fakeDB{}, &fakeDB{err: errors.New("some error")}, &fakeDB{err: errors.Wrap(tsdb.ErrNotReady, "wrap")} tsdb, tsdbWithError, tsdbNotReady := &fakeDB{}, &fakeDB{err: errors.New("some error")}, &fakeDB{err: fmt.Errorf("wrap: %w", tsdb.ErrNotReady)}
snapshotAPI := func(api *API) apiFunc { return api.snapshot } snapshotAPI := func(api *API) apiFunc { return api.snapshot }
cleanAPI := func(api *API) apiFunc { return api.cleanTombstones } cleanAPI := func(api *API) apiFunc { return api.cleanTombstones }
deleteAPI := func(api *API) apiFunc { return api.deleteSeries } deleteAPI := func(api *API) apiFunc { return api.deleteSeries }
@ -3354,7 +3354,7 @@ func TestParseTimeParam(t *testing.T) {
asTime: time.Time{}, asTime: time.Time{},
asError: func() error { asError: func() error {
_, err := parseTime("baz") _, err := parseTime("baz")
return errors.Wrapf(err, "Invalid time value for '%s'", "foo") return fmt.Errorf("Invalid time value for '%s': %w", "foo", err)
}, },
}, },
}, },

View file

@ -15,6 +15,7 @@ package v1
import ( import (
"context" "context"
"errors"
"fmt" "fmt"
"net/http" "net/http"
"net/http/httptest" "net/http/httptest"
@ -24,7 +25,6 @@ import (
"github.com/go-kit/log" "github.com/go-kit/log"
"github.com/grafana/regexp" "github.com/grafana/regexp"
"github.com/pkg/errors"
"github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/common/route" "github.com/prometheus/common/route"
"github.com/stretchr/testify/require" "github.com/stretchr/testify/require"

View file

@ -14,6 +14,7 @@
package web package web
import ( import (
"errors"
"fmt" "fmt"
"net/http" "net/http"
"sort" "sort"
@ -21,7 +22,6 @@ import (
"github.com/go-kit/log/level" "github.com/go-kit/log/level"
"github.com/gogo/protobuf/proto" "github.com/gogo/protobuf/proto"
"github.com/pkg/errors"
"github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus"
dto "github.com/prometheus/client_model/go" dto "github.com/prometheus/client_model/go"
"github.com/prometheus/common/expfmt" "github.com/prometheus/common/expfmt"
@ -86,7 +86,7 @@ func (h *Handler) federation(w http.ResponseWriter, req *http.Request) {
q, err := h.localStorage.Querier(mint, maxt) q, err := h.localStorage.Querier(mint, maxt)
if err != nil { if err != nil {
federationErrors.Inc() federationErrors.Inc()
if errors.Cause(err) == tsdb.ErrNotReady { if errors.Is(err, tsdb.ErrNotReady) {
http.Error(w, err.Error(), http.StatusServiceUnavailable) http.Error(w, err.Error(), http.StatusServiceUnavailable)
return return
} }

View file

@ -16,6 +16,7 @@ package web
import ( import (
"bytes" "bytes"
"context" "context"
"errors"
"fmt" "fmt"
"io" "io"
"net/http" "net/http"
@ -25,7 +26,6 @@ import (
"testing" "testing"
"time" "time"
"github.com/pkg/errors"
"github.com/prometheus/common/model" "github.com/prometheus/common/model"
"github.com/stretchr/testify/require" "github.com/stretchr/testify/require"
@ -238,15 +238,15 @@ type notReadyReadStorage struct {
} }
func (notReadyReadStorage) Querier(int64, int64) (storage.Querier, error) { func (notReadyReadStorage) Querier(int64, int64) (storage.Querier, error) {
return nil, errors.Wrap(tsdb.ErrNotReady, "wrap") return nil, fmt.Errorf("wrap: %w", tsdb.ErrNotReady)
} }
func (notReadyReadStorage) StartTime() (int64, error) { func (notReadyReadStorage) StartTime() (int64, error) {
return 0, errors.Wrap(tsdb.ErrNotReady, "wrap") return 0, fmt.Errorf("wrap: %w", tsdb.ErrNotReady)
} }
func (notReadyReadStorage) Stats(string, int) (*tsdb.Stats, error) { func (notReadyReadStorage) Stats(string, int) (*tsdb.Stats, error) {
return nil, errors.Wrap(tsdb.ErrNotReady, "wrap") return nil, fmt.Errorf("wrap: %w", tsdb.ErrNotReady)
} }
// Regression test for https://github.com/prometheus/prometheus/issues/7181. // Regression test for https://github.com/prometheus/prometheus/issues/7181.
@ -396,7 +396,7 @@ func TestFederationWithNativeHistograms(t *testing.T) {
l := labels.Labels{} l := labels.Labels{}
for { for {
et, err := p.Next() et, err := p.Next()
if err == io.EOF { if err != nil && errors.Is(err, io.EOF) {
break break
} }
require.NoError(t, err) require.NoError(t, err)

View file

@ -40,7 +40,6 @@ import (
"github.com/go-kit/log/level" "github.com/go-kit/log/level"
"github.com/grafana/regexp" "github.com/grafana/regexp"
"github.com/mwitkow/go-conntrack" "github.com/mwitkow/go-conntrack"
"github.com/pkg/errors"
"github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/client_golang/prometheus/promhttp" "github.com/prometheus/client_golang/prometheus/promhttp"
io_prometheus_client "github.com/prometheus/client_model/go" io_prometheus_client "github.com/prometheus/client_model/go"
@ -732,7 +731,7 @@ func (h *Handler) runtimeInfo() (api_v1.RuntimeInfo, error) {
metrics, err := h.gatherer.Gather() metrics, err := h.gatherer.Gather()
if err != nil { if err != nil {
return status, errors.Errorf("error gathering runtime status: %s", err) return status, fmt.Errorf("error gathering runtime status: %w", err)
} }
for _, mF := range metrics { for _, mF := range metrics {
switch *mF.Name { switch *mF.Name {