1738. [func] fdupont
Added new global parameters statistic-default-sample-count and
- statistic-default-sample-age to set the default values uses
- a sample keeping limits in new statistics.
+ statistic-default-sample-age to set the default values used
+ for sample keeping limits.
(Gitlab #1005)
1737. [func] tmark
- ``statistic-default-sample-age`` - determines the default maximum
age in seconds of samples which will be kept.
-.. note::
-
- These apply to default values and have no action on existing statistics.
- To change sample limits on an existing (or all) statistic use commands
- of the dedicated hook described in :ref:`command-statistic-sample-count-set`
- and :ref:`command-statistic-sample-age-set-all`.
-
For instance to reduce the statistic keeping overhead you can set
the default maximum sample count to 1 so only one sample will be kept by:
- ``statistic-default-sample-age`` - determines the default maximum
age in seconds of samples which will be kept.
-.. note::
-
- These apply to default values and have no action on existing statistics.
- To change sample limits on an existing (or all) statistic use commands
- of the dedicated hook described in :ref:`command-statistic-sample-count-set`
- and :ref:`command-statistic-sample-age-set-all`.
-
For instance to reduce the statistic keeping overhead you can set
the default maximum sample count to 1 so only one sample will be kept by:
limit (-sample-age-set) and size based limit (-sample-count-set) which
control how long or how many samples of the given statistic are retained.
-This only applies for existing statistics: to change the default limits used
-when a new statistic is created, for instance during server startup,
-the statistic-default-sample-count and statistic-default-sample-age
-global configuration parameters must be used.
-
The difference between reset and remove is somewhat subtle.
The reset command sets the value of the statistic to zero or a neutral value,
so after this operation, the statistic will have a value of 0 (integer),
return (createAnswer(0, status));
}
+ConstElementPtr
+ControlledDhcpv4Srv::commandStatisticSetMaxSampleCountAllHandler(const string&,
+ ConstElementPtr args) {
+ ConstElementPtr answer = StatsMgr::statisticSetMaxSampleCountAllHandler(args);
+ // Update the default parameter.
+ long max_samples = StatsMgr::instance().getMaxSampleCountDefault();
+ CfgMgr::instance().getCurrentCfg()->addConfiguredGlobal(
+ "statistic-default-sample-count", Element::create(max_samples));
+ return (answer);
+}
+
+ConstElementPtr
+ControlledDhcpv4Srv::commandStatisticSetMaxSampleAgeAllHandler(const string&,
+ ConstElementPtr args) {
+ ConstElementPtr answer = StatsMgr::statisticSetMaxSampleAgeAllHandler(args);
+ // Update the default parameter.
+ auto duration = StatsMgr::instance().getMaxSampleAgeDefault();
+ long max_age = duration.total_seconds();
+ CfgMgr::instance().getCurrentCfg()->addConfiguredGlobal(
+ "statistic-default-sample-age", Element::create(max_age));
+ return (answer);
+}
+
ConstElementPtr
ControlledDhcpv4Srv::processCommand(const string& command,
ConstElementPtr args) {
boost::bind(&StatsMgr::statisticSetMaxSampleAgeHandler, _1, _2));
CommandMgr::instance().registerCommand("statistic-sample-age-set-all",
- boost::bind(&StatsMgr::statisticSetMaxSampleAgeAllHandler, _1, _2));
+ boost::bind(&ControlledDhcpv4Srv::commandStatisticSetMaxSampleAgeAllHandler, this, _1, _2));
CommandMgr::instance().registerCommand("statistic-sample-count-set",
boost::bind(&StatsMgr::statisticSetMaxSampleCountHandler, _1, _2));
CommandMgr::instance().registerCommand("statistic-sample-count-set-all",
- boost::bind(&StatsMgr::statisticSetMaxSampleCountAllHandler, _1, _2));
+ boost::bind(&ControlledDhcpv4Srv::commandStatisticSetMaxSampleCountAllHandler, this, _1, _2));
}
void ControlledDhcpv4Srv::shutdownServer(int exit_value) {
commandStatusGetHandler(const std::string& command,
isc::data::ConstElementPtr args);
+ /// @brief handler for processing 'statistic-sample-count-set-all' command
+ ///
+ /// This handler processes statistic-sample-count-set-all command,
+ /// which set max_sample_count_ limit of all statistics and the default.
+ /// @ref isc::stats::StatsMgr::statisticSetMaxSampleCountAllHandler
+ ///
+ /// @param command (ignored)
+ /// @param args structure containing a map that contains "max-samples"
+ /// @return process information wrapped in a response
+ isc::data::ConstElementPtr
+ commandStatisticSetMaxSampleCountAllHandler(const std::string& command,
+ isc::data::ConstElementPtr args);
+
+ /// @brief handler for processing 'statistic-sample-age-set-all' command
+ ///
+ /// This handler processes statistic-sample-age-set-all command,
+ /// which set max_sample_age_ limit of all statistics and the default.
+ /// @ref isc::stats::StatsMgr::statisticSetMaxSampleAgeAllHandler
+ ///
+ /// @param command (ignored)
+ /// @param args structure containing a map that contains "duration"
+ /// @return process information wrapped in a response
+ isc::data::ConstElementPtr
+ commandStatisticSetMaxSampleAgeAllHandler(const std::string& command,
+ isc::data::ConstElementPtr args);
+
/// @brief Reclaims expired IPv4 leases and reschedules timer.
///
/// This is a wrapper method for @c AllocEngine::reclaimExpiredLeases4.
return (createAnswer(0, status));
}
+ConstElementPtr
+ControlledDhcpv6Srv::commandStatisticSetMaxSampleCountAllHandler(const string&,
+ ConstElementPtr args) {
+ ConstElementPtr answer = StatsMgr::statisticSetMaxSampleCountAllHandler(args);
+ // Update the default parameter.
+ long max_samples = StatsMgr::instance().getMaxSampleCountDefault();
+ CfgMgr::instance().getCurrentCfg()->addConfiguredGlobal(
+ "statistic-default-sample-count", Element::create(max_samples));
+ return (answer);
+}
+
+ConstElementPtr
+ControlledDhcpv6Srv::commandStatisticSetMaxSampleAgeAllHandler(const string&,
+ ConstElementPtr args) {
+ ConstElementPtr answer = StatsMgr::statisticSetMaxSampleAgeAllHandler(args);
+ // Update the default parameter.
+ auto duration = StatsMgr::instance().getMaxSampleAgeDefault();
+ long max_age = duration.total_seconds();
+ CfgMgr::instance().getCurrentCfg()->addConfiguredGlobal(
+ "statistic-default-sample-age", Element::create(max_age));
+ return (answer);
+}
+
ConstElementPtr
ControlledDhcpv6Srv::processCommand(const string& command,
ConstElementPtr args) {
boost::bind(&StatsMgr::statisticSetMaxSampleAgeHandler, _1, _2));
CommandMgr::instance().registerCommand("statistic-sample-age-set-all",
- boost::bind(&StatsMgr::statisticSetMaxSampleAgeAllHandler, _1, _2));
+ boost::bind(&ControlledDhcpv6Srv::commandStatisticSetMaxSampleAgeAllHandler, this, _1, _2));
CommandMgr::instance().registerCommand("statistic-sample-count-set",
boost::bind(&StatsMgr::statisticSetMaxSampleCountHandler, _1, _2));
CommandMgr::instance().registerCommand("statistic-sample-count-set-all",
- boost::bind(&StatsMgr::statisticSetMaxSampleCountAllHandler, _1, _2));
+ boost::bind(&ControlledDhcpv6Srv::commandStatisticSetMaxSampleCountAllHandler, this, _1, _2));
}
void ControlledDhcpv6Srv::shutdownServer(int exit_value) {
commandStatusGetHandler(const std::string& command,
isc::data::ConstElementPtr args);
+ /// @brief handler for processing 'statistic-sample-count-set-all' command
+ ///
+ /// This handler processes statistic-sample-count-set-all command,
+ /// which set max_sample_count_ limit of all statistics and the default.
+ /// @ref isc::stats::StatsMgr::statisticSetMaxSampleCountAllHandler
+ ///
+ /// @param command (ignored)
+ /// @param args structure containing a map that contains "max-samples"
+ /// @return process information wrapped in a response
+ isc::data::ConstElementPtr
+ commandStatisticSetMaxSampleCountAllHandler(const std::string& command,
+ isc::data::ConstElementPtr args);
+
+ /// @brief handler for processing 'statistic-sample-age-set-all' command
+ ///
+ /// This handler processes statistic-sample-age-set-all command,
+ /// which set max_sample_age_ limit of all statistics and the default.
+ /// @ref isc::stats::StatsMgr::statisticSetMaxSampleAgeAllHandler
+ ///
+ /// @param command (ignored)
+ /// @param args structure containing a map that contains "duration"
+ /// @return process information wrapped in a response
+ isc::data::ConstElementPtr
+ commandStatisticSetMaxSampleAgeAllHandler(const std::string& command,
+ isc::data::ConstElementPtr args);
+
/// @brief Reclaims expired IPv6 leases and reschedules timer.
///
/// This is a wrapper method for @c AllocEngine::reclaimExpiredLeases6.
}
}
-
void
SrvConfig::removeStatistics() {
// Removes statistics for v4 and v6 subnets
SrvConfig::updateStatistics() {
// Update default sample limits.
stats::StatsMgr& stats_mgr = stats::StatsMgr::instance();
- ConstElementPtr max_samples =
+ ConstElementPtr samples =
getConfiguredGlobal("statistic-default-sample-count");
- if (max_samples) {
- stats_mgr.setMaxSampleCountDefault(max_samples->intValue());
+ uint32_t max_samples = 0;
+ if (samples) {
+ max_samples = samples->intValue();
+ stats_mgr.setMaxSampleCountDefault(max_samples);
+ if (max_samples != 0) {
+ stats_mgr.setMaxSampleCountAll(max_samples);
+ }
}
ConstElementPtr duration =
getConfiguredGlobal("statistic-default-sample-age");
int64_t minutes = time_duration / 60;
time_duration -= minutes * 60;
int64_t seconds = time_duration;
- stats_mgr.setMaxSampleAgeDefault(boost::posix_time::time_duration(hours, minutes, seconds, 0));
+ auto max_age =
+ boost::posix_time::time_duration(hours, minutes, seconds, 0);
+ stats_mgr.setMaxSampleAgeDefault(max_age);
+ if (max_samples == 0) {
+ stats_mgr.setMaxSampleAgeAll(max_age);
+ }
}
// Updating subnet statistics involves updating lease statistics, which
EXPECT_NO_THROW(total_addrs = stats_mgr.getObservation("subnet[42].total-addresses"));
ASSERT_TRUE(total_addrs);
EXPECT_EQ(128, total_addrs->getInteger().first);
+ EXPECT_TRUE(total_addrs->getMaxSampleCount().first);
+ EXPECT_EQ(15, total_addrs->getMaxSampleCount().second);
+ EXPECT_FALSE(total_addrs->getMaxSampleAge().first);
+ EXPECT_EQ("00:00:02", durationToText(total_addrs->getMaxSampleAge().second, 0));
}
// This test verifies that once the configuration is merged into the current
EXPECT_NO_THROW(total_addrs = stats_mgr.getObservation("subnet[42].total-nas"));
ASSERT_TRUE(total_addrs);
EXPECT_EQ(128, total_addrs->getInteger().first);
-
- EXPECT_NO_THROW(total_addrs = stats_mgr.getObservation("subnet[42].total-pds"));
- ASSERT_TRUE(total_addrs);
- EXPECT_EQ(65536, total_addrs->getInteger().first);
+ EXPECT_TRUE(total_addrs->getMaxSampleCount().first);
+ EXPECT_EQ(14, total_addrs->getMaxSampleCount().second);
+ EXPECT_FALSE(total_addrs->getMaxSampleAge().first);
+ EXPECT_EQ("00:00:10", durationToText(total_addrs->getMaxSampleAge().second, 0));
+
+ ObservationPtr total_prfx;
+ EXPECT_NO_THROW(total_prfx = stats_mgr.getObservation("subnet[42].total-pds"));
+ ASSERT_TRUE(total_prfx);
+ EXPECT_EQ(65536, total_prfx->getInteger().first);
+ EXPECT_TRUE(total_prfx->getMaxSampleCount().first);
+ EXPECT_EQ(14, total_prfx->getMaxSampleCount().second);
+ EXPECT_FALSE(total_prfx->getMaxSampleAge().first);
+ EXPECT_EQ("00:00:10", durationToText(total_prfx->getMaxSampleAge().second, 0));
}
// This test verifies that once the configuration is merged into the current
}
ConstElementPtr
-StatsMgr::statisticSetMaxSampleAgeAllHandler(const string& /*name*/,
- const ConstElementPtr& params) {
+StatsMgr::statisticSetMaxSampleAgeAllHandler(const ConstElementPtr& params) {
string error;
StatsDuration duration;
if (!StatsMgr::getStatDuration(params, duration, error)) {
return (createAnswer(CONTROL_RESULT_ERROR, error));
}
- StatsMgr::instance().setMaxSampleAgeAll(duration);
+ if (MultiThreadingMgr::instance().getMode()) {
+ StatsMgr::instance().setMaxSampleCountDefaultInternal(0);
+ StatsMgr::instance().setMaxSampleAgeDefaultInternal(duration);
+ StatsMgr::instance().setMaxSampleAgeAllInternal(duration);
+ } else {
+ StatsMgr::instance().setMaxSampleCountDefaultInternal(0);
+ StatsMgr::instance().setMaxSampleAgeDefaultInternal(duration);
+ StatsMgr::instance().setMaxSampleAgeAllInternal(duration);
+ }
return (createAnswer(CONTROL_RESULT_SUCCESS,
"All statistics duration limit are set."));
}
ConstElementPtr
-StatsMgr::statisticSetMaxSampleCountAllHandler(const string& /*name*/,
- const ConstElementPtr& params) {
+StatsMgr::statisticSetMaxSampleCountAllHandler(const ConstElementPtr& params) {
string error;
uint32_t max_samples;
if (!StatsMgr::getStatMaxSamples(params, max_samples, error)) {
return (createAnswer(CONTROL_RESULT_ERROR, error));
}
- StatsMgr::instance().setMaxSampleCountAll(max_samples);
+ if (max_samples == 0) {
+ error = "'max-samples' parameter must not be zero";
+ return (createAnswer(CONTROL_RESULT_ERROR, error));
+ }
+ if (MultiThreadingMgr::instance().getMode()) {
+ StatsMgr::instance().setMaxSampleCountDefaultInternal(max_samples);
+ StatsMgr::instance().setMaxSampleCountAllInternal(max_samples);
+ } else {
+ StatsMgr::instance().setMaxSampleCountDefaultInternal(max_samples);
+ StatsMgr::instance().setMaxSampleCountAllInternal(max_samples);
+ }
return (createAnswer(CONTROL_RESULT_SUCCESS,
"All statistics count limit are set."));
}
return (true);
}
-};
-};
+} // end of namespace stats
+} // end of namespace isc
/// @brief Handles statistic-sample-age-set-all command
///
/// This method handles statistic-sample-age-set-all command,
- /// which set max_sample_age_ limit to all statistics.
+ /// which set max_sample_age_ limit to all statistics and the default.
/// It expects one parameter stored in params map:
/// duration: limit expressed as a number of seconds
///
/// "duration": 1245
/// }
///
- /// @param name name of the command (ignored, should be "statistic-sample-age-set-all")
/// @param params structure containing a map that contains "duration"
/// @return answer confirming success of this operation
static isc::data::ConstElementPtr
- statisticSetMaxSampleAgeAllHandler(const std::string& name,
- const isc::data::ConstElementPtr& params);
+ statisticSetMaxSampleAgeAllHandler(const isc::data::ConstElementPtr& params);
/// @brief Handles statistic-sample-count-set-all command
///
/// This method handles statistic-sample-count-set-all command,
- /// which set max_sample_count_ limit of all statistics.
+ /// which set max_sample_count_ limit of all statistics and the default.
/// It expects one parameter stored in params map:
/// max-samples: count limit
+ /// The value 0 is out of range.
///
/// Example params structure:
/// {
/// "max-samples": 15
/// }
///
- /// @param name name of the command (ignored, should be "statistic-sample-count-set-all")
/// @param params structure containing a map that contains "max-samples"
/// @return answer confirming success of this operation
static isc::data::ConstElementPtr
- statisticSetMaxSampleCountAllHandler(const std::string& name,
- const isc::data::ConstElementPtr& params);
+ statisticSetMaxSampleCountAllHandler(const isc::data::ConstElementPtr& params);
/// @}
ASSERT_EQ(StatsMgr::instance().getMaxSampleCountDefault(), 10);
ASSERT_EQ(StatsMgr::instance().getMaxSampleAgeDefault(), time_duration(0, 0, 5, 0));
+ // Check the existing statistics were not updated.
+ EXPECT_EQ(StatsMgr::instance().getObservation("alpha")->getMaxSampleCount().first, true);
+ EXPECT_EQ(StatsMgr::instance().getObservation("alpha")->getMaxSampleCount().second, 20);
+ EXPECT_EQ(StatsMgr::instance().getObservation("alpha")->getMaxSampleAge().first, false);
+ EXPECT_EQ(StatsMgr::instance().getObservation("alpha")->getMaxSampleAge().second, time_duration(0, 0, 0, 0));
+ EXPECT_EQ(StatsMgr::instance().getObservation("beta")->getMaxSampleCount().first, true);
+ EXPECT_EQ(StatsMgr::instance().getObservation("beta")->getMaxSampleCount().second, 20);
+ EXPECT_EQ(StatsMgr::instance().getObservation("beta")->getMaxSampleAge().first, false);
+ EXPECT_EQ(StatsMgr::instance().getObservation("beta")->getMaxSampleAge().second, time_duration(0, 0, 0, 0));
+ EXPECT_EQ(StatsMgr::instance().getObservation("gamma")->getMaxSampleCount().first, true);
+ EXPECT_EQ(StatsMgr::instance().getObservation("gamma")->getMaxSampleCount().second, 20);
+ EXPECT_EQ(StatsMgr::instance().getObservation("gamma")->getMaxSampleAge().first, false);
+ EXPECT_EQ(StatsMgr::instance().getObservation("gamma")->getMaxSampleAge().second, time_duration(0, 0, 0, 0));
+ EXPECT_EQ(StatsMgr::instance().getObservation("delta")->getMaxSampleCount().first, true);
+ EXPECT_EQ(StatsMgr::instance().getObservation("delta")->getMaxSampleCount().second, 20);
+ EXPECT_EQ(StatsMgr::instance().getObservation("delta")->getMaxSampleAge().first, false);
+ EXPECT_EQ(StatsMgr::instance().getObservation("delta")->getMaxSampleAge().second, time_duration(0, 0, 0, 0));
+
+ // Remove all test statistics.
EXPECT_NO_THROW(StatsMgr::instance().removeAll());
StatsMgr::instance().setValue("alpha", static_cast<int64_t>(1234));
EXPECT_NO_THROW(StatsMgr::instance().setMaxSampleCountDefault(0));
ASSERT_EQ(StatsMgr::instance().getMaxSampleCountDefault(), 0);
+ // Check the existing statistics were not updated.
+ EXPECT_EQ(StatsMgr::instance().getObservation("alpha")->getMaxSampleCount().first, true);
+ EXPECT_EQ(StatsMgr::instance().getObservation("alpha")->getMaxSampleCount().second, 10);
+ EXPECT_EQ(StatsMgr::instance().getObservation("alpha")->getMaxSampleAge().first, false);
+ EXPECT_EQ(StatsMgr::instance().getObservation("alpha")->getMaxSampleAge().second, time_duration(0, 0, 5, 0));
+ EXPECT_EQ(StatsMgr::instance().getObservation("beta")->getMaxSampleCount().first, true);
+ EXPECT_EQ(StatsMgr::instance().getObservation("beta")->getMaxSampleCount().second, 10);
+ EXPECT_EQ(StatsMgr::instance().getObservation("beta")->getMaxSampleAge().first, false);
+ EXPECT_EQ(StatsMgr::instance().getObservation("beta")->getMaxSampleAge().second, time_duration(0, 0, 5, 0));
+ EXPECT_EQ(StatsMgr::instance().getObservation("gamma")->getMaxSampleCount().first, true);
+ EXPECT_EQ(StatsMgr::instance().getObservation("gamma")->getMaxSampleCount().second, 10);
+ EXPECT_EQ(StatsMgr::instance().getObservation("gamma")->getMaxSampleAge().first, false);
+ EXPECT_EQ(StatsMgr::instance().getObservation("gamma")->getMaxSampleAge().second, time_duration(0, 0, 5, 0));
+ EXPECT_EQ(StatsMgr::instance().getObservation("delta")->getMaxSampleCount().first, true);
+ EXPECT_EQ(StatsMgr::instance().getObservation("delta")->getMaxSampleCount().second, 10);
+ EXPECT_EQ(StatsMgr::instance().getObservation("delta")->getMaxSampleAge().first, false);
+ EXPECT_EQ(StatsMgr::instance().getObservation("delta")->getMaxSampleAge().second, time_duration(0, 0, 5, 0));
+
+ // Remove all test statistics.
EXPECT_NO_THROW(StatsMgr::instance().removeAll());
StatsMgr::instance().setValue("alpha", static_cast<int64_t>(1234));
params->set("duration", Element::create(3765)); // time_duration(1, 2, 45, 0)
ConstElementPtr rsp =
- StatsMgr::instance().statisticSetMaxSampleAgeAllHandler("statistic-sample-age-set-all", params);
+ StatsMgr::instance().statisticSetMaxSampleAgeAllHandler(params);
int status_code;
ASSERT_NO_THROW(parseAnswer(status_code, rsp));
EXPECT_EQ(CONTROL_RESULT_SUCCESS, status_code);
+ // check defaults
+ EXPECT_EQ(StatsMgr::instance().getMaxSampleAgeDefault(),
+ time_duration(1, 2, 45, 0));
+ EXPECT_EQ(StatsMgr::instance().getMaxSampleCountDefault(), 0);
+
// check if time limit was set properly and whether count limit is disabled
EXPECT_EQ(StatsMgr::instance().getObservation("alpha")->getMaxSampleAge().first, true);
EXPECT_EQ(StatsMgr::instance().getObservation("alpha")->getMaxSampleAge().second,
params->set("max-samples", Element::create(200));
ConstElementPtr rsp =
- StatsMgr::instance().statisticSetMaxSampleCountAllHandler("statistic-sample-count-set-all", params);
+ StatsMgr::instance().statisticSetMaxSampleCountAllHandler(params);
int status_code;
ASSERT_NO_THROW(parseAnswer(status_code, rsp));
EXPECT_EQ(CONTROL_RESULT_SUCCESS, status_code);
+ // check default
+ EXPECT_EQ(StatsMgr::instance().getMaxSampleCountDefault(), 200);
+
// check if count limit was set properly and whether count limit is disabled
EXPECT_EQ(StatsMgr::instance().getObservation("alpha")->getMaxSampleCount().first, true);
EXPECT_EQ(StatsMgr::instance().getObservation("alpha")->getMaxSampleCount().second, 200);
EXPECT_EQ(StatsMgr::instance().getObservation("delta")->getMaxSampleAge().first, false);
}
+// Test checks if statistics-sample-count-set-all fails on zero.
+TEST_F(StatsMgrTest, commandSetMaxSampleCountAllZero) {
+ ElementPtr params = Element::createMap();
+ params->set("max-samples", Element::create(0));
+
+ ConstElementPtr rsp =
+ StatsMgr::instance().statisticSetMaxSampleCountAllHandler(params);
+ int status_code;
+ ASSERT_NO_THROW(parseAnswer(status_code, rsp));
+ EXPECT_EQ(status_code, CONTROL_RESULT_ERROR);
+}
+
};