Skip to content

Commit 1c6798f

Browse files
committed
Use errors.Join instead of multierror in sdk/metric
1 parent d9e789a commit 1c6798f

File tree

2 files changed

+39
-53
lines changed

2 files changed

+39
-53
lines changed

sdk/metric/meter.go

+7-8
Original file line numberDiff line numberDiff line change
@@ -442,21 +442,21 @@ func (m *meter) RegisterCallback(f metric.Callback, insts ...metric.Observable)
442442
}
443443

444444
reg := newObserver()
445-
var errs multierror
445+
var err error
446446
for _, inst := range insts {
447447
switch o := inst.(type) {
448448
case int64Observable:
449-
if err := o.registerable(m); err != nil {
450-
if !errors.Is(err, errEmptyAgg) {
451-
errs.append(err)
449+
if e := o.registerable(m); e != nil {
450+
if !errors.Is(e, errEmptyAgg) {
451+
err = errors.Join(err, e)
452452
}
453453
continue
454454
}
455455
reg.registerInt64(o.observableID)
456456
case float64Observable:
457-
if err := o.registerable(m); err != nil {
458-
if !errors.Is(err, errEmptyAgg) {
459-
errs.append(err)
457+
if e := o.registerable(m); e != nil {
458+
if !errors.Is(e, errEmptyAgg) {
459+
err = errors.Join(err, e)
460460
}
461461
continue
462462
}
@@ -467,7 +467,6 @@ func (m *meter) RegisterCallback(f metric.Callback, insts ...metric.Observable)
467467
}
468468
}
469469

470-
err := errs.errorOrNil()
471470
if reg.len() == 0 {
472471
// All insts use drop aggregation or are invalid.
473472
return noopRegister{}, err

sdk/metric/pipeline.go

+32-45
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ import (
88
"context"
99
"errors"
1010
"fmt"
11-
"strings"
1211
"sync"
1312
"sync/atomic"
1413

@@ -108,11 +107,11 @@ func (p *pipeline) produce(ctx context.Context, rm *metricdata.ResourceMetrics)
108107
p.Lock()
109108
defer p.Unlock()
110109

111-
var errs multierror
110+
var err error
112111
for _, c := range p.callbacks {
113112
// TODO make the callbacks parallel. ( #3034 )
114-
if err := c(ctx); err != nil {
115-
errs.append(err)
113+
if e := c(ctx); e != nil {
114+
err = errors.Join(err, e)
116115
}
117116
if err := ctx.Err(); err != nil {
118117
rm.Resource = nil
@@ -123,8 +122,8 @@ func (p *pipeline) produce(ctx context.Context, rm *metricdata.ResourceMetrics)
123122
for e := p.multiCallbacks.Front(); e != nil; e = e.Next() {
124123
// TODO make the callbacks parallel. ( #3034 )
125124
f := e.Value.(multiCallback)
126-
if err := f(ctx); err != nil {
127-
errs.append(err)
125+
if e := f(ctx); e != nil {
126+
err = errors.Join(err, e)
128127
}
129128
if err := ctx.Err(); err != nil {
130129
// This means the context expired before we finished running callbacks.
@@ -160,7 +159,7 @@ func (p *pipeline) produce(ctx context.Context, rm *metricdata.ResourceMetrics)
160159

161160
rm.ScopeMetrics = rm.ScopeMetrics[:i]
162161

163-
return errs.errorOrNil()
162+
return err
164163
}
165164

166165
// inserter facilitates inserting of new instruments from a single scope into a
@@ -222,17 +221,17 @@ func (i *inserter[N]) Instrument(inst Instrument, readerAggregation Aggregation)
222221
measures []aggregate.Measure[N]
223222
)
224223

225-
errs := &multierror{wrapped: errCreatingAggregators}
224+
var err error
226225
seen := make(map[uint64]struct{})
227226
for _, v := range i.pipeline.views {
228227
stream, match := v(inst)
229228
if !match {
230229
continue
231230
}
232231
matched = true
233-
in, id, err := i.cachedAggregator(inst.Scope, inst.Kind, stream, readerAggregation)
234-
if err != nil {
235-
errs.append(err)
232+
in, id, e := i.cachedAggregator(inst.Scope, inst.Kind, stream, readerAggregation)
233+
if e != nil {
234+
err = errors.Join(err, e)
236235
}
237236
if in == nil { // Drop aggregation.
238237
continue
@@ -245,8 +244,12 @@ func (i *inserter[N]) Instrument(inst Instrument, readerAggregation Aggregation)
245244
measures = append(measures, in)
246245
}
247246

247+
if err != nil {
248+
err = errors.Join(errCreatingAggregators, err)
249+
}
250+
248251
if matched {
249-
return measures, errs.errorOrNil()
252+
return measures, err
250253
}
251254

252255
// Apply implicit default view if no explicit matched.
@@ -255,15 +258,18 @@ func (i *inserter[N]) Instrument(inst Instrument, readerAggregation Aggregation)
255258
Description: inst.Description,
256259
Unit: inst.Unit,
257260
}
258-
in, _, err := i.cachedAggregator(inst.Scope, inst.Kind, stream, readerAggregation)
259-
if err != nil {
260-
errs.append(err)
261+
in, _, e := i.cachedAggregator(inst.Scope, inst.Kind, stream, readerAggregation)
262+
if e != nil {
263+
if err == nil {
264+
err = errCreatingAggregators
265+
}
266+
err = errors.Join(err, e)
261267
}
262268
if in != nil {
263269
// Ensured to have not seen given matched was false.
264270
measures = append(measures, in)
265271
}
266-
return measures, errs.errorOrNil()
272+
return measures, err
267273
}
268274

269275
// addCallback registers a single instrument callback to be run when
@@ -608,15 +614,15 @@ func newResolver[N int64 | float64](p pipelines, vc *cache[string, instID]) reso
608614
func (r resolver[N]) Aggregators(id Instrument) ([]aggregate.Measure[N], error) {
609615
var measures []aggregate.Measure[N]
610616

611-
errs := &multierror{}
617+
var err error
612618
for _, i := range r.inserters {
613-
in, err := i.Instrument(id, i.readerDefaultAggregation(id.Kind))
614-
if err != nil {
615-
errs.append(err)
619+
in, e := i.Instrument(id, i.readerDefaultAggregation(id.Kind))
620+
if e != nil {
621+
err = errors.Join(err, e)
616622
}
617623
measures = append(measures, in...)
618624
}
619-
return measures, errs.errorOrNil()
625+
return measures, err
620626
}
621627

622628
// HistogramAggregators returns the histogram Aggregators that must be updated by the instrument
@@ -625,37 +631,18 @@ func (r resolver[N]) Aggregators(id Instrument) ([]aggregate.Measure[N], error)
625631
func (r resolver[N]) HistogramAggregators(id Instrument, boundaries []float64) ([]aggregate.Measure[N], error) {
626632
var measures []aggregate.Measure[N]
627633

628-
errs := &multierror{}
634+
var err error
629635
for _, i := range r.inserters {
630636
agg := i.readerDefaultAggregation(id.Kind)
631637
if histAgg, ok := agg.(AggregationExplicitBucketHistogram); ok && len(boundaries) > 0 {
632638
histAgg.Boundaries = boundaries
633639
agg = histAgg
634640
}
635-
in, err := i.Instrument(id, agg)
636-
if err != nil {
637-
errs.append(err)
641+
in, e := i.Instrument(id, agg)
642+
if e != nil {
643+
err = errors.Join(err, e)
638644
}
639645
measures = append(measures, in...)
640646
}
641-
return measures, errs.errorOrNil()
642-
}
643-
644-
type multierror struct {
645-
wrapped error
646-
errors []string
647-
}
648-
649-
func (m *multierror) errorOrNil() error {
650-
if len(m.errors) == 0 {
651-
return nil
652-
}
653-
if m.wrapped == nil {
654-
return errors.New(strings.Join(m.errors, "; "))
655-
}
656-
return fmt.Errorf("%w: %s", m.wrapped, strings.Join(m.errors, "; "))
657-
}
658-
659-
func (m *multierror) append(err error) {
660-
m.errors = append(m.errors, err.Error())
647+
return measures, err
661648
}

0 commit comments

Comments
 (0)