New creates a new frontend. Frontend implements service, and must be started and stopped.
(cfg Config, log log.Logger, registerer prometheus.Registerer)
| 87 | |
| 88 | // New creates a new frontend. Frontend implements service, and must be started and stopped. |
| 89 | func New(cfg Config, log log.Logger, registerer prometheus.Registerer) (*Frontend, error) { |
| 90 | const batchBucketCount = 5 |
| 91 | if cfg.MaxBatchSize <= 0 { |
| 92 | return nil, errors.New("max_batch_size must be positive") |
| 93 | } |
| 94 | batchBucketSize := float64(cfg.MaxBatchSize) / float64(batchBucketCount) |
| 95 | |
| 96 | f := &Frontend{ |
| 97 | cfg: cfg, |
| 98 | log: log, |
| 99 | queueLength: promauto.With(registerer).NewGaugeVec(prometheus.GaugeOpts{ |
| 100 | Name: "tempo_query_frontend_queue_length", |
| 101 | Help: "Number of queries in the queue.", |
| 102 | }, []string{"user"}), |
| 103 | batchWeight: promauto.With(registerer).NewHistogramVec(prometheus.HistogramOpts{ |
| 104 | Name: "tempo_query_frontend_batch_weight", |
| 105 | Help: "Weight of the batch.", |
| 106 | Buckets: prometheus.LinearBuckets(1, 1, cfg.MaxBatchSize), |
| 107 | NativeHistogramBucketFactor: 1.1, |
| 108 | NativeHistogramMaxBucketNumber: 100, |
| 109 | NativeHistogramMinResetDuration: 1 * time.Hour, |
| 110 | }, []string{"user"}), |
| 111 | discardedRequests: promauto.With(registerer).NewCounterVec(prometheus.CounterOpts{ |
| 112 | Name: "tempo_query_frontend_discarded_requests_total", |
| 113 | Help: "Total number of query requests discarded.", |
| 114 | }, []string{"user"}), |
| 115 | queueDuration: promauto.With(registerer).NewHistogram(prometheus.HistogramOpts{ |
| 116 | Name: "tempo_query_frontend_queue_duration_seconds", |
| 117 | Help: "Time spend by requests queued.", |
| 118 | Buckets: prometheus.DefBuckets, |
| 119 | NativeHistogramBucketFactor: 1.1, |
| 120 | NativeHistogramMaxBucketNumber: 100, |
| 121 | NativeHistogramMinResetDuration: 1 * time.Hour, |
| 122 | }), |
| 123 | actualBatchSize: promauto.With(registerer).NewHistogram(prometheus.HistogramOpts{ |
| 124 | Name: "tempo_query_frontend_actual_batch_size", |
| 125 | Help: "Batch size.", |
| 126 | Buckets: prometheus.LinearBuckets(1, batchBucketSize, batchBucketCount), |
| 127 | NativeHistogramBucketFactor: 1.1, |
| 128 | NativeHistogramMaxBucketNumber: 100, |
| 129 | NativeHistogramMinResetDuration: 1 * time.Hour, |
| 130 | }), |
| 131 | connectedQuerierWorkers: &atomic.Int32{}, |
| 132 | } |
| 133 | |
| 134 | f.requestQueue = queue.NewRequestQueue(cfg.MaxOutstandingPerTenant, f.queueLength, f.batchWeight, f.discardedRequests) |
| 135 | f.activeUsers = util.NewActiveUsersCleanupWithDefaultValues(f.cleanupInactiveUserMetrics) |
| 136 | |
| 137 | var err error |
| 138 | f.subservices, err = services.NewManager(f.requestQueue, f.activeUsers) |
| 139 | if err != nil { |
| 140 | return nil, err |
| 141 | } |
| 142 | |
| 143 | f.numClients = promauto.With(registerer).NewGaugeFunc(prometheus.GaugeOpts{ |
| 144 | Name: "tempo_query_frontend_connected_clients", |
| 145 | Help: "Number of worker clients currently connected to the frontend.", |
| 146 | }, func() float64 { |
no test coverage detected