]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
3418. [func] New XML schema (version 3.0) for the statistics channel
authorckb <ckb@isc.org>
Wed, 14 Nov 2012 18:44:15 +0000 (12:44 -0600)
committerckb <ckb@isc.org>
Wed, 14 Nov 2012 18:44:15 +0000 (12:44 -0600)
adds query type statistics at the zone level, and
flattens the XML tree and uses compressed format to
optimize parsing. Includes new XSL that permits
charting via the Google Charts API on browsers that
support javascript in XSL.  The old XML schema has been
deprecated. [RT #30023]

3417. [placeholder]

CHANGES
bin/named/bind9.xsl
bin/named/bind9.xsl.h
bin/named/query.c
bin/named/statschannel.c
bin/named/zoneconf.c
lib/dns/include/dns/zone.h
lib/dns/zone.c

diff --git a/CHANGES b/CHANGES
index ce8ebbcaffaabf0968447e55a3aa6147824e1d04..66b6b950e832c0587bc03a613a5515e06e44f110 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -1,3 +1,13 @@
+3418.   [func]          New XML schema (version 3.0) for the statistics channel 
+                       adds query type statistics at the zone level, and 
+                       flattens the XML tree and uses compressed format to 
+                       optimize parsing. Includes new XSL that permits 
+                       charting via the Google Charts API on browsers that 
+                       support javascript in XSL.  The old XML schema has been 
+                       deprecated. [RT #30023]
+
+3417.   [placeholder]
+
 3416.  [bug]           Named could die on shutdown if running with 128 UDP
                        dispatches per interface. [RT #31743]
 
index 1024eba7cf2afcb34600acc4b56b48c8cafcdf00..af046d45f10f8d09bf5daca574ef2bb188e67fff 100644 (file)
  - PERFORMANCE OF THIS SOFTWARE.
 -->
 
-<!-- $Id: bind9.xsl,v 1.21 2009/01/27 23:47:54 tbox Exp $ -->
-
-<xsl:stylesheet version="1.0"
-   xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
-   xmlns="http://www.w3.org/1999/xhtml">
-  <xsl:template match="isc/bind/statistics">
+<!-- %Id: bind9.xsl,v 1.21 2009/01/27 23:47:54 tbox Exp % -->
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/1999/xhtml" version="1.0">
+  <xsl:output method="html" indent="yes" version="4.0"/>
+  <xsl:template match="statistics[@version=&quot;3.0&quot;]">
     <html>
       <head>
+        <xsl:if test="system-property('xsl:vendor')!='Transformiix'">
+          <!-- Non Mozilla specific markup -->
+          <script type="text/javascript" src="https://www.google.com/jsapi"/>
+          <script type="text/javascript">
+        
+        google.load("visualization", "1", {packages:["corechart"]});
+        google.setOnLoadCallback(loadGraphs);
+
+        var graphs=[];
+        
+        function drawChart(chart_title,target,data) {
+          var data = google.visualization.arrayToDataTable(data);
+
+          var options = {
+            title: chart_title
+          };
+          
+          var chart = new google.visualization.BarChart(document.getElementById(target));
+          chart.draw(data, options);
+        }
+        
+        function loadGraphs(){
+          //alert("here we are!");
+          var g;
+            
+          // Server Incoming query Types
+          while(g = graphs.shift()){
+           // alert("going for: " + g.target);
+            drawChart(g.title,g.target,g.data);
+          }
+            
+        }
+        
+            // Server Incoming Queries Types         
+           graphs.push({
+                        'title' : "Server Incoming Query Types",
+                        'target': 'chart_incoming_qtypes',
+                        'data': [['Type','Counter'],<xsl:for-each select="server/counters[@type=&quot;qtype&quot;]/counter">['<xsl:value-of select="@name"/>',<xsl:value-of select="."/>],</xsl:for-each>]
+                        });
+
+
+           // Server Incoming Requests         
+           graphs.push({
+                        'title' : "Server Incoming Requests",
+                        'target': 'chart_incoming_requests',
+                        'data': [['Requests','Counter'],<xsl:for-each select="server/counters[@type=&quot;opcode&quot;]/counter">['<xsl:value-of select="@name"/>',<xsl:value-of select="."/>],</xsl:for-each>]});
+        
+        
+        
+        
+      </script>
+        </xsl:if>
         <style type="text/css">
-body {
-       font-family: sans-serif;
-       background-color: #ffffff;
-       color: #000000;
-}
-
-table {
-       border-collapse: collapse;
-}
-
-tr.rowh {
-       text-align: center;
-       border: 1px solid #000000;
-       background-color: #8080ff;
-       color: #ffffff;
-}
-
-tr.row {
-       text-align: right;
-       border: 1px solid #000000;
-       background-color: teal;
-       color: #ffffff;
-}
-
-tr.lrow {
-       text-align: left;
-       border: 1px solid #000000;
-       background-color: teal;
-       color: #ffffff;
-}
-
-td, th {
-       padding-right: 5px;
-       padding-left: 5px;
-}
-
-.header h1 {
-       background-color: teal;
-       color: #ffffff;
-       padding: 4px;
-}
-
-.content {
-       background-color: #ffffff;
-       color: #000000;
-       padding: 4px;
-}
-
-.item {
-       padding: 4px;
-       align: right;
-}
-
-.value {
-       padding: 4px;
-       font-weight: bold;
-}
-
-div.statcounter h2 {
-       text-align: center;
-       font-size: large;
-       border: 1px solid #000000;
-       background-color: #8080ff;
-       color: #ffffff;
-}
-
-div.statcounter dl {
-       float: left;
-       margin-top: 0;
-       margin-bottom: 0;
-       margin-left: 0;
-       margin-right: 0;
-}
-
-div.statcounter dt {
-       width: 200px;
-       text-align: center;
-       font-weight: bold;
-       border: 0.5px solid #000000;
-       background-color: #8080ff;
-       color: #ffffff;
-}
-
-div.statcounter dd {
-       width: 200px;
-       text-align: right;
-       border: 0.5px solid #000000;
-       background-color: teal;
-       color: #ffffff;
-       margin-left: 0;
-       margin-right: 0;
-}
-
-div.statcounter br {
-       clear: left;
-}
-        </style>
-        <title>BIND 9 Statistics</title>
+     body {
+      font-family: sans-serif;
+      background-color: #ffffff;
+      color: #000000;
+      font-size: 10pt;
+     }
+     
+     .odd{
+      background-color: #f0f0f0;
+     }
+     
+     .even{
+      background-color: #ffffff;
+     }
+     
+     p.footer{
+      font-style:italic;
+      color: grey;
+     }
+
+     table {
+      border-collapse: collapse;
+      border: 1px solid grey;
+     }
+
+     table.counters{
+      border: 1px solid grey;
+      width: 500px;
+     }
+     
+     table.counters th {
+      text-align: center;
+      border: 1px solid grey;
+      width: 120px;
+     }
+    table.counters td{
+      text-align:center;
+      
+    }
+    
+    table.counters tr:hover{
+      background-color: #99ddff;
+    }
+     .totals {
+      background-color: rgb(1,169,206);
+      color: #ffffff;
+     }
+
+     td, th {
+      padding-right: 5px;
+      padding-left: 5px;
+      border: 1px solid grey;
+     }
+
+     .header h1 {
+      color: rgb(1,169,206);
+      padding: 0px;
+     }
+
+     .content {
+      background-color: #ffffff;
+      color: #000000;
+      padding: 4px;
+     }
+
+     .item {
+      padding: 4px;
+      text-align: right;
+     }
+
+     .value {
+      padding: 4px;
+      font-weight: bold;
+     }
+
+
+     h2 {
+       color: grey;
+       font-size: 14pt;
+       width:500px;
+       text-align:center;
+     }
+     
+     h3 {
+       color: #444444;
+       font-size: 12pt;
+       width:500px;
+       text-align:center;
+       
+     }
+     h4 {
+        color:  rgb(1,169,206);
+        font-size: 10pt;
+       width:500px;
+       text-align:center;
+        
+     }
+
+     .pie {
+      width:500px;
+      height: 500px;
+     }
+
+      </style>
+        <title>ISC BIND 9 Statistics</title>
       </head>
       <body>
-       <div class="header">
-         <h1>Bind 9 Configuration and Statistics</h1>
-       </div>
-
-       <br/>
-
-       <table>
-         <tr class="rowh"><th colspan="2">Times</th></tr>
-         <tr class="lrow">
-           <td>boot-time</td>
-           <td><xsl:value-of select="server/boot-time"/></td>
-         </tr>
-         <tr class="lrow">
-           <td>current-time</td>
-           <td><xsl:value-of select="server/current-time"/></td>
-         </tr>
-       </table>
-
-       <br/>
-
-       <table>
-         <tr class="rowh"><th colspan="2">Incoming Requests</th></tr>
-         <xsl:for-each select="server/requests/opcode">
-           <tr class="lrow">
-             <td><xsl:value-of select="name"/></td>
-             <td><xsl:value-of select="counter"/></td>
-           </tr>
-         </xsl:for-each>
-       </table>
-
-       <br/>
-
-       <table>
-         <tr class="rowh"><th colspan="2">Incoming Queries</th></tr>
-         <xsl:for-each select="server/queries-in/rdtype">
-           <tr class="lrow">
-             <td><xsl:value-of select="name"/></td>
-             <td><xsl:value-of select="counter"/></td>
-           </tr>
-         </xsl:for-each>
-       </table>
-
-       <br/>
-
-       <xsl:for-each select="views/view">
-         <table>
-           <tr class="rowh">
-             <th colspan="2">Outgoing Queries from View <xsl:value-of select="name"/></th>
-           </tr>
-           <xsl:for-each select="rdtype">
-             <tr class="lrow">
-               <td><xsl:value-of select="name"/></td>
-               <td><xsl:value-of select="counter"/></td>
-             </tr>
-           </xsl:for-each>
-         </table>
-         <br/>
-       </xsl:for-each>
-
-       <br/>
-
-       <div class="statcounter">
-         <h2>Server Statistics</h2>
-         <xsl:for-each select="server/nsstat">
-           <dl>
-             <dt><xsl:value-of select="name"/></dt>
-             <dd><xsl:value-of select="counter"/></dd>
-           </dl>
-         </xsl:for-each>
-         <br/>
-       </div>
-
-       <div class="statcounter">
-         <h2>Zone Maintenance Statistics</h2>
-         <xsl:for-each select="server/zonestat">
-           <dl>
-             <dt><xsl:value-of select="name"/></dt>
-             <dd><xsl:value-of select="counter"/></dd>
-           </dl>
-         </xsl:for-each>
-         <br />
-       </div>
-
-       <div class="statcounter">
-         <h2>Resolver Statistics (Common)</h2>
-         <xsl:for-each select="server/resstat">
-           <dl>
-             <dt><xsl:value-of select="name"/></dt>
-             <dd><xsl:value-of select="counter"/></dd>
-           </dl>
-         </xsl:for-each>
-         <br />
-       </div>
-
-       <xsl:for-each select="views/view">
-         <div class="statcounter">
-           <h2>Resolver Statistics for View <xsl:value-of select="name"/></h2>
-           <xsl:for-each select="resstat">
-             <dl>
-               <dt><xsl:value-of select="name"/></dt>
-               <dd><xsl:value-of select="counter"/></dd>
-             </dl>
-           </xsl:for-each>
-           <br />
-         </div>
-       </xsl:for-each>
-
-       <br />
-
-       <div class="statcounter">
-         <h2>ADB Statistics (Common)</h2>
-         <xsl:for-each select="server/adbstat">
-           <dl>
-             <dt><xsl:value-of select="name"/></dt>
-             <dd><xsl:value-of select="counter"/></dd>
-           </dl>
-         </xsl:for-each>
-         <br />
-       </div>
-
-       <xsl:for-each select="views/view">
-         <div class="statcounter">
-           <h2>ADB Statistics for View <xsl:value-of select="name"/></h2>
-           <xsl:for-each select="adbstat">
-             <dl>
-               <dt><xsl:value-of select="name"/></dt>
-               <dd><xsl:value-of select="counter"/></dd>
-             </dl>
-           </xsl:for-each>
-           <br />
-         </div>
-       </xsl:for-each>
-
-       <br />
-
-       <xsl:for-each select="views/view">
-         <table>
-           <tr class="rowh">
-             <th colspan="2">Cache Statistics for View <xsl:value-of select="name"/></th>
-           </tr>
-            <xsl:for-each select="cachestats/cachestat">
-             <tr class="lrow">
-               <td><xsl:value-of select="name"/></td>
-               <td><xsl:value-of select="value"/></td>
-             </tr>
-           </xsl:for-each>
-         </table>
-         <br/>
-       </xsl:for-each>
-
-       <xsl:for-each select="views/view">
-         <table>
-           <tr class="rowh">
-             <th colspan="2">Cache DB RRsets for View <xsl:value-of select="name"/></th>
-           </tr>
-           <xsl:for-each select="cache/rrset">
-             <tr class="lrow">
-               <td><xsl:value-of select="name"/></td>
-               <td><xsl:value-of select="counter"/></td>
-             </tr>
-           </xsl:for-each>
-         </table>
-         <br/>
-       </xsl:for-each>
-
-       <div class="statcounter">
-         <h2>Socket I/O Statistics</h2>
-         <xsl:for-each select="server/sockstat">
-           <dl>
-             <dt><xsl:value-of select="name"/></dt>
-             <dd><xsl:value-of select="counter"/></dd>
-           </dl>
-         </xsl:for-each>
-         <br/>
-       </div>
-
-       <br/>
-
-        <xsl:for-each select="views/view">
-          <table>
-            <tr class="rowh">
-              <th colspan="10">Zones for View <xsl:value-of select="name"/></th>
+        <div class="header">
+          <h1>ISC Bind 9 Configuration and Statistics</h1>
+        </div>
+        <hr/>
+        <h2>Server Times</h2>
+        <table class="counters">
+          <tr>
+            <th>Boot time:</th>
+            <td>
+              <xsl:value-of select="server/boot-time"/>
+            </td>
+          </tr>
+          <tr>
+            <th>Sample time:</th>
+            <td>
+              <xsl:value-of select="server/current-time"/>
+            </td>
+          </tr>
+        </table>
+        <br/>
+        <h2>Incoming Requests</h2>
+        <xsl:if test="system-property('xsl:vendor')!='Transformiix'">
+          <!-- Non Mozilla specific markup -->
+          <div class="pie" id="chart_incoming_requests">[graph incoming requests]</div>
+        </xsl:if>
+        <table class="counters">
+          <xsl:for-each select="server/counters[@type=&quot;opcode&quot;]/counter">
+            <xsl:sort select="." data-type="number" order="descending"/>
+            <tr>
+              <th>
+                <xsl:value-of select="@name"/>
+              </th>
+              <td>
+                <xsl:value-of select="."/>
+              </td>
             </tr>
-            <tr class="rowh">
-              <th>Name</th>
-              <th>Class</th>
-              <th>Serial</th>
-              <th>Success</th>
-              <th>Referral</th>
-              <th>NXRRSET</th>
-              <th>NXDOMAIN</th>
-              <th>Failure</th>
-             <th>XfrReqDone</th>
-             <th>XfrRej</th>
+          </xsl:for-each>
+          <tr>
+            <th class="totals">Total:</th>
+            <td class="totals">
+              <xsl:value-of select="sum(server/counters[@type=&quot;opcode&quot;]/counter)"/>
+            </td>
+          </tr>
+        </table>
+        <br/>
+        <h3>Incoming Queries by Type</h3>
+        <xsl:if test="system-property('xsl:vendor')!='Transformiix'">
+          <!-- Non Mozilla specific markup -->
+          <div class="pie" id="chart_incoming_qtypes">[graph incoming qtypes]</div>
+        </xsl:if>
+        <table class="counters">
+          <xsl:for-each select="server/counters[@type=&quot;qtype&quot;]/counter">
+            <xsl:sort select="." data-type="number" order="descending"/>
+            <xsl:variable name="css-class">
+              <xsl:choose>
+                <xsl:when test="position() mod 2 = 0">even</xsl:when>
+                <xsl:otherwise>odd</xsl:otherwise>
+              </xsl:choose>
+            </xsl:variable>
+            <tr class="{$css-class}">
+              <th>
+                <xsl:value-of select="@name"/>
+              </th>
+              <td>
+                <xsl:value-of select="."/>
+              </td>
             </tr>
-            <xsl:for-each select="zones/zone">
-              <tr class="lrow">
-                <td>
-                  <xsl:value-of select="name"/>
-                </td>
-                <td>
-                  <xsl:value-of select="rdataclass"/>
-                </td>
-                <td>
-                  <xsl:value-of select="serial"/>
-                </td>
-                <td>
-                  <xsl:value-of select="counters/QrySuccess"/>
-                </td>
-                <td>
-                  <xsl:value-of select="counters/QryReferral"/>
-                </td>
-                <td>
-                  <xsl:value-of select="counters/QryNxrrset"/>
-                </td>
-                <td>
-                  <xsl:value-of select="counters/QryNXDOMAIN"/>
-                </td>
+          </xsl:for-each>
+          <tr>
+            <th class="totals">Total:</th>
+            <td class="totals">
+              <xsl:value-of select="sum(server/counters[@type=&quot;qtype&quot;]/counter)"/>
+            </td>
+          </tr>
+        </table>
+        <br/>
+        <h2>Outgoing Queries per view</h2>
+        <xsl:for-each select="views/view[count(counters[@type=&quot;resqtype&quot;]/counter) &gt; 0]">
+          <h3>View <xsl:value-of select="@name"/></h3>
+          <xsl:if test="system-property('xsl:vendor')!='Transformiix'">
+            <!-- Non Mozilla specific markup -->
+          <script type="text/javascript">
+                graphs.push({
+                              'title': "Outgoing queries for view: <xsl:value-of select="@name"/>",
+                              'target': 'chart_outgoing_queries_view_<xsl:value-of select="@name"/>',
+                              'data': [['Type','Counter'],<xsl:for-each select="counters[@type=&quot;resqtype&quot;]/counter">['<xsl:value-of select="@name"/>',<xsl:value-of select="."/>],</xsl:for-each>]
+                              });
+                              
+            </script>
+          <xsl:variable name="target">
+            <xsl:value-of select="@name"/>
+          </xsl:variable>
+            <div class="pie" id="chart_outgoing_queries_view_{$target}"/>
+          </xsl:if>
+          <table class="counters">
+            <xsl:for-each select="counters[@type=&quot;resqtype&quot;]/counter">
+              <xsl:sort select="." data-type="number" order="descending"/>
+              <xsl:variable name="css-class1">
+                <xsl:choose>
+                  <xsl:when test="position() mod 2 = 0">even</xsl:when>
+                  <xsl:otherwise>odd</xsl:otherwise>
+                </xsl:choose>
+              </xsl:variable>
+              <tr class="{$css-class1}">
+                <th>
+                  <xsl:value-of select="@name"/>
+                </th>
                 <td>
-                  <xsl:value-of select="counters/QryFailure"/>
+                  <xsl:value-of select="."/>
                 </td>
+              </tr>
+            </xsl:for-each>
+          </table>
+          <br/>
+        </xsl:for-each>
+        <h2>Server Statistics</h2>
+        <xsl:if test="system-property('xsl:vendor')!='Transformiix'">
+          <!-- Non Mozilla specific markup -->
+        <script type="text/javascript">
+                graphs.push({
+                              'title' : "Server Response Types",
+                              'target': 'chart_server_nsstat_restype',
+                              'data': [['Type','Counter'],<xsl:for-each select="server/counters[@type=&quot;nsstat&quot;]/counter[.&gt;0]">['<xsl:value-of select="@name"/>',<xsl:value-of select="."/>],</xsl:for-each>]
+                              });
+                              
+            </script>
+          <div class="pie" id="chart_server_nsstat_restype"/>
+        </xsl:if>
+        <table class="counters">
+          <xsl:for-each select="server/counters[@type=&quot;nsstat&quot;]/counter[.&gt;0]">
+            <xsl:sort select="." data-type="number" order="descending"/>
+            <xsl:variable name="css-class2">
+              <xsl:choose>
+                <xsl:when test="position() mod 2 = 0">even</xsl:when>
+                <xsl:otherwise>odd</xsl:otherwise>
+              </xsl:choose>
+            </xsl:variable>
+            <tr class="{$css-class2}">
+              <th>
+                <xsl:value-of select="@name"/>
+              </th>
+              <td>
+                <xsl:value-of select="."/>
+              </td>
+            </tr>
+          </xsl:for-each>
+        </table>
+        <br/>
+        <h2>Zone Maintenance Statistics</h2>
+        <xsl:if test="system-property('xsl:vendor')!='Transformiix'">
+        <script type="text/javascript">
+                      graphs.push({
+                                    'title' : "Zone Maintenance Stats",
+                                    'target': 'chart_server_zone_maint',
+                                    'data': [['Type','Counter'],<xsl:for-each select="server/counters[@type=&quot;zonestat&quot;]/counter">['<xsl:value-of select="@name"/>',<xsl:value-of select="."/>],</xsl:for-each>]
+                                    });
+
+                  </script>
+          <!-- Non Mozilla specific markup -->
+          <div class="pie" id="chart_server_zone_maint"/>
+        </xsl:if>
+        <table class="counters">
+          <xsl:for-each select="server/counters[@type=&quot;zonestat&quot;]/counter">
+            <xsl:sort select="." data-type="number" order="descending"/>
+            <xsl:variable name="css-class3">
+              <xsl:choose>
+                <xsl:when test="position() mod 2 = 0">even</xsl:when>
+                <xsl:otherwise>odd</xsl:otherwise>
+              </xsl:choose>
+            </xsl:variable>
+            <tr class="{$css-class3}">
+              <th>
+                <xsl:value-of select="@name"/>
+              </th>
+              <td>
+                <xsl:value-of select="."/>
+              </td>
+            </tr>
+          </xsl:for-each>
+        </table>
+        <h2>Resolver Statistics (Common)</h2>
+        <table class="counters">
+          <xsl:for-each select="server/counters[@type=&quot;restat&quot;]/counter">
+            <xsl:sort select="." data-type="number" order="descending"/>
+            <xsl:variable name="css-class4">
+              <xsl:choose>
+                <xsl:when test="position() mod 2 = 0">even</xsl:when>
+                <xsl:otherwise>odd</xsl:otherwise>
+              </xsl:choose>
+            </xsl:variable>
+            <tr class="{$css-class4}">
+              <th>
+                <xsl:value-of select="@name"/>
+              </th>
+              <td>
+                <xsl:value-of select="."/>
+              </td>
+            </tr>
+          </xsl:for-each>
+        </table>
+        <xsl:for-each select="views/view">
+          <h3>Resolver Statistics for View <xsl:value-of select="@name"/></h3>
+          <table class="counters">
+            <xsl:for-each select="counters[@type=&quot;resstats&quot;]/counter[.&gt;0]">
+              <xsl:sort select="." data-type="number" order="descending"/>
+              <xsl:variable name="css-class5">
+                <xsl:choose>
+                  <xsl:when test="position() mod 2 = 0">even</xsl:when>
+                  <xsl:otherwise>odd</xsl:otherwise>
+                </xsl:choose>
+              </xsl:variable>
+              <tr class="{$css-class5}">
+                <th>
+                  <xsl:value-of select="@name"/>
+                </th>
                 <td>
-                  <xsl:value-of select="counters/XfrReqDone"/>
+                  <xsl:value-of select="."/>
                 </td>
+              </tr>
+            </xsl:for-each>
+          </table>
+        </xsl:for-each>
+        <h3>Cache DB RRsets for View <xsl:value-of select="@name"/></h3>
+        <xsl:for-each select="views/view">
+          <table class="counters">
+            <xsl:for-each select="cache/rrset">
+              <xsl:variable name="css-class6">
+                <xsl:choose>
+                  <xsl:when test="position() mod 2 = 0">even</xsl:when>
+                  <xsl:otherwise>odd</xsl:otherwise>
+                </xsl:choose>
+              </xsl:variable>
+              <tr class="{$css-class6}">
+                <th>
+                  <xsl:value-of select="name"/>
+                </th>
                 <td>
-                  <xsl:value-of select="counters/XfrRej"/>
+                  <xsl:value-of select="counter"/>
                 </td>
               </tr>
             </xsl:for-each>
           </table>
           <br/>
         </xsl:for-each>
-
+        <h2>Socket I/O Statistics</h2>
+        <table class="counters">
+          <xsl:for-each select="server/counters[@type=&quot;sockstat&quot;]/counter[.&gt;0]">
+            <xsl:variable name="css-class7">
+              <xsl:choose>
+                <xsl:when test="position() mod 2 = 0">even</xsl:when>
+                <xsl:otherwise>odd</xsl:otherwise>
+              </xsl:choose>
+            </xsl:variable>
+            <tr class="{$css-class7}">
+              <th>
+                <xsl:value-of select="@name"/>
+              </th>
+              <td>
+                <xsl:value-of select="."/>
+              </td>
+            </tr>
+          </xsl:for-each>
+        </table>
         <br/>
-
-        <table>
-          <tr class="rowh">
-            <th colspan="7">Network Status</th>
-          </tr>
-          <tr class="rowh">
+        <br/>
+        <h2>Response Codes per view/zone</h2>
+        <xsl:for-each select="views/view[zones/zone/counters[@type=&quot;rcode&quot;]/counter &gt;0]">
+          <h3>View <xsl:value-of select="@name"/></h3>
+          <xsl:variable name="thisview">
+            <xsl:value-of select="@name"/>
+          </xsl:variable>
+          <xsl:for-each select="zones/zone">
+            <xsl:if test="counters[@type=&quot;rcode&quot;]/counter[. &gt; 0]">
+              <h4>Zone <xsl:value-of select="@name"/></h4>
+              <xsl:if test="system-property('xsl:vendor')!='Transformiix'">
+                <!-- Non Mozilla specific markup -->
+              <script type="text/javascript">
+                      graphs.push({
+                                    'title': "Response Codes for zone <xsl:value-of select="@name"/>",
+                                    'target': 'chart_rescode_<xsl:value-of select="../../@name"/>_<xsl:value-of select="@name"/>',
+                                    'data': [['Type','Counter'],<xsl:for-each select="counters[@type=&quot;rcode&quot;]/counter[.&gt;0 and @name != &quot;QryAuthAns&quot;]">['<xsl:value-of select="@name"/>',<xsl:value-of select="."/>],</xsl:for-each>]
+                                    });
+
+                  </script>
+              <xsl:variable name="target">
+                <xsl:value-of select="@name"/>
+              </xsl:variable>
+                <div class="pie" id="chart_rescode_{$thisview}_{$target}"/>
+              </xsl:if>
+              <table class="counters">
+                <xsl:for-each select="counters[@type=&quot;rcode&quot;]/counter[.&gt;0 and @name != &quot;QryAuthAns&quot;]">
+                  <xsl:sort select="."/>
+                  <xsl:variable name="css-class10">
+                    <xsl:choose>
+                      <xsl:when test="position() mod 2 = 0">even</xsl:when>
+                      <xsl:otherwise>odd</xsl:otherwise>
+                    </xsl:choose>
+                  </xsl:variable>
+                  <tr class="{$css-class10}">
+                    <th>
+                      <xsl:value-of select="@name"/>
+                    </th>
+                    <td>
+                      <xsl:value-of select="."/>
+                    </td>
+                  </tr>
+                </xsl:for-each>
+              </table>
+            </xsl:if>
+          </xsl:for-each>
+        </xsl:for-each>
+        <h2>Received QTYPES per view/zone</h2>
+        <xsl:for-each select="views/view[zones/zone/counters[@type=&quot;qtype&quot;]/counter &gt;0]">
+          <h3>View <xsl:value-of select="@name"/></h3>
+          <xsl:variable name="thisview2">
+            <xsl:value-of select="@name"/>
+          </xsl:variable>
+          <xsl:for-each select="zones/zone">
+            <xsl:if test="counters[@type=&quot;qtype&quot;]/counter[count(.) &gt; 0]">
+              <h4>Zone <xsl:value-of select="@name"/></h4>
+              <xsl:if test="system-property('xsl:vendor')!='Transformiix'">
+                <!-- Non Mozilla specific markup -->
+              <script type="text/javascript">
+                      graphs.push({
+                                    'title': "Query Types for zone <xsl:value-of select="@name"/>",
+                                    'target': 'chart_qtype_<xsl:value-of select="../../@name"/>_<xsl:value-of select="@name"/>',
+                                    'data': [['Type','Counter'],<xsl:for-each select="counters[@type=&quot;qtype&quot;]/counter[.&gt;0 and @name != &quot;QryAuthAns&quot;]">['<xsl:value-of select="@name"/>',<xsl:value-of select="."/>],</xsl:for-each>]
+                                    });
+
+                  </script>
+              <xsl:variable name="target">
+                <xsl:value-of select="@name"/>
+              </xsl:variable>
+                <div class="pie" id="chart_qtype_{$thisview2}_{$target}"/>
+              </xsl:if>
+              <table class="counters">
+                <xsl:for-each select="counters[@type=&quot;qtype&quot;]/counter">
+                  <xsl:sort select="."/>
+                  <xsl:variable name="css-class11">
+                    <xsl:choose>
+                      <xsl:when test="position() mod 2 = 0">even</xsl:when>
+                      <xsl:otherwise>odd</xsl:otherwise>
+                    </xsl:choose>
+                  </xsl:variable>
+                  <tr class="{$css-class11}">
+                    <th>
+                      <xsl:value-of select="@name"/>
+                    </th>
+                    <td>
+                      <xsl:value-of select="."/>
+                    </td>
+                  </tr>
+                </xsl:for-each>
+              </table>
+            </xsl:if>
+          </xsl:for-each>
+        </xsl:for-each>
+        <h2>Network Status</h2>
+        <table class="counters">
+          <tr>
             <th>ID</th>
-           <th>Name</th>
+            <th>Name</th>
             <th>Type</th>
             <th>References</th>
             <th>LocalAddress</th>
@@ -373,7 +551,14 @@ div.statcounter br {
             <th>State</th>
           </tr>
           <xsl:for-each select="socketmgr/sockets/socket">
-            <tr class="lrow">
+            <xsl:sort select="id"/>
+            <xsl:variable name="css-class12">
+              <xsl:choose>
+                <xsl:when test="position() mod 2 = 0">even</xsl:when>
+                <xsl:otherwise>odd</xsl:otherwise>
+              </xsl:choose>
+            </xsl:variable>
+            <tr class="{$css-class12}">
               <td>
                 <xsl:value-of select="id"/>
               </td>
@@ -401,56 +586,52 @@ div.statcounter br {
           </xsl:for-each>
         </table>
         <br/>
-        <table>
-          <tr class="rowh">
-            <th colspan="2">Task Manager Configuration</th>
-          </tr>
-          <tr class="lrow">
-            <td>Thread-Model</td>
+        <h2>Task Manager Configuration</h2>
+        <table class="counters">
+          <tr>
+            <th class="even">Thread-Model</th>
             <td>
               <xsl:value-of select="taskmgr/thread-model/type"/>
             </td>
           </tr>
-          <tr class="lrow">
-            <td>Worker Threads</td>
+          <tr class="odd">
+            <th>Worker Threads</th>
             <td>
               <xsl:value-of select="taskmgr/thread-model/worker-threads"/>
             </td>
           </tr>
-          <tr class="lrow">
-            <td>Default Quantum</td>
+          <tr class="even">
+            <th>Default Quantum</th>
             <td>
               <xsl:value-of select="taskmgr/thread-model/default-quantum"/>
             </td>
           </tr>
-          <tr class="lrow">
-            <td>Tasks Running</td>
+          <tr class="odd">
+            <th>Tasks Running</th>
             <td>
               <xsl:value-of select="taskmgr/thread-model/tasks-running"/>
             </td>
           </tr>
-          <tr class="lrow">
-            <td>Tasks Ready</td>
-            <td>
-              <xsl:value-of select="taskmgr/thread-model/tasks-ready"/>
-            </td>
-          </tr>
         </table>
         <br/>
-        <table>
-          <tr class="rowh">
-            <th colspan="6">Tasks</th>
-          </tr>
-          <tr class="rowh">
+        <h2>Tasks</h2>
+        <table class="counters">
+          <tr>
             <th>ID</th>
             <th>Name</th>
             <th>References</th>
             <th>State</th>
             <th>Quantum</th>
-            <th>Events</th>
           </tr>
           <xsl:for-each select="taskmgr/tasks/task">
-            <tr class="lrow">
+            <xsl:sort select="name"/>
+            <xsl:variable name="css-class14">
+              <xsl:choose>
+                <xsl:when test="position() mod 2 = 0">even</xsl:when>
+                <xsl:otherwise>odd</xsl:otherwise>
+              </xsl:choose>
+            </xsl:variable>
+            <tr class="{$css-class14}">
               <td>
                 <xsl:value-of select="id"/>
               </td>
@@ -466,77 +647,88 @@ div.statcounter br {
               <td>
                 <xsl:value-of select="quantum"/>
               </td>
+            </tr>
+          </xsl:for-each>
+        </table>
+        <br/>
+        <h2>Memory Usage Summary</h2>
+        <table class="counters">
+          <xsl:for-each select="memory/summary/*">
+            <xsl:variable name="css-class13">
+              <xsl:choose>
+                <xsl:when test="position() mod 2 = 0">even</xsl:when>
+                <xsl:otherwise>odd</xsl:otherwise>
+              </xsl:choose>
+            </xsl:variable>
+            <tr class="{$css-class13}">
+              <th>
+                <xsl:value-of select="name()"/>
+              </th>
               <td>
-                <xsl:value-of select="events"/>
+                <xsl:value-of select="."/>
               </td>
             </tr>
           </xsl:for-each>
         </table>
-       <br />
-       <table>
-          <tr class="rowh">
-            <th colspan="4">Memory Usage Summary</th>
-          </tr>
-         <xsl:for-each select="memory/summary/*">
-           <tr class="lrow">
-             <td><xsl:value-of select="name()"/></td>
-             <td><xsl:value-of select="."/></td>
-           </tr>
-         </xsl:for-each>
-       </table>
-       <br />
-       <table>
-          <tr class="rowh">
-            <th colspan="10">Memory Contexts</th>
+        <br/>
+        <h2>Memory Contexts</h2>
+        <table class="counters">
+          <tr>
+            <th>ID</th>
+            <th>Name</th>
+            <th>References</th>
+            <th>TotalUse</th>
+            <th>InUse</th>
+            <th>MaxUse</th>
+            <th>BlockSize</th>
+            <th>Pools</th>
+            <th>HiWater</th>
+            <th>LoWater</th>
           </tr>
-         <tr class="rowh">
-           <th>ID</th>
-           <th>Name</th>
-           <th>References</th>
-           <th>TotalUse</th>
-           <th>InUse</th>
-           <th>MaxUse</th>
-           <th>BlockSize</th>
-           <th>Pools</th>
-           <th>HiWater</th>
-           <th>LoWater</th>
-         </tr>
-         <xsl:for-each select="memory/contexts/context">
-           <tr class="lrow">
-             <td>
-               <xsl:value-of select="id"/>
-             </td>
+          <xsl:for-each select="memory/contexts/context">
+            <xsl:sort select="total" data-type="number" order="descending"/>
+            <xsl:variable name="css-class14">
+              <xsl:choose>
+                <xsl:when test="position() mod 2 = 0">even</xsl:when>
+                <xsl:otherwise>odd</xsl:otherwise>
+              </xsl:choose>
+            </xsl:variable>
+            <tr class="{$css-class14}">
+              <td>
+                <xsl:value-of select="id"/>
+              </td>
               <td>
                 <xsl:value-of select="name"/>
               </td>
-             <td>
-               <xsl:value-of select="references"/>
-             </td>
-             <td>
-               <xsl:value-of select="total"/>
-             </td>
-             <td>
-               <xsl:value-of select="inuse"/>
-             </td>
-             <td>
-               <xsl:value-of select="maxinuse"/>
-             </td>
-             <td>
-               <xsl:value-of select="blocksize"/>
-             </td>
-             <td>
-               <xsl:value-of select="pools"/>
-             </td>
-             <td>
-               <xsl:value-of select="hiwater"/>
-             </td>
-             <td>
-               <xsl:value-of select="lowater"/>
-             </td>
-           </tr>
-         </xsl:for-each>
-       </table>
-
+              <td>
+                <xsl:value-of select="references"/>
+              </td>
+              <td>
+                <xsl:value-of select="total"/>
+              </td>
+              <td>
+                <xsl:value-of select="inuse"/>
+              </td>
+              <td>
+                <xsl:value-of select="maxinuse"/>
+              </td>
+              <td>
+                <xsl:value-of select="blocksize"/>
+              </td>
+              <td>
+                <xsl:value-of select="pools"/>
+              </td>
+              <td>
+                <xsl:value-of select="hiwater"/>
+              </td>
+              <td>
+                <xsl:value-of select="lowater"/>
+              </td>
+            </tr>
+          </xsl:for-each>
+        </table>
+        <hr/>
+        <p class="footer">Internet Systems Consortium Inc.<br/><a href="http://www.isc.org">http://www.isc.org</a></p>
       </body>
     </html>
   </xsl:template>
index 946d907614247ce541bed129108166e35cd87461..c6042c7a5f3559a4d188e9333b9255a568c8ef80 100644 (file)
@@ -1,11 +1,11 @@
 /*
  * Generated by convertxsl.pl 1.14 2008/07/17 23:43:26 jinmei Exp  
- * From bind9.xsl 1.21 2009/01/27 23:47:54 tbox Exp 
+ * From <!-- %Id: bind9.xsl 1.21 2009/01/27 23:47:54 tbox Exp %
  */
 static char xslmsg[] =
        "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
        "<!--\n"
-       " - Copyright (C) 2006-2009, 2012 Internet Systems Consortium, Inc. (\"ISC\")\n"
+       " - Copyright (C) 2006-2009 Internet Systems Consortium, Inc. (\"ISC\")\n"
        " -\n"
        " - Permission to use, copy, modify, and/or distribute this software for any\n"
        " - purpose with or without fee is hereby granted, provided that the above\n"
@@ -19,356 +19,533 @@ static char xslmsg[] =
        " - OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\n"
        " - PERFORMANCE OF THIS SOFTWARE.\n"
        "-->\n"
-       "\n"
        "<!-- \045Id: bind9.xsl,v 1.21 2009/01/27 23:47:54 tbox Exp \045 -->\n"
-       "\n"
-       "<xsl:stylesheet version=\"1.0\"\n"
-       " xmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\"\n"
-       " xmlns=\"http://www.w3.org/1999/xhtml\">\n"
-       " <xsl:template match=\"isc/bind/statistics\">\n"
+       "<xsl:stylesheet xmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\" xmlns=\"http://www.w3.org/1999/xhtml\" version=\"1.0\">\n"
+       " <xsl:output method=\"html\" indent=\"yes\" version=\"4.0\"/>\n"
+       " <xsl:template match=\"statistics[@version=&quot;3.0&quot;]\">\n"
        " <html>\n"
        " <head>\n"
+       " <xsl:if test=\"system-property('xsl:vendor')!='Transformiix'\">\n"
+       " <!-- Non Mozilla specific markup -->\n"
+       " <script type=\"text/javascript\" src=\"https://www.google.com/jsapi\"/>\n"
+       " <script type=\"text/javascript\">\n"
+       " \n"
+       " google.load(\"visualization\", \"1\", {packages:[\"corechart\"]});\n"
+       " google.setOnLoadCallback(loadGraphs);\n"
+       "\n"
+       " var graphs=[];\n"
+       " \n"
+       " function drawChart(chart_title,target,data) {\n"
+       " var data = google.visualization.arrayToDataTable(data);\n"
+       "\n"
+       " var options = {\n"
+       " title: chart_title\n"
+       " };\n"
+       " \n"
+       " var chart = new google.visualization.BarChart(document.getElementById(target));\n"
+       " chart.draw(data, options);\n"
+       " }\n"
+       " \n"
+       " function loadGraphs(){\n"
+       " //alert(\"here we are!\");\n"
+       " var g;\n"
+       " \n"
+       " // Server Incoming query Types\n"
+       " while(g = graphs.shift()){\n"
+       " // alert(\"going for: \" + g.target);\n"
+       " drawChart(g.title,g.target,g.data);\n"
+       " }\n"
+       " \n"
+       " }\n"
+       " \n"
+       " // Server Incoming Queries Types \n"
+       " graphs.push({\n"
+       " 'title' : \"Server Incoming Query Types\",\n"
+       " 'target': 'chart_incoming_qtypes',\n"
+       " 'data': [['Type','Counter'],<xsl:for-each select=\"server/counters[@type=&quot;qtype&quot;]/counter\">['<xsl:value-of select=\"@name\"/>',<xsl:value-of select=\".\"/>],</xsl:for-each>]\n"
+       " });\n"
+       "\n"
+       "\n"
+       " // Server Incoming Requests \n"
+       " graphs.push({\n"
+       " 'title' : \"Server Incoming Requests\",\n"
+       " 'target': 'chart_incoming_requests',\n"
+       " 'data': [['Requests','Counter'],<xsl:for-each select=\"server/counters[@type=&quot;opcode&quot;]/counter\">['<xsl:value-of select=\"@name\"/>',<xsl:value-of select=\".\"/>],</xsl:for-each>]});\n"
+       " \n"
+       " \n"
+       " \n"
+       " \n"
+       " </script>\n"
+       " </xsl:if>\n"
        " <style type=\"text/css\">\n"
-       "body {\n"
+       " body {\n"
        " font-family: sans-serif;\n"
        " background-color: #ffffff;\n"
        " color: #000000;\n"
-       "}\n"
-       "\n"
-       "table {\n"
+       " font-size: 10pt;\n"
+       " }\n"
+       " \n"
+       " .odd{\n"
+       " background-color: #f0f0f0;\n"
+       " }\n"
+       " \n"
+       " .even{\n"
+       " background-color: #ffffff;\n"
+       " }\n"
+       " \n"
+       " p.footer{\n"
+       " font-style:italic;\n"
+       " color: grey;\n"
+       " }\n"
+       "\n"
+       " table {\n"
        " border-collapse: collapse;\n"
-       "}\n"
-       "\n"
-       "tr.rowh {\n"
+       " border: 1px solid grey;\n"
+       " }\n"
+       "\n"
+       " table.counters{\n"
+       " border: 1px solid grey;\n"
+       " width: 500px;\n"
+       " }\n"
+       " \n"
+       " table.counters th {\n"
        " text-align: center;\n"
-       " border: 1px solid #000000;\n"
-       " background-color: #8080ff;\n"
-       " color: #ffffff;\n"
-       "}\n"
-       "\n"
-       "tr.row {\n"
-       " text-align: right;\n"
-       " border: 1px solid #000000;\n"
-       " background-color: teal;\n"
-       " color: #ffffff;\n"
-       "}\n"
-       "\n"
-       "tr.lrow {\n"
-       " text-align: left;\n"
-       " border: 1px solid #000000;\n"
-       " background-color: teal;\n"
+       " border: 1px solid grey;\n"
+       " width: 120px;\n"
+       " }\n"
+       " table.counters td{\n"
+       " text-align:center;\n"
+       " \n"
+       " }\n"
+       " \n"
+       " table.counters tr:hover{\n"
+       " background-color: #99ddff;\n"
+       " }\n"
+       " \n"
+       " .totals {\n"
+       " background-color: rgb(1,169,206);\n"
        " color: #ffffff;\n"
-       "}\n"
+       " }\n"
        "\n"
-       "td, th {\n"
+       " td, th {\n"
        " padding-right: 5px;\n"
        " padding-left: 5px;\n"
-       "}\n"
+       " border: 1px solid grey;\n"
+       " }\n"
        "\n"
-       ".header h1 {\n"
-       " background-color: teal;\n"
-       " color: #ffffff;\n"
-       " padding: 4px;\n"
-       "}\n"
+       " .header h1 {\n"
+       " color: rgb(1,169,206);\n"
+       " padding: 0px;\n"
+       " }\n"
        "\n"
-       ".content {\n"
+       " .content {\n"
        " background-color: #ffffff;\n"
        " color: #000000;\n"
        " padding: 4px;\n"
-       "}\n"
+       " }\n"
        "\n"
-       ".item {\n"
+       " .item {\n"
        " padding: 4px;\n"
-       " align: right;\n"
-       "}\n"
+       " text-align: right;\n"
+       " }\n"
        "\n"
-       ".value {\n"
+       " .value {\n"
        " padding: 4px;\n"
        " font-weight: bold;\n"
-       "}\n"
-       "\n"
-       "div.statcounter h2 {\n"
-       " text-align: center;\n"
-       " font-size: large;\n"
-       " border: 1px solid #000000;\n"
-       " background-color: #8080ff;\n"
-       " color: #ffffff;\n"
-       "}\n"
-       "\n"
-       "div.statcounter dl {\n"
-       " float: left;\n"
-       " margin-top: 0;\n"
-       " margin-bottom: 0;\n"
-       " margin-left: 0;\n"
-       " margin-right: 0;\n"
-       "}\n"
-       "\n"
-       "div.statcounter dt {\n"
-       " width: 200px;\n"
-       " text-align: center;\n"
-       " font-weight: bold;\n"
-       " border: 0.5px solid #000000;\n"
-       " background-color: #8080ff;\n"
-       " color: #ffffff;\n"
-       "}\n"
+       " }\n"
+       "\n"
+       "\n"
+       " h2 {\n"
+       " color: grey;\n"
+       " font-size: 14pt;\n"
+       " width:500px;\n"
+       " text-align:center;\n"
+       " }\n"
+       " \n"
+       " h3 {\n"
+       " color: #444444;\n"
+       " font-size: 12pt;\n"
+       " width:500px;\n"
+       " text-align:center;\n"
+       " \n"
+       " }\n"
+       " h4 {\n"
+       " color: rgb(1,169,206);\n"
+       " font-size: 10pt;\n"
+       " width:500px;\n"
+       " text-align:center;\n"
+       " \n"
+       " }\n"
+       "\n"
+       " .pie {\n"
+       " width:500px;\n"
+       " height: 500px;\n"
+       " }\n"
        "\n"
-       "div.statcounter dd {\n"
-       " width: 200px;\n"
-       " text-align: right;\n"
-       " border: 0.5px solid #000000;\n"
-       " background-color: teal;\n"
-       " color: #ffffff;\n"
-       " margin-left: 0;\n"
-       " margin-right: 0;\n"
-       "}\n"
-       "\n"
-       "div.statcounter br {\n"
-       " clear: left;\n"
-       "}\n"
        " </style>\n"
-       " <title>BIND 9 Statistics</title>\n"
+       " <title>ISC BIND 9 Statistics</title>\n"
        " </head>\n"
        " <body>\n"
        " <div class=\"header\">\n"
-       " <h1>Bind 9 Configuration and Statistics</h1>\n"
+       " <h1>ISC Bind 9 Configuration and Statistics</h1>\n"
        " </div>\n"
-       "\n"
-       " <br/>\n"
-       "\n"
-       " <table>\n"
-       " <tr class=\"rowh\"><th colspan=\"2\">Times</th></tr>\n"
-       " <tr class=\"lrow\">\n"
-       " <td>boot-time</td>\n"
-       " <td><xsl:value-of select=\"server/boot-time\"/></td>\n"
+       " <hr/>\n"
+       " <h2>Server Times</h2>\n"
+       " <table class=\"counters\">\n"
+       " <tr>\n"
+       " <th>Boot time:</th>\n"
+       " <td>\n"
+       " <xsl:value-of select=\"server/boot-time\"/>\n"
+       " </td>\n"
        " </tr>\n"
-       " <tr class=\"lrow\">\n"
-       " <td>current-time</td>\n"
-       " <td><xsl:value-of select=\"server/current-time\"/></td>\n"
+       " <tr>\n"
+       " <th>Sample time:</th>\n"
+       " <td>\n"
+       " <xsl:value-of select=\"server/current-time\"/>\n"
+       " </td>\n"
        " </tr>\n"
        " </table>\n"
-       "\n"
        " <br/>\n"
-       "\n"
-       " <table>\n"
-       " <tr class=\"rowh\"><th colspan=\"2\">Incoming Requests</th></tr>\n"
-       " <xsl:for-each select=\"server/requests/opcode\">\n"
-       " <tr class=\"lrow\">\n"
-       " <td><xsl:value-of select=\"name\"/></td>\n"
-       " <td><xsl:value-of select=\"counter\"/></td>\n"
+       " <h2>Incoming Requests</h2>\n"
+       " <xsl:if test=\"system-property('xsl:vendor')!='Transformiix'\">\n"
+       " <!-- Non Mozilla specific markup -->\n"
+       " <div class=\"pie\" id=\"chart_incoming_requests\">[graph incoming requests]</div>\n"
+       " </xsl:if>\n"
+       " <table class=\"counters\">\n"
+       " <xsl:for-each select=\"server/counters[@type=&quot;opcode&quot;]/counter\">\n"
+       " <xsl:sort select=\".\" data-type=\"number\" order=\"descending\"/>\n"
+       " <tr>\n"
+       " <th>\n"
+       " <xsl:value-of select=\"@name\"/>\n"
+       " </th>\n"
+       " <td>\n"
+       " <xsl:value-of select=\".\"/>\n"
+       " </td>\n"
        " </tr>\n"
        " </xsl:for-each>\n"
+       " <tr>\n"
+       " <th class=\"totals\">Total:</th>\n"
+       " <td class=\"totals\">\n"
+       " <xsl:value-of select=\"sum(server/counters[@type=&quot;opcode&quot;]/counter)\"/>\n"
+       " </td>\n"
+       " </tr>\n"
        " </table>\n"
-       "\n"
        " <br/>\n"
-       "\n"
-       " <table>\n"
-       " <tr class=\"rowh\"><th colspan=\"2\">Incoming Queries</th></tr>\n"
-       " <xsl:for-each select=\"server/queries-in/rdtype\">\n"
-       " <tr class=\"lrow\">\n"
-       " <td><xsl:value-of select=\"name\"/></td>\n"
-       " <td><xsl:value-of select=\"counter\"/></td>\n"
+       " <h3>Incoming Queries by Type</h3>\n"
+       " <xsl:if test=\"system-property('xsl:vendor')!='Transformiix'\">\n"
+       " <!-- Non Mozilla specific markup -->\n"
+       " <div class=\"pie\" id=\"chart_incoming_qtypes\">[graph incoming qtypes]</div>\n"
+       " </xsl:if>\n"
+       " <table class=\"counters\">\n"
+       " <xsl:for-each select=\"server/counters[@type=&quot;qtype&quot;]/counter\">\n"
+       " <xsl:sort select=\".\" data-type=\"number\" order=\"descending\"/>\n"
+       " <xsl:variable name=\"css-class\">\n"
+       " <xsl:choose>\n"
+       " <xsl:when test=\"position() mod 2 = 0\">even</xsl:when>\n"
+       " <xsl:otherwise>odd</xsl:otherwise>\n"
+       " </xsl:choose>\n"
+       " </xsl:variable>\n"
+       " <tr class=\"{$css-class}\">\n"
+       " <th>\n"
+       " <xsl:value-of select=\"@name\"/>\n"
+       " </th>\n"
+       " <td>\n"
+       " <xsl:value-of select=\".\"/>\n"
+       " </td>\n"
        " </tr>\n"
        " </xsl:for-each>\n"
+       " <tr>\n"
+       " <th class=\"totals\">Total:</th>\n"
+       " <td class=\"totals\">\n"
+       " <xsl:value-of select=\"sum(server/counters[@type=&quot;qtype&quot;]/counter)\"/>\n"
+       " </td>\n"
+       " </tr>\n"
        " </table>\n"
-       "\n"
        " <br/>\n"
-       "\n"
-       " <xsl:for-each select=\"views/view\">\n"
-       " <table>\n"
-       " <tr class=\"rowh\">\n"
-       " <th colspan=\"2\">Outgoing Queries from View <xsl:value-of select=\"name\"/></th>\n"
-       " </tr>\n"
-       " <xsl:for-each select=\"rdtype\">\n"
-       " <tr class=\"lrow\">\n"
-       " <td><xsl:value-of select=\"name\"/></td>\n"
-       " <td><xsl:value-of select=\"counter\"/></td>\n"
+       " <h2>Outgoing Queries per view</h2>\n"
+       " <xsl:for-each select=\"views/view[count(counters[@type=&quot;resqtype&quot;]/counter) &gt; 0]\">\n"
+       " <h3>View <xsl:value-of select=\"@name\"/></h3>\n"
+       " <xsl:if test=\"system-property('xsl:vendor')!='Transformiix'\">\n"
+       " <!-- Non Mozilla specific markup -->\n"
+       " <script type=\"text/javascript\">\n"
+       " graphs.push({\n"
+       " 'title': \"Outgoing queries for view: <xsl:value-of select=\"@name\"/>\",\n"
+       " 'target': 'chart_outgoing_queries_view_<xsl:value-of select=\"@name\"/>',\n"
+       " 'data': [['Type','Counter'],<xsl:for-each select=\"counters[@type=&quot;resqtype&quot;]/counter\">['<xsl:value-of select=\"@name\"/>',<xsl:value-of select=\".\"/>],</xsl:for-each>]\n"
+       " });\n"
+       " \n"
+       " </script>\n"
+       " <xsl:variable name=\"target\">\n"
+       " <xsl:value-of select=\"@name\"/>\n"
+       " </xsl:variable>\n"
+       " <div class=\"pie\" id=\"chart_outgoing_queries_view_{$target}\"/>\n"
+       " </xsl:if>\n"
+       " <table class=\"counters\">\n"
+       " <xsl:for-each select=\"counters[@type=&quot;resqtype&quot;]/counter\">\n"
+       " <xsl:sort select=\".\" data-type=\"number\" order=\"descending\"/>\n"
+       " <xsl:variable name=\"css-class1\">\n"
+       " <xsl:choose>\n"
+       " <xsl:when test=\"position() mod 2 = 0\">even</xsl:when>\n"
+       " <xsl:otherwise>odd</xsl:otherwise>\n"
+       " </xsl:choose>\n"
+       " </xsl:variable>\n"
+       " <tr class=\"{$css-class1}\">\n"
+       " <th>\n"
+       " <xsl:value-of select=\"@name\"/>\n"
+       " </th>\n"
+       " <td>\n"
+       " <xsl:value-of select=\".\"/>\n"
+       " </td>\n"
        " </tr>\n"
        " </xsl:for-each>\n"
        " </table>\n"
        " <br/>\n"
        " </xsl:for-each>\n"
-       "\n"
-       " <br/>\n"
-       "\n"
-       " <div class=\"statcounter\">\n"
        " <h2>Server Statistics</h2>\n"
-       " <xsl:for-each select=\"server/nsstat\">\n"
-       " <dl>\n"
-       " <dt><xsl:value-of select=\"name\"/></dt>\n"
-       " <dd><xsl:value-of select=\"counter\"/></dd>\n"
-       " </dl>\n"
+       " <xsl:if test=\"system-property('xsl:vendor')!='Transformiix'\">\n"
+       " <!-- Non Mozilla specific markup -->\n"
+       " <script type=\"text/javascript\">\n"
+       " graphs.push({\n"
+       " 'title' : \"Server Response Types\",\n"
+       " 'target': 'chart_server_nsstat_restype',\n"
+       " 'data': [['Type','Counter'],<xsl:for-each select=\"server/counters[@type=&quot;nsstat&quot;]/counter[.&gt;0]\">['<xsl:value-of select=\"@name\"/>',<xsl:value-of select=\".\"/>],</xsl:for-each>]\n"
+       " });\n"
+       " \n"
+       " </script>\n"
+       " <div class=\"pie\" id=\"chart_server_nsstat_restype\"/>\n"
+       " </xsl:if>\n"
+       " <table class=\"counters\">\n"
+       " <xsl:for-each select=\"server/counters[@type=&quot;nsstat&quot;]/counter[.&gt;0]\">\n"
+       " <xsl:sort select=\".\" data-type=\"number\" order=\"descending\"/>\n"
+       " <xsl:variable name=\"css-class2\">\n"
+       " <xsl:choose>\n"
+       " <xsl:when test=\"position() mod 2 = 0\">even</xsl:when>\n"
+       " <xsl:otherwise>odd</xsl:otherwise>\n"
+       " </xsl:choose>\n"
+       " </xsl:variable>\n"
+       " <tr class=\"{$css-class2}\">\n"
+       " <th>\n"
+       " <xsl:value-of select=\"@name\"/>\n"
+       " </th>\n"
+       " <td>\n"
+       " <xsl:value-of select=\".\"/>\n"
+       " </td>\n"
+       " </tr>\n"
        " </xsl:for-each>\n"
+       " </table>\n"
        " <br/>\n"
-       " </div>\n"
-       "\n"
-       " <div class=\"statcounter\">\n"
        " <h2>Zone Maintenance Statistics</h2>\n"
-       " <xsl:for-each select=\"server/zonestat\">\n"
-       " <dl>\n"
-       " <dt><xsl:value-of select=\"name\"/></dt>\n"
-       " <dd><xsl:value-of select=\"counter\"/></dd>\n"
-       " </dl>\n"
+       " <xsl:if test=\"system-property('xsl:vendor')!='Transformiix'\">\n"
+       " <script type=\"text/javascript\">\n"
+       " graphs.push({\n"
+       " 'title' : \"Zone Maintenance Stats\",\n"
+       " 'target': 'chart_server_zone_maint',\n"
+       " 'data': [['Type','Counter'],<xsl:for-each select=\"server/counters[@type=&quot;zonestat&quot;]/counter\">['<xsl:value-of select=\"@name\"/>',<xsl:value-of select=\".\"/>],</xsl:for-each>]\n"
+       " });\n"
+       "\n"
+       " </script>\n"
+       " <!-- Non Mozilla specific markup -->\n"
+       " <div class=\"pie\" id=\"chart_server_zone_maint\"/>\n"
+       " </xsl:if>\n"
+       " <table class=\"counters\">\n"
+       " <xsl:for-each select=\"server/counters[@type=&quot;zonestat&quot;]/counter\">\n"
+       " <xsl:sort select=\".\" data-type=\"number\" order=\"descending\"/>\n"
+       " <xsl:variable name=\"css-class3\">\n"
+       " <xsl:choose>\n"
+       " <xsl:when test=\"position() mod 2 = 0\">even</xsl:when>\n"
+       " <xsl:otherwise>odd</xsl:otherwise>\n"
+       " </xsl:choose>\n"
+       " </xsl:variable>\n"
+       " <tr class=\"{$css-class3}\">\n"
+       " <th>\n"
+       " <xsl:value-of select=\"@name\"/>\n"
+       " </th>\n"
+       " <td>\n"
+       " <xsl:value-of select=\".\"/>\n"
+       " </td>\n"
+       " </tr>\n"
        " </xsl:for-each>\n"
-       " <br />\n"
-       " </div>\n"
-       "\n"
-       " <div class=\"statcounter\">\n"
+       " </table>\n"
        " <h2>Resolver Statistics (Common)</h2>\n"
-       " <xsl:for-each select=\"server/resstat\">\n"
-       " <dl>\n"
-       " <dt><xsl:value-of select=\"name\"/></dt>\n"
-       " <dd><xsl:value-of select=\"counter\"/></dd>\n"
-       " </dl>\n"
-       " </xsl:for-each>\n"
-       " <br />\n"
-       " </div>\n"
-       "\n"
-       " <xsl:for-each select=\"views/view\">\n"
-       " <div class=\"statcounter\">\n"
-       " <h2>Resolver Statistics for View <xsl:value-of select=\"name\"/></h2>\n"
-       " <xsl:for-each select=\"resstat\">\n"
-       " <dl>\n"
-       " <dt><xsl:value-of select=\"name\"/></dt>\n"
-       " <dd><xsl:value-of select=\"counter\"/></dd>\n"
-       " </dl>\n"
-       " </xsl:for-each>\n"
-       " <br />\n"
-       " </div>\n"
-       " </xsl:for-each>\n"
-       "\n"
-       " <br />\n"
-       "\n"
-       " <div class=\"statcounter\">\n"
-       " <h2>ADB Statistics (Common)</h2>\n"
-       " <xsl:for-each select=\"server/adbstat\">\n"
-       " <dl>\n"
-       " <dt><xsl:value-of select=\"name\"/></dt>\n"
-       " <dd><xsl:value-of select=\"counter\"/></dd>\n"
-       " </dl>\n"
-       " </xsl:for-each>\n"
-       " <br />\n"
-       " </div>\n"
-       "\n"
-       " <xsl:for-each select=\"views/view\">\n"
-       " <div class=\"statcounter\">\n"
-       " <h2>ADB Statistics for View <xsl:value-of select=\"name\"/></h2>\n"
-       " <xsl:for-each select=\"adbstat\">\n"
-       " <dl>\n"
-       " <dt><xsl:value-of select=\"name\"/></dt>\n"
-       " <dd><xsl:value-of select=\"counter\"/></dd>\n"
-       " </dl>\n"
-       " </xsl:for-each>\n"
-       " <br />\n"
-       " </div>\n"
+       " <table class=\"counters\">\n"
+       " <xsl:for-each select=\"server/counters[@type=&quot;restat&quot;]/counter\">\n"
+       " <xsl:sort select=\".\" data-type=\"number\" order=\"descending\"/>\n"
+       " <xsl:variable name=\"css-class4\">\n"
+       " <xsl:choose>\n"
+       " <xsl:when test=\"position() mod 2 = 0\">even</xsl:when>\n"
+       " <xsl:otherwise>odd</xsl:otherwise>\n"
+       " </xsl:choose>\n"
+       " </xsl:variable>\n"
+       " <tr class=\"{$css-class4}\">\n"
+       " <th>\n"
+       " <xsl:value-of select=\"@name\"/>\n"
+       " </th>\n"
+       " <td>\n"
+       " <xsl:value-of select=\".\"/>\n"
+       " </td>\n"
+       " </tr>\n"
        " </xsl:for-each>\n"
-       "\n"
-       " <br />\n"
-       "\n"
+       " </table>\n"
        " <xsl:for-each select=\"views/view\">\n"
-       " <table>\n"
-       " <tr class=\"rowh\">\n"
-       " <th colspan=\"2\">Cache Statistics for View <xsl:value-of select=\"name\"/></th>\n"
-       " </tr>\n"
-       " <xsl:for-each select=\"cachestats/cachestat\">\n"
-       " <tr class=\"lrow\">\n"
-       " <td><xsl:value-of select=\"name\"/></td>\n"
-       " <td><xsl:value-of select=\"value\"/></td>\n"
+       " <h3>Resolver Statistics for View <xsl:value-of select=\"@name\"/></h3>\n"
+       " <table class=\"counters\">\n"
+       " <xsl:for-each select=\"counters[@type=&quot;resstats&quot;]/counter[.&gt;0]\">\n"
+       " <xsl:sort select=\".\" data-type=\"number\" order=\"descending\"/>\n"
+       " <xsl:variable name=\"css-class5\">\n"
+       " <xsl:choose>\n"
+       " <xsl:when test=\"position() mod 2 = 0\">even</xsl:when>\n"
+       " <xsl:otherwise>odd</xsl:otherwise>\n"
+       " </xsl:choose>\n"
+       " </xsl:variable>\n"
+       " <tr class=\"{$css-class5}\">\n"
+       " <th>\n"
+       " <xsl:value-of select=\"@name\"/>\n"
+       " </th>\n"
+       " <td>\n"
+       " <xsl:value-of select=\".\"/>\n"
+       " </td>\n"
        " </tr>\n"
        " </xsl:for-each>\n"
        " </table>\n"
-       " <br/>\n"
        " </xsl:for-each>\n"
-       "\n"
+       " <h3>Cache DB RRsets for View <xsl:value-of select=\"@name\"/></h3>\n"
        " <xsl:for-each select=\"views/view\">\n"
-       " <table>\n"
-       " <tr class=\"rowh\">\n"
-       " <th colspan=\"2\">Cache DB RRsets for View <xsl:value-of select=\"name\"/></th>\n"
-       " </tr>\n"
+       " <table class=\"counters\">\n"
        " <xsl:for-each select=\"cache/rrset\">\n"
-       " <tr class=\"lrow\">\n"
-       " <td><xsl:value-of select=\"name\"/></td>\n"
-       " <td><xsl:value-of select=\"counter\"/></td>\n"
+       " <xsl:variable name=\"css-class6\">\n"
+       " <xsl:choose>\n"
+       " <xsl:when test=\"position() mod 2 = 0\">even</xsl:when>\n"
+       " <xsl:otherwise>odd</xsl:otherwise>\n"
+       " </xsl:choose>\n"
+       " </xsl:variable>\n"
+       " <tr class=\"{$css-class6}\">\n"
+       " <th>\n"
+       " <xsl:value-of select=\"name\"/>\n"
+       " </th>\n"
+       " <td>\n"
+       " <xsl:value-of select=\"counter\"/>\n"
+       " </td>\n"
        " </tr>\n"
        " </xsl:for-each>\n"
        " </table>\n"
        " <br/>\n"
        " </xsl:for-each>\n"
-       "\n"
-       " <div class=\"statcounter\">\n"
        " <h2>Socket I/O Statistics</h2>\n"
-       " <xsl:for-each select=\"server/sockstat\">\n"
-       " <dl>\n"
-       " <dt><xsl:value-of select=\"name\"/></dt>\n"
-       " <dd><xsl:value-of select=\"counter\"/></dd>\n"
-       " </dl>\n"
+       " <table class=\"counters\">\n"
+       " <xsl:for-each select=\"server/counters[@type=&quot;sockstat&quot;]/counter[.&gt;0]\">\n"
+       " <xsl:variable name=\"css-class7\">\n"
+       " <xsl:choose>\n"
+       " <xsl:when test=\"position() mod 2 = 0\">even</xsl:when>\n"
+       " <xsl:otherwise>odd</xsl:otherwise>\n"
+       " </xsl:choose>\n"
+       " </xsl:variable>\n"
+       " <tr class=\"{$css-class7}\">\n"
+       " <th>\n"
+       " <xsl:value-of select=\"@name\"/>\n"
+       " </th>\n"
+       " <td>\n"
+       " <xsl:value-of select=\".\"/>\n"
+       " </td>\n"
+       " </tr>\n"
        " </xsl:for-each>\n"
+       " </table>\n"
        " <br/>\n"
-       " </div>\n"
-       "\n"
        " <br/>\n"
-       "\n"
-       " <xsl:for-each select=\"views/view\">\n"
-       " <table>\n"
-       " <tr class=\"rowh\">\n"
-       " <th colspan=\"10\">Zones for View <xsl:value-of select=\"name\"/></th>\n"
-       " </tr>\n"
-       " <tr class=\"rowh\">\n"
-       " <th>Name</th>\n"
-       " <th>Class</th>\n"
-       " <th>Serial</th>\n"
-       " <th>Success</th>\n"
-       " <th>Referral</th>\n"
-       " <th>NXRRSET</th>\n"
-       " <th>NXDOMAIN</th>\n"
-       " <th>Failure</th>\n"
-       " <th>XfrReqDone</th>\n"
-       " <th>XfrRej</th>\n"
-       " </tr>\n"
+       " <h2>Response Codes per view/zone</h2>\n"
+       " <xsl:for-each select=\"views/view[zones/zone/counters[@type=&quot;rcode&quot;]/counter &gt;0]\">\n"
+       " <h3>View <xsl:value-of select=\"@name\"/></h3>\n"
+       " <xsl:variable name=\"thisview\">\n"
+       " <xsl:value-of select=\"@name\"/>\n"
+       " </xsl:variable>\n"
        " <xsl:for-each select=\"zones/zone\">\n"
-       " <tr class=\"lrow\">\n"
-       " <td>\n"
-       " <xsl:value-of select=\"name\"/>\n"
-       " </td>\n"
-       " <td>\n"
-       " <xsl:value-of select=\"rdataclass\"/>\n"
-       " </td>\n"
-       " <td>\n"
-       " <xsl:value-of select=\"serial\"/>\n"
-       " </td>\n"
-       " <td>\n"
-       " <xsl:value-of select=\"counters/QrySuccess\"/>\n"
-       " </td>\n"
-       " <td>\n"
-       " <xsl:value-of select=\"counters/QryReferral\"/>\n"
-       " </td>\n"
-       " <td>\n"
-       " <xsl:value-of select=\"counters/QryNxrrset\"/>\n"
-       " </td>\n"
-       " <td>\n"
-       " <xsl:value-of select=\"counters/QryNXDOMAIN\"/>\n"
-       " </td>\n"
-       " <td>\n"
-       " <xsl:value-of select=\"counters/QryFailure\"/>\n"
-       " </td>\n"
+       " <xsl:if test=\"counters[@type=&quot;rcode&quot;]/counter[. &gt; 0]\">\n"
+       " <h4>Zone <xsl:value-of select=\"@name\"/></h4>\n"
+       " <xsl:if test=\"system-property('xsl:vendor')!='Transformiix'\">\n"
+       " <!-- Non Mozilla specific markup -->\n"
+       " <script type=\"text/javascript\">\n"
+       " graphs.push({\n"
+       " 'title': \"Response Codes for zone <xsl:value-of select=\"@name\"/>\",\n"
+       " 'target': 'chart_rescode_<xsl:value-of select=\"../../@name\"/>_<xsl:value-of select=\"@name\"/>',\n"
+       " 'data': [['Type','Counter'],<xsl:for-each select=\"counters[@type=&quot;rcode&quot;]/counter[.&gt;0 and @name != &quot;QryAuthAns&quot;]\">['<xsl:value-of select=\"@name\"/>',<xsl:value-of select=\".\"/>],</xsl:for-each>]\n"
+       " });\n"
+       "\n"
+       " </script>\n"
+       " <xsl:variable name=\"target\">\n"
+       " <xsl:value-of select=\"@name\"/>\n"
+       " </xsl:variable>\n"
+       " <div class=\"pie\" id=\"chart_rescode_{$thisview}_{$target}\"/>\n"
+       " </xsl:if>\n"
+       " <table class=\"counters\">\n"
+       " <xsl:for-each select=\"counters[@type=&quot;rcode&quot;]/counter[.&gt;0 and @name != &quot;QryAuthAns&quot;]\">\n"
+       " <xsl:sort select=\".\"/>\n"
+       " <xsl:variable name=\"css-class10\">\n"
+       " <xsl:choose>\n"
+       " <xsl:when test=\"position() mod 2 = 0\">even</xsl:when>\n"
+       " <xsl:otherwise>odd</xsl:otherwise>\n"
+       " </xsl:choose>\n"
+       " </xsl:variable>\n"
+       " <tr class=\"{$css-class10}\">\n"
+       " <th>\n"
+       " <xsl:value-of select=\"@name\"/>\n"
+       " </th>\n"
        " <td>\n"
-       " <xsl:value-of select=\"counters/XfrReqDone\"/>\n"
+       " <xsl:value-of select=\".\"/>\n"
        " </td>\n"
+       " </tr>\n"
+       " </xsl:for-each>\n"
+       " </table>\n"
+       " </xsl:if>\n"
+       " </xsl:for-each>\n"
+       " </xsl:for-each>\n"
+       " <h2>Received QTYPES per view/zone</h2>\n"
+       " <xsl:for-each select=\"views/view[zones/zone/counters[@type=&quot;qtype&quot;]/counter &gt;0]\">\n"
+       " <h3>View <xsl:value-of select=\"@name\"/></h3>\n"
+       " <xsl:variable name=\"thisview2\">\n"
+       " <xsl:value-of select=\"@name\"/>\n"
+       " </xsl:variable>\n"
+       " <xsl:for-each select=\"zones/zone\">\n"
+       " <xsl:if test=\"counters[@type=&quot;qtype&quot;]/counter[count(.) &gt; 0]\">\n"
+       " <h4>Zone <xsl:value-of select=\"@name\"/></h4>\n"
+       " <xsl:if test=\"system-property('xsl:vendor')!='Transformiix'\">\n"
+       " <!-- Non Mozilla specific markup -->\n"
+       " <script type=\"text/javascript\">\n"
+       " graphs.push({\n"
+       " 'title': \"Query Types for zone <xsl:value-of select=\"@name\"/>\",\n"
+       " 'target': 'chart_qtype_<xsl:value-of select=\"../../@name\"/>_<xsl:value-of select=\"@name\"/>',\n"
+       " 'data': [['Type','Counter'],<xsl:for-each select=\"counters[@type=&quot;qtype&quot;]/counter[.&gt;0 and @name != &quot;QryAuthAns&quot;]\">['<xsl:value-of select=\"@name\"/>',<xsl:value-of select=\".\"/>],</xsl:for-each>]\n"
+       " });\n"
+       "\n"
+       " </script>\n"
+       " <xsl:variable name=\"target\">\n"
+       " <xsl:value-of select=\"@name\"/>\n"
+       " </xsl:variable>\n"
+       " <div class=\"pie\" id=\"chart_qtype_{$thisview2}_{$target}\"/>\n"
+       " </xsl:if>\n"
+       " <table class=\"counters\">\n"
+       " <xsl:for-each select=\"counters[@type=&quot;qtype&quot;]/counter\">\n"
+       " <xsl:sort select=\".\"/>\n"
+       " <xsl:variable name=\"css-class11\">\n"
+       " <xsl:choose>\n"
+       " <xsl:when test=\"position() mod 2 = 0\">even</xsl:when>\n"
+       " <xsl:otherwise>odd</xsl:otherwise>\n"
+       " </xsl:choose>\n"
+       " </xsl:variable>\n"
+       " <tr class=\"{$css-class11}\">\n"
+       " <th>\n"
+       " <xsl:value-of select=\"@name\"/>\n"
+       " </th>\n"
        " <td>\n"
-       " <xsl:value-of select=\"counters/XfrRej\"/>\n"
+       " <xsl:value-of select=\".\"/>\n"
        " </td>\n"
        " </tr>\n"
        " </xsl:for-each>\n"
        " </table>\n"
-       " <br/>\n"
+       " </xsl:if>\n"
        " </xsl:for-each>\n"
-       "\n"
-       " <br/>\n"
-       "\n"
-       " <table>\n"
-       " <tr class=\"rowh\">\n"
-       " <th colspan=\"7\">Network Status</th>\n"
-       " </tr>\n"
-       " <tr class=\"rowh\">\n"
+       " </xsl:for-each>\n"
+       " <h2>Network Status</h2>\n"
+       " <table class=\"counters\">\n"
+       " <tr>\n"
        " <th>ID</th>\n"
        " <th>Name</th>\n"
        " <th>Type</th>\n"
@@ -378,7 +555,14 @@ static char xslmsg[] =
        " <th>State</th>\n"
        " </tr>\n"
        " <xsl:for-each select=\"socketmgr/sockets/socket\">\n"
-       " <tr class=\"lrow\">\n"
+       " <xsl:sort select=\"id\"/>\n"
+       " <xsl:variable name=\"css-class12\">\n"
+       " <xsl:choose>\n"
+       " <xsl:when test=\"position() mod 2 = 0\">even</xsl:when>\n"
+       " <xsl:otherwise>odd</xsl:otherwise>\n"
+       " </xsl:choose>\n"
+       " </xsl:variable>\n"
+       " <tr class=\"{$css-class12}\">\n"
        " <td>\n"
        " <xsl:value-of select=\"id\"/>\n"
        " </td>\n"
@@ -406,56 +590,52 @@ static char xslmsg[] =
        " </xsl:for-each>\n"
        " </table>\n"
        " <br/>\n"
-       " <table>\n"
-       " <tr class=\"rowh\">\n"
-       " <th colspan=\"2\">Task Manager Configuration</th>\n"
-       " </tr>\n"
-       " <tr class=\"lrow\">\n"
-       " <td>Thread-Model</td>\n"
+       " <h2>Task Manager Configuration</h2>\n"
+       " <table class=\"counters\">\n"
+       " <tr>\n"
+       " <th class=\"even\">Thread-Model</th>\n"
        " <td>\n"
        " <xsl:value-of select=\"taskmgr/thread-model/type\"/>\n"
        " </td>\n"
        " </tr>\n"
-       " <tr class=\"lrow\">\n"
-       " <td>Worker Threads</td>\n"
+       " <tr class=\"odd\">\n"
+       " <th>Worker Threads</th>\n"
        " <td>\n"
        " <xsl:value-of select=\"taskmgr/thread-model/worker-threads\"/>\n"
        " </td>\n"
        " </tr>\n"
-       " <tr class=\"lrow\">\n"
-       " <td>Default Quantum</td>\n"
+       " <tr class=\"even\">\n"
+       " <th>Default Quantum</th>\n"
        " <td>\n"
        " <xsl:value-of select=\"taskmgr/thread-model/default-quantum\"/>\n"
        " </td>\n"
        " </tr>\n"
-       " <tr class=\"lrow\">\n"
-       " <td>Tasks Running</td>\n"
+       " <tr class=\"odd\">\n"
+       " <th>Tasks Running</th>\n"
        " <td>\n"
        " <xsl:value-of select=\"taskmgr/thread-model/tasks-running\"/>\n"
        " </td>\n"
        " </tr>\n"
-       " <tr class=\"lrow\">\n"
-       " <td>Tasks Ready</td>\n"
-       " <td>\n"
-       " <xsl:value-of select=\"taskmgr/thread-model/tasks-ready\"/>\n"
-       " </td>\n"
-       " </tr>\n"
        " </table>\n"
        " <br/>\n"
-       " <table>\n"
-       " <tr class=\"rowh\">\n"
-       " <th colspan=\"6\">Tasks</th>\n"
-       " </tr>\n"
-       " <tr class=\"rowh\">\n"
+       " <h2>Tasks</h2>\n"
+       " <table class=\"counters\">\n"
+       " <tr>\n"
        " <th>ID</th>\n"
        " <th>Name</th>\n"
        " <th>References</th>\n"
        " <th>State</th>\n"
        " <th>Quantum</th>\n"
-       " <th>Events</th>\n"
        " </tr>\n"
        " <xsl:for-each select=\"taskmgr/tasks/task\">\n"
-       " <tr class=\"lrow\">\n"
+       " <xsl:sort select=\"name\"/>\n"
+       " <xsl:variable name=\"css-class14\">\n"
+       " <xsl:choose>\n"
+       " <xsl:when test=\"position() mod 2 = 0\">even</xsl:when>\n"
+       " <xsl:otherwise>odd</xsl:otherwise>\n"
+       " </xsl:choose>\n"
+       " </xsl:variable>\n"
+       " <tr class=\"{$css-class14}\">\n"
        " <td>\n"
        " <xsl:value-of select=\"id\"/>\n"
        " </td>\n"
@@ -471,30 +651,33 @@ static char xslmsg[] =
        " <td>\n"
        " <xsl:value-of select=\"quantum\"/>\n"
        " </td>\n"
-       " <td>\n"
-       " <xsl:value-of select=\"events\"/>\n"
-       " </td>\n"
        " </tr>\n"
        " </xsl:for-each>\n"
        " </table>\n"
-       " <br />\n"
-       " <table>\n"
-       " <tr class=\"rowh\">\n"
-       " <th colspan=\"4\">Memory Usage Summary</th>\n"
-       " </tr>\n"
+       " <br/>\n"
+       " <h2>Memory Usage Summary</h2>\n"
+       " <table class=\"counters\">\n"
        " <xsl:for-each select=\"memory/summary/*\">\n"
-       " <tr class=\"lrow\">\n"
-       " <td><xsl:value-of select=\"name()\"/></td>\n"
-       " <td><xsl:value-of select=\".\"/></td>\n"
+       " <xsl:variable name=\"css-class13\">\n"
+       " <xsl:choose>\n"
+       " <xsl:when test=\"position() mod 2 = 0\">even</xsl:when>\n"
+       " <xsl:otherwise>odd</xsl:otherwise>\n"
+       " </xsl:choose>\n"
+       " </xsl:variable>\n"
+       " <tr class=\"{$css-class13}\">\n"
+       " <th>\n"
+       " <xsl:value-of select=\"name()\"/>\n"
+       " </th>\n"
+       " <td>\n"
+       " <xsl:value-of select=\".\"/>\n"
+       " </td>\n"
        " </tr>\n"
        " </xsl:for-each>\n"
        " </table>\n"
-       " <br />\n"
-       " <table>\n"
-       " <tr class=\"rowh\">\n"
-       " <th colspan=\"10\">Memory Contexts</th>\n"
-       " </tr>\n"
-       " <tr class=\"rowh\">\n"
+       " <br/>\n"
+       " <h2>Memory Contexts</h2>\n"
+       " <table class=\"counters\">\n"
+       " <tr>\n"
        " <th>ID</th>\n"
        " <th>Name</th>\n"
        " <th>References</th>\n"
@@ -507,7 +690,14 @@ static char xslmsg[] =
        " <th>LoWater</th>\n"
        " </tr>\n"
        " <xsl:for-each select=\"memory/contexts/context\">\n"
-       " <tr class=\"lrow\">\n"
+       " <xsl:sort select=\"total\" data-type=\"number\" order=\"descending\"/>\n"
+       " <xsl:variable name=\"css-class14\">\n"
+       " <xsl:choose>\n"
+       " <xsl:when test=\"position() mod 2 = 0\">even</xsl:when>\n"
+       " <xsl:otherwise>odd</xsl:otherwise>\n"
+       " </xsl:choose>\n"
+       " </xsl:variable>\n"
+       " <tr class=\"{$css-class14}\">\n"
        " <td>\n"
        " <xsl:value-of select=\"id\"/>\n"
        " </td>\n"
@@ -541,7 +731,8 @@ static char xslmsg[] =
        " </tr>\n"
        " </xsl:for-each>\n"
        " </table>\n"
-       "\n"
+       " <hr/>\n"
+       " <p class=\"footer\">Internet Systems Consortium Inc.<br/><a href=\"http://www.isc.org\">http://www.isc.org</a></p>\n"
        " </body>\n"
        " </html>\n"
        " </xsl:template>\n"
index 2c794af924821a997e2fa78508f9574bc746ae73..25b70d82a5f0db08740a0df74ff1fc54cef23ec8 100644 (file)
@@ -173,39 +173,62 @@ rpz_st_clear(ns_client_t *client);
 static inline void
 inc_stats(ns_client_t *client, isc_statscounter_t counter) {
        dns_zone_t *zone = client->query.authzone;
+       dns_rdatatype_t qtype;
+       dns_rdataset_t *rdataset;
+       isc_stats_t *zonestats;
+       dns_stats_t *querystats = NULL;
 
        isc_stats_increment(ns_g_server->nsstats, counter);
 
-       if (zone != NULL) {
-               isc_stats_t *zonestats = dns_zone_getrequeststats(zone);
-               if (zonestats != NULL)
-                       isc_stats_increment(zonestats, counter);
+       if (zone == NULL)
+               return;
+
+       /* Do regular response type stats */
+       zonestats = dns_zone_getrequeststats(zone);
+
+       if (zonestats != NULL)
+               isc_stats_increment(zonestats, counter);
+
+       /* Do query type statistics
+        *
+        * We only increment per-type if we're using the authoriative
+        * answer counter, preventing double-counting.
+        */
+       if (counter == dns_nsstatscounter_authans) {
+               querystats = dns_zone_getrcvquerystats(zone);
+               if (querystats != NULL) {
+                       rdataset = ISC_LIST_HEAD(client->query.qname->list);
+                       if (rdataset != NULL) {
+                               qtype = rdataset->type;
+                               dns_rdatatypestats_increment(querystats, qtype);
+                       }
+               }
        }
 }
 
 static void
 query_send(ns_client_t *client) {
        isc_statscounter_t counter;
+
        if ((client->message->flags & DNS_MESSAGEFLAG_AA) == 0)
                inc_stats(client, dns_nsstatscounter_nonauthans);
        else
                inc_stats(client, dns_nsstatscounter_authans);
+
        if (client->message->rcode == dns_rcode_noerror) {
-               if (ISC_LIST_EMPTY(client->message->sections[DNS_SECTION_ANSWER])) {
-                       if (client->query.isreferral) {
+               dns_section_t answer = DNS_SECTION_ANSWER;
+               if (ISC_LIST_EMPTY(client->message->sections[answer])) {
+                       if (client->query.isreferral)
                                counter = dns_nsstatscounter_referral;
-                       } else {
+                       else
                                counter = dns_nsstatscounter_nxrrset;
-                       }
-               } else {
+               } else
                        counter = dns_nsstatscounter_success;
-               }
-       } else if (client->message->rcode == dns_rcode_nxdomain) {
+       } else if (client->message->rcode == dns_rcode_nxdomain)
                counter = dns_nsstatscounter_nxdomain;
-       } else {
-               /* We end up here in case of YXDOMAIN, and maybe others */
+       else /* We end up here in case of YXDOMAIN, and maybe others */
                counter = dns_nsstatscounter_failure;
-       }
+
        inc_stats(client, counter);
        ns_client_send(client);
 }
@@ -7476,6 +7499,7 @@ ns_query_start(ns_client_t *client) {
        INSIST(rdataset != NULL);
        qtype = rdataset->type;
        dns_rdatatypestats_increment(ns_g_server->rcvquerystats, qtype);
+
        if (dns_rdatatype_ismeta(qtype)) {
                switch (qtype) {
                case dns_rdatatype_any:
index 8cb5ce4f797b8c7e163b84034fb83fa91d3fe7b7..bfa6dd4b2bfe0da8733220451d8c166594917ad7 100644 (file)
@@ -189,7 +189,7 @@ init_desc(void) {
        SET_NSSTATDESC(servfail, "queries resulted in SERVFAIL", "QrySERVFAIL");
        SET_NSSTATDESC(formerr, "queries resulted in FORMERR", "QryFORMERR");
        SET_NSSTATDESC(nxdomain, "queries resulted in NXDOMAIN", "QryNXDOMAIN");
-       SET_NSSTATDESC(recursion, "queries caused recursion","QryRecursion");
+       SET_NSSTATDESC(recursion, "queries caused recursion", "QryRecursion");
        SET_NSSTATDESC(duplicate, "duplicate queries received", "QryDuplicate");
        SET_NSSTATDESC(dropped, "queries dropped", "QryDropped");
        SET_NSSTATDESC(failure, "other query failures", "QryFailure");
@@ -334,7 +334,8 @@ init_desc(void) {
        SET_ZONESTATDESC(axfrreqv6, "IPv6 AXFR requested", "AXFRReqv6");
        SET_ZONESTATDESC(ixfrreqv4, "IPv4 IXFR requested", "IXFRReqv4");
        SET_ZONESTATDESC(ixfrreqv6, "IPv6 IXFR requested", "IXFRReqv6");
-       SET_ZONESTATDESC(xfrsuccess, "transfer requests succeeded","XfrSuccess");
+       SET_ZONESTATDESC(xfrsuccess, "transfer requests succeeded",
+                        "XfrSuccess");
        SET_ZONESTATDESC(xfrfail, "transfer requests failed", "XfrFail");
        INSIST(i == dns_zonestatscounter_max);
 
@@ -463,7 +464,7 @@ init_desc(void) {
        do { \
                set_desc(dns_dnssecstats_ ## counterid, \
                         dns_dnssecstats_max, \
-                        desc, dnssecstats_desc,\
+                        desc, dnssecstats_desc, \
                         xmldesc, dnssecstats_xmldesc); \
                dnssecstats_index[i++] = dns_dnssecstats_ ## counterid; \
        } while (0)
@@ -562,32 +563,48 @@ dump_counters(isc_stats_t *stats, isc_statsformat_t type, void *arg,
                        writer = arg;
 
                        if (category != NULL) {
+                               /* <NameOfCategory> */
                                TRY0(xmlTextWriterStartElement(writer,
                                                               ISC_XMLCHAR
                                                               category));
+
+                               /* <name> inside category */
                                TRY0(xmlTextWriterStartElement(writer,
                                                               ISC_XMLCHAR
                                                               "name"));
                                TRY0(xmlTextWriterWriteString(writer,
                                                              ISC_XMLCHAR
                                                              desc[index]));
-                               TRY0(xmlTextWriterEndElement(writer)); /* name */
+                               TRY0(xmlTextWriterEndElement(writer));
+                               /* </name> */
 
+                               /* <counter> */
                                TRY0(xmlTextWriterStartElement(writer,
                                                               ISC_XMLCHAR
                                                               "counter"));
+                               TRY0(xmlTextWriterWriteFormatString(writer,
+                                       "%" ISC_PRINT_QUADFORMAT "u", value));
+
+                               TRY0(xmlTextWriterEndElement(writer));
+                               /* </counter> */
+                               TRY0(xmlTextWriterEndElement(writer));
+                               /* </NameOfCategory> */
+
                        } else {
                                TRY0(xmlTextWriterStartElement(writer,
                                                               ISC_XMLCHAR
-                                                              desc[index]));
+                                                              "counter"));
+                               TRY0(xmlTextWriterWriteAttribute(writer,
+                                                                ISC_XMLCHAR
+                                                                "name",
+                                                                ISC_XMLCHAR
+                                                                desc[index]));
+                               TRY0(xmlTextWriterWriteFormatString(writer,
+                                       "%" ISC_PRINT_QUADFORMAT "u", value));
+                               TRY0(xmlTextWriterEndElement(writer));
+                               /* counter */
                        }
-                       TRY0(xmlTextWriterWriteFormatString(writer,
-                                                           "%"
-                                                           ISC_PRINT_QUADFORMAT
-                                                           "u", value));
-                       TRY0(xmlTextWriterEndElement(writer)); /* counter */
-                       if (category != NULL)
-                               TRY0(xmlTextWriterEndElement(writer)); /* category */
+
 #endif
                        break;
                }
@@ -595,6 +612,8 @@ dump_counters(isc_stats_t *stats, isc_statsformat_t type, void *arg,
        return (ISC_R_SUCCESS);
 #ifdef HAVE_LIBXML2
  error:
+       isc_log_write(ns_g_lctx, NS_LOGCATEGORY_GENERAL, NS_LOGMODULE_SERVER,
+                     ISC_LOG_ERROR, "failed at dump_counters()");
        return (ISC_R_FAILURE);
 #endif
 }
@@ -627,25 +646,24 @@ rdtypestat_dump(dns_rdatastatstype_t type, isc_uint64_t val, void *arg) {
 #ifdef HAVE_LIBXML2
                writer = dumparg->arg;
 
-               TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "rdtype"));
-
-               TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "name"));
-               TRY0(xmlTextWriterWriteString(writer, ISC_XMLCHAR typestr));
-               TRY0(xmlTextWriterEndElement(writer)); /* name */
 
                TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "counter"));
+               TRY0(xmlTextWriterWriteAttribute(writer, ISC_XMLCHAR "name",
+                                                ISC_XMLCHAR typestr));
+
                TRY0(xmlTextWriterWriteFormatString(writer,
                                               "%" ISC_PRINT_QUADFORMAT "u",
                                               val));
-               TRY0(xmlTextWriterEndElement(writer)); /* counter */
 
-               TRY0(xmlTextWriterEndElement(writer)); /* rdtype */
+               TRY0(xmlTextWriterEndElement(writer)); /* type */
 #endif
                break;
        }
        return;
 #ifdef HAVE_LIBXML2
  error:
+       isc_log_write(ns_g_lctx, NS_LOGCATEGORY_GENERAL, NS_LOGMODULE_SERVER,
+                     ISC_LOG_ERROR, "failed at rdtypestat_dump()");
        dumparg->result = ISC_R_FAILURE;
        return;
 #endif
@@ -714,6 +732,8 @@ rdatasetstats_dump(dns_rdatastatstype_t type, isc_uint64_t val, void *arg) {
        return;
 #ifdef HAVE_LIBXML2
  error:
+       isc_log_write(ns_g_lctx, NS_LOGCATEGORY_GENERAL, NS_LOGMODULE_SERVER,
+                     ISC_LOG_ERROR, "failed at rdatasetstats_dump()");
        dumparg->result = ISC_R_FAILURE;
 #endif
 
@@ -742,20 +762,13 @@ opcodestat_dump(dns_opcode_t code, isc_uint64_t val, void *arg) {
        case isc_statsformat_xml:
 #ifdef HAVE_LIBXML2
                writer = dumparg->arg;
-
-               TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "opcode"));
-
-               TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "name"));
-               TRY0(xmlTextWriterWriteString(writer, ISC_XMLCHAR codebuf));
-               TRY0(xmlTextWriterEndElement(writer)); /* name */
-
                TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "counter"));
