@@ -20,6 +20,7 @@ import (
20
20
"os"
21
21
"slices"
22
22
"strings"
23
+ "time"
23
24
24
25
"github.com/PuerkitoBio/rehttp"
25
26
"github.com/alecthomas/kingpin/v2"
@@ -185,6 +186,7 @@ type handler struct {
185
186
metricsExtraFilters []collectors.MetricFilter
186
187
additionalGatherer prometheus.Gatherer
187
188
m * monitoring.Service
189
+ collectors * collectors.CollectorCache
188
190
}
189
191
190
192
func (h * handler ) ServeHTTP (w http.ResponseWriter , r * http.Request ) {
@@ -203,35 +205,65 @@ func (h *handler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
203
205
}
204
206
205
207
func newHandler (projectIDs []string , metricPrefixes []string , metricExtraFilters []collectors.MetricFilter , m * monitoring.Service , logger * slog.Logger , additionalGatherer prometheus.Gatherer ) * handler {
208
+ var ttl time.Duration
209
+ // Add collector caching TTL as max of deltas aggregation or descriptor caching
210
+ if * monitoringMetricsAggregateDeltas || * monitoringDescriptorCacheTTL > 0 {
211
+ ttl = * monitoringMetricsDeltasTTL
212
+ if * monitoringDescriptorCacheTTL > ttl {
213
+ ttl = * monitoringDescriptorCacheTTL
214
+ }
215
+ } else {
216
+ ttl = 2 * time .Hour
217
+ }
218
+
219
+ logger .Info ("Creating collector cache" , "ttl" , ttl )
220
+
206
221
h := & handler {
207
222
logger : logger ,
208
223
projectIDs : projectIDs ,
209
224
metricsPrefixes : metricPrefixes ,
210
225
metricsExtraFilters : metricExtraFilters ,
211
226
additionalGatherer : additionalGatherer ,
212
227
m : m ,
228
+ collectors : collectors .NewCollectorCache (ttl ),
213
229
}
214
230
215
231
h .handler = h .innerHandler (nil )
216
232
return h
217
233
}
218
234
235
+ func (h * handler ) getCollector (project string , filters map [string ]bool ) (* collectors.MonitoringCollector , error ) {
236
+ filterdPrefixes := h .filterMetricTypePrefixes (filters )
237
+ collectorKey := fmt .Sprintf ("%s-%v" , project , filterdPrefixes )
238
+
239
+ if collector , found := h .collectors .Get (collectorKey ); found {
240
+ return collector , nil
241
+ }
242
+
243
+ collector , err := collectors .NewMonitoringCollector (project , h .m , collectors.MonitoringCollectorOptions {
244
+ MetricTypePrefixes : filterdPrefixes ,
245
+ ExtraFilters : h .metricsExtraFilters ,
246
+ RequestInterval : * monitoringMetricsInterval ,
247
+ RequestOffset : * monitoringMetricsOffset ,
248
+ IngestDelay : * monitoringMetricsIngestDelay ,
249
+ FillMissingLabels : * collectorFillMissingLabels ,
250
+ DropDelegatedProjects : * monitoringDropDelegatedProjects ,
251
+ AggregateDeltas : * monitoringMetricsAggregateDeltas ,
252
+ DescriptorCacheTTL : * monitoringDescriptorCacheTTL ,
253
+ DescriptorCacheOnlyGoogle : * monitoringDescriptorCacheOnlyGoogle ,
254
+ }, h .logger , delta .NewInMemoryCounterStore (h .logger , * monitoringMetricsDeltasTTL ), delta .NewInMemoryHistogramStore (h .logger , * monitoringMetricsDeltasTTL ))
255
+ if err != nil {
256
+ return nil , err
257
+ }
258
+ h .collectors .Store (collectorKey , collector )
259
+ return collector , nil
260
+ }
261
+
219
262
func (h * handler ) innerHandler (filters map [string ]bool ) http.Handler {
220
263
registry := prometheus .NewRegistry ()
221
264
222
265
for _ , project := range h .projectIDs {
223
- monitoringCollector , err := collectors .NewMonitoringCollector (project , h .m , collectors.MonitoringCollectorOptions {
224
- MetricTypePrefixes : h .filterMetricTypePrefixes (filters ),
225
- ExtraFilters : h .metricsExtraFilters ,
226
- RequestInterval : * monitoringMetricsInterval ,
227
- RequestOffset : * monitoringMetricsOffset ,
228
- IngestDelay : * monitoringMetricsIngestDelay ,
229
- FillMissingLabels : * collectorFillMissingLabels ,
230
- DropDelegatedProjects : * monitoringDropDelegatedProjects ,
231
- AggregateDeltas : * monitoringMetricsAggregateDeltas ,
232
- DescriptorCacheTTL : * monitoringDescriptorCacheTTL ,
233
- DescriptorCacheOnlyGoogle : * monitoringDescriptorCacheOnlyGoogle ,
234
- }, h .logger , delta .NewInMemoryCounterStore (h .logger , * monitoringMetricsDeltasTTL ), delta .NewInMemoryHistogramStore (h .logger , * monitoringMetricsDeltasTTL ))
266
+ monitoringCollector , err := h .getCollector (project , filters )
235
267
if err != nil {
236
268
h .logger .Error ("error creating monitoring collector" , "err" , err )
237
269
os .Exit (1 )
0 commit comments