[FABAN-22] Add accept-encoding processing to fhb Created: 28/Apr/14  Updated: 21/Jun/14

Status: Open
Project: faban
Component/s: None
Affects Version/s: None
Fix Version/s: None

Type: New Feature Priority: Minor
Reporter: Scott Oaks Assignee: jamesxcheng
Resolution: Unresolved Votes: 0
Labels: None
Remaining Estimate: Not Specified
Time Spent: Not Specified
Original Estimate: Not Specified


 Description   

It would be quite useful for fhb to be able to set different accept-encoding headers – e.g. to measure compressed vs. uncompressed output (I used that feature in Java Performance Tuning). Ditto to fhb to report the 95th% and 99th% response times.



 Comments   
Comment by Scott Oaks [ 28/Apr/14 ]
diff --git a/driver/resources/driver_template b/driver/resources/driver_template
index 5450ebf..516f7aa 100755
--- a/driver/resources/driver_template
+++ b/driver/resources/driver_template
@@ -1,5 +1,7 @@
 import java.io.UnsupportedEncodingException;
 import java.net.URLEncoder;
+import java.util.HashMap;
+import java.util.Map;
 import java.util.StringTokenizer;
 import java.util.logging.Logger; // debug only
 
@@ -11,6 +13,7 @@ import com.sun.faban.driver.util.Random;
 
 @BenchmarkDriver (
  name  = "@BenchmarkDriverName@",
+ percentiles = { "90th", "95th", "99th" },
  threadPerScale = 1 
 )
 
@@ -22,6 +25,7 @@ private HttpTransport httpTransport;
 private DriverContext ctx;
 private Random random;
 private ContentSizeStats contentStats = null;
