瀏覽代碼

Merge pull request #6206 from wangkx/h11785a

HPCC-11785 Fix Thor Usage/Queue display in legacy ECLWatch

Reviewed-By: Gordon Smith <gordon.smith@lexisnexis.com>
Reviewed-By: Richard Chapman <rchapman@hpccsystems.com>
Richard Chapman 11 年之前
父節點
當前提交
735efdfbdc

+ 50 - 38
esp/files/joblist.js

@@ -175,12 +175,27 @@ var usageArray=null;
 var busagAarray = null;
 var nbusageArray = null;
 var totalWorkunits=0;
+var showAllStat = true;
+var numberOfDays = 0;
 
 function displayProgress(status)
 {
     document.getElementById('progress').innerHTML=status;
 }
 
+function initStat()
+{
+    usageArray=new Array(numberOfDays);
+    busageArray=new Array(numberOfDays);
+    nbusageArray=new Array(numberOfDays);
+    for(var i=0;i<numberOfDays;i++)
+    {
+        usageArray[i] = 0;
+        busageArray[i] = 0;
+        nbusageArray[i] = 0;
+    }
+}
+
 function displayBegin(from,to,showall)
 {
     fromDate=new Date(parseUTC(from)), 
@@ -189,10 +204,10 @@ function displayBegin(from,to,showall)
     var first=ZCMJD(fromDate.getFullYear(),fromDate.getMonth() + 1,fromDate.getDate());
     var last=ZCMJD(toDate.getFullYear(),toDate.getMonth() + 1,toDate.getDate());
     var count=last-first+1;
+    numberOfDays = count;
+    showAllStat = showall;
+    initStat();
 
-    usageArray=new Array(count);
-    busageArray=new Array(count);
-    nbusageArray=new Array(count);
     totalWorkunits=0;
 
     var svg=document.getElementById('SVG');
@@ -233,17 +248,6 @@ function displayBegin(from,to,showall)
                 grey.setAttribute("stroke-width",1);
                 g.appendChild(grey);
             }
-
-            var text=svgdoc.createElementNS("http://www.w3.org/2000/svg", "text");
-            text.setAttribute("x",24.2);
-            text.setAttribute("y",i+2.5);
-            text.setAttribute("text-anchor","begin");
-            text.setAttribute("id","usage"+i);
-            if(showall)
-               text.appendChild(svgdoc.createTextNode('0% 0% 0%'));
-            else
-               text.appendChild(svgdoc.createTextNode('0%'));
-            g.appendChild(text);
         }
 
         var line=svgdoc.createElementNS("http://www.w3.org/2000/svg", "line");
@@ -391,41 +395,49 @@ function displayJob(wuid,graph,started,finished,cluster,state,source,showall,bbt
         line.setAttribute("y2",y+2.5);
         g.appendChild(line);
 
-        usageArray[y]=(usageArray[y] || 0)+100*(xx2-xx1)/24;
+        usageArray[y]+=100*(xx2-xx1)/24;
         var bhours = ((betime < xx2)?betime:xx2) - ((bbtime > xx1)?bbtime:xx1);
         if(bhours < 0)
             bhours = 0;
         var nbhours = (xx2 - xx1 - bhours);
 
-        if(bbtime + (24 - betime) <= 0.001)
-            nbusageArray[y] = (nbusageArray[y] || 0) + 0;
-        else
-            nbusageArray[y] = (nbusageArray[y] || 0) + 100*nbhours/(bbtime + (24 - betime));
-
-        if(betime - bbtime <= 0.001)
-            busageArray[y] = (busageArray[y] || 0) + 0;
-        else
-            busageArray[y] = (busageArray[y] || 0) + 100*bhours/(betime - bbtime);
-
-        var u=svgdoc.getElementById('usage'+y);
-        var usagestr = '';
-        if(usageArray[y] < 10)
-            usagestr += ' ';
-        usagestr += Math.round(usageArray[y])+'%';
-        if(showall)
-        {
-            usagestr += ' ' + Math.round(busageArray[y])+'% ' + Math.round(nbusageArray[y])+'%';
-        }
-        u.replaceChild(svgdoc.createTextNode(usagestr), u.firstChild);
+        if(bbtime + (24 - betime) > 0.001)
+            nbusageArray[y] += 100*nbhours/(bbtime + (24 - betime));
+        if(betime - bbtime > 0.001)
+            busageArray[y] += 100*bhours/(betime - bbtime);
     }
 
     svgdoc.getElementById("top").appendChild(g);
 }
 