+               TRY0(xmlTextWriterWriteAttribute(writer, ISC_XMLCHAR "name",
+                                                ISC_XMLCHAR codebuf ));
                TRY0(xmlTextWriterWriteFormatString(writer,
-                                              "%" ISC_PRINT_QUADFORMAT "u",
-                                              val));
+                                                      "%" ISC_PRINT_QUADFORMAT "u",
+                                                      val));
                TRY0(xmlTextWriterEndElement(writer)); /* counter */
-
-               TRY0(xmlTextWriterEndElement(writer)); /* opcode */
 #endif
                break;
        }
@@ -763,6 +776,8 @@ opcodestat_dump(dns_opcode_t code, isc_uint64_t val, void *arg) {
 
 #ifdef HAVE_LIBXML2
  error:
+       isc_log_write(ns_g_lctx, NS_LOGCATEGORY_GENERAL, NS_LOGMODULE_SERVER,
+                     ISC_LOG_ERROR, "failed at opcodestat_dump()");
        dumparg->result = ISC_R_FAILURE;
        return;
 #endif
@@ -770,56 +785,89 @@ opcodestat_dump(dns_opcode_t code, isc_uint64_t val, void *arg) {
 
 #ifdef HAVE_LIBXML2
 
-/* XXXMLG below here sucks. */
+/* XXXMLG below here sucks. (not so much) */
 
 
 static isc_result_t
 zone_xmlrender(dns_zone_t *zone, void *arg) {
+
        char buf[1024 + 32];    /* sufficiently large for zone name and class */
+       char *zone_name_only = NULL;
        dns_rdataclass_t rdclass;
        isc_uint32_t serial;
        xmlTextWriterPtr writer = arg;
        isc_stats_t *zonestats;
+       dns_stats_t *rcvquerystats;
+
        isc_uint64_t nsstat_values[dns_nsstatscounter_max];
        int xmlrc;
        isc_result_t result;
 
-       TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "zone"));
+       stats_dumparg_t dumparg;
 
+       dumparg.type = isc_statsformat_xml;
+       dumparg.arg = writer;
+
+
+       TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "zone"));
        dns_zone_name(zone, buf, sizeof(buf));
