Commit 5de7909a authored by Naoki Kambe's avatar Naoki Kambe
Browse files

[master] Revert trac930 because of failures on biuldbots:

  "[master] update the ChangeLog entry for trac928, trac929 and trac930"
  004afad6

  "[trac930] revise the entry of ChangeLog for trac928, trac929 and trac930"
  f20be125

  "[trac930]"
  fcc70704

  "[trac930]"
  da5d5926

  "[trac930] refactor unittests"
  0314c7bb

  "[trac930] add comments about abstracts of the test scripts in their headers"
  b8cecbbd

  "[trac930] modify stats.py"
  7a31e95e

  "[trac930] modify b10-stats_test.py"
  e18a678b

  "[trac930] remove tailing whitespaces."
  1d1a8793

  "[trac930] raise StatsError including errors in the stats spec file"
  c6948a6d

  "[trac930] rename the function name"
  db0371fc

  "[trac930] remove a unnecessary x bit from stats_httpd.py.in"
  e906efc3

  "[trac930] modify logging"
  d86a9dce

  "[trac930] modify the update_modues function"
  4c2732cb

  "[trac930]"
  aaffb9c8

  "[trac930] remove unnecessary a white space"
  e8a22472

  "[trac930] add a test pattern which the set command with a non-existent item"
  2c22d334

  "[trac930] modify parse_spec function"
  8a24b906

  "[trac930] fix conflicts with trac1021"
  7275c59d

  "[trac930] add changes because query counter names described in the specfile are changed."
  bcf37a11

  "[trac930] add the logging when the validation of statistics data fails"
  a142fa63

  "[trac930] Add unittests to test sumitStatistics with the validation of statistics data and add mock ModuleSpec class"
  ae8748f7

  "[trac930] Add prototypes of validator_typea and registerStatisticsValidator"
  d0d5a671

  "[trac930]"
  a9a976d2

  "[trac930] add the helper functions which are used around the registration of the function to validate the statistics data."
  df9a8f92

  "[trac930] add new messages into the message file of Auth and Boss"
  e9562533

  "[trac930] add statistics validation for bob"
  28cad73d

  "[trac930]"
  4de3a5bd

  "[trac930] remove unneeded empty TODO comments"
  aa108cc8

  "[trac930] add new entry for #928-#930"
  691328d9

  "[trac930] refurbish the unittests for new stats module, new stats httpd module"
  c06463cf

  "[trac930] modify Stats"
  c074f6e0

  "[trac930]"
  daa1d6dd

  "[trac930] update spec file of stats module"
  e7b4337a

  "[trac930] update argument name and argument format of set command in auth module and boss module"
  0b235902

  "[trac930] remove description about removing statistics data by stats module"
  c19a295e

  "[trac930] add a column "Owner" in the table tag"
  9261da87

  "[trac930] remove descriptions about "stats-schema.spec" and add description about new"
  d4078d52

  "[trac930] add utilities and mock-up modules for unittests of"
  1aa728dd

  "[trac930] remove unneeded mockups, fake modules and dummy data"
  1768e822

  "[trac930] remove unneeded specfile "stats-schema.spec""
  326885a3
