Repository: ambari Updated Branches: refs/heads/trunk f1909d72c -> 4897ab831
AMBARI-6810. rm_metrics and StartTime are missed after ResourceManager HA enabling.(vbrodetskyi) Project: http://git-wip-us.apache.org/repos/asf/ambari/repo Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/4897ab83 Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/4897ab83 Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/4897ab83 Branch: refs/heads/trunk Commit: 4897ab831ea6aa0e96e6b89ca15e73d6780c62fc Parents: f1909d7 Author: Vitaly Brodetskyi <[email protected]> Authored: Mon Aug 11 18:01:40 2014 +0300 Committer: Vitaly Brodetskyi <[email protected]> Committed: Mon Aug 11 18:01:40 2014 +0300 ---------------------------------------------------------------------- .../controller/AmbariManagementController.java | 12 +++++++ .../AmbariManagementControllerImpl.java | 2 +- .../internal/AbstractProviderModule.java | 16 ++++++++- .../server/controller/jmx/JMXHostProvider.java | 15 ++++++-- .../controller/jmx/JMXPropertyProvider.java | 36 ++++++++++++++------ .../internal/JMXHostProviderTest.java | 32 +++++++++++++++++ .../controller/jmx/JMXPropertyProviderTest.java | 5 +++ .../apache/ambari/scom/SQLProviderModule.java | 6 ++++ 8 files changed, 109 insertions(+), 15 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ambari/blob/4897ab83/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementController.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementController.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementController.java index 92ef821..bee118e 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementController.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementController.java @@ -454,6 +454,18 @@ public interface AmbariManagementController { // ----- Common utility methods -------------------------------------------- /** + * Get service name by cluster instance and component name + * + * @param cluster the cluster instance + * @param componentName the component name in String type + * + * @return a service name + * + * @throws AmbariException if service name is null or empty + */ + public String findServiceName(Cluster cluster, String componentName) throws AmbariException; + + /** * Get the clusters for this management controller. * * @return the clusters http://git-wip-us.apache.org/repos/asf/ambari/blob/4897ab83/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementControllerImpl.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementControllerImpl.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementControllerImpl.java index 9d2c5d3..1530a20 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementControllerImpl.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementControllerImpl.java @@ -2322,7 +2322,7 @@ public class AmbariManagementControllerImpl implements AmbariManagementControlle } } - private String findServiceName(Cluster cluster, String componentName) throws AmbariException { + public String findServiceName(Cluster cluster, String componentName) throws AmbariException { StackId stackId = cluster.getDesiredStackVersion(); String serviceName = ambariMetaInfo.getComponentToService(stackId.getStackName(), http://git-wip-us.apache.org/repos/asf/ambari/blob/4897ab83/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AbstractProviderModule.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AbstractProviderModule.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AbstractProviderModule.java index bf92238..fc60210 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AbstractProviderModule.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AbstractProviderModule.java @@ -46,6 +46,7 @@ import org.apache.ambari.server.state.DesiredConfig; import org.apache.ambari.server.state.HostState; import org.apache.ambari.server.state.Service; import org.apache.ambari.server.state.State; +import org.apache.ambari.server.state.Cluster; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -133,7 +134,7 @@ public abstract class AbstractProviderModule implements ProviderModule, Resource private final Map<Resource.Type,List<PropertyProvider>> propertyProviders = new HashMap<Resource.Type, List<PropertyProvider>>(); @Inject - private AmbariManagementController managementController; + AmbariManagementController managementController; /** * The map of host components. @@ -212,6 +213,19 @@ public abstract class AbstractProviderModule implements ProviderModule, Resource } @Override + public Set<String> getHostNames(String clusterName, String componentName) { + Set<String> hosts = null; + try { + Cluster cluster = managementController.getClusters().getCluster(clusterName); + String serviceName = managementController.findServiceName(cluster, componentName); + hosts = cluster.getService(serviceName).getServiceComponent(componentName).getServiceComponentHosts().keySet(); + } catch (Exception e) { + LOG.warn("Exception in getting host names for jmx metrics: ", e); + } + return hosts; + } + + @Override public String getPort(String clusterName, String componentName) throws SystemException { // Parent map need not be synchronized Map<String, String> clusterJmxPorts = jmxPortMap.get(clusterName); http://git-wip-us.apache.org/repos/asf/ambari/blob/4897ab83/ambari-server/src/main/java/org/apache/ambari/server/controller/jmx/JMXHostProvider.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/jmx/JMXHostProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/jmx/JMXHostProvider.java index 142740c..12f3725 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/controller/jmx/JMXHostProvider.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/jmx/JMXHostProvider.java @@ -17,9 +17,9 @@ */ package org.apache.ambari.server.controller.jmx; -import org.apache.ambari.server.controller.spi.NoSuchParentResourceException; import org.apache.ambari.server.controller.spi.SystemException; -import org.apache.ambari.server.controller.spi.UnsupportedPropertyException; + +import java.util.Set; /** * Provider of JMX host information. @@ -40,6 +40,17 @@ public interface JMXHostProvider { throws SystemException; /** + * Get the JMX host names for the given cluster name and component name. + * + * @param clusterName the cluster name + * @param componentName the component name + * + * @return set of JMX host names + * + */ + public Set<String> getHostNames(String clusterName, String componentName); + + /** * Get the port for the specified cluster name and component. * * @param clusterName the cluster name http://git-wip-us.apache.org/repos/asf/ambari/blob/4897ab83/ambari-server/src/main/java/org/apache/ambari/server/controller/jmx/JMXPropertyProvider.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/jmx/JMXPropertyProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/jmx/JMXPropertyProvider.java index 734da90..4437ce9 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/controller/jmx/JMXPropertyProvider.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/jmx/JMXPropertyProvider.java @@ -20,6 +20,7 @@ package org.apache.ambari.server.controller.jmx; import java.io.IOException; import java.io.InputStream; +import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.LinkedList; @@ -334,26 +335,33 @@ public class JMXPropertyProvider extends AbstractPropertyProvider { return resource; } - String hostName = getHost(resource, clusterName, componentName); - if (hostName == null) { + Set<String> hostNames = getHosts(resource, clusterName, componentName); + if (hostNames == null || hostNames.isEmpty()) { LOG.warn("Unable to get JMX metrics. No host name for " + componentName); return resource; } String protocol = getJMXProtocol(clusterName, componentName); - try { - InputStream in = streamProvider.readFrom(getSpec(protocol, hostName, port, componentName)); + InputStream in = null; + try { try { - - if (null == componentName || !componentName.equals(STORM_REST_API)) { - getHadoopMetricValue(in, ids, resource, request); - } else { - getStormMetricValue(in, ids, resource); + for (String hostName : hostNames) { + try { + in = streamProvider.readFrom(getSpec(protocol, hostName, port, componentName)); + if (null == componentName || !componentName.equals(STORM_REST_API)) { + getHadoopMetricValue(in, ids, resource, request); + } else { + getStormMetricValue(in, ids, resource); + } + } catch (IOException e) { + logException(e); + } } - } finally { - in.close(); + if (in != null) { + in.close(); + } } } catch (IOException e) { logException(e); @@ -507,6 +515,12 @@ public class JMXPropertyProvider extends AbstractPropertyProvider { (String) resource.getPropertyValue(hostNamePropertyId); } + private Set<String> getHosts(Resource resource, String clusterName, String componentName) { + return hostNamePropertyId == null ? + jmxHostProvider.getHostNames(clusterName, componentName) : + Collections.singleton((String) resource.getPropertyValue(hostNamePropertyId)); + } + private String getCategory(Map<String, Object> bean) { if (bean.containsKey(NAME_KEY)) { String name = (String) bean.get(NAME_KEY); http://git-wip-us.apache.org/repos/asf/ambari/blob/4897ab83/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/JMXHostProviderTest.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/JMXHostProviderTest.java b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/JMXHostProviderTest.java index a66233d..94bd0c2 100644 --- a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/JMXHostProviderTest.java +++ b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/JMXHostProviderTest.java @@ -46,6 +46,9 @@ import org.apache.ambari.server.state.Cluster; import org.apache.ambari.server.state.Clusters; import org.apache.ambari.server.state.StackId; import org.apache.ambari.server.state.State; +import org.apache.ambari.server.state.Service; +import org.apache.ambari.server.state.ServiceComponent; +import org.apache.ambari.server.state.ServiceComponentHost; import org.junit.After; import org.junit.Assert; import org.junit.Before; @@ -348,6 +351,35 @@ public class JMXHostProviderTest { } @Test + public void testGetHostNames() throws AmbariException { + JMXHostProviderModule providerModule = new JMXHostProviderModule(); + + + AmbariManagementController managementControllerMock = createNiceMock(AmbariManagementController.class); + Clusters clustersMock = createNiceMock(Clusters.class); + Cluster clusterMock = createNiceMock(Cluster.class); + Service serviceMock = createNiceMock(Service.class); + ServiceComponent serviceComponentMock = createNiceMock(ServiceComponent.class); + + Map<String, ServiceComponentHost> hostComponents = new HashMap<String, ServiceComponentHost>(); + hostComponents.put("host1", null); + + expect(managementControllerMock.getClusters()).andReturn(clustersMock).anyTimes(); + expect(managementControllerMock.findServiceName(clusterMock, "DATANODE")).andReturn("HDFS"); + expect(clustersMock.getCluster("c1")).andReturn(clusterMock).anyTimes(); + expect(clusterMock.getService("HDFS")).andReturn(serviceMock).anyTimes(); + expect(serviceMock.getServiceComponent("DATANODE")).andReturn(serviceComponentMock).anyTimes(); + expect(serviceComponentMock.getServiceComponentHosts()).andReturn(hostComponents).anyTimes(); + + replay(managementControllerMock, clustersMock, clusterMock, serviceMock, serviceComponentMock); + providerModule.managementController = managementControllerMock; + + Set<String> result = providerModule.getHostNames("c1", "DATANODE"); + Assert.assertTrue(result.iterator().next().toString().equals("host1")); + + } + + @Test public void testJMXPortMapUpdate() throws NoSuchParentResourceException, ResourceAlreadyExistsException, UnsupportedPropertyException, http://git-wip-us.apache.org/repos/asf/ambari/blob/4897ab83/ambari-server/src/test/java/org/apache/ambari/server/controller/jmx/JMXPropertyProviderTest.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/test/java/org/apache/ambari/server/controller/jmx/JMXPropertyProviderTest.java b/ambari-server/src/test/java/org/apache/ambari/server/controller/jmx/JMXPropertyProviderTest.java index ac7314e..b4c3c6a 100644 --- a/ambari-server/src/test/java/org/apache/ambari/server/controller/jmx/JMXPropertyProviderTest.java +++ b/ambari-server/src/test/java/org/apache/ambari/server/controller/jmx/JMXPropertyProviderTest.java @@ -431,6 +431,11 @@ public class JMXPropertyProviderTest { } @Override + public Set<String> getHostNames(String clusterName, String componentName) { + return null; + } + + @Override public String getPort(String clusterName, String componentName) throws SystemException { http://git-wip-us.apache.org/repos/asf/ambari/blob/4897ab83/contrib/ambari-scom/ambari-scom-server/src/main/java/org/apache/ambari/scom/SQLProviderModule.java ---------------------------------------------------------------------- diff --git a/contrib/ambari-scom/ambari-scom-server/src/main/java/org/apache/ambari/scom/SQLProviderModule.java b/contrib/ambari-scom/ambari-scom-server/src/main/java/org/apache/ambari/scom/SQLProviderModule.java index a62f3f7..950935c 100644 --- a/contrib/ambari-scom/ambari-scom-server/src/main/java/org/apache/ambari/scom/SQLProviderModule.java +++ b/contrib/ambari-scom/ambari-scom-server/src/main/java/org/apache/ambari/scom/SQLProviderModule.java @@ -42,6 +42,7 @@ import java.util.HashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; +import java.util.Set; /** * Provider module used to install PropertyProviders required for ambari-scom. @@ -159,6 +160,11 @@ public class SQLProviderModule extends DefaultProviderModule implements HostInfo } @Override + public Set<String> getHostNames(String clusterName, String componentName) { + return super.getHostNames(clusterName, componentName); + } + + @Override public String getHostName(String id) throws SystemException { return getClusterNodeName(id); }
