| 215 | } |
| 216 | |
| 217 | func NewTracker(cfg PerTrackerConfig, name string, labelsFn tenantLabelsFunc, maxFn tenantMaxFunc, logger log.Logger) (*Tracker, error) { |
| 218 | // wrapped into error because we only log errors in the usage tracker with this logger |
| 219 | logger = level.Error(log.With(logger, "component", "usage-tracker")) |
| 220 | u := &Tracker{ |
| 221 | cfg: cfg, |
| 222 | name: name, |
| 223 | tenants: make(map[string]*tenantUsage), |
| 224 | labelsFn: labelsFn, |
| 225 | maxFn: maxFn, |
| 226 | reg: prometheus.NewRegistry(), |
| 227 | // rate limit logger to avoid log spam |
| 228 | logger: tempo_log.NewRateLimitedLogger(1, logger), |
| 229 | } |
| 230 | |
| 231 | err := u.reg.Register(u) |
| 232 | if err != nil { |
| 233 | return nil, err |
| 234 | } |
| 235 | |
| 236 | go u.PurgeRoutine() |
| 237 | |
| 238 | return u, nil |
| 239 | } |
| 240 | |
| 241 | // getTenant must be called under lock. |
| 242 | func (u *Tracker) getTenant(tenant string) *tenantUsage { |