Bläddra i källkod

AMBARI-2107. Cluster CPU Chart is off the charts. (swagle)

git-svn-id: https://svn.apache.org/repos/asf/incubator/ambari/trunk@1481189 13f79535-47bb-0310-9956-ffa450edef68
Siddharth Wagle 12 år sedan
förälder
incheckning
a5c83a096e

+ 2 - 0
CHANGES.txt

@@ -837,6 +837,8 @@ Trunk (unreleased changes):
 
  BUG FIXES
 
+ AMBARI-2107. Cluster CPU Chart is off the charts. (swagle)
+
  AMBARI-2102. Confusing message "ls: cannot access /usr/share/java/*oracle*:
  No such file or directory". (smohanty)
 

+ 1 - 1
ambari-server/pom.xml

@@ -400,7 +400,7 @@
               </environmentVariables>
               <skip>${skipTests}</skip>
             </configuration>
-            <id>default-cli</id>
+            <id>python-test</id>
             <phase>test</phase>
             <goals>
               <goal>exec</goal>

+ 84 - 3
ambari-server/src/main/java/org/apache/ambari/server/controller/ganglia/GangliaMetric.java

@@ -18,6 +18,10 @@
 
 package org.apache.ambari.server.controller.ganglia;
 
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
 import org.codehaus.jackson.annotate.JsonIgnoreProperties;
 @JsonIgnoreProperties(ignoreUnknown = true)
 
@@ -58,6 +62,22 @@ public class GangliaMetric {
    * The temporal data points.
    */
   private Number[][] datapoints;
+  
+  
+  private static final Set<String> PERCENTAGE_METRIC;
+
+  //BUG-3386 Cluster CPU Chart is off the charts
+  // Here can be added other percentage metrics
+  static {
+    Set<String> temp = new HashSet<String>();
+    temp.add("cpu_wio");
+    /*temp.add("cpu_idle");
+    temp.add("cpu_nice");
+    temp.add("cpu_aidle");
+    temp.add("cpu_system");
+    temp.add("cpu_user");*/
+    PERCENTAGE_METRIC = Collections.unmodifiableSet(temp);
+  }
 
 
   // ----- GangliaMetric -----------------------------------------------------
@@ -106,10 +126,45 @@ public class GangliaMetric {
     return datapoints;
   }
 
+
   public void setDatapoints(Number[][] datapoints) {
     this.datapoints = datapoints;
-  }
+  } 
+  
+  public void setDatapointsFromList(List<GangliaMetric.TemporalMetric> listTemporalMetrics) { 
+    //this.datapoints = datapoints;
+    Number[][] datapointsArray = new Number[listTemporalMetrics.size()][2];
+    int cnt = 0;
+    if (PERCENTAGE_METRIC.contains(metric_name)) {
+      int firstIndex = 0;
+      int lastIndex = listTemporalMetrics.size() - 1;
+      for (int i = firstIndex; i <= lastIndex; ++i) {
+        GangliaMetric.TemporalMetric m = listTemporalMetrics.get(i);
+        Number val = m.getValue();
+        if (100.0 >= val.doubleValue()) {
+          datapointsArray[cnt][0] = val;
+          datapointsArray[cnt][1] = m.getTime();
+          cnt++;
+        }
+      }
+    } else {
+      int firstIndex = 0;
+      int lastIndex = listTemporalMetrics.size() - 1;
+      for (int i = firstIndex; i <= lastIndex; ++i) {
+        GangliaMetric.TemporalMetric m = listTemporalMetrics.get(i);
+        datapointsArray[i][0] = m.getValue();
+        datapointsArray[i][1] = m.getTime();
+        cnt++;
+      }
+    }
+
+    this.datapoints = new Number[cnt][2];
+    for (int i = 0; i < this.datapoints.length; i++) {
+      this.datapoints[i][0] = datapointsArray[i][0];
+      this.datapoints[i][1] = datapointsArray[i][1];
+    }
 
+  }
 
   // ----- Object overrides --------------------------------------------------
 
