github.com/grafana/pyroscope@v1.18.0/pkg/validation/user_limits_handler.go (about)

     1  // SPDX-License-Identifier: AGPL-3.0-only
     2  
     3  package validation
     4  
     5  import (
     6  	"net/http"
     7  
     8  	"github.com/grafana/dskit/tenant"
     9  
    10  	"github.com/grafana/pyroscope/pkg/util"
    11  	httputil "github.com/grafana/pyroscope/pkg/util/http"
    12  )
    13  
    14  type TenantLimitsResponse struct {
    15  	// Write path limits
    16  	IngestionRate            float64 `json:"ingestion_rate"`
    17  	IngestionBurstSize       int     `json:"ingestion_burst_size"`
    18  	MaxGlobalSeriesPerTenant int     `json:"max_global_series_per_user"`
    19  
    20  	// todo
    21  }
    22  
    23  // TenantLimitsHandler handles user limits.
    24  func TenantLimitsHandler(defaultLimits Limits, tenantLimits TenantLimits) http.HandlerFunc {
    25  	return func(w http.ResponseWriter, r *http.Request) {
    26  		userID, err := tenant.TenantID(r.Context())
    27  		if err != nil {
    28  			httputil.ErrorWithStatus(w, err, http.StatusUnauthorized)
    29  			return
    30  		}
    31  
    32  		userLimits := tenantLimits.TenantLimits(userID)
    33  		if userLimits == nil {
    34  			userLimits = &defaultLimits
    35  		}
    36  
    37  		limits := TenantLimitsResponse{
    38  			// Write path limits
    39  			IngestionRate:            userLimits.IngestionRateMB,
    40  			IngestionBurstSize:       int(userLimits.IngestionBurstSizeMB),
    41  			MaxGlobalSeriesPerTenant: userLimits.MaxGlobalSeriesPerTenant,
    42  		}
    43  
    44  		util.WriteJSONResponse(w, limits)
    45  	}
    46  }