+function displayStat()
+{
+    var svg=document.getElementById('SVG');
+    var svgDoc=svg.getSVGDocument();
+    var topLines=svgDoc.getElementById('toplines');
+    for(var i=0;i<numberOfDays;i++)
+    {
+        var usageStr = '';
+        if(usageArray[i] < 10)
+            usageStr += ' ';
+        usageStr += Math.round(usageArray[i])+'%';
+        if(showAllStat)
+            usageStr += ' ' + Math.round(busageArray[i])+'% ' + Math.round(nbusageArray[i])+'%';
+
+        var text=svgDoc.createElementNS("http://www.w3.org/2000/svg", "text");
+        text.setAttribute("x",24.2);
+        text.setAttribute("y",i+2.5);
+        text.setAttribute("text-anchor","begin");
+        text.appendChild(svgDoc.createTextNode(usageStr));
+        topLines.appendChild(text);
+    }
+}
+
 function displayEnd(xls)
 {
+    displayStat();
     if (totalWorkunits > 0)
-        displayProgress('<table><tr><td>Total: '+(totalWorkunits)+' graphs (<a href=\"/WsWorkunits/WUClusterJobXLS?' + xls +'\">xls</a>...<a href=\"/WsWorkunits/WUClusterJobSummaryXLS?' + xls +'\">summary</a>)</td></tr></table>');
+        displayProgress('<table><tr><td>Total: '+(totalWorkunits)+' graphs (<a href=\"/WsWorkunits/WUClusterJobSummaryXLS?' + xls +'\">summary</a>...<a href=\"/WsWorkunits/WUClusterJobXLS?' + xls +'\">cluster_jobs.html</a>)</td></tr></table>');
     else
         displayProgress('<table><tr><td>Total: '+(totalWorkunits)+' graphs</td></tr></table>');
 }
@@ -445,7 +457,7 @@ function displayLegend()
     var svgdoc=svg.getSVGDocument();
     var g1=svgdoc.createElementNS("http://www.w3.org/2000/svg", "g");
     g1.setAttribute("transform","translate(20,20) scale(25,20)");
-    g1.setAttribute("id","top");
+    g1.setAttribute("id","LegendBaseT");
 
     var g=svgdoc.createElementNS("http://www.w3.org/2000/svg", "g");
     g.setAttribute("stroke-width","0.01");
@@ -453,7 +465,7 @@ function displayLegend()
     g.setAttribute("font-size","0.5");
     g.setAttribute("stroke-width","0.01");
     g.setAttribute("alignment-baseline","middle");
