| 62 | } |
| 63 | |
| 64 | func NewPerLabelLimiter(tenant string, maxCardinalityF maxCardinalityFunc, staleDuration time.Duration) *PerLabelLimiter { |
| 65 | pll := &PerLabelLimiter{ |
| 66 | tenant: tenant, |
| 67 | maxCardinalityFunc: maxCardinalityF, |
| 68 | labelsState: make(map[string]*labelCardinalityState), |
| 69 | staleDuration: staleDuration, |
| 70 | demandUpdateChan: time.Tick(demandUpdateInterval), |
| 71 | pruneChan: time.Tick(removeStaleSeriesInterval), |
| 72 | } |
| 73 | // init on New, config is refreshed on demand update tick |
| 74 | pll.maxCardinality.Store(maxCardinalityF(tenant)) |
| 75 | return pll |
| 76 | } |
| 77 | |
| 78 | // Limit applies the per-label cardinality limit to the given labels. |
| 79 | // Labels whose estimated cardinality exceeds the configured max have their |