-       TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "name"));
-       TRY0(xmlTextWriterWriteString(writer, ISC_XMLCHAR buf));
-       TRY0(xmlTextWriterEndElement(writer));
+       zone_name_only = strtok(buf, "/");
+       if(zone_name_only == NULL){
+               zone_name_only = buf;
+       }
+       TRY0(xmlTextWriterWriteAttribute(writer, ISC_XMLCHAR "name",
+                                        ISC_XMLCHAR zone_name_only));
 
        rdclass = dns_zone_getclass(zone);
        dns_rdataclass_format(rdclass, buf, sizeof(buf));
-       TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "rdataclass"));
-       TRY0(xmlTextWriterWriteString(writer, ISC_XMLCHAR buf));
-       TRY0(xmlTextWriterEndElement(writer));
+       TRY0(xmlTextWriterWriteAttribute(writer, ISC_XMLCHAR "rdataclass",
+                                        ISC_XMLCHAR buf));
 
        TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "serial"));
        if (dns_zone_getserial2(zone, &serial) == ISC_R_SUCCESS)
                TRY0(xmlTextWriterWriteFormatString(writer, "%u", serial));
        else
                TRY0(xmlTextWriterWriteString(writer, ISC_XMLCHAR "-"));
-       TRY0(xmlTextWriterEndElement(writer));
+       TRY0(xmlTextWriterEndElement(writer)); /* serial */
 
        zonestats = dns_zone_getrequeststats(zone);
