Skip to content

Commit

Permalink
fix(typeahead/prometheus): Consider account name when querying metada…
Browse files Browse the repository at this point in the history
…ta. (#598) (#601)
  • Loading branch information
maggieneterval authored and fieldju committed Aug 1, 2019
1 parent f84d127 commit 6a3c60f
Showing 1 changed file with 47 additions and 26 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -74,7 +75,8 @@ public class PrometheusMetricsService implements MetricsService {
private final Registry registry;

@Builder.Default
private List<PrometheusMetricDescriptor> metricDescriptorsCache = Collections.emptyList();
private Map<String, List<PrometheusMetricDescriptor>> metricDescriptorsCache =
Collections.emptyMap();

@Override
public String getType() {
Expand Down Expand Up @@ -312,45 +314,62 @@ public List<MetricSet> queryMetrics(String accountName,

@Override
public List<Map> getMetadata(String metricsAccountName, String filter) {
if (!StringUtils.isEmpty(filter)) {
String lowerCaseFilter = filter.toLowerCase();
List<PrometheusMetricDescriptor> 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<AccountCredentials> accountCredentialsSet =
CredentialsHelper.getAllAccountsOfType(AccountCredentials.Type.METRICS_STORE, accountCredentialsRepository);
CredentialsHelper.getAllAccountsOfType(
AccountCredentials.Type.METRICS_STORE, accountCredentialsRepository);
Map<String, List<PrometheusMetricDescriptor>> 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<String> 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<PrometheusMetricDescriptor> 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());
}
Expand All @@ -359,5 +378,7 @@ public void updateMetricDescriptorsCache() {
}
}
}

metricDescriptorsCache = updatedMetricDescriptorsCache;
}
}

0 comments on commit 6a3c60f

Please sign in to comment.