This is an automated email from the ASF dual-hosted git repository.
avijayan pushed a commit to branch trunk
in repository https://gitbox.apache.org/repos/asf/ambari.git
The following commit(s) were added to refs/heads/trunk by this push:
new e6cd5b1 AMBARI-23618 : Requesting non-existing metric (including
wildcard) to AMS gets HTTP 500 error.
e6cd5b1 is described below
commit e6cd5b11e6bfd0f25571495820b8eeabddccd642
Author: Aravindan Vijayan <[email protected]>
AuthorDate: Wed Apr 18 17:27:11 2018 -0700
AMBARI-23618 : Requesting non-existing metric (including wildcard) to AMS
gets HTTP 500 error.
---
.../core/timeline/HBaseTimelineMetricsService.java | 10 ++++++++--
.../metrics/core/timeline/aggregators/Function.java | 3 +--
.../discovery/TimelineMetricMetadataManager.java | 19 +++++++------------
.../core/timeline/discovery/TestMetadataManager.java | 5 +++++
4 files changed, 21 insertions(+), 16 deletions(-)
diff --git
a/ambari-metrics/ambari-metrics-timelineservice/src/main/java/org/apache/ambari/metrics/core/timeline/HBaseTimelineMetricsService.java
b/ambari-metrics/ambari-metrics-timelineservice/src/main/java/org/apache/ambari/metrics/core/timeline/HBaseTimelineMetricsService.java
index d21edfc..ae394e3 100644
---
a/ambari-metrics/ambari-metrics-timelineservice/src/main/java/org/apache/ambari/metrics/core/timeline/HBaseTimelineMetricsService.java
+++
b/ambari-metrics/ambari-metrics-timelineservice/src/main/java/org/apache/ambari/metrics/core/timeline/HBaseTimelineMetricsService.java
@@ -27,6 +27,7 @@ import java.net.URISyntaxException;
import java.net.UnknownHostException;
import java.sql.SQLException;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
@@ -262,8 +263,15 @@ public class HBaseTimelineMetricsService extends
AbstractService implements Time
Multimap<String, List<Function>> metricFunctions =
parseMetricNamesToAggregationFunctions(metricNames);
+ TimelineMetrics metrics = new TimelineMetrics();
+
List<byte[]> uuids =
metricMetadataManager.getUuids(metricFunctions.keySet(), hostnames,
applicationId, instanceId);
+ if (uuids.isEmpty()) {
+ LOG.warn("No metric UUIDs generated for query : " +
Arrays.asList(metricNames).toString());
+ return metrics;
+ }
+
ConditionBuilder conditionBuilder = new ConditionBuilder(new
ArrayList<String>(metricFunctions.keySet()))
.hostnames(hostnames)
.appId(applicationId)
@@ -296,8 +304,6 @@ public class HBaseTimelineMetricsService extends
AbstractService implements Time
Condition condition = conditionBuilder.build();
- TimelineMetrics metrics;
-
if (hostnames == null || hostnames.isEmpty()) {
metrics = hBaseAccessor.getAggregateMetricRecords(condition,
metricFunctions);
} else {
diff --git
a/ambari-metrics/ambari-metrics-timelineservice/src/main/java/org/apache/ambari/metrics/core/timeline/aggregators/Function.java
b/ambari-metrics/ambari-metrics-timelineservice/src/main/java/org/apache/ambari/metrics/core/timeline/aggregators/Function.java
index dd67b64..6929036 100644
---
a/ambari-metrics/ambari-metrics-timelineservice/src/main/java/org/apache/ambari/metrics/core/timeline/aggregators/Function.java
+++
b/ambari-metrics/ambari-metrics-timelineservice/src/main/java/org/apache/ambari/metrics/core/timeline/aggregators/Function.java
@@ -24,8 +24,7 @@ import java.util.Arrays;
/**
* Is used to determine metrics aggregate table.
*
- * @see TimelineWebServices#getTimelineMetric
- * @see TimelineWebServices#getTimelineMetrics
+ * @see org.apache.ambari.metrics.webapp.TimelineWebServices#getTimelineMetrics
*/
public class Function {
public static Function DEFAULT_VALUE_FUNCTION = new
Function(ReadFunction.VALUE, null);
diff --git
a/ambari-metrics/ambari-metrics-timelineservice/src/main/java/org/apache/ambari/metrics/core/timeline/discovery/TimelineMetricMetadataManager.java
b/ambari-metrics/ambari-metrics-timelineservice/src/main/java/org/apache/ambari/metrics/core/timeline/discovery/TimelineMetricMetadataManager.java
index ff24c10..e13c884 100644
---
a/ambari-metrics/ambari-metrics-timelineservice/src/main/java/org/apache/ambari/metrics/core/timeline/discovery/TimelineMetricMetadataManager.java
+++
b/ambari-metrics/ambari-metrics-timelineservice/src/main/java/org/apache/ambari/metrics/core/timeline/discovery/TimelineMetricMetadataManager.java
@@ -55,6 +55,7 @@ import static
org.apache.ambari.metrics.core.timeline.TimelineMetricConfiguratio
import static
org.apache.ambari.metrics.core.timeline.TimelineMetricConfiguration.METRICS_METADATA_SYNC_SCHEDULE_DELAY;
import static
org.apache.ambari.metrics.core.timeline.TimelineMetricConfiguration.TIMELINE_METRICS_UUID_GEN_STRATEGY;
import static
org.apache.ambari.metrics.core.timeline.TimelineMetricConfiguration.TIMELINE_METRIC_METADATA_FILTERS;
+import static
org.apache.ambari.metrics.core.timeline.aggregators.AggregatorUtils.getJavaRegexFromSqlRegex;
public class TimelineMetricMetadataManager {
private static final Log LOG =
LogFactory.getLog(TimelineMetricMetadataManager.class);
@@ -497,19 +498,11 @@ public class TimelineMetricMetadataManager {
public List<byte[]> getUuids(Collection<String> metricNames, List<String>
hostnames, String appId, String instanceId) {
Collection<String> sanitizedMetricNames = new HashSet<>();
+ List<byte[]> uuids = new ArrayList<>();
for (String metricName : metricNames) {
if (metricName.contains("%")) {
- String metricRegEx;
- //Special case handling for metric name with * and __%.
- //For example, dfs.NNTopUserOpCounts.windowMs=300000.op=*.user=%.count
- // or dfs.NNTopUserOpCounts.windowMs=300000.op=__%.user=%.count
- if (metricName.contains("*") || metricName.contains("__%")) {
- String metricNameWithEscSeq = metricName.replace("*",
"\\*").replace("__%", "..%");
- metricRegEx = metricNameWithEscSeq.replace("%", ".*");
- } else {
- metricRegEx = metricName.replace("%", ".*");
- }
+ String metricRegEx = getJavaRegexFromSqlRegex(metricName);
for (TimelineMetricMetadataKey key : METADATA_CACHE.keySet()) {
String metricNameFromMetadata = key.getMetricName();
if (metricNameFromMetadata.matches(metricRegEx)) {
@@ -521,6 +514,10 @@ public class TimelineMetricMetadataManager {
}
}
+ if(sanitizedMetricNames.isEmpty()) {
+ return uuids;
+ }
+
Set<String> sanitizedHostNames = new HashSet<>();
if (CollectionUtils.isNotEmpty(hostnames)) {
for (String hostname : hostnames) {
@@ -538,8 +535,6 @@ public class TimelineMetricMetadataManager {
}
}
- List<byte[]> uuids = new ArrayList<>();
-
if ( StringUtils.isNotEmpty(appId) && !(appId.equals("HOST") ||
appId.equals("FLUME_HANDLER"))) { //HACK.. Why??
appId = appId.toLowerCase();
}
diff --git
a/ambari-metrics/ambari-metrics-timelineservice/src/test/java/org/apache/ambari/metrics/core/timeline/discovery/TestMetadataManager.java
b/ambari-metrics/ambari-metrics-timelineservice/src/test/java/org/apache/ambari/metrics/core/timeline/discovery/TestMetadataManager.java
index 94fbb30..3604ec4 100644
---
a/ambari-metrics/ambari-metrics-timelineservice/src/test/java/org/apache/ambari/metrics/core/timeline/discovery/TestMetadataManager.java
+++
b/ambari-metrics/ambari-metrics-timelineservice/src/test/java/org/apache/ambari/metrics/core/timeline/discovery/TestMetadataManager.java
@@ -228,6 +228,11 @@ public class TestMetadataManager extends
AbstractMiniHBaseClusterTest {
List<String> hosts = Arrays.asList("dummy_host%", "dummy_3h");
uuids = metadataManager.getUuids(metrics, hosts, "dummy_app2", null);
Assert.assertTrue(uuids.size() == 9);
+
+ metrics = Arrays.asList("abc%");
+ hosts = Arrays.asList("dummy_host");
+ uuids = metadataManager.getUuids(metrics, hosts, "dummy_app2", null);
+ Assert.assertTrue(uuids.isEmpty());
}
--
To stop receiving notification emails like this one, please contact
[email protected].