-       if (zonestats != NULL) {
+       rcvquerystats = dns_zone_getrcvquerystats(zone);
+       if (zonestats != NULL ) {
                TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "counters"));
+               TRY0(xmlTextWriterWriteAttribute(writer, ISC_XMLCHAR "type",
+                                                ISC_XMLCHAR "rcode"));
+
                result = dump_counters(zonestats, isc_statsformat_xml, writer,
                                       NULL, nsstats_xmldesc,
                                       dns_nsstatscounter_max, nsstats_index,
                                       nsstat_values, ISC_STATSDUMP_VERBOSE);
                if (result != ISC_R_SUCCESS)
                        goto error;
-               TRY0(xmlTextWriterEndElement(writer)); /* counters */
+               /* counters type="rcode"*/
+               TRY0(xmlTextWriterEndElement(writer));
+       }
+
+       if(rcvquerystats != NULL){
+               TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "counters"));
+               TRY0(xmlTextWriterWriteAttribute(writer, ISC_XMLCHAR "type",
+                                                ISC_XMLCHAR "qtype"));
+
+               dumparg.result = ISC_R_SUCCESS;
+               dns_rdatatypestats_dump(rcvquerystats, rdtypestat_dump,
+                                       &dumparg, 0);
+               if(dumparg.result != ISC_R_SUCCESS)
+                       goto error;
+
+               /* counters type="qtype"*/
+               TRY0(xmlTextWriterEndElement(writer));
        }
 
        TRY0(xmlTextWriterEndElement(writer)); /* zone */
 
        return (ISC_R_SUCCESS);
  error:
