diff --git a/kayenta-prometheus/src/main/java/com/netflix/kayenta/prometheus/metrics/PrometheusMetricsService.java b/kayenta-prometheus/src/main/java/com/netflix/kayenta/prometheus/metrics/PrometheusMetricsService.java index b31c60381..ed19a2d9f 100644 --- a/kayenta-prometheus/src/main/java/com/netflix/kayenta/prometheus/metrics/PrometheusMetricsService.java +++ b/kayenta-prometheus/src/main/java/com/netflix/kayenta/prometheus/metrics/PrometheusMetricsService.java @@ -49,6 +49,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; +import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; @@ -74,7 +75,8 @@ public class PrometheusMetricsService implements MetricsService { private final Registry registry; @Builder.Default - private List metricDescriptorsCache = Collections.emptyList(); + private Map> metricDescriptorsCache = + Collections.emptyMap(); @Override public String getType() { @@ -312,45 +314,62 @@ public List queryMetrics(String accountName, @Override public List getMetadata(String metricsAccountName, String filter) { - if (!StringUtils.isEmpty(filter)) { - String lowerCaseFilter = filter.toLowerCase(); + List accountSpecificMetricDescriptorsCache = + metricDescriptorsCache.get(metricsAccountName); + + if (CollectionUtils.isEmpty(accountSpecificMetricDescriptorsCache)) { + return Collections.emptyList(); + } - return metricDescriptorsCache - .stream() - .filter(metricDescriptor -> metricDescriptor.getName().toLowerCase().contains(lowerCaseFilter)) - .map(metricDescriptor -> metricDescriptor.getMap()) - .collect(Collectors.toList()); + if (StringUtils.isEmpty(filter)) { + return accountSpecificMetricDescriptorsCache.stream() + .map(metricDescriptor -> metricDescriptor.getMap()) + .collect(Collectors.toList()); } else { - return metricDescriptorsCache - .stream() - .map(metricDescriptor -> metricDescriptor.getMap()) - .collect(Collectors.toList()); + String lowerCaseFilter = filter.toLowerCase(); + + return accountSpecificMetricDescriptorsCache.stream() + .filter( + metricDescriptor -> + metricDescriptor.getName().toLowerCase().contains(lowerCaseFilter)) + .map(metricDescriptor -> metricDescriptor.getMap()) + .collect(Collectors.toList()); } } @Scheduled(fixedDelayString = "#{@prometheusConfigurationProperties.metadataCachingIntervalMS}") public void updateMetricDescriptorsCache() { Set accountCredentialsSet = - CredentialsHelper.getAllAccountsOfType(AccountCredentials.Type.METRICS_STORE, accountCredentialsRepository); + CredentialsHelper.getAllAccountsOfType( + AccountCredentials.Type.METRICS_STORE, accountCredentialsRepository); + Map> updatedMetricDescriptorsCache = new HashMap<>(); for (AccountCredentials credentials : accountCredentialsSet) { if (credentials instanceof PrometheusNamedAccountCredentials) { - PrometheusNamedAccountCredentials prometheusCredentials = (PrometheusNamedAccountCredentials)credentials; - PrometheusRemoteService prometheusRemoteService = prometheusCredentials.getPrometheusRemoteService(); - PrometheusMetricDescriptorsResponse prometheusMetricDescriptorsResponse = prometheusRemoteService.listMetricDescriptors(); - - if (prometheusMetricDescriptorsResponse != null && prometheusMetricDescriptorsResponse.getStatus().equals("success")) { + PrometheusNamedAccountCredentials prometheusCredentials = + (PrometheusNamedAccountCredentials) credentials; + PrometheusRemoteService prometheusRemoteService = + prometheusCredentials.getPrometheusRemoteService(); + PrometheusMetricDescriptorsResponse prometheusMetricDescriptorsResponse = + prometheusRemoteService.listMetricDescriptors(); + + if (prometheusMetricDescriptorsResponse != null + && prometheusMetricDescriptorsResponse.getStatus().equals("success")) { List data = prometheusMetricDescriptorsResponse.getData(); if (!CollectionUtils.isEmpty(data)) { - // TODO(duftler): Should we instead be building the union across all accounts? This doesn't seem quite right yet. - metricDescriptorsCache = - data - .stream() - .map(metricName -> new PrometheusMetricDescriptor(metricName)) - .collect(Collectors.toList()); - - log.debug("Updated cache with {} metric descriptors via account {}.", metricDescriptorsCache.size(), prometheusCredentials.getName()); + List accountSpecificMetricDescriptorsCache = + data.stream() + .map(metricName -> new PrometheusMetricDescriptor(metricName)) + .collect(Collectors.toList()); + + updatedMetricDescriptorsCache.put( + prometheusCredentials.getName(), accountSpecificMetricDescriptorsCache); + + log.debug( + "Updated cache with {} metric descriptors via account {}.", + accountSpecificMetricDescriptorsCache.size(), + prometheusCredentials.getName()); } else { log.debug("While updating cache, found no metric descriptors via account {}.", prometheusCredentials.getName()); } @@ -359,5 +378,7 @@ public void updateMetricDescriptorsCache() { } } } + + metricDescriptorsCache = updatedMetricDescriptorsCache; } }