+private Map<String,String> headers = new HashMap<String,String>();
 
 public @DriverClassName@(){
      HttpTransport.setProvider("@ProviderClass@");
@@ -30,6 +34,7 @@ public @DriverClassName@(){
      random = ctx.getRandom();
      contentStats = new ContentSizeStats(ctx.getOperationCount());
      ctx.attachMetrics(contentStats);
+     headers.put("Accept-Language", "en-us,en;q=0.5");
 }
 
 private static String doEncode(String s) {
@@ -65,8 +70,9 @@ public void @operationName@() throws Exception{
 	try{
             String url = @url@;
 	 	@doKbps@
+		@doHeaders@
 	    @doTiming@
-            int bytesRead = httpTransport.readURL(url@postRequest@);
+            int bytesRead = httpTransport.readURL(url@postRequest@, headers);
             //System.out.println("url:"+url);
 
 	    @doTiming@
diff --git a/driver/src/com/sun/faban/driver/engine/RunInfo.java b/driver/src/com/sun/faban/driver/engine/RunInfo.java
index 4a81a2b..6dcb2f8 100644
--- a/driver/src/com/sun/faban/driver/engine/RunInfo.java
+++ b/driver/src/com/sun/faban/driver/engine/RunInfo.java
@@ -472,6 +472,7 @@ public class RunInfo implements Serializable {
             String url;
             String data;
             String kbps = "-1";
+	    String headers = "";
 
             abstract String getURL(int opNum);
 
@@ -493,12 +494,16 @@ public class RunInfo implements Serializable {
                 return "httpTransport.setDownloadSpeed(" + kbps + ");\n";
             }
 
+	    String getHeaders(int opNum) {
+		return headers;
+	    }
+
             abstract String getPostRequest(int opNum) throws Exception;
 
             abstract String getStatics(int opNum) throws Exception;
 
             public void init(boolean doSubst, boolean isBinary,
-                    String url, String data, String kbps) {
+                    String url, String data, String kbps, String accpt) {
                 this.doSubst = doSubst;
                 this.isBinary = isBinary;
                 this.url = url;
@@ -506,6 +511,13 @@ public class RunInfo implements Serializable {
                 if (kbps != null && !"".equals(kbps)) {
                     this.kbps = kbps;
                 }
+		if (accept != null && accept.length() > 0) {
+		    StringBuilder sb = new StringBuilder();
+		    sb.append("headers.put(\"Accept-Encoding", \"");
+		    sb.append(accept);
+		    sb.append("\"");
+		    this.headers = sb.toString();
+		}
             }
 
             @SuppressWarnings("cast")
@@ -771,6 +783,7 @@ public class RunInfo implements Serializable {
                 String url = xp.evaluate("fd:url", operationNode);
                 String max90th = xp.evaluate("fd:max90th", operationNode);
                 String kbps = xp.evaluate("fd:kbps", operationNode);
+		String accept = xp.evaluate("fd:accept", operationNode);
 
                 String requestString = "";
 
@@ -844,13 +857,15 @@ public class RunInfo implements Serializable {
                 } else {
                     rid = new RunInfoGetDefinition();
                 }
-                rid.init(doSubst, isBinary, url, requestString, kbps);
+                rid.init(doSubst, isBinary, url, requestString, kbps, accept);
 
                 //Create the benchmark Operation annotation
                 StringBuilder bmop = new StringBuilder(
                         "@BenchmarkOperation(name = \"").append(operationName);
-                bmop.append("\", max90th=").append(max90th).append(
-                        ", ");
+                bmop.append("\", percentileLimits={ ").
+		     append(max90th).append(", ").
+		     append(max90th).append(", ").
+		     append(max90th).append("}, ");
                 if (provider == TransportProvider.SUN
                         && url.startsWith("https")) {
                     bmop.append("timing = com.sun.faban.driver.Timing.MANUAL");
@@ -876,6 +891,8 @@ public class RunInfo implements Serializable {
                 opTemplateClone = opTemplateClone.replaceAll(
                         "@doKbps@", rid.getKbps(i));
                 opTemplateClone = opTemplateClone.replaceAll(
+                        "@doHeaders@", rid.getHeaders(i));
+                opTemplateClone = opTemplateClone.replaceAll(
                         "@doTiming@", rid.doTiming(i, provider));
 
                 operations.append(opTemplateClone);
diff --git a/driver/src/com/sun/faban/driver/util/FabanHTTPBench.java b/driver/src/com/sun/faban/driver/util/FabanHTTPBench.java
index 5400572..286db3c 100644
--- a/driver/src/com/sun/faban/driver/util/FabanHTTPBench.java
+++ b/driver/src/com/sun/faban/driver/util/FabanHTTPBench.java
@@ -27,8 +27,10 @@ import com.sun.faban.driver.engine.RunInfo;
 import com.sun.faban.driver.ConfigurationException;
 import com.sun.faban.common.TextTable;
 import com.sun.faban.common.ParamReader;
+import org.w3c.dom.Attr;
 import org.w3c.dom.Document;
 import org.w3c.dom.Element;
+import org.w3c.dom.NamedNodeMap;
 import org.w3c.dom.Node;
 import org.w3c.dom.NodeList;
 import org.xml.sax.SAXException;
@@ -97,6 +99,7 @@ public class FabanHTTPBench {
     private static boolean save = false;
     private static boolean substitute = false;
     private static String kbps = "-1";
+    private static String accept = null;
     private static boolean isBinary = false;
     private static String thinkTime = "0";
     private static final int CYCLE_DEVIATION = 1;
@@ -231,6 +234,12 @@ public class FabanHTTPBench {
 		tmp.setPrefix("");
 		tmp.appendChild(doc.createTextNode(kbps));
 		op.appendChild(tmp);
+	if (accept != null) { 
+            tmp = doc.createElementNS(RunInfo.DRIVERURI, "accept");
+            tmp.setPrefix("");
+            tmp.appendChild(doc.createTextNode(accept));
+            op.appendChild(tmp);
+        }
         if (postRequest) {
             tmp = doc.createElementNS(RunInfo.DRIVERURI, "post");
             tmp.setAttributeNS(null, "binary", Boolean.toString(isBinary));
@@ -382,30 +391,38 @@ public class FabanHTTPBench {
         if (txCount <= 1) {
             System.out.println("avg. time: " + getValue(doc, "avg"));
             System.out.println("max time: " + getValue(doc, "max"));
-            String p90th = getValue(doc, "p90th");
-            System.out.println("90th %: " + p90th);
-            if (p90th.startsWith(">") || Double.parseDouble(p90th) > ninetyPct)
-                System.out.println("ERROR: Missed target 90% of " + ninetyPct);
+            String percentile = getValue(doc, "percentile", "nth", "90");
+            System.out.println("90th %: " + percentile);
+            if (percentile.startsWith(">") || Double.parseDouble(percentile) > ninetyPct)
+                 System.out.println("ERROR: Missed target 90% of " + ninetyPct);
+	    percentile = getValue(doc, "percentile", "nth", "95");
+   	    System.out.println("95th %: " + percentile);
+	    percentile = getValue(doc, "percentile", "nth", "99");
+	    System.out.println("99th %: " + percentile);
         } else {
-            TextTable table = new TextTable(txCount, 5);
+            TextTable table = new TextTable(txCount, 7);
             table.setHeader(0, "Response Times");
             table.setHeader(1, "Avg");
             table.setHeader(2, "Max");
             table.setHeader(3, "90th%");
-            table.setHeader(4, "");
+            table.setHeader(4, "95th%");
+            table.setHeader(5, "99th%");
+            table.setHeader(6, "");
 
             for (int i = 0; i < txCount; i++) {
                 Node opNode = nodeList.item(i);
                 table.setField(i, 0, xPath.evaluate("@name", opNode));
                 table.setField(i, 1, xPath.evaluate("avg", opNode));
                 table.setField(i, 2, xPath.evaluate("max", opNode));
-                table.setField(i, 3, xPath.evaluate("p90th", opNode));
+                table.setField(i, 3, getValue(opNode, "percentile", "nth", "90"));
+                table.setField(i, 4, getValue(opNode, "percentile", "nth", "95"));
+                table.setField(i, 5, getValue(opNode, "percentile", "nth", "99"));
                 boolean passed = Boolean.parseBoolean(
                                     xPath.evaluate("passed", opNode));
                 if (passed)
-                    table.setField(i, 4, "PASSED");
+                    table.setField(i, 6, "PASSED");
                 else
-                    table.setField(i, 4, "FAILED");
+                    table.setField(i, 6, "FAILED");
             }
             table.format(System.out);
         }
@@ -441,6 +458,24 @@ public class FabanHTTPBench {
                 item(0).getNodeValue().trim();
     }
 
+    private static String getValue(Node node, String s, String attr, String value) {
+	NodeList nl = node.getChildNodes();
+        for (int i = 0; i < nl.getLength(); i++) {
+            Node n = nl.item(i);
+            NamedNodeMap nnm = n.getAttributes();
+		if (nnm == null) {
+		    continue;
+		}
+            for (int j = 0; j < nnm.getLength(); j++) {
+                Attr a = (Attr) nnm.item(j);
+                if (a.getName().equals(attr) && a.getValue().equals(value)) {
+                    return n.getChildNodes().item(0).getNodeValue().trim();
+                }
+            }
+        }
+        return null;
+    }
+
     private static void cleanUp() {
         if (save) {
             System.out.println("Saving output from run in " + outputDirectory);
@@ -516,6 +551,9 @@ public class FabanHTTPBench {
                 case 'V':
                     System.out.println("Faban cd: Version 0.1");
                     System.exit(0);
+		case 'z':
+		    accept = args[++i];
+		    break;
                 case 'h':
                 default:
                     usage();
@@ -582,6 +620,7 @@ public class FabanHTTPBench {
                                                 "query string or POST data");
         System.err.println("\t-K Set speed of sockets to in kilobytes/sec");
         System.err.println("\t-k NOTE : Keep alive is always on");
+        System.err.println("\t-z mime-type : Include the given mime-type(s) in the accept-encoding headers");
         System.exit(-1);
     }
 }
Comment by jamesxcheng [ 20/Jun/14 ]

Hi Scott,

I got a couple of questions on the patch:

1. Since the -z option is about compressed/uncompressed output, should the "accept"
shown below be "accept-encoding" instead?

@@ -231,6 +234,12 @@ public class FabanHTTPBench {
tmp.setPrefix("");
tmp.appendChild(doc.createTextNode(kbps));
op.appendChild(tmp);
+ if (accept != null) {
+ tmp = doc.createElementNS(RunInfo.DRIVERURI, "accept");

2. Always got an exception after the following change, because percentile was null:

@@ -382,30 +391,38 @@ public class FabanHTTPBench {
if (txCount <= 1) {
System.out.println("avg. time: " + getValue(doc, "avg"));
System.out.println("max time: " + getValue(doc, "max"));

  • String p90th = getValue(doc, "p90th");
  • System.out.println("90th %: " + p90th);
  • if (p90th.startsWith(">") || Double.parseDouble(p90th) > ninetyPct)
  • System.out.println("ERROR: Missed target 90% of " + ninetyPct);
    + String percentile = getValue(doc, "percentile", "nth", "90");

The following appeared to fix the problem. Is it good?

+ Node opNode = nodeList.item(0);
+ String percentile = getValue(opNode, "percentile", "nth", "90");

Thanks,
-James

Comment by Scott Oaks [ 21/Jun/14 ]

Hi James –

1) The "accept" there is the token that will appear in the run.xml file, so it can be anything arbitrary. But if that changes, then you have to change line 796 in RunInfo.java which parses the run.xml so that those are in sync. I would just keep it as it is (and on line 530 there, you'll see the Accept-Encoding hear is what is set.

2) I definitely did not need that, and I wonder if that fails for you then do the 95th and 99th also get a null return (or did you also pass opCode to the getValue() method for those)? I may have messed up the patch there...but if you send me the final FabanHTTPBench file, I can test it as well.





[FABAN-23] Calculation of sleep times should use long arithmetic Created: 20/Jun/14  Updated: 20/Jun/14

Status: Open
Project: faban
Component/s: None
Affects Version/s: None
Fix Version/s: None

Type: Bug Priority: Minor
Reporter: Scott Oaks Assignee: jamesxcheng
Resolution: Unresolved Votes: 0
Labels: None
Remaining Estimate: Not Specified
Time Spent: Not Specified
Original Estimate: Not Specified


 Description   

Specifying a rampup/steady/rampdown value > 2147482 will yield an exception like this:
java.lang.IllegalArgumentException: timeout value is negative
at java.lang.Thread.sleep(Native Method)
at com.sun.faban.driver.engine.MasterImpl.executeRaun(MasterImpl.java:705)
...

Those values are stored as ints, but when they are multiplied by 1000 for ms passed to the sleep, the values can overflow. The value passed to sleep should be calculated as a long:

Thread.sleep(runInfo.stdyState * 1000L);



 Comments   
Comment by jamesxcheng [ 20/Jun/14 ]

Reproduced the problem with 2147484 or larger.

% fhb -W 1000 -r 2147484/60/30 -c 25 http://localhost:80/
...
java.lang.IllegalArgumentException: timeout value is negative
at java.lang.Thread.sleep(Native Method)
at com.sun.faban.driver.engine.MasterImpl.executeRun(MasterImpl.java:697)





[FABAN-21] vmstat report doesn't exclude the first entry from calculation Created: 10/May/12  Updated: 10/May/12

Status: Open
Project: faban
Component/s: None
Affects Version/s: None
Fix Version/s: None

Type: Bug Priority: Minor
Reporter: khandker Assignee: Unassigned
Resolution: Unresolved Votes: 0
Labels: None
Remaining Estimate: Not Specified
Time Spent: Not Specified
Original Estimate: Not Specified
Environment:

all



 Description   

When summarizing the CPU statistics based on vmstat output, the first line needs to be excluded because this line is the average since the machine was booted.






[FABAN-19] Change instructions for starting distributed driver. Classpath correction. Created: 24/Oct/11  Updated: 21/Nov/11

Status: Open
Project: faban
Component/s: None
Affects Version/s: None
Fix Version/s: None

Type: Bug Priority: Trivial
Reporter: whitingjr Assignee: yaominchen
Resolution: Unresolved Votes: 0
Labels: None
Remaining Estimate: Not Specified
Time Spent: Not Specified
Original Estimate: Not Specified
Environment:

None.


Tags: documentation

 Description   

The instructions for starting the distributed driver in the "Faban Driver Framework Developers Guide" section 6 provide the wrong classpath.

The classpath is set to fabandriver.jar.

This needs to be changed to fabancommon.jar which contains the file RegistryImpl.class.






[FABAN-17] FlatSequenceMix should be configurabe from run.xml Created: 02/Sep/11  Updated: 23/Sep/11

Status: Open
Project: faban
Component/s: None
Affects Version/s: None
Fix Version/s: None

Type: New Feature Priority: Minor
Reporter: Scott Oaks Assignee: sheetalpatil
Resolution: Unresolved Votes: 0
Labels: None
Remaining Estimate: Not Specified
Time Spent: Not Specified
Original Estimate: Not Specified

Attachments: File faban.diff    

 Description   

The FlatSequenceMix should be configurable from run.xml the same way that the flat mix is.

This is slightly more than Flat Mix – the individual sequences of the FlatSequenceMix do not presently have names. However, we can add a name annotation there (as long as it has a default), and then configure the individual sequences like this:

<flatSequenceMix>
<name>MyFirstSequence</name>
<ratio>10</ratio>
</flatSeqeuenceMix>
<flatSequenceMix>
<name>MySecondSequence</name>
<ratio>10</ratio>
</flatSequenceMix>
...

Patch attached.






[FABAN-18] fhb will not run unless kbps is specified Created: 16/Sep/11  Updated: 23/Sep/11

Status: Open
Project: faban
Component/s: None
Affects Version/s: None
Fix Version/s: None

Type: Bug Priority: Major
Reporter: Scott Oaks Assignee: sheetalpatil
Resolution: Unresolved Votes: 0
Labels: None
Remaining Estimate: Not Specified
Time Spent: Not Specified
Original Estimate: Not Specified


 Description   

If you attempt to run fhb with a simple template (e.g., the one in the documentation), it will not run. Because the template does not specify a kbps, you get this exception:

SEVERE: Master terminated with errors.
java.lang.NumberFormatException: For input string: ""
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:48)
at java.lang.Integer.parseInt(Integer.java:470)
at java.lang.Integer.parseInt(Integer.java:499)
at com.sun.faban.driver.engine.RunInfo$ConfigurationReader$RunInfoDefinition.getKbps(RunInfo.java:489)
at com.sun.faban.driver.engine.RunInfo$ConfigurationReader.createDefinition(RunInfo.java:875)
at com.sun.faban.driver.engine.RunInfo$ConfigurationReader.<init>(RunInfo.java:378)

This is because the RunInfoDefinition has been instantiated with a default kbps string of "". The class tests to see if the string is null, and rejects that; but it needs also to reject an empty string. Line 505 of RunInfo needs to be:

if (kbps != null && !kbps.equals("")) {






[FABAN-14] vmstat Null exception Created: 21/May/11  Updated: 13/Jun/11  Due: 30/Jun/11

Status: Open
Project: faban
Component/s: None
Affects Version/s: None
Fix Version/s: None

Type: Bug Priority: Minor
Reporter: yaominchen Assignee: yaominchen
Resolution: Unresolved Votes: 0
Labels: None
Remaining Estimate: Not Specified
Time Spent: Not Specified
Original Estimate: Not Specified
Environment:

Linux


Attachments: JPEG File vmstat-bug-1.jpg     JPEG File vmstat-bug-2.jpg    
Tags: Faban, vmstat

 Description   

When vmstat result is not available, run log shows exception (see attachments).



 Comments   
Comment by yaominchen [ 13/Jun/11 ]

Yi suggested this may be due to the racing condition introduced by @AgentFinal implementation, as it did not happen before the change.





[FABAN-16] The 90th percentile response time may be larger than max response time Created: 25/May/11  Updated: 25/May/11  Due: 29/Jul/11

Status: Open
Project: faban
Component/s: None
Affects Version/s: None
Fix Version/s: None

Type: Bug Priority: Minor
Reporter: yaominchen Assignee: Unassigned
Resolution: Unresolved Votes: 0
Labels: None
Remaining Estimate: Not Specified
Time Spent: Not Specified
Original Estimate: Not Specified
Environment:

Solaris



 Description   

Sometimes 90th% response time is actually larger than max response time.

Here is the screen shot:
Response Times (milliseconds)
Type Avg Max SD 90th% 90th% limit 99th% 99.9th% Pass/Fail
MyOperation1 1.654 204.635 0.820 > 495.000 100.000 > 495.000 > 495.000 FAILED
MyOperation2 1.654 223.379 0.830 > 495.000 100.000 > 495.000 > 495.000 FAILED
MyOperation3 1.654 204.428 0.829 > 495.000 100.000 > 495.000 > 495.000 FAILED






[FABAN-15] Enable Operation Matrix in the xform generation Created: 24/May/11  Updated: 24/May/11  Due: 30/Jun/11

Status: Open
Project: faban
Component/s: None
Affects Version/s: None
Fix Version/s: None

Type: New Feature Priority: Minor
Reporter: yaominchen Assignee: sheetalpatil
Resolution: Unresolved Votes: 0
Labels: None
Remaining Estimate: Not Specified
Time Spent: Not Specified
Original Estimate: Not Specified
Environment:

Solaris



 Description   

We need support in faban kit that helps override the operation mix through GUI.

The format to be used in the run.xml file is,
<operationMix name="1">
<name>MyOperation1</name>
<r name="1">0</r>
<r name="2">70</r>
<r name="3">30</r>
</operationMix>
<operationMix name="2">
<name>MyOperation2</name>
<r name="1">60</r>
<r name="2">0</r>
<r name="3">40</r>
</operationMix>
<operationMix name="3">
<name>MyOperation3</name>
<r name="1">50</r>
<r name="2">50</r>
<r name="3">0</r>
</operationMix>






[FABAN-12] Need a way to retrieve binary data Created: 29/Apr/11  Updated: 29/Apr/11

Status: Open
Project: faban
Component/s: None
Affects Version/s: None
Fix Version/s: None

Type: New Feature Priority: Minor
Reporter: Scott Oaks Assignee: yaominchen
Resolution: Unresolved Votes: 0
Labels: None
Remaining Estimate: Not Specified
Time Spent: Not Specified
Original Estimate: Not Specified


 Description   

For some benchmarks, it is useful to get the binary data back from the server, something like this:

byte[] buf = new byte[8192];
int nBytes = httpTransport.readURL(url, buf);

which would place the first 8192 bytes of the response into the provided buffer (and return the number of bytes, which could of course be <8192). The benchmark writer would be responsible for the buffer management in this case, including providing a large enough buffer for the data – which may not sound ideal, but is common in load generators like LoadRunner.






[FABAN-9] Error message when Java directories don't match Created: 25/Apr/11  Updated: 25/Apr/11

Status: Open
Project: faban
Component/s: None
Affects Version/s: None
Fix Version/s: None

Type: Improvement Priority: Minor
Reporter: azeemj Assignee: Unassigned
Resolution: Unresolved Votes: 0
Labels: None
Remaining Estimate: Not Specified
Time Spent: Not Specified
Original Estimate: Not Specified
Environment:

Any FABAN setup



 Description   

If the Java instances on the faban master, driver, database are not all in the same location then FABAN gives the following cryptic message:

06:19:19 WARNING Retry connecting to CmdAgent@jasdatabase, count 1.

Instead it should give a more useful message.






[FABAN-5] Visual indicator for status of Faban Created: 14/Mar/11  Updated: 14/Mar/11

Status: Open
Project: faban
Component/s: None
Affects Version/s: None
Fix Version/s: None

Type: New Feature Priority: Major
Reporter: azeemj Assignee: Unassigned
Resolution: Unresolved Votes: 0
Labels: None
Remaining Estimate: Not Specified
Time Spent: Not Specified
Original Estimate: Not Specified


 Description   

A visual indicator of the status of Faban such as a Green/Yellow/Red light next to the "Pending Runs" text? Green means everything is good, Yellow means suspend, Red means not working.






[FABAN-4] Combine Suspend Pending Runs/Resume Pending Runs/View Pending runs Created: 14/Mar/11  Updated: 14/Mar/11

Status: Open
Project: faban
Component/s: None
Affects Version/s: None
Fix Version/s: None

Type: New Feature Priority: Minor
Reporter: azeemj Assignee: Unassigned
Resolution: Unresolved Votes: 0
Labels: None
Remaining Estimate: Not Specified
Time Spent: Not Specified
Original Estimate: Not Specified


 Description   

The "Suspend Pending Runs", "Resume Pending Runs" and "View Pending Runs" buttons can probably be combined into a single one. The Suspend one in particular is too close to "Schedule Run" which can mean accidental clicks and lots of headache

I would suggest "Pending Runs" and then have it display the current runs (so similar to View Pending Runs) but with two buttons for Suspend and Resume (or some toggle?)






[FABAN-3] Time should be visible in view results pane Created: 14/Mar/11  Updated: 14/Mar/11

Status: Open
Project: faban
Component/s: None
Affects Version/s: None
Fix Version/s: None

Type: New Feature Priority: Minor
Reporter: azeemj Assignee: Unassigned
Resolution: Unresolved Votes: 0
Labels: None
Remaining Estimate: Not Specified
Time Spent: Not Specified
Original Estimate: Not Specified


 Description   

In the "View Results" button, results table has "Date/Time" but only the Date is visible, with a hover that has both time and date. Both
should be visible in the field. The hover over already has the time, should be easy to add the time to the field as well.






Generated at Fri Aug 28 17:44:06 UTC 2015 using JIRA 6.2.3#6260-sha1:63ef1d6dac3f4f4d7db4c1effd405ba38ccdc558.