+       isc_log_write(ns_g_lctx, NS_LOGCATEGORY_GENERAL, NS_LOGMODULE_SERVER,
+                     ISC_LOG_ERROR, "Failed at zone_xmlrender()");
        return (ISC_R_FAILURE);
 }
 
@@ -851,14 +899,9 @@ generatexml(ns_server_t *server, int *buflen, xmlChar **buf) {
        TRY0(xmlTextWriterStartDocument(writer, NULL, "UTF-8", NULL));
        TRY0(xmlTextWriterWritePI(writer, ISC_XMLCHAR "xml-stylesheet",
                        ISC_XMLCHAR "type=\"text/xsl\" href=\"/bind9.xsl\""));
-       TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "isc"));
-       TRY0(xmlTextWriterWriteAttribute(writer, ISC_XMLCHAR "version",
-                                        ISC_XMLCHAR "1.0"));
-
-       TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "bind"));
        TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "statistics"));
        TRY0(xmlTextWriterWriteAttribute(writer, ISC_XMLCHAR "version",
-                                        ISC_XMLCHAR "2.2"));
+                                        ISC_XMLCHAR "3.0"));
 
        /* Set common fields for statistics dump */
        dumparg.type = isc_statsformat_xml;
@@ -872,17 +915,20 @@ generatexml(ns_server_t *server, int *buflen, xmlChar **buf) {
        TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "views"));
        while (view != NULL) {
                TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "view"));
