NewHandler creates a new frontend handler.
(cfg HandlerConfig, tenantFederationCfg tenantfederation.Config, roundTripper http.RoundTripper, log log.Logger, reg prometheus.Registerer)
| 122 | |
| 123 | // NewHandler creates a new frontend handler. |
| 124 | func NewHandler(cfg HandlerConfig, tenantFederationCfg tenantfederation.Config, roundTripper http.RoundTripper, log log.Logger, reg prometheus.Registerer) *Handler { |
| 125 | h := &Handler{ |
| 126 | cfg: cfg, |
| 127 | tenantFederationCfg: tenantFederationCfg, |
| 128 | log: log, |
| 129 | roundTripper: roundTripper, |
| 130 | reg: reg, |
| 131 | } |
| 132 | |
| 133 | if cfg.QueryStatsEnabled { |
| 134 | h.querySeconds = promauto.With(reg).NewCounterVec(prometheus.CounterOpts{ |
| 135 | Name: "cortex_query_seconds_total", |
| 136 | Help: "Total amount of wall clock time spend processing queries.", |
| 137 | }, []string{"source", "user"}) |
| 138 | |
| 139 | h.queryFetchedSeries = promauto.With(reg).NewCounterVec(prometheus.CounterOpts{ |
| 140 | Name: "cortex_query_fetched_series_total", |
| 141 | Help: "Number of series fetched to execute a query.", |
| 142 | }, []string{"source", "user"}) |
| 143 | |
| 144 | h.queryFetchedSamples = promauto.With(reg).NewCounterVec(prometheus.CounterOpts{ |
| 145 | Name: "cortex_query_samples_total", |
| 146 | Help: "Number of samples fetched to execute a query.", |
| 147 | }, []string{"source", "user"}) |
| 148 | |
| 149 | // It tracks TotalSamples in https://github.com/prometheus/prometheus/blob/main/util/stats/query_stats.go#L237 for each user. |
| 150 | h.queryScannedSamples = promauto.With(reg).NewCounterVec(prometheus.CounterOpts{ |
| 151 | Name: "cortex_query_samples_scanned_total", |
| 152 | Help: "Number of samples scanned to execute a query.", |
| 153 | }, []string{"source", "user"}) |
| 154 | |
| 155 | h.queryPeakSamples = promauto.With(reg).NewHistogramVec(prometheus.HistogramOpts{ |
| 156 | Name: "cortex_query_peak_samples", |
| 157 | Help: "Highest count of samples considered to execute a query.", |
| 158 | NativeHistogramBucketFactor: 1.1, |
| 159 | NativeHistogramMaxBucketNumber: 100, |
| 160 | NativeHistogramMinResetDuration: 1 * time.Hour, |
| 161 | }, []string{"source", "user"}) |
| 162 | |
| 163 | h.queryChunkBytes = promauto.With(reg).NewCounterVec(prometheus.CounterOpts{ |
| 164 | Name: "cortex_query_fetched_chunks_bytes_total", |
| 165 | Help: "Size of all chunks fetched to execute a query in bytes.", |
| 166 | }, []string{"source", "user"}) |
| 167 | |
| 168 | h.queryDataBytes = promauto.With(reg).NewCounterVec(prometheus.CounterOpts{ |
| 169 | Name: "cortex_query_fetched_data_bytes_total", |
| 170 | Help: "Size of all data fetched to execute a query in bytes.", |
| 171 | }, []string{"source", "user"}) |
| 172 | |
| 173 | h.rejectedQueries = promauto.With(reg).NewCounterVec( |
| 174 | prometheus.CounterOpts{ |
| 175 | Name: "cortex_rejected_queries_total", |
| 176 | Help: "The total number of queries that were rejected.", |
| 177 | }, |
| 178 | []string{"reason", "source", "user"}, |
| 179 | ) |
| 180 | h.activeUsers = users.NewActiveUsersCleanupWithDefaultValues(h.cleanupMetricsForInactiveUser) |
| 181 | // If cleaner stops or fail, we will simply not clean the metrics for inactive users. |