Browse Source

AMBARI-6810. rm_metrics and StartTime are missed after ResourceManager HA enabling.(vbrodetskyi)

Vitaly Brodetskyi 10 years ago
parent
commit
4897ab831e

+ 12 - 0
ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementController.java

@@ -453,6 +453,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.
    *

+ 1 - 1
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(),

+ 15 - 1
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.
@@ -211,6 +212,19 @@ public abstract class AbstractProviderModule implements ProviderModule, Resource
     return clusterHostComponentMap.get(clusterName).get(componentName);
   }
 
+  @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

+ 13 - 2
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.
@@ -39,6 +39,17 @@ public interface JMXHostProvider {
   public String getHostName(String clusterName, String componentName)
       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.
    *

+ 25 - 11
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);

+ 32 - 0
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;
@@ -347,6 +350,35 @@ public class JMXHostProviderTest {
     Assert.assertEquals(null, providerModule.getPort("c1", "HBASE_MASTER"));
   }
 
+  @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,

+ 5 - 0
ambari-server/src/test/java/org/apache/ambari/server/controller/jmx/JMXPropertyProviderTest.java

@@ -430,6 +430,11 @@ public class JMXPropertyProviderTest {
       return null;
     }
 
+    @Override
+    public Set<String> getHostNames(String clusterName, String componentName) {
+      return null;
+    }
+
     @Override
     public String getPort(String clusterName, String componentName) throws
       SystemException {

+ 6 - 0
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.
@@ -158,6 +159,11 @@ public class SQLProviderModule extends DefaultProviderModule implements HostInfo
     return getClusterNodeName(super.getHostName(clusterName, componentName));
   }
 
+  @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);