-
-               TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "name"));
-               TRY0(xmlTextWriterWriteString(writer, ISC_XMLCHAR view->name));
-               TRY0(xmlTextWriterEndElement(writer));
+               TRY0(xmlTextWriterWriteAttribute(writer, ISC_XMLCHAR "name",
+                                                ISC_XMLCHAR view->name));
 
                TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "zones"));
                result = dns_zt_apply(view->zonetable, ISC_TRUE, zone_xmlrender,
                                      writer);
                if (result != ISC_R_SUCCESS)
                        goto error;
-               TRY0(xmlTextWriterEndElement(writer));
+               TRY0(xmlTextWriterEndElement(writer)); /* zones */
+
+               TRY0(xmlTextWriterStartElement(writer,
+                                              ISC_XMLCHAR "counters"));
+               TRY0(xmlTextWriterWriteAttribute(writer, ISC_XMLCHAR "type",
+                                                ISC_XMLCHAR "resqtype"));
 
                if (view->resquerystats != NULL) {
                        dumparg.result = ISC_R_SUCCESS;
@@ -891,17 +937,23 @@ generatexml(ns_server_t *server, int *buflen, xmlChar **buf) {
                        if (dumparg.result != ISC_R_SUCCESS)
                                goto error;
                }
+               TRY0(xmlTextWriterEndElement(writer));
 
+               /* <resstats> */
+               TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "counters"));
+               TRY0(xmlTextWriterWriteAttribute(writer, ISC_XMLCHAR "type",
+                                                ISC_XMLCHAR "resstats"));
                if (view->resstats != NULL) {
                        result = dump_counters(view->resstats,
                                               isc_statsformat_xml, writer,
-                                              "resstat", resstats_xmldesc,
+                                              NULL, resstats_xmldesc,
                                               dns_resstatscounter_max,
                                               resstats_index, resstat_values,
                                               ISC_STATSDUMP_VERBOSE);
                        if (result != ISC_R_SUCCESS)
                                goto error;
                }
