File: wait_limiter.go

package info (click to toggle)
gitlab-agent 16.11.5-1
  • links: PTS, VCS
  • area: contrib
  • in suites: experimental
  • size: 7,072 kB
  • sloc: makefile: 193; sh: 55; ruby: 3
file content (43 lines) | stat: -rw-r--r-- 956 bytes parent folder | download
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
}