You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by ab...@apache.org on 2014/11/25 19:07:48 UTC

[3/3] ambari git commit: AMBARI-8326 - Merge Ambari SCOM changes from Ambari on Windows project (Jayush Luniya via abaranchuk)

AMBARI-8326 - Merge Ambari SCOM changes from Ambari on Windows project (Jayush Luniya via abaranchuk)


Project: http://git-wip-us.apache.org/repos/asf/ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/848e7874
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/848e7874
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/848e7874

Branch: refs/heads/trunk
Commit: 848e78742452f5f66c97435035210470ebdf288a
Parents: 20591d2
Author: Artem Baranchuk <ab...@hortonworks.com>
Authored: Tue Nov 25 20:07:25 2014 +0200
Committer: Artem Baranchuk <ab...@hortonworks.com>
Committed: Tue Nov 25 20:07:25 2014 +0200

----------------------------------------------------------------------
 .../apache/ambari/scom/SQLPropertyProvider.java | 258 ++++--
 .../apache/ambari/scom/SQLProviderModule.java   |   2 +
 .../main/resources/sqlserver_properties.json    | 921 ++++++++++---------
 .../ambari/scom/SQLPropertyProviderTest.java    |  27 +-
 4 files changed, 666 insertions(+), 542 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/848e7874/contrib/ambari-scom/ambari-scom-server/src/main/java/org/apache/ambari/scom/SQLPropertyProvider.java
----------------------------------------------------------------------
diff --git a/contrib/ambari-scom/ambari-scom-server/src/main/java/org/apache/ambari/scom/SQLPropertyProvider.java b/contrib/ambari-scom/ambari-scom-server/src/main/java/org/apache/ambari/scom/SQLPropertyProvider.java
index 938b55e..23e25e9 100644
--- a/contrib/ambari-scom/ambari-scom-server/src/main/java/org/apache/ambari/scom/SQLPropertyProvider.java
+++ b/contrib/ambari-scom/ambari-scom-server/src/main/java/org/apache/ambari/scom/SQLPropertyProvider.java
@@ -38,6 +38,7 @@ import java.sql.Statement;
 import java.text.NumberFormat;
 import java.text.ParsePosition;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