parent 004afad6
279. [func] naokikambe
Statistics items are specified by each module's spec file.
Stats module can read these through the config manager. Stats
module and stats httpd report statistics data and statistics
schema by each module via both bindctl and HTTP/XML.
(Trac #928,#929,#930, git f20be125d667bceea0d940fc5fabf87b2eef86cd)
278. [doc] jelte
Add logging configuration documentation to the guide.
(Trac #1011, git TODO)
......
......@@ -801,6 +801,13 @@ AC_CONFIG_FILES([Makefile
src/bin/zonemgr/tests/Makefile
src/bin/stats/Makefile
src/bin/stats/tests/Makefile
src/bin/stats/tests/isc/Makefile
src/bin/stats/tests/isc/cc/Makefile
src/bin/stats/tests/isc/config/Makefile
src/bin/stats/tests/isc/util/Makefile
src/bin/stats/tests/isc/log/Makefile
src/bin/stats/tests/testdata/Makefile
src/bin/stats/tests/http/Makefile
src/bin/usermgr/Makefile
src/bin/tests/Makefile
src/lib/Makefile
......
......@@ -664,30 +664,24 @@ This may be a temporary setting until then.
</p><p>
This stats daemon provides commands to identify if it is
running, show specified or all statistics data, show specified
or all statistics data schema, and set specified statistics
data.
This stats daemon provides commands to identify if it is running,
show specified or all statistics data, set values, remove data,
and reset data.
For example, using <span class="command"><strong>bindctl</strong></span>:
</p><pre class="screen">
&gt; <strong class="userinput"><code>Stats show</code></strong>
{
"Auth": {
"queries.tcp": 1749,
"queries.udp": 867868
},
"Boss": {
"boot_time": "2011-01-20T16:59:03Z"
},
"Stats": {
"boot_time": "2011-01-20T16:59:05Z",
"last_update_time": "2011-01-20T17:04:05Z",
"lname": "4d3869d9_a@jreed.example.net",
"report_time": "2011-01-20T17:04:06Z",
"timestamp": 1295543046.823504
}
"auth.queries.tcp": 1749,
"auth.queries.udp": 867868,
"bind10.boot_time": "2011-01-20T16:59:03Z",
"report_time": "2011-01-20T17:04:06Z",
"stats.boot_time": "2011-01-20T16:59:05Z",
"stats.last_update_time": "2011-01-20T17:04:05Z",
"stats.lname": "4d3869d9_a@jreed.example.net",
"stats.start_time": "2011-01-20T16:59:05Z",
"stats.timestamp": 1295543046.823504
}
</pre><p>
</p></div><div class="chapter" title="Chapter 14. Logging"><div class="titlepage"><div><div><h2 class="title"><a name="logging"></a>Chapter 14. Logging</h2></div></div></div><p>
......
......@@ -1453,30 +1453,24 @@ then change those defaults with config set Resolver/forward_addresses[0]/address
<para>
This stats daemon provides commands to identify if it is
running, show specified or all statistics data, show specified
or all statistics data schema, and set specified statistics
data.
This stats daemon provides commands to identify if it is running,
show specified or all statistics data, set values, remove data,
and reset data.
For example, using <command>bindctl</command>:
<screen>
&gt; <userinput>Stats show</userinput>
{
"Auth": {
"queries.tcp": 1749,
"queries.udp": 867868
},
"Boss": {
"boot_time": "2011-01-20T16:59:03Z"
},
"Stats": {
"boot_time": "2011-01-20T16:59:05Z",
"last_update_time": "2011-01-20T17:04:05Z",
"lname": "4d3869d9_a@jreed.example.net",
"report_time": "2011-01-20T17:04:06Z",
"timestamp": 1295543046.823504
}
"auth.queries.tcp": 1749,
"auth.queries.udp": 867868,
"bind10.boot_time": "2011-01-20T16:59:03Z",
"report_time": "2011-01-20T17:04:06Z",
"stats.boot_time": "2011-01-20T16:59:05Z",
"stats.last_update_time": "2011-01-20T17:04:05Z",
"stats.lname": "4d3869d9_a@jreed.example.net",
"stats.start_time": "2011-01-20T16:59:05Z",
"stats.timestamp": 1295543046.823504
}
</screen>
</para>
......
......@@ -257,7 +257,4 @@ request. The zone manager component has been informed of the request,
but has returned an error response (which is included in the message). The
NOTIFY request will not be honored.
% AUTH_INVALID_STATISTICS_DATA invalid specification of statistics data specified
An error was encountered when the authoritiative server specified
statistics data which is invalid for the auth specification file.
......@@ -125,10 +125,6 @@ public:
/// The TSIG keyring
const shared_ptr<TSIGKeyRing>* keyring_;
/// Bind the ModuleSpec object in config_session_ with
/// isc:config::ModuleSpec::validateStatistics.
void registerStatisticsValidator();
private:
std::string db_file_;
......@@ -143,9 +139,6 @@ private:
/// Increment query counter
void incCounter(const int protocol);
// validateStatistics
bool validateStatistics(isc::data::ConstElementPtr data) const;
};
AuthSrvImpl::AuthSrvImpl(const bool use_cache,
......@@ -324,7 +317,6 @@ AuthSrv::setXfrinSession(AbstractSession* xfrin_session) {
void
AuthSrv::setConfigSession(ModuleCCSession* config_session) {
impl_->config_session_ = config_session;
impl_->registerStatisticsValidator();
}
void
......@@ -678,22 +670,6 @@ AuthSrvImpl::incCounter(const int protocol) {
}
}
void
AuthSrvImpl::registerStatisticsValidator() {
counters_.registerStatisticsValidator(
boost::bind(&AuthSrvImpl::validateStatistics, this, _1));
}
bool
AuthSrvImpl::validateStatistics(isc::data::ConstElementPtr data) const {
if (config_session_ == NULL) {
return (false);
}
return (
config_session_->getModuleSpec().validateStatistics(
data, true));
}
ConstElementPtr
AuthSrvImpl::setDbFile(ConstElementPtr config) {
ConstElementPtr answer = isc::config::createAnswer();
......
......@@ -37,14 +37,11 @@ public:
void inc(const AuthCounters::CounterType type);
bool submitStatistics() const;
void setStatisticsSession(isc::cc::AbstractSession* statistics_session);
void registerStatisticsValidator
(AuthCounters::validator_type validator);
// Currently for testing purpose only
uint64_t getCounter(const AuthCounters::CounterType type) const;
private:
std::vector<uint64_t> counters_;
isc::cc::AbstractSession* statistics_session_;
AuthCounters::validator_type validator_;
};
AuthCountersImpl::AuthCountersImpl() :
......@@ -70,25 +67,16 @@ AuthCountersImpl::submitStatistics() const {
}
std::stringstream statistics_string;
statistics_string << "{\"command\": [\"set\","
<< "{ \"owner\": \"Auth\","
<< " \"data\":"
<< "{ \"queries.udp\": "
<< "{ \"stats_data\": "
<< "{ \"auth.queries.udp\": "
<< counters_.at(AuthCounters::COUNTER_UDP_QUERY)
<< ", \"queries.tcp\": "
<< ", \"auth.queries.tcp\": "
<< counters_.at(AuthCounters::COUNTER_TCP_QUERY)
<< " }"
<< "}"
<< "]}";
isc::data::ConstElementPtr statistics_element =
isc::data::Element::fromJSON(statistics_string);
// validate the statistics data before send
if (validator_) {
if (!validator_(
statistics_element->get("command")->get(1)->get("data"))) {
LOG_ERROR(auth_logger, AUTH_INVALID_STATISTICS_DATA);
return (false);
}
}
try {
// group_{send,recv}msg() can throw an exception when encountering
// an error, and group_recvmsg() will throw an exception on timeout.
......@@ -117,13 +105,6 @@ AuthCountersImpl::setStatisticsSession
statistics_session_ = statistics_session;
}
void
AuthCountersImpl::registerStatisticsValidator
(AuthCounters::validator_type validator)
{
validator_ = validator;
}
// Currently for testing purpose only
uint64_t
AuthCountersImpl::getCounter(const AuthCounters::CounterType type) const {
......@@ -158,10 +139,3 @@ uint64_t
AuthCounters::getCounter(const AuthCounters::CounterType type) const {
return (impl_->getCounter(type));
}
void
AuthCounters::registerStatisticsValidator
(AuthCounters::validator_type validator) const
{
return (impl_->registerStatisticsValidator(validator));
}
......@@ -131,26 +131,6 @@ public:
/// \return the value of the counter specified by \a type.
///
uint64_t getCounter(const AuthCounters::CounterType type) const;
/// \brief A type of validation function for the specification in
/// isc::config::ModuleSpec.
///
/// This type might be useful for not only statistics
/// specificatoin but also for config_data specification and for
/// commnad.
///
typedef boost::function<bool(const isc::data::ConstElementPtr&)>
validator_type;
/// \brief Register a function type of the statistics validation
/// function for AuthCounters.
///
/// This method never throws an exception.
///
/// \param validator A function type of the validation of
/// statistics specification.
///
void registerStatisticsValidator(AuthCounters::validator_type validator) const;
};
#endif // __STATISTICS_H
......
......@@ -16,8 +16,6 @@
#include <gtest/gtest.h>
#include <boost/bind.hpp>
#include <cc/data.h>
#include <cc/session.h>
......@@ -78,13 +76,6 @@ protected:
}
MockSession statistics_session_;
AuthCounters counters;
// no need to be inherited from the original class here.
class MockModuleSpec {
public:
bool validateStatistics(ConstElementPtr, const bool valid) const
{ return (valid); }
};
MockModuleSpec module_spec_;
};
void
......@@ -190,7 +181,7 @@ TEST_F(AuthCountersTest, submitStatisticsWithException) {
statistics_session_.setThrowSessionTimeout(false);
}
TEST_F(AuthCountersTest, submitStatisticsWithoutValidator) {
TEST_F(AuthCountersTest, submitStatistics) {
// Submit statistics data.
// Validate if it submits correct data.
......@@ -210,69 +201,12 @@ TEST_F(AuthCountersTest, submitStatisticsWithoutValidator) {
// Command is "set".
EXPECT_EQ("set", statistics_session_.sent_msg->get("command")
->get(0)->stringValue());
EXPECT_EQ("Auth", statistics_session_.sent_msg->get("command")
->get(1)->get("owner")->stringValue());
ConstElementPtr statistics_data = statistics_session_.sent_msg
->get("command")->get(1)
->get("data");
->get("stats_data");
// UDP query counter is 2 and TCP query counter is 1.
EXPECT_EQ(2, statistics_data->get("queries.udp")->intValue());
EXPECT_EQ(1, statistics_data->get("queries.tcp")->intValue());
EXPECT_EQ(2, statistics_data->get("auth.queries.udp")->intValue());
EXPECT_EQ(1, statistics_data->get("auth.queries.tcp")->intValue());
}
TEST_F(AuthCountersTest, submitStatisticsWithValidator) {
//a validator for the unittest
AuthCounters::validator_type validator;
ConstElementPtr el;
// Submit statistics data with correct statistics validator.
validator = boost::bind(
&AuthCountersTest::MockModuleSpec::validateStatistics,
&module_spec_, _1, true);
EXPECT_TRUE(validator(el));
// register validator to AuthCounters
counters.registerStatisticsValidator(validator);
// Counters should be initialized to 0.
EXPECT_EQ(0, counters.getCounter(AuthCounters::COUNTER_UDP_QUERY));
EXPECT_EQ(0, counters.getCounter(AuthCounters::COUNTER_TCP_QUERY));
// UDP query counter is set to 2.
counters.inc(AuthCounters::COUNTER_UDP_QUERY);
counters.inc(AuthCounters::COUNTER_UDP_QUERY);
// TCP query counter is set to 1.
counters.inc(AuthCounters::COUNTER_TCP_QUERY);
// checks the value returned by submitStatistics
EXPECT_TRUE(counters.submitStatistics());
// Destination is "Stats".
EXPECT_EQ("Stats", statistics_session_.msg_destination);
// Command is "set".
EXPECT_EQ("set", statistics_session_.sent_msg->get("command")
->get(0)->stringValue());
EXPECT_EQ("Auth", statistics_session_.sent_msg->get("command")
->get(1)->get("owner")->stringValue());
ConstElementPtr statistics_data = statistics_session_.sent_msg
->get("command")->get(1)
->get("data");
// UDP query counter is 2 and TCP query counter is 1.
EXPECT_EQ(2, statistics_data->get("queries.udp")->intValue());
EXPECT_EQ(1, statistics_data->get("queries.tcp")->intValue());
// Submit statistics data with incorrect statistics validator.
validator = boost::bind(
&AuthCountersTest::MockModuleSpec::validateStatistics,
&module_spec_, _1, false);
EXPECT_FALSE(validator(el));
counters.registerStatisticsValidator(validator);
// checks the value returned by submitStatistics
EXPECT_FALSE(counters.submitStatistics());
}
}
......@@ -198,7 +198,3 @@ the message channel.
% BIND10_UNKNOWN_CHILD_PROCESS_ENDED unknown child pid %1 exited
An unknown child process has exited. The PID is printed, but no further
action will be taken by the boss process.
% BIND10_INVALID_STATISTICS_DATA invalid specification of statistics data specified
An error was encountered when the boss module specified
statistics data which is invalid for the boss specification file.
......@@ -85,7 +85,7 @@ isc.util.process.rename(sys.argv[0])
# number, and the overall BIND 10 version number (set in configure.ac).
VERSION = "bind10 20110223 (BIND 10 @PACKAGE_VERSION@)"
# This is for boot_time of Boss
# This is for bind10.boottime of stats module
_BASETIME = time.gmtime()
class RestartSchedule:
......@@ -318,22 +318,13 @@ class BoB:
answer = isc.config.ccsession.create_answer(0)
elif command == "sendstats":
# send statistics data to the stats daemon immediately
statistics_data = {
'boot_time': time.strftime('%Y-%m-%dT%H:%M:%SZ', _BASETIME)
}
valid = self.ccs.get_module_spec().validate_statistics(
True, statistics_data)
if valid:
cmd = isc.config.ccsession.create_command(
'set', { "owner": "Boss",
"data": statistics_data })
seq = self.cc_session.group_sendmsg(cmd, 'Stats')
self.cc_session.group_recvmsg(True, seq)
answer = isc.config.ccsession.create_answer(0)
else:
logger.fatal(BIND10_INVALID_STATISTICS_DATA);
answer = isc.config.ccsession.create_answer(
1, "specified statistics data is invalid")
cmd = isc.config.ccsession.create_command(
'set', { "stats_data": {
'bind10.boot_time': time.strftime('%Y-%m-%dT%H:%M:%SZ', _BASETIME)
}})
seq = self.cc_session.group_sendmsg(cmd, 'Stats')
self.cc_session.group_recvmsg(True, seq)
answer = isc.config.ccsession.create_answer(0)
elif command == "ping":
answer = isc.config.ccsession.create_answer(0, "pong")
elif command == "show_processes":
......
......@@ -137,27 +137,9 @@ class TestBoB(unittest.TestCase):
def group_sendmsg(self, msg, group):
(self.msg, self.group) = (msg, group)
def group_recvmsg(self, nonblock, seq): pass
class DummyModuleCCSession():
module_spec = isc.config.module_spec.ModuleSpec({
"module_name": "Boss",
"statistics": [
{
"item_name": "boot_time",
"item_type": "string",
"item_optional": False,
"item_default": "1970-01-01T00:00:00Z",
"item_title": "Boot time",
"item_description": "A date time when bind10 process starts initially",
"item_format": "date-time"
}
]
})
def get_module_spec(self):
return self.module_spec
bob = BoB()
bob.verbose = True
bob.cc_session = DummySession()
bob.ccs = DummyModuleCCSession()
# a bad command
self.assertEqual(bob.command_handler(-1, None),
isc.config.ccsession.create_answer(1, "bad command"))
......@@ -171,9 +153,8 @@ class TestBoB(unittest.TestCase):
self.assertEqual(bob.cc_session.group, "Stats")
self.assertEqual(bob.cc_session.msg,
isc.config.ccsession.create_command(
"set", { "owner": "Boss",
"data": {
"boot_time": time.strftime("%Y-%m-%dT%H:%M:%SZ", _BASETIME)
'set', { "stats_data": {
'bind10.boot_time': time.strftime('%Y-%m-%dT%H:%M:%SZ', _BASETIME)
}}))
# "ping" command
self.assertEqual(bob.command_handler("ping", None),
......
......@@ -5,7 +5,7 @@ pkglibexecdir = $(libexecdir)/@PACKAGE@
pkglibexec_SCRIPTS = b10-stats b10-stats-httpd
b10_statsdir = $(pkgdatadir)
b10_stats_DATA = stats.spec stats-httpd.spec
b10_stats_DATA = stats.spec stats-httpd.spec stats-schema.spec
b10_stats_DATA += stats-httpd-xml.tpl stats-httpd-xsd.tpl stats-httpd-xsl.tpl
pyexec_DATA = stats_messages.py stats_httpd_messages.py
......@@ -16,7 +16,7 @@ CLEANFILES += stats_httpd_messages.py stats_httpd_messages.pyc
man_MANS = b10-stats.8 b10-stats-httpd.8
EXTRA_DIST = $(man_MANS) b10-stats.xml b10-stats-httpd.xml
EXTRA_DIST += stats.spec stats-httpd.spec
EXTRA_DIST += stats.spec stats-httpd.spec stats-schema.spec
EXTRA_DIST += stats-httpd-xml.tpl stats-httpd-xsd.tpl stats-httpd-xsl.tpl
EXTRA_DIST += stats_messages.mes stats_httpd_messages.mes
......
......@@ -36,7 +36,7 @@ b10-stats-httpd \- BIND 10 HTTP server for HTTP/XML interface of statistics
.PP
\fBb10\-stats\-httpd\fR
is a standalone HTTP server\&. It is intended for HTTP/XML interface for statistics module\&. This server process runs as a process separated from the process of the BIND 10 Stats daemon (\fBb10\-stats\fR)\&. The server is initially executed by the BIND 10 boss process (\fBbind10\fR) and eventually exited by it\&. The server is intended to be server requests by HTTP clients like web browsers and third\-party modules\&. When the server is asked, it requests BIND 10 statistics data or its schema from
is a standalone HTTP server\&. It is intended for HTTP/XML interface for statistics module\&. This server process runs as a process separated from the process of the BIND 10 Stats daemon (\fBb10\-stats\fR)\&. The server is initially executed by the BIND 10 boss process (\fBbind10\fR) and eventually exited by it\&. The server is intended to be server requests by HTTP clients like web browsers and third\-party modules\&. When the server is asked, it requests BIND 10 statistics data from
\fBb10\-stats\fR, and it sends the data back in Python dictionary format and the server converts it into XML format\&. The server sends it to the HTTP client\&. The server can send three types of document, which are XML (Extensible Markup Language), XSD (XML Schema definition) and XSL (Extensible Stylesheet Language)\&. The XML document is the statistics data of BIND 10, The XSD document is the data schema of it, and The XSL document is the style sheet to be showed for the web browsers\&. There is different URL for each document\&. But please note that you would be redirected to the URL of XML document if you request the URL of the root document\&. For example, you would be redirected to http://127\&.0\&.0\&.1:8000/bind10/statistics/xml if you request http://127\&.0\&.0\&.1:8000/\&. Please see the manual and the spec file of
\fBb10\-stats\fR
for more details about the items of BIND 10 statistics\&. The server uses CC session in communication with
......@@ -66,6 +66,10 @@ bindctl(1)\&. Please see the manual of
bindctl(1)
about how to configure the settings\&.
.PP
/usr/local/share/bind10\-devel/stats\-schema\&.spec
\(em This is a spec file for data schema of of BIND 10 statistics\&. This schema cannot be configured via
bindctl(1)\&.
.PP
/usr/local/share/bind10\-devel/stats\-httpd\-xml\&.tpl
\(em the template file of XML document\&.
......
......@@ -57,7 +57,7 @@
by the BIND 10 boss process (<command>bind10</command>) and eventually
exited by it. The server is intended to be server requests by HTTP
clients like web browsers and third-party modules. When the server is
asked, it requests BIND 10 statistics data or its schema from
asked, it requests BIND 10 statistics data from
<command>b10-stats</command>, and it sends the data back in Python
dictionary format and the server converts it into XML format. The server
sends it to the HTTP client. The server can send three types of document,
......@@ -112,6 +112,12 @@
of <refentrytitle>bindctl</refentrytitle><manvolnum>1</manvolnum> about
how to configure the settings.
</para>
<para><filename>/usr/local/share/bind10-devel/stats-schema.spec</filename>
<!--TODO: The filename should be computed from prefix-->
&mdash; This is a spec file for data schema of
of BIND 10 statistics. This schema cannot be configured
via <refentrytitle>bindctl</refentrytitle><manvolnum>1</manvolnum>.
</para>
<para>
<filename>/usr/local/share/bind10-devel/stats-httpd-xml.tpl</filename>
<!--TODO: The filename should be computed from prefix-->
......@@ -132,7 +138,7 @@
<refsect1>
<title>CONFIGURATION AND COMMANDS</title>
<para>
The configurable setting in
The configurable setting in
<filename>stats-httpd.spec</filename> is:
</para>
<variablelist>
......
......@@ -66,6 +66,10 @@ switches to verbose mode\&. It sends verbose messages to STDOUT\&.
\fBb10\-stats\fR\&. It contains commands for
\fBb10\-stats\fR\&. They can be invoked via
bindctl(1)\&.
.PP
/usr/local/share/bind10\-devel/stats\-schema\&.spec
\(em This is a spec file for data schema of of BIND 10 statistics\&. This schema cannot be configured via
bindctl(1)\&.
.SH "SEE ALSO"
.PP
......
......@@ -95,6 +95,12 @@
invoked
via <refentrytitle>bindctl</refentrytitle><manvolnum>1</manvolnum>.
</para>
<para><filename>/usr/local/share/bind10-devel/stats-schema.spec</filename>
<!--TODO: The filename should be computed from prefix-->
&mdash; This is a spec file for data schema of
of BIND 10 statistics. This schema cannot be configured
via <refentrytitle>bindctl</refentrytitle><manvolnum>1</manvolnum>.
</para>
</refsect1>
<refsect1>
......
......@@ -44,7 +44,6 @@ td.title {
<h1>BIND 10 Statistics</h1>
<table>
<tr>
<th>Owner</th>
<th>Title</th>
<th>Value</th>
</tr>
......
{
"module_spec": {
"module_name": "Stats",
"module_description": "Statistics data schema",
"config_data": [
{
"item_name": "report_time",
"item_type": "string",
"item_optional": false,
"item_default": "1970-01-01T00:00:00Z",
"item_title": "Report time",
"item_description": "A date time when stats module reports",
"item_format": "date-time"
},
{
"item_name": "bind10.boot_time",
"item_type": "string",
"item_optional": false,
"item_default": "1970-01-01T00:00:00Z",
"item_title": "bind10.BootTime",
"item_description": "A date time when bind10 process starts initially",
"item_format": "date-time"
},
{
"item_name": "stats.boot_time",
"item_type": "string",
"item_optional": false,
"item_default": "1970-01-01T00:00:00Z",
"item_title": "stats.BootTime",
"item_description": "A date time when the stats module starts initially or when the stats module restarts",
"item_format": "date-time"
},
{
"item_name": "stats.start_time",
"item_type": "string",
"item_optional": false,
"item_default": "1970-01-01T00:00:00Z",
"item_title": "stats.StartTime",
"item_description": "A date time when the stats module starts collecting data or resetting values last time",
"item_format": "date-time"
},
{
"item_name": "stats.last_update_time",
"item_type": "string",
"item_optional": false,
"item_default": "1970-01-01T00:00:00Z",
"item_title": "stats.LastUpdateTime",