AMBARI-18911 : Storm start is failing due to metrics initialization error.
Project: http://git-wip-us.apache.org/repos/asf/ambari/repo Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/940143ee Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/940143ee Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/940143ee Branch: refs/heads/branch-feature-AMBARI-18901 Commit: 940143eea80270919f57fe197375b8691c10e3aa Parents: d92dc0e Author: Aravindan Vijayan <[email protected]> Authored: Wed Nov 16 12:56:17 2016 -0800 Committer: Aravindan Vijayan <[email protected]> Committed: Wed Nov 16 12:56:17 2016 -0800 ---------------------------------------------------------------------- ambari-metrics/ambari-metrics-common/pom.xml | 11 ++- .../timeline/AbstractTimelineMetricsSink.java | 20 ++-- .../AbstractTimelineMetricSinkTest.java | 98 ++++++++++++++++++++ 3 files changed, 117 insertions(+), 12 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ambari/blob/940143ee/ambari-metrics/ambari-metrics-common/pom.xml ---------------------------------------------------------------------- diff --git a/ambari-metrics/ambari-metrics-common/pom.xml b/ambari-metrics/ambari-metrics-common/pom.xml index 0e66a6d..62ae75f 100644 --- a/ambari-metrics/ambari-metrics-common/pom.xml +++ b/ambari-metrics/ambari-metrics-common/pom.xml @@ -74,7 +74,11 @@ </relocation> <relocation> <pattern>org.apache.commons.io</pattern> - <shadedPattern>org.apache.hadoop.metrics2.sink.relocated.commons.io</shadedPattern> + <shadedPattern>org.apache.hadoop.metrics2.sink.relocated.commons.io</shadedPattern>StormTimelineMetricsReporter + </relocation> + <relocation> + <pattern>org.apache.commons.lang</pattern> + <shadedPattern>org.apache.hadoop.metrics2.sink.relocated.commons.lang</shadedPattern> </relocation> <relocation> <pattern>org.apache.curator</pattern> @@ -154,6 +158,11 @@ <version>1.9.13</version> </dependency> <dependency> + <groupId>commons-lang</groupId> + <artifactId>commons-lang</artifactId> + <version>2.5</version> + </dependency> + <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-math3</artifactId> <version>3.1.1</version> http://git-wip-us.apache.org/repos/asf/ambari/blob/940143ee/ambari-metrics/ambari-metrics-common/src/main/java/org/apache/hadoop/metrics2/sink/timeline/AbstractTimelineMetricsSink.java ---------------------------------------------------------------------- diff --git a/ambari-metrics/ambari-metrics-common/src/main/java/org/apache/hadoop/metrics2/sink/timeline/AbstractTimelineMetricsSink.java b/ambari-metrics/ambari-metrics-common/src/main/java/org/apache/hadoop/metrics2/sink/timeline/AbstractTimelineMetricsSink.java index efa5cba..173e675 100644 --- a/ambari-metrics/ambari-metrics-common/src/main/java/org/apache/hadoop/metrics2/sink/timeline/AbstractTimelineMetricsSink.java +++ b/ambari-metrics/ambari-metrics-common/src/main/java/org/apache/hadoop/metrics2/sink/timeline/AbstractTimelineMetricsSink.java @@ -23,6 +23,7 @@ import com.google.common.reflect.TypeToken; import com.google.gson.Gson; import com.google.gson.JsonSyntaxException; import org.apache.commons.io.IOUtils; +import org.apache.commons.lang.StringUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.hadoop.metrics2.sink.timeline.availability.MetricCollectorHAHelper; @@ -477,24 +478,21 @@ public abstract class AbstractTimelineMetricsSink { /** * Parses input Sting of format "['host1', 'host2']" into Collection of hostnames */ - protected Collection<String> parseHostsStringIntoCollection(String hostsString) { + public Collection<String> parseHostsStringIntoCollection(String hostsString) { Set<String> hosts = new HashSet<>(); - if (hostsString == null) { + if (StringUtils.isEmpty(hostsString)) { LOG.error("No Metric collector configured."); return hosts; } - hostsString = hostsString.replace("[", ""); - hostsString = hostsString.replace("]", ""); - hostsString = hostsString.replace("'", ""); + String[] untrimmedHosts = hostsString.split(","); - String [] hostNamesWithApostrophes = hostsString.split(","); - - for (String host : hostNamesWithApostrophes) { - host = host.trim(); - if (host.equals("")) continue; - hosts.add(host); + for (String host : untrimmedHosts) { + host = StringUtils.substringBetween(host, "'"); + if (StringUtils.isEmpty(host)) + continue; + hosts.add(host.trim()); } return hosts; http://git-wip-us.apache.org/repos/asf/ambari/blob/940143ee/ambari-metrics/ambari-metrics-common/src/test/java/org/apache/hadoop/metrics2/sink/timeline/availability/AbstractTimelineMetricSinkTest.java ---------------------------------------------------------------------- diff --git a/ambari-metrics/ambari-metrics-common/src/test/java/org/apache/hadoop/metrics2/sink/timeline/availability/AbstractTimelineMetricSinkTest.java b/ambari-metrics/ambari-metrics-common/src/test/java/org/apache/hadoop/metrics2/sink/timeline/availability/AbstractTimelineMetricSinkTest.java new file mode 100644 index 0000000..5e016f8 --- /dev/null +++ b/ambari-metrics/ambari-metrics-common/src/test/java/org/apache/hadoop/metrics2/sink/timeline/availability/AbstractTimelineMetricSinkTest.java @@ -0,0 +1,98 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.hadoop.metrics2.sink.timeline.availability; + +import junit.framework.Assert; +import org.apache.hadoop.metrics2.sink.timeline.AbstractTimelineMetricsSink; +import org.apache.hadoop.metrics2.sink.timeline.TimelineMetrics; +import org.junit.Test; + +import java.util.Arrays; +import java.util.Collection; + +public class AbstractTimelineMetricSinkTest { + + @Test + public void testParseHostsStringIntoCollection() { + AbstractTimelineMetricsSink sink = new TestTimelineMetricsSink(); + Collection<String> hosts; + + hosts = sink.parseHostsStringIntoCollection("[]"); + Assert.assertTrue(hosts.isEmpty()); + + hosts = sink.parseHostsStringIntoCollection("[u'test1.123.abc.def.local']"); + Assert.assertTrue(hosts.size() == 1); + Assert.assertTrue(hosts.contains("test1.123.abc.def.local")); + + hosts = sink.parseHostsStringIntoCollection("['test1.123.abc.def.local']"); + Assert.assertTrue(hosts.size() == 1); + Assert.assertTrue(hosts.contains("test1.123.abc.def.local")); + + hosts = sink.parseHostsStringIntoCollection("[u'test1.123.abc.def.local', u'test1.456.abc.def.local']"); + Assert.assertTrue(hosts.size() == 2); + + hosts = sink.parseHostsStringIntoCollection("['test1.123.abc.def.local', 'test1.456.abc.def.local']"); + Assert.assertTrue(hosts.size() == 2); + Assert.assertTrue(hosts.contains("test1.123.abc.def.local")); + Assert.assertTrue(hosts.contains("test1.456.abc.def.local")); + + } + + private class TestTimelineMetricsSink extends AbstractTimelineMetricsSink { + @Override + protected String getCollectorUri(String host) { + return ""; + } + + @Override + protected String getCollectorProtocol() { + return "http"; + } + + @Override + protected String getCollectorPort() { + return "2181"; + } + + @Override + protected int getTimeoutSeconds() { + return 10; + } + + @Override + protected String getZookeeperQuorum() { + return "localhost:2181"; + } + + @Override + protected Collection<String> getConfiguredCollectorHosts() { + return Arrays.asList("localhost"); + } + + @Override + protected String getHostname() { + return "h1"; + } + + @Override + public boolean emitMetrics(TimelineMetrics metrics) { + super.init(); + return super.emitMetrics(metrics); + } + } +}
