| 22 | } |
| 23 | |
| 24 | func NewResourceBasedLimiter(resourceMonitor resource.IMonitor, limits map[resource.Type]float64, registerer prometheus.Registerer, component string) (*ResourceBasedLimiter, error) { |
| 25 | for resType, limit := range limits { |
| 26 | switch resType { |
| 27 | case resource.CPU, resource.Heap: |
| 28 | promauto.With(registerer).NewGauge(prometheus.GaugeOpts{ |
| 29 | Name: "cortex_resource_based_limiter_limit", |
| 30 | Help: "Limit set for the resource utilization.", |
| 31 | ConstLabels: map[string]string{"component": component, "resource": string(resType)}, |
| 32 | }).Set(limit) |
| 33 | default: |
| 34 | return nil, fmt.Errorf("unsupported resource type: [%s]", resType) |
| 35 | } |
| 36 | } |
| 37 | |
| 38 | return &ResourceBasedLimiter{ |
| 39 | resourceMonitor: resourceMonitor, |
| 40 | limits: limits, |
| 41 | limitBreachedCount: promauto.With(registerer).NewCounterVec( |
| 42 | prometheus.CounterOpts{ |
| 43 | Name: "cortex_resource_based_limiter_throttled_total", |
| 44 | Help: "The total number of times resource based limiter throttled.", |
| 45 | ConstLabels: map[string]string{"component": component}, |
| 46 | }, |
| 47 | []string{"resource"}, |
| 48 | ), |
| 49 | }, nil |
| 50 | } |
| 51 | |
| 52 | func (l *ResourceBasedLimiter) AcceptNewRequest() error { |
| 53 | for resType, limit := range l.limits { |