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  }