@@ -159,9 +214,19 @@ public class GangliaMetric {
   public static class TemporalMetric {
     private Number m_value;
     private Number m_time;
+    private boolean isInvalid;
+
+    public boolean isIsInvalid() {
+      return isInvalid;
+    }
 
-    public TemporalMetric(Number value, Number time) {
-      m_value = value;
+    public TemporalMetric(String value, Number time) {
+      isInvalid = false;
+      try{
+        m_value = convertToNumber(value);
+      } catch (NumberFormatException e) {
+        isInvalid = true;
+      }
       m_time = time;
     }
 
@@ -172,5 +237,21 @@ public class GangliaMetric {
     public Number getTime() {
       return m_time;
     }
+    
+    private Number convertToNumber(String s) throws NumberFormatException {
+      Number res;
+      if(s.contains(".")){
+        Double d = Double.parseDouble(s);
+        if(d.isNaN() || d.isInfinite()){
+          throw new NumberFormatException(s);
+        } else {
+          res = d;
+        } 
+      } else {
+        res = Long.parseLong(s);
+      }
+      return res;
+    }
+    
   }
 }

+ 3 - 10
ambari-server/src/main/java/org/apache/ambari/server/controller/ganglia/GangliaPropertyProvider.java

@@ -413,20 +413,13 @@ public abstract class GangliaPropertyProvider extends AbstractPropertyProvider {
 
           String val = reader.readLine();
           while(! val.equals("[AMBARI_DP_END]")) {
-            listTemporalMetrics.add(
-                new GangliaMetric.TemporalMetric(convertToNumber(val), time));
+            GangliaMetric.TemporalMetric tm = new GangliaMetric.TemporalMetric(val, time);
+            if (!tm.isIsInvalid()) listTemporalMetrics.add(tm);
             time += step;
             val = reader.readLine();
           }
 
-          //todo: change setter in GangliaMetric to take collection
-          Number[][] datapointsArray = new Number[listTemporalMetrics.size()][2];
-          for (int i = 0; i < listTemporalMetrics.size(); ++i) {
-            GangliaMetric.TemporalMetric m = listTemporalMetrics.get(i);
-            datapointsArray[i][0] = m.getValue();
-            datapointsArray[i][1] = m.getTime();
-          }
-          metric.setDatapoints(datapointsArray);
+          metric.setDatapointsFromList(listTemporalMetrics);
 
           ResourceKey key = new ResourceKey(metric.getHost_name(), metric.getCluster_name());
           Set<Resource> resourceSet = resources.get(key);

+ 102 - 0
ambari-server/src/test/java/org/apache/ambari/server/controller/ganglia/GangliaMetricTest.java

@@ -0,0 +1,102 @@
+/*
+ * To change this template, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package org.apache.ambari.server.controller.ganglia;
+
+import java.util.ArrayList;
+import java.util.List;
+import org.junit.Test;
+import static org.junit.Assert.*;
+
+/**
+ *
+ * @author root
+ */
+public class GangliaMetricTest {
+  
+
+
+  /**
+   * Test of setDatapoints method, of class GangliaMetric.
+   */
+  @Test
+  public void testSetDatapointsOfPercentValue() {
+    System.out.println("setDatapoints");
+    List<GangliaMetric.TemporalMetric> listTemporalMetrics =
+              new ArrayList<GangliaMetric.TemporalMetric>();
+    GangliaMetric instance = new GangliaMetric();
+    instance.setDs_name("dsName");
+    instance.setCluster_name("c1");
+    instance.setHost_name("localhost");
+    instance.setMetric_name("cpu_wio");
+    
+    listTemporalMetrics.add(new GangliaMetric.TemporalMetric("111.0", new Long(1362440880)));
+    listTemporalMetrics.add(new GangliaMetric.TemporalMetric("11.0", new Long(1362440881)));
+    listTemporalMetrics.add(new GangliaMetric.TemporalMetric("100.0", new Long(1362440882)));
+    instance.setDatapointsFromList(listTemporalMetrics);
+    assertTrue(instance.getDatapoints().length == 2);
+  }
+
+  /**
+   * Test of setDatapoints method, of class GangliaMetric.
+   */
+  //@Test
+  public void testSetDatapointsOfgcTimeMillisValue() {
+    System.out.println("setDatapoints");
+    List<GangliaMetric.TemporalMetric> listTemporalMetrics =
+              new ArrayList<GangliaMetric.TemporalMetric>();
+    GangliaMetric instance = new GangliaMetric();
+    instance.setDs_name("dsName");
+    instance.setCluster_name("c1");
+    instance.setHost_name("localhost");
+    instance.setMetric_name("jvm.metrics.gcTimeMillis");
+    
+    listTemporalMetrics.add(new GangliaMetric.TemporalMetric("0.0", new Long(1)));
+    listTemporalMetrics.add(new GangliaMetric.TemporalMetric("0.0", new Long(2)));
+    listTemporalMetrics.add(new GangliaMetric.TemporalMetric("0.0", new Long(3)));
+    listTemporalMetrics.add(new GangliaMetric.TemporalMetric("111.0", new Long(4)));
+    listTemporalMetrics.add(new GangliaMetric.TemporalMetric("11.0", new Long(5)));
+    listTemporalMetrics.add(new GangliaMetric.TemporalMetric("100.0", new Long(6)));
+    listTemporalMetrics.add(new GangliaMetric.TemporalMetric("0.0", new Long(7)));
+    listTemporalMetrics.add(new GangliaMetric.TemporalMetric("11.0", new Long(8)));
+    listTemporalMetrics.add(new GangliaMetric.TemporalMetric("0.0", new Long(9)));
+    listTemporalMetrics.add(new GangliaMetric.TemporalMetric("0.0", new Long(10)));
+    listTemporalMetrics.add(new GangliaMetric.TemporalMetric("0.0", new Long(11)));
+    listTemporalMetrics.add(new GangliaMetric.TemporalMetric("0.0", new Long(12)));
+    listTemporalMetrics.add(new GangliaMetric.TemporalMetric("11.0", new Long(13)));
+    listTemporalMetrics.add(new GangliaMetric.TemporalMetric("100.0", new Long(14)));
+    listTemporalMetrics.add(new GangliaMetric.TemporalMetric("0.0", new Long(15)));
+    listTemporalMetrics.add(new GangliaMetric.TemporalMetric("0.0", new Long(16)));
+    listTemporalMetrics.add(new GangliaMetric.TemporalMetric("0.0", new Long(17)));
+    listTemporalMetrics.add(new GangliaMetric.TemporalMetric("0.0", new Long(18)));
+    instance.setDatapointsFromList(listTemporalMetrics);
+    System.out.println(instance.toString());
+    assertTrue(instance.getDatapoints().length == 11);
+  }  
+  
+    /**
+   * Test of GangliaMetric.TemporalMetric constructor.
+   */
+  @Test
+  public void testTemporalMetricFineValue() {
+    System.out.println("GangliaMetric.TemporalMetric");
+    GangliaMetric.TemporalMetric tm;
+    tm = new GangliaMetric.TemporalMetric("100", new Long(1362440880));
+    assertFalse("GangliaMetric.TemporalMetric is valid", tm.isIsInvalid());
+  }
+
+    /**
+   * Test of GangliaMetric.TemporalMetric constructor.
+   */
+  @Test
+  public void testTemporalMetricIsNaNValue() {
+    System.out.println("GangliaMetric.TemporalMetric");
+    GangliaMetric.TemporalMetric tm;
+    tm = new GangliaMetric.TemporalMetric("any string", new Long(1362440880));
+    assertTrue("GangliaMetric.TemporalMetric is invalid", tm.isIsInvalid());
+  }
+  
+
+  
+}