in ambari-metrics-timelineservice/src/main/java/org/apache/ambari/metrics/core/timeline/discovery/TimelineMetricMetadataManager.java [647:745]
public List<byte[]> getUuidsForGetMetricQuery(Collection<String> metricNames,
List<String> hostnames,
String appId,
String instanceId,
List<String> transientMetricNames) {
List<byte[]> uuids = new ArrayList<>();
boolean metricNameHasWildcard = false;
for (String metricName : metricNames) {
if (hasWildCard(metricName)) {
metricNameHasWildcard = true;
break;
}
}
boolean hostNameHasWildcard = false;
if (CollectionUtils.isNotEmpty(hostnames)) {
for (String hostname : hostnames) {
if (hasWildCard(hostname)) {
hostNameHasWildcard = true;
break;
}
}
}
if (hasWildCard(instanceId) || hasWildCard(appId) || hostNameHasWildcard || metricNameHasWildcard) {
try {
List<TimelineMetricMetadata> metricMetadataFromStore = hBaseAccessor.scanMetricMetadataForWildCardRequest(metricNames,
appId, instanceId);
List<byte[]> hostUuidsFromStore = hBaseAccessor.scanHostMetadataForWildCardRequest(hostnames);
for (TimelineMetricMetadata matchedEntry : metricMetadataFromStore) {
if (matchedEntry.getUuid() != null) {
if (CollectionUtils.isNotEmpty(hostnames)) {
for (byte[] hostUuidEntry : hostUuidsFromStore) {
uuids.add(ArrayUtils.addAll(matchedEntry.getUuid(), hostUuidEntry));
}
} else {
uuids.add(matchedEntry.getUuid());
}
} else if (isTransientMetric(matchedEntry.getMetricName(), matchedEntry.getAppId())) {
transientMetricNames.add(matchedEntry.getMetricName());
}
}
return uuids;
} catch (SQLException e) {
LOG.error("Unable to query metadata table to check satisfying metric keys for wildcard request : " + e);
return uuids;
}
} else {
if (CollectionUtils.isNotEmpty(hostnames)) {
if (CollectionUtils.isNotEmpty(metricNames)) {
//Skip getting UUID if it is a transient metric.
//An attempt to get it will also be OK as we don't add null UUIDs.
for (String metricName : metricNames) {
if (isTransientMetric(metricName, appId)) {
transientMetricNames.add(metricName);
continue;
}
TimelineMetric metric = new TimelineMetric();
metric.setMetricName(metricName);
metric.setAppId(appId);
metric.setInstanceId(instanceId);
for (String hostname : hostnames) {
metric.setHostName(hostname);
byte[] uuid = getUuid(metric, false);
if (uuid != null) {
uuids.add(uuid);
}
}
}
} else {
for (String hostname : hostnames) {
byte[] uuid = getUuidForHostname(hostname, false);
if (uuid != null) {
uuids.add(uuid);
}
}
}
} else {
for (String metricName : metricNames) {
//Skip getting UUID if it is a transient metric. An attempt to get it will also be OK as we don't add null UUIDs.
if (isTransientMetric(metricName, appId)) {
transientMetricNames.add(metricName);
continue;
}
TimelineClusterMetric metric = new TimelineClusterMetric(metricName, appId, instanceId, -1l);
byte[] uuid = getUuid(metric, false);
if (uuid != null) {
uuids.add(uuid);
}
}
}
}
return uuids;
}