+               TRY0(xmlTextWriterEndElement(writer)); /* </resstats> */
 
                cacherrstats = dns_db_getrrsetstats(view->cachedb);
                if (cacherrstats != NULL) {
@@ -952,60 +1004,92 @@ generatexml(ns_server_t *server, int *buflen, xmlChar **buf) {
        TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "server"));
        TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "boot-time"));
        TRY0(xmlTextWriterWriteString(writer, ISC_XMLCHAR boottime));
-       TRY0(xmlTextWriterEndElement(writer));
+       TRY0(xmlTextWriterEndElement(writer)); /* boot-time */
        TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "current-time"));
        TRY0(xmlTextWriterWriteString(writer, ISC_XMLCHAR nowstr));
-       TRY0(xmlTextWriterEndElement(writer));
+       TRY0(xmlTextWriterEndElement(writer));  /* current-time */
 
-       TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "requests"));
        dumparg.result = ISC_R_SUCCESS;
+
+       TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "counters"));
+       TRY0(xmlTextWriterWriteAttribute(writer, ISC_XMLCHAR "type",
+                                                                                                                                        ISC_XMLCHAR "opcode"));
+
        dns_opcodestats_dump(server->opcodestats, opcodestat_dump, &dumparg,
                             0);
        if (dumparg.result != ISC_R_SUCCESS)
                goto error;
