Browse Source

HADOOP-4989. Added scatter chart capability to Chukwa Charting.

git-svn-id: https://svn.apache.org/repos/asf/hadoop/core/trunk@748627 13f79535-47bb-0310-9956-ffa450edef68
Eric Yang 16 years ago
parent
commit
929c966bce

+ 43 - 18
src/contrib/chukwa/src/java/org/apache/hadoop/chukwa/hicc/Chart.java

@@ -45,6 +45,7 @@ public class Chart {
 	private int width;
 	private int height;
 	private List<String> xLabelRange;
+	private HashMap<String, Long> xLabelRangeHash;
 	private HttpServletRequest request = null;
     private boolean legend;
     private String xLabel="";
@@ -141,6 +142,12 @@ public class Chart {
 
     public void setXLabelsRange(List<String> range) {
     	xLabelRange = range;
+        xLabelRangeHash = new HashMap<String, Long>();
+        long value = 0;
+        for(String label : range) {
+            xLabelRangeHash.put(label,value);
+            value++;
+        }
     }
 
     public void setLegend(boolean toggle) {
@@ -172,6 +179,12 @@ public class Chart {
 				dateFormat="%y-%m-%d %H:%M";
 			}
 		}
+        String xAxisOptions = "";
+        if(xLabel.equals("Time")) {
+                xAxisOptions = "timeformat: \""+dateFormat+"\",mode: \"time\"";
+        } else {
+                xAxisOptions = "tickFormatter: function (val, axis) { return xLabels[Math.round(val)]; }, ticks: 0";
+        }
         output = "<html><link href=\"/hicc/css/default.css\" rel=\"stylesheet\" type=\"text/css\">\n" +
 		         "<body onresize=\"wholePeriod()\"><script type=\"text/javascript\" src=\"/hicc/js/jquery-1.2.6.min.js\"></script>\n"+
 		         "<script type=\"text/javascript\" src=\"/hicc/js/jquery.flot.pack.js\"></script>\n"+
@@ -183,24 +196,23 @@ public class Chart {
 		         "<script type=\"text/javascript\" src=\"/hicc/js/flot.extend.js\">\n" +
 		         "</script>\n" +
 		         "<script type=\"text/javascript\">\n"+
+                         "var xLabels=new Array();\n"+
 		         "var cw = document.body.clientWidth-70;\n"+
 		         "var ch = document.body.clientHeight-50;\n"+
 		         "document.getElementById('placeholder').style.width=cw+'px';\n"+
 		         "document.getElementById('placeholder').style.height=ch+'px';\n"+
 		         "_options={\n"+
 		         "        points: { show: false },\n"+
-		         "        xaxis: {                timeformat: \""+dateFormat+"\",\n"+
-		         "	                mode: \"time\"\n"+
-		         "	        },\n"+
-		         "	        selection: { mode: \"x\" },\n"+
-		         "	        grid: {\n"+
-		         "	                clickable: true,\n"+
-		         "	                hoverable: true,\n"+
-		         "	                tickColor: \"#C0C0C0\",\n"+
-		         "	                backgroundColor:\"#FFFFFF\"\n"+
-		         "	        },\n"+
-		         "	        legend: { show: "+this.legend+" },\n"+
-                 "          yaxis: { ";
+		         "        xaxis: { "+xAxisOptions+" },\n"+
+		         "	  selection: { mode: \"x\" },\n"+
+		         "	  grid: {\n"+
+		         "	           clickable: true,\n"+
+		         "	           hoverable: true,\n"+
+		         "	           tickColor: \"#C0C0C0\",\n"+
+		         "	           backgroundColor:\"#FFFFFF\"\n"+
+		         "	  },\n"+
+		         "	  legend: { show: "+this.legend+" },\n"+
+                         "        yaxis: { ";
         boolean stack = false;
         for(String type : this.chartType) {
             if(type.startsWith("stack")) {
@@ -226,10 +238,14 @@ public class Chart {
             output = output + ", min:0, max:"+this.max;
         }
         output = output + "}\n";
-        output = output +
-		         "	};\n"+
-		         "_series=[\n";
-		            ArrayList<Long> numericLabelRange = new ArrayList<Long>();
+        output = output + "	};\n";
+        if(!xLabel.equals("Time")) {
+            for(int i=0;i<xLabelRange.size();i++) {
+                output = output + "xLabels[" + i + "]=\"" + xLabelRange.get(i)+"\";\n";
+            }
+        }
+        output = output + "_series=[\n";
+/*		            ArrayList<Long> numericLabelRange = new ArrayList<Long>();
 				    if(xLabel.equals("Time")) {
 				        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
 				        for(int i=0;i<xLabelRange.size();i++) {
@@ -243,7 +259,7 @@ public class Chart {
 					    for(int i=0;i<xLabelRange.size();i++) {
 					    	numericLabelRange.add(Long.parseLong(xLabelRange.get(i)));
 					    }
-				    }
+				    }*/
 			        ColorPicker cp = new ColorPicker();
 		   			int i=0;
 				    for(TreeMap<String, TreeMap<String, Double>> dataMap : this.dataset) {
@@ -289,6 +305,10 @@ public class Chart {
 					 	    	type="bars";
 					 	    	param="stepByStep: true";
 					 	    }
+                                                    if(this.chartType.get(i).equals("point")) {
+                                                        type="points";
+                                                        param="fill: false";
+                                                    }
 					 	    output+="  {"+type+": { show: true, "+param+" }, color: \""+cp.get(counter+1)+"\", label: \""+seriesName+"\", ";
 					 	    String showYAxis="false";
 					 	    String shortRow="false";
@@ -302,7 +322,12 @@ public class Chart {
 		   			 	        if(counter2!=0) {
 		   					        output+=",";
 		   				        }
-		   				        output+="["+dp+","+data.get(dp)+"]";
+                                                        if(xLabel.equals("Time")) {
+		   				            output+="[\""+dp+"\","+data.get(dp)+"]";
+                                                        } else {
+                                                            long value = xLabelRangeHash.get(dp);
+		   				            output+="[\""+value+"\","+data.get(dp)+"]";
+                                                        }
 		   				        counter2++;
 		   			        }
 		   	   			    output+="], min:0, max:"+this.max+"}";

+ 16 - 32
src/contrib/chukwa/src/web/hicc/js/flot.extend.js

@@ -40,7 +40,7 @@ options={
 };
 
         var previousPoint = null;
-	$("#placeholder").bind("plothover", function (event, pos, item) {
+	$("#placeholder").bind("plotclick", function (event, pos, item) {
 	    var leftPad = function(n) {
                 n = "" + n;
 	        return n.length == 1 ? "0" + n : n;
@@ -50,44 +50,28 @@ options={
                     previousPoint = item.datapoint;
                
                     $("#tooltip").remove();
-                    var x = item.datapoint[0].toFixed(2),
-                         y = item.stackValue.toFixed(2);
-                    var dnow=new Date();
-                    dnow.setTime(x);
-	            var dita=leftPad(dnow.getUTCFullYear())+"/"+leftPad(dnow.getUTCMonth()+1)+"/"+dnow.getUTCDate()+" "+leftPad(dnow.getUTCHours())+":"+leftPad(dnow.getUTCMinutes())+":"+leftPad(dnow.getUTCSeconds());
+                    if(xLabels.length==0) {
+                        var x = item.datapoint[0],
+                            y = item.stackValue.toFixed(2);
+                        var dnow=new Date();
+                        dnow.setTime(x);
+	                var dita=leftPad(dnow.getUTCFullYear())+"/"+leftPad(dnow.getUTCMonth()+1)+"/"+dnow.getUTCDate()+" "+leftPad(dnow.getUTCHours())+":"+leftPad(dnow.getUTCMinutes())+":"+leftPad(dnow.getUTCSeconds());
  
-                    showTooltip(item.pageX, item.pageY,
-                                item.series.label + ": " + y + "<br>Time: " + dita);
+                        showTooltip(item.pageX, item.pageY,
+                                    item.series.label + ": " + y + "<br>Time: " + dita);
+                    } else {
+                        var x = item.datapoint[0],
+                            y = item.stackValue.toFixed(2);
+                        xLabel = xLabels[x];
+                        showTooltip(item.pageX, item.pageY,
+                                    item.series.label + ": " + y + "<br>" + xLabel);
+                    }
                  }
             } else {
                  $("#tooltip").remove();
                  previousPoint = null;            
             }
          });
-    $("#placeholder").bind("plotclick", function (event, pos, item) {
-	    var leftPad = function(n) {
-                n = "" + n;
-	        return n.length == 1 ? "0" + n : n;
-	    };
-            if (item) {
-                if (previousPoint != item.datapoint) {
-                    previousPoint = item.datapoint;
-               
-                    $("#tooltip").remove();
-                    var x = item.datapoint[0].toFixed(2),
-                         y = item.datapoint[1].toFixed(2);
-                    var dnow=new Date();
-                    dnow.setTime(x);
-	            var dita=leftPad(dnow.getUTCFullYear())+"/"+leftPad(dnow.getUTCMonth()+1)+"/"+dnow.getUTCDate()+" "+leftPad(dnow.getUTCHours())+":"+leftPad(dnow.getUTCMinutes())+":"+leftPad(dnow.getUTCSeconds());
- 
-                    showTooltip(item.pageX, item.pageY,
-                                item.series.label + ": " + y + "<br>Time: " + dita);
-                 }
-            } else {
-                 $("#tooltip").remove();
-                 previousPoint = null;            
-            }
-    });
 		$("#placeholder").bind("selected", function (event, area) {
 			plot = $.plot(
 				$("#placeholder"),

+ 14 - 2
src/contrib/chukwa/src/web/hicc/jsp/single-series-chart-javascript.jsp

@@ -168,7 +168,15 @@ No time range specified.  Select a time range through widget preference, or use
            Iterator<String> ki = tmpDataMap.keySet().iterator();
            while(ki.hasNext()) {
                String ts = ki.next();
-               dataMap.put(ts,tmpDataMap.get(ts));
+               if(dataMap.containsKey(ts)) {
+                   TreeMap<String, Double> newTree = dataMap.get(ts);
+                   for(String s : tmpDataMap.get(ts).keySet()) {
+                       newTree.put(s,tmpDataMap.get(ts).get(s));
+                   }
+                   dataMap.put(ts,newTree);
+               } else {
+                   dataMap.put(ts,tmpDataMap.get(ts));
+               }
            } 
        }
        if(dataMap.size()!=0) {
@@ -183,7 +191,11 @@ No time range specified.  Select a time range through widget preference, or use
                c.setXAxisLabels(false);
            }
            c.setYAxisLabel("");
-           c.setXAxisLabel("Time");
+           if(request.getParameter("x_axis_label")!=null) {
+               c.setXAxisLabel(request.getParameter("x_axis_label"));
+           } else {
+               c.setXAxisLabel("Time");
+           }
            c.setTitle(metrics.toString());
            if(request.getParameter("y_axis_max")!=null) {
                double max = Double.parseDouble(request.getParameter("y_axis_max"));