dependency-injected non-global metrics object

This commit is contained in:
pdbogen 2019-07-22 11:35:28 -07:00
parent b394496f5c
commit bda754ad2d
7 changed files with 162 additions and 78 deletions

View file

@ -40,6 +40,8 @@ type externalPrometheusProvider struct {
metricConverter MetricConverter
seriesRegistry ExternalSeriesRegistry
serviceMetrics *metrics.ServiceMetrics
}
func (p *externalPrometheusProvider) GetExternalMetric(namespace string, metricSelector labels.Selector, info provider.ExternalMetricInfo) (*external_metrics.ExternalMetricValueList, error) {
@ -47,12 +49,16 @@ func (p *externalPrometheusProvider) GetExternalMetric(namespace string, metricS
if err != nil {
klog.Errorf("unable to generate a query for the metric: %v", err)
metrics.Errors.WithLabelValues("internal").Inc()
if p.serviceMetrics != nil {
p.serviceMetrics.Errors.WithLabelValues("internal").Inc()
}
return nil, apierr.NewInternalError(fmt.Errorf("unable to fetch metrics"))
}
if !found {
metrics.Errors.WithLabelValues("not_found").Inc()
if p.serviceMetrics != nil {
p.serviceMetrics.Errors.WithLabelValues("not_found").Inc()
}
return nil, provider.NewMetricNotFoundError(p.selectGroupResource(namespace), info.Metric)
}
// Here is where we're making the query, need to be before here xD
@ -61,7 +67,9 @@ func (p *externalPrometheusProvider) GetExternalMetric(namespace string, metricS
if err != nil {
klog.Errorf("unable to fetch metrics from prometheus: %v", err)
// don't leak implementation details to the user
metrics.Errors.WithLabelValues("internal").Inc()
if p.serviceMetrics != nil {
p.serviceMetrics.Errors.WithLabelValues("internal").Inc()
}
return nil, apierr.NewInternalError(fmt.Errorf("unable to fetch metrics"))
}
return p.metricConverter.Convert(info, queryResults)
@ -83,14 +91,15 @@ func (p *externalPrometheusProvider) selectGroupResource(namespace string) schem
}
// NewExternalPrometheusProvider creates an ExternalMetricsProvider capable of responding to Kubernetes requests for external metric data
func NewExternalPrometheusProvider(promClient prom.Client, namers []naming.MetricNamer, updateInterval time.Duration) (provider.ExternalMetricsProvider, Runnable) {
func NewExternalPrometheusProvider(promClient prom.Client, namers []naming.MetricNamer, updateInterval time.Duration, serviceMetrics *metrics.ServiceMetrics) (provider.ExternalMetricsProvider, Runnable) {
metricConverter := NewMetricConverter()
basicLister := NewBasicMetricLister(promClient, namers, updateInterval)
periodicLister, _ := NewPeriodicMetricLister(basicLister, updateInterval)
seriesRegistry := NewExternalSeriesRegistry(periodicLister)
seriesRegistry := NewExternalSeriesRegistry(periodicLister, serviceMetrics)
return &externalPrometheusProvider{
promClient: promClient,
seriesRegistry: seriesRegistry,
metricConverter: metricConverter,
serviceMetrics: serviceMetrics,
}, periodicLister
}