1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
|
package metric
import (
"context"
otelmetric "go.opentelemetry.io/otel/metric"
"go.opentelemetry.io/otel/trace"
)
var (
_ WaitLimiter = (*WaitLimiterInstrumentation)(nil)
)
type WaitLimiter interface {
Wait(context.Context) error
}
type WaitLimiterInstrumentation struct {
wrapper *LimiterWrapper
delegate WaitLimiter
}
func NewWaitLimiterInstrumentation(limiterName string, limit float64, limitUnit string, tr trace.Tracer, m otelmetric.Meter, delegate WaitLimiter) (*WaitLimiterInstrumentation, error) {
w, err := NewLimiterWrapper(limiterName, limit, limitUnit, m, tr)
if err != nil {
return nil, err
}
return &WaitLimiterInstrumentation{
wrapper: w,
delegate: delegate,
}, nil
}
func (i *WaitLimiterInstrumentation) Wait(ctx context.Context) error {
ctx, done := i.wrapper.Start(ctx)
allowed := false
defer func() { // to handle panics
done(allowed)
}()
err := i.delegate.Wait(ctx)
allowed = err == nil
return err
}
|