-       TRY0(xmlTextWriterEndElement(writer)); /* requests */
 
-       TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "queries-in"));
+       TRY0(xmlTextWriterEndElement(writer)); /* counters type=opcode */
+
+       TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "counters"));
+       TRY0(xmlTextWriterWriteAttribute(writer, ISC_XMLCHAR "type",
+                                        ISC_XMLCHAR "qtype"));
+
        dumparg.result = ISC_R_SUCCESS;
        dns_rdatatypestats_dump(server->rcvquerystats, rdtypestat_dump,
                                &dumparg, 0);
        if (dumparg.result != ISC_R_SUCCESS)
                goto error;
-       TRY0(xmlTextWriterEndElement(writer)); /* queries-in */
+       TRY0(xmlTextWriterEndElement(writer)); /* counters */
 
-       result = dump_counters(server->nsstats, isc_statsformat_xml, writer,
-                              "nsstat", nsstats_xmldesc,
-                               dns_nsstatscounter_max,
-                               nsstats_index, nsstat_values,
-                               ISC_STATSDUMP_VERBOSE);
+       TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "counters"));
+       TRY0(xmlTextWriterWriteAttribute(writer, ISC_XMLCHAR "type",
+                                        ISC_XMLCHAR "nsstat"));
+
+       result = dump_counters(server->nsstats, isc_statsformat_xml,
+                              writer, NULL, nsstats_xmldesc,
+                              dns_nsstatscounter_max,
+                              nsstats_index, nsstat_values,
+                              ISC_STATSDUMP_VERBOSE);
        if (result != ISC_R_SUCCESS)
                goto error;
 
+       TRY0(xmlTextWriterEndElement(writer)); /* counters type=nsstat */
+
+       TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "counters"));
+       TRY0(xmlTextWriterWriteAttribute(writer, ISC_XMLCHAR "type",
+                                        ISC_XMLCHAR "zonestat"));
+
        result = dump_counters(server->zonestats, isc_statsformat_xml, writer,
-                              "zonestat", zonestats_xmldesc,
+                              NULL, zonestats_xmldesc,
                               dns_zonestatscounter_max, zonestats_index,
                               zonestat_values, ISC_STATSDUMP_VERBOSE);
        if (result != ISC_R_SUCCESS)
                goto error;
 
+       TRY0(xmlTextWriterEndElement(writer)); /* counters type=zonestat */
+
        /*
         * Most of the common resolver statistics entries are 0, so we don't
         * use the verbose dump here.
         */
-       result = dump_counters(server->resolverstats, isc_statsformat_xml, writer,
-                              "resstat", resstats_xmldesc,
+
+       TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "counters"));
+       TRY0(xmlTextWriterWriteAttribute(writer, ISC_XMLCHAR "type",
+                                        ISC_XMLCHAR "resstat"));
+       result = dump_counters(server->resolverstats, isc_statsformat_xml,
+                              writer, NULL, resstats_xmldesc,
                               dns_resstatscounter_max, resstats_index,
                               resstat_values, 0);
        if (result != ISC_R_SUCCESS)
                goto error;
 
-       result = dump_counters(server->sockstats, isc_statsformat_xml, writer,
-                              "sockstat", sockstats_xmldesc,
+       TRY0(xmlTextWriterEndElement(writer)); /* counters type=resstat */
+
+       TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "counters"));
+       TRY0(xmlTextWriterWriteAttribute(writer, ISC_XMLCHAR "type",
+                                        ISC_XMLCHAR "sockstat"));
+
+       result = dump_counters(server->sockstats, isc_statsformat_xml,
+                              writer, NULL, sockstats_xmldesc,
                               isc_sockstatscounter_max, sockstats_index,
                               sockstat_values, ISC_STATSDUMP_VERBOSE);
        if (result != ISC_R_SUCCESS)
                goto error;
 
+       TRY0(xmlTextWriterEndElement(writer)); /* counters type=sockstat */
+
        TRY0(xmlTextWriterEndElement(writer)); /* server */
 
        TRY0(xmlTextWriterStartElement(writer, ISC_XMLCHAR "memory"));
@@ -1013,18 +1097,18 @@ generatexml(ns_server_t *server, int *buflen, xmlChar **buf) {
        TRY0(xmlTextWriterEndElement(writer)); /* memory */
 
        TRY0(xmlTextWriterEndElement(writer)); /* statistics */
-       TRY0(xmlTextWriterEndElement(writer)); /* bind */
-       TRY0(xmlTextWriterEndElement(writer)); /* isc */
 
        TRY0(xmlTextWriterEndDocument(writer));
 
        xmlFreeTextWriter(writer);
 
-       xmlDocDumpFormatMemoryEnc(doc, buf, buflen, "UTF-8", 1);
+       xmlDocDumpFormatMemoryEnc(doc, buf, buflen, "UTF-8", 0);
        xmlFreeDoc(doc);
        return (ISC_R_SUCCESS);
 
  error:
+       isc_log_write(ns_g_lctx, NS_LOGCATEGORY_GENERAL, NS_LOGMODULE_SERVER,
+                     ISC_LOG_ERROR, "failed generating XML response");
        if (writer != NULL)
                xmlFreeTextWriter(writer);
        if (doc != NULL)
@@ -1063,7 +1147,10 @@ render_index(const char *url, const char *querystring, void *arg,
                isc_buffer_add(b, msglen);
                *freecb = wrap_xmlfree;
                *freecb_args = NULL;
-       }
+       } else
+               isc_log_write(ns_g_lctx, NS_LOGCATEGORY_GENERAL,
+                             NS_LOGMODULE_SERVER, ISC_LOG_ERROR,
+                             "failed at rendering XML()");
 
        return (result);
 }
@@ -1095,7 +1182,7 @@ static void
 shutdown_listener(ns_statschannel_t *listener) {
        char socktext[ISC_SOCKADDR_FORMATSIZE];
        isc_sockaddr_format(&listener->address, socktext, sizeof(socktext));
-       isc_log_write(ns_g_lctx, NS_LOGCATEGORY_GENERAL,NS_LOGMODULE_SERVER,
+       isc_log_write(ns_g_lctx, NS_LOGCATEGORY_GENERAL, NS_LOGMODULE_SERVER,
                      ISC_LOG_NOTICE, "stopping statistics channel on %s",
                      socktext);
 
@@ -1348,7 +1435,8 @@ ns_statschannels_configure(ns_server_t *server, const cfg_obj_t *config,
                                obj = cfg_tuple_get(listen_params, "address");
                                addr = *cfg_obj_assockaddr(obj);
                                if (isc_sockaddr_getport(&addr) == 0)
-                                       isc_sockaddr_setport(&addr, NS_STATSCHANNEL_HTTPPORT);
+                                       isc_sockaddr_setport(&addr,
+                                                    NS_STATSCHANNEL_HTTPPORT);
 
                                isc_sockaddr_format(&addr, socktext,
                                                    sizeof(socktext));
index 4dc9c130ce4056603fa5dbce0bd06ef3c2848554..21d88684a3e6dc018de88db099857d6d45cde375 100644 (file)
@@ -820,6 +820,7 @@ ns_zone_configure(const cfg_obj_t *config, const cfg_obj_t *vconfig,
        isc_boolean_t ixfrdiff;
        dns_masterformat_t masterformat;
        isc_stats_t *zoneqrystats;
+       dns_stats_t *rcvquerystats;
        isc_boolean_t zonestats_on;
        int seconds;
        dns_zone_t *mayberaw = (raw != NULL) ? raw : zone;
@@ -1006,15 +1007,24 @@ ns_zone_configure(const cfg_obj_t *config, const cfg_obj_t *vconfig,
        result = ns_config_get(maps, "zone-statistics", &obj);
        INSIST(result == ISC_R_SUCCESS && obj != NULL);
        zonestats_on = cfg_obj_asboolean(obj);
-       zoneqrystats = NULL;
+
+       zoneqrystats  = NULL;
+       rcvquerystats = NULL;
        if (zonestats_on) {
                RETERR(isc_stats_create(mctx, &zoneqrystats,
                                        dns_nsstatscounter_max));
+               RETERR(dns_rdatatypestats_create(mctx,
+                                       &rcvquerystats));
        }
-       dns_zone_setrequeststats(zone, zoneqrystats);
+       dns_zone_setrequeststats(zone,  zoneqrystats );
+       dns_zone_setrcvquerystats(zone, rcvquerystats);
+
        if (zoneqrystats != NULL)
                isc_stats_detach(&zoneqrystats);
 
+       if(rcvquerystats != NULL)
+               dns_stats_detach(&rcvquerystats);
+
        /*
         * Configure master functionality.  This applies
         * to primary masters (type "master") and slaves
index 60c87e1cb60f0a0d15b1b131dc474537100468df..5bc370c6ea09ce1a41944505579a938aa869ca0e 100644 (file)
@@ -1701,8 +1701,15 @@ dns_zone_setrequeststats(dns_zone_t *zone, isc_stats_t *stats);
  *\li  stats is a valid statistics.
  */
 
+void
+dns_zone_setrcvquerystats(dns_zone_t *zone, dns_stats_t *stats);
+
 isc_stats_t *
 dns_zone_getrequeststats(dns_zone_t *zone);
+
+dns_stats_t *
+dns_zone_getrcvquerystats(dns_zone_t *zone);
+
 /*%<
  * Get the additional statistics for zone, if one is installed.
  *
index bc871e8558e2a41511b64800e27459ba49fd1662..da7e868f170530c92c30782e0ffc1a5634fbd5ce 100644 (file)
@@ -310,6 +310,7 @@ struct dns_zone {
         */
        isc_boolean_t           requeststats_on;
        isc_stats_t             *requeststats;
+       dns_stats_t             *rcvquerystats;
        isc_uint32_t            notifydelay;
        dns_isselffunc_t        isself;
        void                    *isselfarg;
@@ -903,6 +904,7 @@ dns_zone_create(dns_zone_t **zonep, isc_mem_t *mctx) {
        zone->stats = NULL;
        zone->requeststats_on = ISC_FALSE;
        zone->requeststats = NULL;
+       zone->rcvquerystats = NULL;
        zone->notifydelay = 5;
        zone->isself = NULL;
        zone->isselfarg = NULL;
@@ -1018,6 +1020,8 @@ zone_free(dns_zone_t *zone) {
                isc_stats_detach(&zone->stats);
        if (zone->requeststats != NULL)
                isc_stats_detach(&zone->requeststats);
+       if(zone->rcvquerystats != NULL )
+               dns_stats_detach(&zone->rcvquerystats);
        if (zone->db != NULL)
                zone_detachdb(zone);
        if (zone->acache != NULL)
@@ -14750,8 +14754,11 @@ dns_zone_setstats(dns_zone_t *zone, isc_stats_t *stats) {
 
 void
 dns_zone_setrequeststats(dns_zone_t *zone, isc_stats_t *stats) {
+
        REQUIRE(DNS_ZONE_VALID(zone));
 
+       dns_zone_log(zone, ISC_LOG_INFO, "Setting zone query stats");
+
        LOCK_ZONE(zone);
        if (zone->requeststats_on && stats == NULL)
                zone->requeststats_on = ISC_FALSE;
@@ -14762,8 +14769,23 @@ dns_zone_setrequeststats(dns_zone_t *zone, isc_stats_t *stats) {
                }
        }
        UNLOCK_ZONE(zone);
+}
 
-       return;
+void
+dns_zone_setrcvquerystats(dns_zone_t *zone, dns_stats_t *stats) {
+
+       REQUIRE(DNS_ZONE_VALID(zone));
+
+       dns_zone_log(zone, ISC_LOG_INFO, "Setting received query stats");
+
+       LOCK_ZONE(zone);
+       if (zone->requeststats_on && stats != NULL) {
+               if (zone->rcvquerystats == NULL) {
+                       dns_stats_attach(stats, &zone->rcvquerystats);
+                       zone->requeststats_on = ISC_TRUE;
+               }
+       }
+       UNLOCK_ZONE(zone);
 }
 
 isc_stats_t *
@@ -14782,6 +14804,18 @@ dns_zone_getrequeststats(dns_zone_t *zone) {
                return (NULL);
 }
 
+/*
+ * Return the received query stats bucket
+ * see note from dns_zone_getrequeststats()
+ */
+dns_stats_t *
+dns_zone_getrcvquerystats(dns_zone_t *zone) {
+       if (zone->requeststats_on)
+               return (zone->rcvquerystats);
+       else
+               return (NULL);
+}
+
 void
 dns_zone_dialup(dns_zone_t *zone) {