github.com/grafana/synthetic-monitoring-agent@v0.64.2/internal/limits/tenant.go (about) 1 package limits 2 3 import ( 4 "context" 5 "errors" 6 7 "github.com/grafana/synthetic-monitoring-agent/internal/model" 8 sm "github.com/grafana/synthetic-monitoring-agent/pkg/pb/synthetic_monitoring" 9 ) 10 11 const ( 12 // Tenant limits (defaults) 13 14 maxMetricLabels = sm.MaxMetricLabels 15 maxLogLabels = sm.MaxLogLabels 16 ) 17 18 var ( 19 ErrTooManyMetricLabels = errors.New("too many metric labels") 20 ErrTooManyLogLabels = errors.New("too many log labels") 21 ) 22 23 type TenantProvider interface { 24 GetTenant(context.Context, *sm.TenantInfo) (*sm.Tenant, error) 25 } 26 27 // TenantLimits provides functionalities to query and validate metrics and log 28 // labels limits for a particular tenant. 29 type TenantLimits struct { 30 tp TenantProvider 31 } 32 33 func NewTenantLimits(tp TenantProvider) *TenantLimits { 34 return &TenantLimits{ 35 tp, 36 } 37 } 38 39 // MetricLabels returns the metric labels limit for the specified tenant. 40 func (tl *TenantLimits) MetricLabels(ctx context.Context, tenantID model.GlobalID) (int, error) { 41 tenant, err := tl.tp.GetTenant(ctx, &sm.TenantInfo{ 42 Id: int64(tenantID), 43 }) 44 if err != nil { 45 return 0, err 46 } 47 48 max := maxMetricLabels 49 if tenant.Limits != nil { 50 max = int(tenant.Limits.MaxMetricLabels) 51 } 52 53 return max, nil 54 } 55 56 // LogLabels returns the log labels limit for the specified tenant. 57 func (tl *TenantLimits) LogLabels(ctx context.Context, tenantID model.GlobalID) (int, error) { 58 tenant, err := tl.tp.GetTenant(ctx, &sm.TenantInfo{ 59 Id: int64(tenantID), 60 }) 61 if err != nil { 62 return 0, err 63 } 64 65 max := maxLogLabels 66 if tenant.Limits != nil { 67 max = int(tenant.Limits.MaxLogLabels) 68 } 69 70 return max, nil 71 } 72 73 // ValidateMetricLabels validates the given number of metric labels against the specific tenant limits. 74 func (tl *TenantLimits) ValidateMetricLabels(ctx context.Context, tenantID model.GlobalID, n int) error { 75 max, err := tl.MetricLabels(ctx, tenantID) 76 if err != nil { 77 return err 78 } 79 80 if n > max { 81 return ErrTooManyMetricLabels 82 } 83 84 return nil 85 } 86 87 // ValidateLogLabels validates the given number of log labels against the specific tenant limits. 88 func (tl *TenantLimits) ValidateLogLabels(ctx context.Context, tenantID model.GlobalID, n int) error { 89 max, err := tl.LogLabels(ctx, tenantID) 90 if err != nil { 91 return err 92 } 93 94 if n > max { 95 return ErrTooManyLogLabels 96 } 97 98 return nil 99 }