-    g.setAttribute("id","toplines");
+    g.setAttribute("id","LegendBase");
    
     for(var i=0;i<count;i++)
     {

+ 39 - 66
esp/files/jobqueue.js

@@ -168,7 +168,7 @@ var usageArray=null;
 var busagAarray = null;
 var nbusageArray = null;
 var totalWorkunits=0;
-
+var itemWidth=0.4;
 function displayQLegend()
 {
     var count = 3;
@@ -179,7 +179,6 @@ function displayQLegend()
     var svgdoc=svg.getSVGDocument();
     var g1=svgdoc.createElementNS("http://www.w3.org/2000/svg", "g");
     g1.setAttribute("transform","translate(20,20) scale(25,20)");
-    g1.setAttribute("id","top");
 
     var g=svgdoc.createElementNS("http://www.w3.org/2000/svg", "g");
     g.setAttribute("stroke-width","0.01");
@@ -187,7 +186,6 @@ function displayQLegend()
     g.setAttribute("font-size","0.5");
     g.setAttribute("stroke-width","0.01");
     g.setAttribute("alignment-baseline","middle");
-    g.setAttribute("id","toplines");
 
     for(var i=0;i<count;i++)
     {
@@ -235,7 +233,6 @@ function displayQBegin(queues, connected, count)
     g.setAttribute("font-size","0.5");
     g.setAttribute("stroke-width","0.01");
     g.setAttribute("alignment-baseline","middle");
-    g.setAttribute("id","toplines");
 
      var lines = queues + connected + 1;
     for(var i=0;i<lines;i++)
@@ -250,7 +247,7 @@ function displayQBegin(queues, connected, count)
         var line=svgdoc.createElementNS("http://www.w3.org/2000/svg", "line");
         line.setAttribute("x1",0);
         line.setAttribute("y1",i);
-        line.setAttribute("x2",count*0.3+0.3);
+        line.setAttribute("x2",count*itemWidth+0.3);
         line.setAttribute("y2",i);
         if(i==0 || i==(lines-1))
         {
@@ -286,12 +283,11 @@ function displayQueue(count,dt,running,queued,waiting,connected,idle,wuid1, wuid
 
     var g=svgdoc.createElementNS("http://www.w3.org/2000/svg", "g");
     g.setAttribute("stroke","black");
-    g.setAttribute("font-size","0.5");
+    g.setAttribute("font-size","0.4");
     g.setAttribute("stroke-width","0.02");
     g.setAttribute("alignment-baseline","middle");
-    g.setAttribute("id","toplines");
-
-    var xpos = 0.3*count - 0.1;
+ 
+    var xpos = itemWidth*count - 0.1;
     var ybase = max_queues + 2;
     var ypos = ybase+0.2;
 
@@ -300,7 +296,6 @@ function displayQueue(count,dt,running,queued,waiting,connected,idle,wuid1, wuid
         var gskew = svgdoc.createElementNS("http://www.w3.org/2000/svg", "g");
         var trans = "translate(" + xpos + "," + ypos + ") rotate(-90)";
         gskew.setAttribute("transform", trans);
-        gskew.setAttribute("font-size","0.35");
         var text3=svgdoc.createElementNS("http://www.w3.org/2000/svg", "text");
         text3.setAttribute("x",0);
         text3.setAttribute("y",0);
@@ -324,66 +319,44 @@ function displayQueue(count,dt,running,queued,waiting,connected,idle,wuid1, wuid
 
     if (running > 0)
     {
-        if (!isFF)
-        {
-            var s='<g stroke-width="1" onmouseout="hide_popup()" onclick="open_workunit(\''+wuid1+'\')"'+
-              ' onmouseover="show_q_popup(window.evt.screenX,window.evt.screenY,\''+wuid1+'\',\''+dt+'\')" stroke="blue">';
-            s+='<line x1="'+xpos+'" y1="'+ybase+'" x2="'+xpos+'" y2="'+(ybase - 1)+'" stroke-width="0.15" />'
-            s+='</g>';
-            g.appendChild(svg.getWindow().parseXML(s,svgdoc));
-        }
-        else
-        {
-            var g1=svgdoc.createElementNS("http://www.w3.org/2000/svg", "g");
-            g1.setAttribute("stroke","blue");
-            g1.setAttribute("stroke-width",1);
-
-            g1.addEventListener("mouseover",function(evt) { show_q_popup1(evt,wuid1,dt); }, false);
-            g1.addEventListener("mouseout",function(evt) { hide_popup(); }, false);
-            g1.addEventListener("click",function(evt) { open_workunit(wuid1); }, false);
-            
-            var line2=svgdoc.createElementNS("http://www.w3.org/2000/svg", "line");
-            line2.setAttribute("x1",+xpos);
-            line2.setAttribute("y1",ybase);
-            line2.setAttribute("x2",xpos);
-            line2.setAttribute("y2",ybase - 1);
-            line2.setAttribute("stroke-width",0.15);
-            g1.appendChild(line2);
-            
-            g.appendChild(g1);
-        }
+        var g1=svgdoc.createElementNS("http://www.w3.org/2000/svg", "g");
+        g1.setAttribute("stroke","blue");
+        g1.setAttribute("stroke-width",1);
+
+        g1.addEventListener("mouseover",function(evt) { show_q_popup1(evt,wuid1,dt); }, false);
+        g1.addEventListener("mouseout",function(evt) { hide_popup(); }, false);
+        g1.addEventListener("click",function(evt) { open_workunit(wuid1); }, false);
+
+        var line2=svgdoc.createElementNS("http://www.w3.org/2000/svg", "line");
+        line2.setAttribute("x1",+xpos);
+        line2.setAttribute("y1",ybase);
+        line2.setAttribute("x2",xpos);
+        line2.setAttribute("y2",ybase - 1);
+        line2.setAttribute("stroke-width",0.15);
+        g1.appendChild(line2);
+
+        g.appendChild(g1);
     }
 
     if (running > 1)
     {
-        if (!isFF)
-        {
-            var s='<g stroke-width="1" onmouseout="hide_popup()" onclick="open_workunit(\''+wuid2+'\')"'+
-              ' onmouseover="show_q_popup(window.evt.screenX,window.evt.screenY,\''+wuid2+'\',\''+dt+'\')" stroke="blue">';
-            s+='<line x1="'+xpos+'" y1="'+(ybase - 1)+'" x2="'+xpos+'" y2="'+(ybase - 2)+'" stroke-width="0.15" />'
-            s+='</g>';
-            g.appendChild(svg.getWindow().parseXML(s,svgdoc));
-        }
-        else
-        {
-            var g1=svgdoc.createElementNS("http://www.w3.org/2000/svg", "g");
-            g1.setAttribute("stroke","blue");
-            g1.setAttribute("stroke-width",1);
-
-            g1.addEventListener("mouseover",function(evt) { show_q_popup1(evt,wuid2,dt); }, false);
-            g1.addEventListener("mouseout",function(evt) { hide_popup(); }, false);
-            g1.addEventListener("click",function(evt) { open_workunit(wuid2); }, false);
-            
-            var line2=svgdoc.createElementNS("http://www.w3.org/2000/svg", "line");
-            line2.setAttribute("x1",+xpos);
-            line2.setAttribute("y1",ybase - 1);
-            line2.setAttribute("x2",xpos);
-            line2.setAttribute("y2",ybase - 2);
-            line2.setAttribute("stroke-width",0.15);
-            g1.appendChild(line2);
-            
-            g.appendChild(g1);
-        }
+        var g1=svgdoc.createElementNS("http://www.w3.org/2000/svg", "g");
+        g1.setAttribute("stroke","blue");
+        g1.setAttribute("stroke-width",1);
+
+        g1.addEventListener("mouseover",function(evt) { show_q_popup1(evt,wuid2,dt); }, false);
+        g1.addEventListener("mouseout",function(evt) { hide_popup(); }, false);
+        g1.addEventListener("click",function(evt) { open_workunit(wuid2); }, false);
+
+        var line2=svgdoc.createElementNS("http://www.w3.org/2000/svg", "line");
+        line2.setAttribute("x1",+xpos);
+        line2.setAttribute("y1",ybase - 1);
+        line2.setAttribute("x2",xpos);
+        line2.setAttribute("y2",ybase - 2);
+        line2.setAttribute("stroke-width",0.15);
+        g1.appendChild(line2);
+
+        g.appendChild(g1);
     }
 
     if (queued > 0)

+ 24 - 9
esp/services/ws_workunits/ws_workunitsAuditLogs.cpp

@@ -392,6 +392,8 @@ void AddToClusterJobXLS(JobUsageArray& jobsummary, CDateTime &adjStart, CDateTim
 
         float xx1= (y==y1 ? x1 : 0.0F);
         float xx2= (y==y2 ? x2 : 86400.0F);
+        if (xx2<=xx1)
+            continue;
         jobUsage.m_usage += (xx2-xx1)/864.0F;
 
         float bhours = ((busEnd < xx2)? busEnd : xx2) - ((busStart > xx1) ? busStart : xx1);
@@ -802,6 +804,9 @@ bool getClusterJobSummaryXLS(double version, StringBuffer &xml, const char* clus
     for (int i = first; i <= last; i++)
     {
         Owned<CJobUsage> jobUsage =  new CJobUsage();
+        jobUsage->m_busage = 0.0;
+        jobUsage->m_nbusage = 0.0;
+        jobUsage->m_usage = 0.0;
         usageDT.getDateString(jobUsage->m_date);
         jobUsages.append(*jobUsage.getClear());
         usageDT.adjustTime(60*24);
@@ -814,7 +819,6 @@ bool getClusterJobSummaryXLS(double version, StringBuffer &xml, const char* clus
             continue;
 
         Owned<IEspECLJob> job = createEclJobFromAuditLine(version, jobs.item(idx).text.get());
-
         CDateTime adjStart;
         adjStart.setString(job->getStartedDate(),NULL,true);
         adjStart.adjustTime(delayTime);
@@ -931,6 +935,10 @@ void streamJobListResponse(IEspContext &context, const char *cluster, const char
         toTime.getString(tostr, false);
     }
 
+    response->setContentType(HTTP_TYPE_TEXT_HTML_UTF8);
+    response->setStatus(HTTP_STATUS_OK);
+    response->startSend();
+
     StringBuffer sb;
     sb.append("<script language=\"javascript\">parent.displayLegend(");
     appendQuoted(sb, fromstr.str(), true);
@@ -1036,7 +1044,7 @@ void streamJobListResponse(IEspContext &context, const char *cluster, const char
     sb.clear().append("<script language=\"javascript\">\r\n");
     sb.append("parent.displaySasha();\r\nparent.displayEnd(");
     appendQuoted(sb, xls, true).append(")</script>\r\n");
-    response->sendChunk(sb.str());
+    response->sendFinalChunk(sb.str());
 }
 
 bool checkSameStrings(const char* s1, const char* s2)
@@ -1264,8 +1272,6 @@ void appendQueueInfoFromAuditLine(IArrayOf<IEspThorQueue>& items, const char* li
 
     if (checkNewThorQueueItem(tq, showAll, items))
         items.append(*tq.getClear());
-
-    DBGLOG("Queue log: [%s]", line);
 }
 
 
@@ -1314,6 +1320,10 @@ void streamJobQueueListResponse(IEspContext &context, const char *cluster, const
         countLines++;
     }
 
+    response->setContentType(HTTP_TYPE_TEXT_HTML_UTF8);
+    response->setStatus(HTTP_STATUS_OK);
+    response->startSend();
+
     if (items.length() < 1)
     {
         response->sendChunk("<script language=\"javascript\">\r\nparent.displayQEnd(\'No data found\')</script>\r\n");
@@ -1364,14 +1374,14 @@ void streamJobQueueListResponse(IEspContext &context, const char *cluster, const
     sb.append("parent.displayQEnd(\'<table><tr><td>");
     sb.append("Total Records in the Time Period: ").append(items.length());
     sb.append(" (<a href=\"/WsWorkunits/WUClusterJobQueueLOG?").append(xls);
-    sb.append("\">txt</a>...<a href=\"/WsWorkunits/WUClusterJobQueueXLS?").append(xls).append("\">xls</a>).");
+    sb.append("\">job_queue_log</a>...<a href=\"/WsWorkunits/WUClusterJobQueueXLS?").append(xls).append("\">job_queue.html</a>).");
     sb.append("</td></tr><tr><td>");
     if (count > maxDisplay)
         sb.append("Displayed: First ").append(maxDisplay).append(". ");
     sb.append("Max. Queue Length: ").append(longestQueue).append(".");
     sb.append("</td></tr></table>\')</script>\r\n");
 
-    response->sendChunk(sb.str());
+    response->sendFinalChunk(sb.str());
 }
 
 int CWsWorkunitsSoapBindingEx::onGet(CHttpRequest* request, CHttpResponse* response)
@@ -1419,6 +1429,9 @@ int CWsWorkunitsSoapBindingEx::onGet(CHttpRequest* request, CHttpResponse* respo
          }
          if(!strnicmp(path.str(), "/WsWorkunits/JobList", 20))
          {
+            if (ctx->getClientVersion()<=0)
+                ctx->setClientVersion(1.51);
+
             const char *cluster = params->queryProp("Cluster");
             const char *startDate = params->queryProp("StartDate");
             const char *endDate = params->queryProp("EndDate");
@@ -1513,7 +1526,8 @@ bool CWsWorkunitsEx::onWUClusterJobQueueXLS(IEspContext &context, IEspWUClusterJ
         MemoryBuffer mb;
         mb.setBuffer(xls.length(), (void*)xls.str());
         resp.setResult(mb);
-        resp.setResult_mimetype("application/vnd.ms-excel");
+        resp.setResult_mimetype(HTTP_TYPE_TEXT_HTML);
+        context.addCustomerHeader("Content-disposition", "attachment;filename=job_queue.html");
     }
     catch(IException* e)
     {
@@ -1599,7 +1613,8 @@ bool CWsWorkunitsEx::onWUClusterJobXLS(IEspContext &context, IEspWUClusterJobXLS
         MemoryBuffer mb;
         mb.setBuffer(xls.length(), (void*)xls.str());
         resp.setResult(mb);
-        resp.setResult_mimetype("application/vnd.ms-excel");
+        resp.setResult_mimetype(HTTP_TYPE_TEXT_HTML);
+        context.addCustomerHeader("Content-disposition", "attachment;filename=cluster_jobs.html");
     }
     catch(IException* e)
     {
@@ -1630,7 +1645,7 @@ bool CWsWorkunitsEx::onWUClusterJobSummaryXLS(IEspContext &context, IEspWUCluste
         MemoryBuffer mb;
         mb.setBuffer(xls.length(), (void*)xls.str());
         resp.setResult(mb);
-        resp.setResult_mimetype("application/vnd.ms-excel");
+        resp.setResult_mimetype(HTTP_TYPE_TEXT_HTML);
     }
     catch(IException* e)
     {

+ 0 - 2
esp/services/ws_workunits/ws_workunitsHelpers.cpp

@@ -2516,8 +2516,6 @@ void WsWuJobQueueAuditInfo::getAuditLineInfo(const char* line, unsigned& longest
 
     if (checkNewThorQueueItem(tq, showAll, items))
         items.append(*tq.getClear());
-
-    DBGLOG("Queue log: [%s]", line);
 }
 
 bool WsWuJobQueueAuditInfo::checkSameStrings(const char* s1, const char* s2)