+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]
- 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="3.0"]">
<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="qtype"]/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="opcode"]/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="opcode"]/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="opcode"]/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="qtype"]/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="qtype"]/counter)"/>
+ </td>
+ </tr>
+ </table>
+ <br/>
+ <h2>Outgoing Queries per view</h2>
+ <xsl:for-each select="views/view[count(counters[@type="resqtype"]/counter) > 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="resqtype"]/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="resqtype"]/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="nsstat"]/counter[.>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="nsstat"]/counter[.>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="zonestat"]/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="zonestat"]/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="restat"]/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="resstats"]/counter[.>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="sockstat"]/counter[.>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="rcode"]/counter >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="rcode"]/counter[. > 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="rcode"]/counter[.>0 and @name != "QryAuthAns"]">['<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="rcode"]/counter[.>0 and @name != "QryAuthAns"]">
+ <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="qtype"]/counter >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="qtype"]/counter[count(.) > 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="qtype"]/counter[.>0 and @name != "QryAuthAns"]">['<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="qtype"]/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>
<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>
</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>
<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>
/*
* 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"
" - 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="3.0"]\">\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="qtype"]/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="opcode"]/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="opcode"]/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="opcode"]/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="qtype"]/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="qtype"]/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="resqtype"]/counter) > 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="resqtype"]/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="resqtype"]/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="nsstat"]/counter[.>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="nsstat"]/counter[.>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="zonestat"]/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="zonestat"]/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="restat"]/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="resstats"]/counter[.>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="sockstat"]/counter[.>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="rcode"]/counter >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="rcode"]/counter[. > 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="rcode"]/counter[.>0 and @name != "QryAuthAns"]\">['<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="rcode"]/counter[.>0 and @name != "QryAuthAns"]\">\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="qtype"]/counter >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="qtype"]/counter[count(.) > 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="qtype"]/counter[.>0 and @name != "QryAuthAns"]\">['<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="qtype"]/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"
" <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"
" </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"
" <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"
" <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"
" </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"
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);
}
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:
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");
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);
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)
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;
}
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
}
#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
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
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;
}
#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
#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);
}
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;
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;
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) {
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"));
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)
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);
}
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);
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));
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;
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
*\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.
*
*/
isc_boolean_t requeststats_on;
isc_stats_t *requeststats;
+ dns_stats_t *rcvquerystats;
isc_uint32_t notifydelay;
dns_isselffunc_t isself;
void *isselfarg;
zone->stats = NULL;
zone->requeststats_on = ISC_FALSE;
zone->requeststats = NULL;
+ zone->rcvquerystats = NULL;
zone->notifydelay = 5;
zone->isself = NULL;
zone->isselfarg = NULL;
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)
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;
}
}
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 *
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) {