@@ -57,29 +58,33 @@ public class SQLPropertyProvider extends AbstractPropertyProvider {
 
   private final String componentNamePropertyId;
 
+  private final String serviceNamePropertyId;
+
   private final ConnectionFactory connectionFactory;
 
 
   // ----- Constants ---------------------------------------------------------
 
   private static final String GET_METRICS_STATEMENT =
-                  "SELECT  s.RecordTypeContext, s.RecordTypeName, s.NodeName, s.ServiceName, mn.Name AS MetricName, s.RecordTimeStamp, mp.MetricValue\n" +
-                  "FROM HadoopMetrics.dbo.MetricPair mp\n" +
-                  "     INNER JOIN (\n" +
-                  "         SELECT mr.RecordID AS RecordID, mr.RecordTimeStamp AS RecordTimeStamp, rt.Context AS RecordTypeContext, rt.Name AS RecordTypeName, nd.Name AS NodeName, sr.Name AS ServiceName\n" +
-                  "         FROM HadoopMetrics.dbo.MetricRecord mr\n" +
-                  "              INNER JOIN HadoopMetrics.dbo.RecordType rt ON (mr.RecordTypeId = rt.RecordTypeId)\n" +
-                  "              INNER JOIN HadoopMetrics.dbo.Node nd ON (mr.NodeID = nd.NodeID)\n" +
-                  "              INNER JOIN HadoopMetrics.dbo.Service sr ON (mr.ServiceID = sr.ServiceID)\n" +
-                  "         WHERE rt.Context in (%s)\n" +
-                  "               AND rt.Name in (%s)\n" +
-                  "               AND (nd.Name in (%s))\n" +
-                  "               AND (sr.Name in (%s))\n" +
-                  "               AND mr.RecordTimestamp >= %d\n" +
-                  "               AND mr.RecordTimestamp <= %d\n" +
-                  "     ) s ON (mp.RecordID = s.RecordID)\n" +
-                  "     INNER JOIN HadoopMetrics.dbo.MetricName mn ON (mp.MetricID = mn.MetricID)\n" +
-                  "WHERE (mn.Name in (%s))";
+    "SELECT  s.RecordTypeContext, s.RecordTypeName, s.TagPairs, s.NodeName, s.ServiceName, mn.Name AS MetricName, s.RecordTimeStamp, mp.MetricValue\n" +
+      "FROM HadoopMetrics.dbo.MetricPair mp\n" +
+      "     INNER JOIN (\n" +
+      "         SELECT mr.RecordID AS RecordID, mr.RecordTimeStamp AS RecordTimeStamp, rt.Context AS RecordTypeContext, rt.Name AS RecordTypeName, ts.TagPairs AS TagPairs, nd.Name AS NodeName, sr.Name AS ServiceName\n" +
+      "         FROM HadoopMetrics.dbo.MetricRecord mr\n" +
+      "              INNER JOIN HadoopMetrics.dbo.RecordType rt ON (mr.RecordTypeId = rt.RecordTypeId)\n" +
+      "              INNER JOIN HadoopMetrics.dbo.TagSet ts ON (mr.TagSetID = ts.TagSetID)\n" +
+      "              INNER JOIN HadoopMetrics.dbo.Node nd ON (mr.NodeID = nd.NodeID)\n" +
+      "              INNER JOIN HadoopMetrics.dbo.Service sr ON (mr.ServiceID = sr.ServiceID)\n" +
+      "         WHERE rt.Context in (%s)\n" +
+      "               AND rt.Name in (%s)\n" +
+      "               AND (ts.TagPairs LIKE %s)\n" +
+      "               AND (nd.Name in (%s))\n" +
+      "               AND (sr.Name in (%s))\n" +
+      "               AND mr.RecordTimestamp >= %d\n" +
+      "               AND mr.RecordTimestamp <= %d\n" +
+      "     ) s ON (mp.RecordID = s.RecordID)\n" +
+      "     INNER JOIN HadoopMetrics.dbo.MetricName mn ON (mp.MetricID = mn.MetricID)\n" +
+      "WHERE (mn.Name in (%s))";
 
   protected final static Logger LOG = LoggerFactory.getLogger(SQLPropertyProvider.class);
 
@@ -87,18 +92,20 @@ public class SQLPropertyProvider extends AbstractPropertyProvider {
   // ----- Constructors ------------------------------------------------------
 
   public SQLPropertyProvider(
-      Map<String, Map<String, PropertyInfo>> componentPropertyInfoMap,
-      HostInfoProvider hostProvider,
-      String clusterNamePropertyId,
-      String hostNamePropertyId,
-      String componentNamePropertyId,
-      ConnectionFactory connectionFactory) {
+    Map<String, Map<String, PropertyInfo>> componentPropertyInfoMap,
+    HostInfoProvider hostProvider,
+    String clusterNamePropertyId,
+    String hostNamePropertyId,
+    String componentNamePropertyId,
+    String serviceNamePropertyId,
+    ConnectionFactory connectionFactory) {
     super(componentPropertyInfoMap);
-    this.hostProvider             = hostProvider;
-    this.clusterNamePropertyId    = clusterNamePropertyId;
-    this.hostNamePropertyId       = hostNamePropertyId;
-    this.componentNamePropertyId  = componentNamePropertyId;
-    this.connectionFactory        = connectionFactory;
+    this.hostProvider = hostProvider;
+    this.clusterNamePropertyId = clusterNamePropertyId;
+    this.hostNamePropertyId = hostNamePropertyId;
+    this.componentNamePropertyId = componentNamePropertyId;
+    this.serviceNamePropertyId = serviceNamePropertyId;
+    this.connectionFactory = connectionFactory;
   }
 
 
@@ -106,7 +113,7 @@ public class SQLPropertyProvider extends AbstractPropertyProvider {
 
   @Override
   public Set<Resource> populateResources(Set<Resource> resources, Request request, Predicate predicate)
-      throws SystemException {
+    throws SystemException {
     Set<Resource> keepers = new HashSet<Resource>();
     try {
       Connection connection = connectionFactory.getConnection();
@@ -126,9 +133,9 @@ public class SQLPropertyProvider extends AbstractPropertyProvider {
       }
     } catch (SQLException e) {
       if (LOG.isErrorEnabled()) {
-        LOG.error("Error during populateResources call : caught exception", e);
+        LOG.error("Error during populateResources call.");
+        LOG.debug("Error during populateResources call : caught exception", e);
       }
-      throw new SystemException("Error during populateResources call : caught exception", e);
     }
     return keepers;
   }
@@ -146,6 +153,7 @@ public class SQLPropertyProvider extends AbstractPropertyProvider {
     }
 
     String componentName = (String) resource.getPropertyValue(componentNamePropertyId);
+    String serviceName = (String) resource.getPropertyValue(serviceNamePropertyId);
 
     if (getComponentMetrics().get(componentName) == null) {
       // no metrics defined for the given component ... nothing to do.
@@ -153,25 +161,29 @@ public class SQLPropertyProvider extends AbstractPropertyProvider {
     }
 
     String clusterName = (String) resource.getPropertyValue(clusterNamePropertyId);
-    String hostName    = getHost(resource, clusterName, componentName);
+    String hostName = getHost(resource, clusterName, componentName);
 
     if (hostName == null) {
       throw new SystemException(
-          "Unable to get metrics.  No host name for " + componentName, null);
+        "Unable to get metrics.  No host name for " + componentName, null);
     }
 
     Set<MetricDefinition> metricsDefinitionSet = new HashSet<MetricDefinition>();
     for (String id : ids) {
       Map<String, PropertyInfo> propertyInfoMap = getPropertyInfoMap(componentName, id);
 
-      for (Map.Entry<String, PropertyInfo> entry: propertyInfoMap.entrySet()) {
-        String       propertyKey  = entry.getKey();
+      for (Map.Entry<String, PropertyInfo> entry : propertyInfoMap.entrySet()) {
+        String propertyKey = entry.getKey();
         PropertyInfo propertyInfo = entry.getValue();
-        String       propertyId   = propertyInfo.getPropertyId();
+        if (containsArguments(propertyKey)) {
+          propertyInfo = updatePropertyInfo(propertyKey, id, propertyInfo);
+        }
+
+        String propertyId = propertyInfo.getPropertyId();
         TemporalInfo temporalInfo = request.getTemporalInfo(id);
 
         if ((propertyInfo.isPointInTime() && temporalInfo == null) ||
-            (propertyInfo.isTemporal()    && temporalInfo != null)) {
+          (propertyInfo.isTemporal() && temporalInfo != null)) {
 
           long startTime;
           long endTime;
@@ -179,31 +191,44 @@ public class SQLPropertyProvider extends AbstractPropertyProvider {
           if (temporalInfo != null) {
             Long endTimeSeconds = temporalInfo.getEndTime();
 
-            endTime   = endTimeSeconds != -1 ? endTimeSeconds * 1000 : Long.MAX_VALUE;
+            endTime = endTimeSeconds != -1 ? endTimeSeconds * 1000 : Long.MAX_VALUE;
             startTime = temporalInfo.getStartTime() * 1000;
           } else {
             startTime = 0L;
-            endTime   = Long.MAX_VALUE;
+            endTime = Long.MAX_VALUE;
           }
 
-          String[] parts = propertyId.split("\\.");
-          int      size  = parts.length;
-
-          if (size >= 3) {
-
+          String category = "";
+          String recordTypeContext = "";
+          String recordTypeName = "";
+          String metricName = "";
+          String tagPairsPattern = "";
+          int dotIndex = propertyId.lastIndexOf('.');
+          if (dotIndex != -1) {
+            category = propertyId.substring(0, dotIndex);
+            metricName = propertyId.substring(dotIndex + 1);
+          }
+          String[] parts = category.split("\\.");
+          if (parts.length >= 2) {
+            recordTypeContext = parts[0];
+            recordTypeName = parts[1];
+            if (containsArguments(propertyKey) && parts.length > 2) {
+              tagPairsPattern = StringUtils.join(Arrays.copyOfRange(parts, 2, parts.length), ".");
+            }
             metricsDefinitionSet.add(
-                    new MetricDefinition(
-                            startTime,
-                            endTime,
-                            parts[size - 3],
-                            parts[size - 2],
-                            parts[size - 1],
-                            componentName.toLowerCase(),
-                            hostName,
-                            propertyKey,
-                            temporalInfo)
+              new MetricDefinition(
+                startTime,
+                endTime,
+                recordTypeContext,
+                recordTypeName,
+                tagPairsPattern,
+                metricName,
+                serviceName != null && serviceName.toLowerCase().equals("hbase") ? serviceName.toLowerCase() : componentName.toLowerCase(),
+                hostName,
+                propertyKey,
+                id,
+                temporalInfo)
             );
-
           } else {
             if (LOG.isWarnEnabled()) {
               LOG.warn("Can't get metrics for " + id + " : " + propertyId);
@@ -215,24 +240,29 @@ public class SQLPropertyProvider extends AbstractPropertyProvider {
 
     Map<MetricDefinition, List<DataPoint>> results = getMetric(metricsDefinitionSet, statement);
 
-    for(MetricDefinition metricDefinition : metricsDefinitionSet) {
-        List<DataPoint> dataPoints = results.containsKey(metricDefinition) ? results.get(metricDefinition) : new ArrayList<DataPoint>();
-        TemporalInfo temporalInfo = metricDefinition.getTemporalInfo();
-        String propertyKey = metricDefinition.getPropertyKey();
-        if (dataPoints != null) {
-          if (temporalInfo == null){
-            // return the value of the last data point
-            int length = dataPoints.size();
-            Serializable value  = length > 0 ? dataPoints.get(length - 1).getValue() : 0;
-            resource.setProperty(propertyKey, value);
+    for (MetricDefinition metricDefinition : metricsDefinitionSet) {
+      List<DataPoint> dataPoints = results.containsKey(metricDefinition) ? results.get(metricDefinition) : new ArrayList<DataPoint>();
+      TemporalInfo temporalInfo = metricDefinition.getTemporalInfo();
+      String propertyKey = metricDefinition.getPropertyKey();
+      String requestedPropertyKey = metricDefinition.getRequestedPropertyKey();
+      if (dataPoints != null) {
+        if (temporalInfo == null) {
+          // return the value of the last data point
+          int length = dataPoints.size();
+          Serializable value = length > 0 ? dataPoints.get(length - 1).getValue() : 0;
+          resource.setProperty(propertyKey, value);
+        } else {
+          Number[][] dp = new Number[dataPoints.size()][2];
+          for (int i = 0; i < dp.length; i++) {
+            dp[i][0] = dataPoints.get(i).getValue();
+            dp[i][1] = dataPoints.get(i).getTimestamp() / 1000;
+          }
+          if (containsArguments(propertyKey)) {
+            resource.setProperty(requestedPropertyKey, dp);
           } else {
-            Number[][] dp = new Number[dataPoints.size()][2];
-            for (int i = 0; i < dp.length; i++) {
-              dp[i][0] = dataPoints.get(i).getValue();
-              dp[i][1] = dataPoints.get(i).getTimestamp();
-            }
             resource.setProperty(propertyKey, dp);
           }
+        }
       }
     }
 
@@ -246,6 +276,7 @@ public class SQLPropertyProvider extends AbstractPropertyProvider {
       StringBuilder query = new StringBuilder();
       Set<String> recordTypeContexts = new HashSet<String>();
       Set<String> recordTypeNamess = new HashSet<String>();
+      Set<String> tagPairsPatterns = new HashSet<String>();
       Set<String> nodeNames = new HashSet<String>();
       Set<String> serviceNames = new HashSet<String>();
       Set<String> metricNames = new HashSet<String>();
@@ -257,6 +288,7 @@ public class SQLPropertyProvider extends AbstractPropertyProvider {
 
         recordTypeContexts.add(metricDefinition.getRecordTypeContext());
         recordTypeNamess.add(metricDefinition.getRecordTypeName());
+        tagPairsPatterns.add(metricDefinition.getTagPairsPattern());
         nodeNames.add(metricDefinition.getNodeName());
         serviceNames.add(metricDefinition.getServiceName());
         metricNames.add(metricDefinition.getMetricName());
@@ -264,29 +296,37 @@ public class SQLPropertyProvider extends AbstractPropertyProvider {
         endTime = metricDefinition.getEndTime();
       }
 
-      query.append(String.format(GET_METRICS_STATEMENT,
-              "'" + StringUtils.join(recordTypeContexts, "','") + "'",
-              "'" + StringUtils.join(recordTypeNamess, "','") + "'",
-              "'" + StringUtils.join(nodeNames, "','") + "'",
-              "'" + StringUtils.join(serviceNames, "','") + "'",
-              startTime,
-              endTime,
-              "'" + StringUtils.join(metricNames, "','") + "'"
-      ));
+      for (String tagPairsPattern : tagPairsPatterns) {
+        if (query.length() != 0) {
+          query.append("\nUNION\n");
+        }
+        query.append(String.format(GET_METRICS_STATEMENT,
+          "'" + StringUtils.join(recordTypeContexts, "','") + "'",
+          "'" + StringUtils.join(recordTypeNamess, "','") + "'",
+          "'%" + tagPairsPattern + "%'",
+          "'" + StringUtils.join(nodeNames, "','") + "'",
+          "'" + StringUtils.join(serviceNames, "','") + "'",
+          startTime,
+          endTime,
+          "'" + StringUtils.join(metricNames, "','") + "'"
+        ));
+      }
 
-      ResultSet rs = statement.executeQuery(query.toString());
+      ResultSet rs = null;
+      if (query.length() != 0) {
+        rs = statement.executeQuery(query.toString());
+      }
 
       if (rs != null) {
         //(RecordTimeStamp bigint, MetricValue NVARCHAR(512))
         while (rs.next()) {
-          MetricDefinition metricDefinition = new MetricDefinition(rs.getString("RecordTypeContext"), rs.getString("RecordTypeName"), rs.getString("MetricName"), rs.getString("ServiceName"), rs.getString("NodeName"));
+          MetricDefinition metricDefinition = new MetricDefinition(rs.getString("RecordTypeContext"), rs.getString("RecordTypeName"), rs.getString("TagPairs"), rs.getString("MetricName"), rs.getString("ServiceName"), rs.getString("NodeName"));
           ParsePosition parsePosition = new ParsePosition(0);
-          NumberFormat  numberFormat  = NumberFormat.getInstance();
-          Number parsedNumber  = numberFormat.parse(rs.getNString("MetricValue"), parsePosition);
-          if(results.containsKey(metricDefinition)) {
-              results.get(metricDefinition).add(new DataPoint(rs.getLong("RecordTimeStamp"), parsedNumber));
-          }
-          else {
+          NumberFormat numberFormat = NumberFormat.getInstance();
+          Number parsedNumber = numberFormat.parse(rs.getNString("MetricValue"), parsePosition);
+          if (results.containsKey(metricDefinition)) {
+            results.get(metricDefinition).add(new DataPoint(rs.getLong("RecordTimeStamp"), parsedNumber));
+          } else {
             List<DataPoint> dataPoints = new ArrayList<DataPoint>();
             dataPoints.add(new DataPoint(rs.getLong("RecordTimeStamp"), parsedNumber));
             results.put(metricDefinition, dataPoints);
@@ -302,8 +342,8 @@ public class SQLPropertyProvider extends AbstractPropertyProvider {
   // get the hostname for a given resource
   private String getHost(Resource resource, String clusterName, String componentName) throws SystemException {
     return hostNamePropertyId == null ?
-        hostProvider.getHostName(clusterName, componentName) :
-        hostProvider.getHostName((String) resource.getPropertyValue(hostNamePropertyId));
+      hostProvider.getHostName(clusterName, componentName) :
+      hostProvider.getHostName((String) resource.getPropertyValue(hostNamePropertyId));
   }
 
 
@@ -321,8 +361,8 @@ public class SQLPropertyProvider extends AbstractPropertyProvider {
     /**
      * Construct a data point from the given value and timestamp.
      *
-     * @param timestamp  the timestamp
-     * @param value      the value
+     * @param timestamp the timestamp
+     * @param value     the value
      */
     private DataPoint(long timestamp, Number value) {
       this.timestamp = timestamp;
@@ -333,6 +373,7 @@ public class SQLPropertyProvider extends AbstractPropertyProvider {
 
     /**
      * Get the timestamp value.
+     *
      * @return the timestamp
      */
     public long getTimestamp() {
@@ -341,6 +382,7 @@ public class SQLPropertyProvider extends AbstractPropertyProvider {
 
     /**
      * Get the value.
+     *
      * @return the value
      */
     public Number getValue() {
@@ -351,7 +393,7 @@ public class SQLPropertyProvider extends AbstractPropertyProvider {
 
     @Override
     public String toString() {
-      return "{" +value + " : " + timestamp + "}";
+      return "{" + value + " : " + timestamp + "}";
     }
   }
 
@@ -361,28 +403,33 @@ public class SQLPropertyProvider extends AbstractPropertyProvider {
 
     String recordTypeContext;
     String recordTypeName;
+    String tagPairsPattern;
     String metricName;
     String serviceName;
     String nodeName;
 
     String propertyKey;
+    String requestedPropertyKey;
     TemporalInfo temporalInfo;
 
-    private MetricDefinition(long startTime, long endTime, String recordTypeContext, String recordTypeName, String metricName, String serviceName, String nodeName, String propertyKey, TemporalInfo temporalInfo) {
+    private MetricDefinition(long startTime, long endTime, String recordTypeContext, String recordTypeName, String tagPairsPattern, String metricName, String serviceName, String nodeName, String propertyKey, String requestedPropertyKey, TemporalInfo temporalInfo) {
       this.startTime = startTime;
       this.endTime = endTime;
       this.recordTypeContext = recordTypeContext;
       this.recordTypeName = recordTypeName;
+      this.tagPairsPattern = tagPairsPattern;
       this.metricName = metricName;
       this.serviceName = serviceName;
       this.nodeName = nodeName;
       this.propertyKey = propertyKey;
+      this.requestedPropertyKey = requestedPropertyKey;
       this.temporalInfo = temporalInfo;
     }
 
-    private MetricDefinition(String recordTypeContext, String recordTypeName, String metricName, String serviceName, String nodeName) {
+    private MetricDefinition(String recordTypeContext, String recordTypeName, String tagPairsPattern, String metricName, String serviceName, String nodeName) {
       this.recordTypeContext = recordTypeContext;
       this.recordTypeName = recordTypeName;
+      this.tagPairsPattern = tagPairsPattern;
       this.metricName = metricName;
       this.serviceName = serviceName;
       this.nodeName = nodeName;
@@ -420,6 +467,14 @@ public class SQLPropertyProvider extends AbstractPropertyProvider {
       this.recordTypeName = recordTypeName;
     }
 
+    public String getTagPairsPattern() {
+      return tagPairsPattern;
+    }
+
+    public void getTagPairsPattern(String tagPairsPattern) {
+      this.tagPairsPattern = tagPairsPattern;
+    }
+
     public String getMetricName() {
       return metricName;
     }
@@ -452,6 +507,14 @@ public class SQLPropertyProvider extends AbstractPropertyProvider {
       this.propertyKey = propertyKey;
     }
 
+    public String getRequestedPropertyKey() {
+      return requestedPropertyKey;
+    }
+
+    public void setRequestedPropertyKey(String requestedPropertyKey) {
+      this.requestedPropertyKey = requestedPropertyKey;
+    }
+
     public TemporalInfo getTemporalInfo() {
       return temporalInfo;
     }
@@ -468,12 +531,15 @@ public class SQLPropertyProvider extends AbstractPropertyProvider {
       MetricDefinition that = (MetricDefinition) o;
 
       if (metricName != null ? !metricName.equals(that.metricName) : that.metricName != null) return false;
-      if (nodeName != null ? !nodeName.equals(that.nodeName) : that.nodeName != null) return false;
+      if (nodeName != null ? !nodeName.equalsIgnoreCase(that.nodeName) : that.nodeName != null) return false;
       if (recordTypeContext != null ? !recordTypeContext.equals(that.recordTypeContext) : that.recordTypeContext != null)
         return false;
       if (recordTypeName != null ? !recordTypeName.equals(that.recordTypeName) : that.recordTypeName != null)
         return false;
       if (serviceName != null ? !serviceName.equals(that.serviceName) : that.serviceName != null) return false;
+      if (tagPairsPattern != null ? !(tagPairsPattern.contains(that.tagPairsPattern) ||
+        that.tagPairsPattern.contains(tagPairsPattern)) : that.tagPairsPattern != null)
+        return false;
 
       return true;
     }
@@ -484,7 +550,7 @@ public class SQLPropertyProvider extends AbstractPropertyProvider {
       result = 31 * result + (recordTypeName != null ? recordTypeName.hashCode() : 0);
       result = 31 * result + (metricName != null ? metricName.hashCode() : 0);
       result = 31 * result + (serviceName != null ? serviceName.hashCode() : 0);
-      result = 31 * result + (nodeName != null ? nodeName.hashCode() : 0);
+      result = 31 * result + (nodeName != null ? nodeName.toLowerCase().hashCode() : 0);
       return result;
     }
   }

http://git-wip-us.apache.org/repos/asf/ambari/blob/848e7874/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 33d013e..b2fb8e6 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
@@ -129,6 +129,7 @@ public class SQLProviderModule extends DefaultProviderModule implements HostInfo
               PropertyHelper.getPropertyId("ServiceComponentInfo", "cluster_name"),
               null,
               PropertyHelper.getPropertyId("ServiceComponentInfo", "component_name"),
+              PropertyHelper.getPropertyId("ServiceComponentInfo", "service_name"),
               connectionFactory));
     } else if (type.equals(Resource.Type.HostComponent)) {
       providers.add(new JMXPropertyProvider(
@@ -147,6 +148,7 @@ public class SQLProviderModule extends DefaultProviderModule implements HostInfo
               PropertyHelper.getPropertyId("HostRoles", "cluster_name"),
               PropertyHelper.getPropertyId("HostRoles", "host_name"),
               PropertyHelper.getPropertyId("HostRoles", "component_name"),
+              PropertyHelper.getPropertyId("HostRoles", "service_name"),
               connectionFactory));
     }
     putPropertyProviders(type, providers);