You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
119 lines
4.0 KiB
119 lines
4.0 KiB
/* |
|
Copyright 2016 The Kubernetes Authors. |
|
|
|
Licensed under the Apache License, Version 2.0 (the "License"); |
|
you may not use this file except in compliance with the License. |
|
You may obtain a copy of the License at |
|
|
|
http://www.apache.org/licenses/LICENSE-2.0 |
|
|
|
Unless required by applicable law or agreed to in writing, software |
|
distributed under the License is distributed on an "AS IS" BASIS, |
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
|
See the License for the specific language governing permissions and |
|
limitations under the License. |
|
*/ |
|
|
|
// This file provides abstractions for setting the provider (e.g., prometheus) |
|
// of metrics. |
|
|
|
package cache |
|
|
|
import ( |
|
"sync" |
|
) |
|
|
|
// GaugeMetric represents a single numerical value that can arbitrarily go up |
|
// and down. |
|
type GaugeMetric interface { |
|
Set(float64) |
|
} |
|
|
|
// CounterMetric represents a single numerical value that only ever |
|
// goes up. |
|
type CounterMetric interface { |
|
Inc() |
|
} |
|
|
|
// SummaryMetric captures individual observations. |
|
type SummaryMetric interface { |
|
Observe(float64) |
|
} |
|
|
|
type noopMetric struct{} |
|
|
|
func (noopMetric) Inc() {} |
|
func (noopMetric) Dec() {} |
|
func (noopMetric) Observe(float64) {} |
|
func (noopMetric) Set(float64) {} |
|
|
|
type reflectorMetrics struct { |
|
numberOfLists CounterMetric |
|
listDuration SummaryMetric |
|
numberOfItemsInList SummaryMetric |
|
|
|
numberOfWatches CounterMetric |
|
numberOfShortWatches CounterMetric |
|
watchDuration SummaryMetric |
|
numberOfItemsInWatch SummaryMetric |
|
|
|
lastResourceVersion GaugeMetric |
|
} |
|
|
|
// MetricsProvider generates various metrics used by the reflector. |
|
type MetricsProvider interface { |
|
NewListsMetric(name string) CounterMetric |
|
NewListDurationMetric(name string) SummaryMetric |
|
NewItemsInListMetric(name string) SummaryMetric |
|
|
|
NewWatchesMetric(name string) CounterMetric |
|
NewShortWatchesMetric(name string) CounterMetric |
|
NewWatchDurationMetric(name string) SummaryMetric |
|
NewItemsInWatchMetric(name string) SummaryMetric |
|
|
|
NewLastResourceVersionMetric(name string) GaugeMetric |
|
} |
|
|
|
type noopMetricsProvider struct{} |
|
|
|
func (noopMetricsProvider) NewListsMetric(name string) CounterMetric { return noopMetric{} } |
|
func (noopMetricsProvider) NewListDurationMetric(name string) SummaryMetric { return noopMetric{} } |
|
func (noopMetricsProvider) NewItemsInListMetric(name string) SummaryMetric { return noopMetric{} } |
|
func (noopMetricsProvider) NewWatchesMetric(name string) CounterMetric { return noopMetric{} } |
|
func (noopMetricsProvider) NewShortWatchesMetric(name string) CounterMetric { return noopMetric{} } |
|
func (noopMetricsProvider) NewWatchDurationMetric(name string) SummaryMetric { return noopMetric{} } |
|
func (noopMetricsProvider) NewItemsInWatchMetric(name string) SummaryMetric { return noopMetric{} } |
|
func (noopMetricsProvider) NewLastResourceVersionMetric(name string) GaugeMetric { |
|
return noopMetric{} |
|
} |
|
|
|
var metricsFactory = struct { |
|
metricsProvider MetricsProvider |
|
setProviders sync.Once |
|
}{ |
|
metricsProvider: noopMetricsProvider{}, |
|
} |
|
|
|
func newReflectorMetrics(name string) *reflectorMetrics { |
|
var ret *reflectorMetrics |
|
if len(name) == 0 { |
|
return ret |
|
} |
|
return &reflectorMetrics{ |
|
numberOfLists: metricsFactory.metricsProvider.NewListsMetric(name), |
|
listDuration: metricsFactory.metricsProvider.NewListDurationMetric(name), |
|
numberOfItemsInList: metricsFactory.metricsProvider.NewItemsInListMetric(name), |
|
numberOfWatches: metricsFactory.metricsProvider.NewWatchesMetric(name), |
|
numberOfShortWatches: metricsFactory.metricsProvider.NewShortWatchesMetric(name), |
|
watchDuration: metricsFactory.metricsProvider.NewWatchDurationMetric(name), |
|
numberOfItemsInWatch: metricsFactory.metricsProvider.NewItemsInWatchMetric(name), |
|
lastResourceVersion: metricsFactory.metricsProvider.NewLastResourceVersionMetric(name), |
|
} |
|
} |
|
|
|
// SetReflectorMetricsProvider sets the metrics provider |
|
func SetReflectorMetricsProvider(metricsProvider MetricsProvider) { |
|
metricsFactory.setProviders.Do(func() { |
|
metricsFactory.metricsProvider = metricsProvider |
|
}) |
|
}
|
|
|