Kea  2.5.3
lib/stats/stats_mgr.cc
Go to the documentation of this file.
1 // Copyright (C) 2015-2023 Internet Systems Consortium, Inc. ("ISC")
2 //
3 // This Source Code Form is subject to the terms of the Mozilla Public
4 // License, v. 2.0. If a copy of the MPL was not distributed with this
5 // file, You can obtain one at http://mozilla.org/MPL/2.0/.
6 
7 #include <config.h>
8 
10 #include <stats/stats_mgr.h>
11 #include <cc/data.h>
12 #include <cc/command_interpreter.h>
14 #include <util/bigints.h>
15 
16 #include <boost/make_shared.hpp>
17 
18 #include <chrono>
19 
20 using namespace std;
21 using namespace std::chrono;
22 using namespace isc::data;
23 using namespace isc::config;
24 using namespace isc::util;
25 
26 namespace isc {
27 namespace stats {
28 
29 StatsMgr&
30 StatsMgr::instance() {
31  static StatsMgr stats_mgr;
32  return (stats_mgr);
33 }
34 
35 StatsMgr::StatsMgr() :
36  global_(boost::make_shared<StatContext>()), mutex_(new mutex) {
37 }
38 
39 void
40 StatsMgr::setValue(const string& name, const int64_t value) {
41  MultiThreadingLock lock(*mutex_);
42  setValueInternal(name, value);
43 }
44 
45 void
46 StatsMgr::setValue(const string& name, const int128_t& value) {
47  MultiThreadingLock lock(*mutex_);
48  setValueInternal(name, value);
49 }
50 
51 void
52 StatsMgr::setValue(const string& name, const double value) {
53  MultiThreadingLock lock(*mutex_);
54  setValueInternal(name, value);
55 }
56 
57 void
58 StatsMgr::setValue(const string& name, const StatsDuration& value) {
59  MultiThreadingLock lock(*mutex_);
60  setValueInternal(name, value);
61 }
62 
63 void
64 StatsMgr::setValue(const string& name, const string& value) {
65  MultiThreadingLock lock(*mutex_);
66  setValueInternal(name, value);
67 }
68 
69 void
70 StatsMgr::addValue(const string& name, const int64_t value) {
71  MultiThreadingLock lock(*mutex_);
72  addValueInternal(name, value);
73 }
74 
75 void
76 StatsMgr::addValue(const string& name, const int128_t& value) {
77  MultiThreadingLock lock(*mutex_);
78  addValueInternal(name, value);
79 }
80 
81 void
82 StatsMgr::addValue(const string& name, const double value) {
83  MultiThreadingLock lock(*mutex_);
84  addValueInternal(name, value);
85 }
86 
87 void
88 StatsMgr::addValue(const string& name, const StatsDuration& value) {
89  MultiThreadingLock lock(*mutex_);
90  addValueInternal(name, value);
91 }
92 
93 void
94 StatsMgr::addValue(const string& name, const string& value) {
95  MultiThreadingLock lock(*mutex_);
96  addValueInternal(name, value);
97 }
98 
100 StatsMgr::getObservation(const string& name) const {
101  MultiThreadingLock lock(*mutex_);
102  return (getObservationInternal(name));
103 }
104 
106 StatsMgr::getObservationInternal(const string& name) const {
108  // Currently we keep everything in a global context.
109  return (global_->get(name));
110 }
111 
112 void
114  MultiThreadingLock lock(*mutex_);
116 }
117 
118 void
121  // Currently we keep everything in a global context.
122  global_->add(stat);
123 }
124 
125 bool
126 StatsMgr::deleteObservation(const string& name) {
127  MultiThreadingLock lock(*mutex_);
128  return (deleteObservationInternal(name));
129 }
130 
131 bool
132 StatsMgr::deleteObservationInternal(const string& name) {
134  // Currently we keep everything in a global context.
135  return (global_->del(name));
136 }
137 
138 bool
139 StatsMgr::setMaxSampleAge(const string& name, const StatsDuration& duration) {
140  MultiThreadingLock lock(*mutex_);
141  return (setMaxSampleAgeInternal(name, duration));
142 }
143 
144 bool
145 StatsMgr::setMaxSampleAgeInternal(const string& name,
146  const StatsDuration& duration) {
148  if (obs) {
149  obs->setMaxSampleAge(duration);
150  return (true);
151  }
152  return (false);
153 }
154 
155 bool
156 StatsMgr::setMaxSampleCount(const string& name, uint32_t max_samples) {
157  MultiThreadingLock lock(*mutex_);
158  return (setMaxSampleCountInternal(name, max_samples));
159 }
160 
161 bool
162 StatsMgr::setMaxSampleCountInternal(const string& name,
163  uint32_t max_samples) {
165  if (obs) {
166  obs->setMaxSampleCount(max_samples);
167  return (true);
168  }
169  return (false);
170 }
171 
172 void
174  MultiThreadingLock lock(*mutex_);
175  setMaxSampleAgeAllInternal(duration);
176 }
177 
178 void
179 StatsMgr::setMaxSampleAgeAllInternal(const StatsDuration& duration) {
180  global_->setMaxSampleAgeAll(duration);
181 }
182 
183 void
184 StatsMgr::setMaxSampleCountAll(uint32_t max_samples) {
185  MultiThreadingLock lock(*mutex_);
186  setMaxSampleCountAllInternal(max_samples);
187 }
188 
189 void
190 StatsMgr::setMaxSampleCountAllInternal(uint32_t max_samples) {
191  global_->setMaxSampleCountAll(max_samples);
192 }
193 
194 void
196  MultiThreadingLock lock(*mutex_);
197  setMaxSampleAgeDefaultInternal(duration);
198 }
199 
200 void
201 StatsMgr::setMaxSampleAgeDefaultInternal(const StatsDuration& duration) {
203 }
204 
205 void
206 StatsMgr::setMaxSampleCountDefault(uint32_t max_samples) {
207  MultiThreadingLock lock(*mutex_);
208  setMaxSampleCountDefaultInternal(max_samples);
209 }
210 
211 void
212 StatsMgr::setMaxSampleCountDefaultInternal(uint32_t max_samples) {
214 }
215 
216 const StatsDuration&
218  MultiThreadingLock lock(*mutex_);
219  return (getMaxSampleAgeDefaultInternal());
220 }
221 
222 const StatsDuration&
223 StatsMgr::getMaxSampleAgeDefaultInternal() const {
225 }
226 
227 uint32_t
229  MultiThreadingLock lock(*mutex_);
230  return (getMaxSampleCountDefaultInternal());
231 }
232 
233 uint32_t
234 StatsMgr::getMaxSampleCountDefaultInternal() const {
236 }
237 
238 bool
239 StatsMgr::reset(const string& name) {
240  MultiThreadingLock lock(*mutex_);
241  return (resetInternal(name));
242 }
243 
244 bool
245 StatsMgr::resetInternal(const string& name) {
247  if (obs) {
248  obs->reset();
249  return (true);
250  }
251  return (false);
252 }
253 
254 bool
255 StatsMgr::del(const string& name) {
256  MultiThreadingLock lock(*mutex_);
257  return (delInternal(name));
258 }
259 
260 bool
261 StatsMgr::delInternal(const string& name) {
262  return (global_->del(name));
263 }
264 
265 void
267  MultiThreadingLock lock(*mutex_);
268  removeAllInternal();
269 }
270 
271 void
272 StatsMgr::removeAllInternal() {
273  global_->clear();
274 }
275 
277 StatsMgr::get(const string& name) const {
278  MultiThreadingLock lock(*mutex_);
279  return (getInternal(name));
280 }
281 
283 StatsMgr::getInternal(const string& name) const {
284  ElementPtr map = Element::createMap(); // a map
286  if (obs) {
287  map->set(name, obs->getJSON()); // that contains observations
288  }
289  return (map);
290 }
291 
294  MultiThreadingLock lock(*mutex_);
295  return (getAllInternal());
296 }
297 
299 StatsMgr::getAllInternal() const {
300  return (global_->getAll());
301 }
302 
303 void
305  MultiThreadingLock lock(*mutex_);
306  resetAllInternal();
307 }
308 
309 void
310 StatsMgr::resetAllInternal() {
311  global_->resetAll();
312 }
313 
314 size_t
315 StatsMgr::getSize(const string& name) const {
316  MultiThreadingLock lock(*mutex_);
317  return (getSizeInternal(name));
318 }
319 
320 size_t
321 StatsMgr::getSizeInternal(const string& name) const {
323  if (obs) {
324  return (obs->getSize());
325  }
326  return (0);
327 }
328 
329 size_t
331  MultiThreadingLock lock(*mutex_);
332  return (countInternal());
333 }
334 
335 size_t
336 StatsMgr::countInternal() const {
337  return (global_->size());
338 }
339 
342  const ConstElementPtr& params) {
343  string name, error;
344  StatsDuration duration;
345  if (!StatsMgr::getStatName(params, name, error)) {
347  }
348  if (!StatsMgr::getStatDuration(params, duration, error)) {
350  }
351  if (StatsMgr::instance().setMaxSampleAge(name, duration)) {
353  "Statistic '" + name + "' duration limit is set."));
354  } else {
356  "No '" + name + "' statistic found"));
357  }
358 }
359 
362  const ConstElementPtr& params) {
363  string name, error;
364  uint32_t max_samples;
365  if (!StatsMgr::getStatName(params, name, error)) {
367  }
368  if (!StatsMgr::getStatMaxSamples(params, max_samples, error)) {
370  }
371  if (StatsMgr::instance().setMaxSampleCount(name, max_samples)) {
373  "Statistic '" + name + "' count limit is set."));
374  } else {
376  "No '" + name + "' statistic found"));
377  }
378 }
379 
381 StatsMgr::statisticGetHandler(const string& /*name*/,
382  const ConstElementPtr& params) {
383  string name, error;
384  if (!StatsMgr::getStatName(params, name, error)) {
386  }
388  StatsMgr::instance().get(name)));
389 }
390 
392 StatsMgr::statisticResetHandler(const string& /*name*/,
393  const ConstElementPtr& params) {
394  string name, error;
395  if (!StatsMgr::getStatName(params, name, error)) {
397  }
398  if (StatsMgr::instance().reset(name)) {
400  "Statistic '" + name + "' reset."));
401  } else {
403  "No '" + name + "' statistic found"));
404  }
405 }
406 
408 StatsMgr::statisticRemoveHandler(const string& /*name*/,
409  const ConstElementPtr& params) {
410  string name, error;
411  if (!StatsMgr::getStatName(params, name, error)) {
413  }
414  if (StatsMgr::instance().del(name)) {
416  "Statistic '" + name + "' removed."));
417  } else {
419  "No '" + name + "' statistic found"));
420  }
421 
422 }
423 
425 StatsMgr::statisticRemoveAllHandler(const string& /*name*/,
426  const ConstElementPtr& /*params*/) {
429  "Warning: statistic-remove-all command is deprecated."
430  " All statistics removed."));
431 }
432 
434 StatsMgr::statisticGetAllHandler(const string& /*name*/,
435  const ConstElementPtr& /*params*/) {
436  ConstElementPtr all_stats = StatsMgr::instance().getAll();
437  return (createAnswer(CONTROL_RESULT_SUCCESS, all_stats));
438 }
439 
441 StatsMgr::statisticResetAllHandler(const string& /*name*/,
442  const ConstElementPtr& /*params*/) {
445  "All statistics reset to neutral values."));
446 }
447 
450  string error;
451  StatsDuration duration;
452  if (!StatsMgr::getStatDuration(params, duration, error)) {
454  }
455  MultiThreadingLock lock(*mutex_);
456  StatsMgr::instance().setMaxSampleCountDefaultInternal(0);
457  StatsMgr::instance().setMaxSampleAgeDefaultInternal(duration);
458  StatsMgr::instance().setMaxSampleAgeAllInternal(duration);
460  "All statistics duration limit are set."));
461 }
462 
465  string error;
466  uint32_t max_samples;
467  if (!StatsMgr::getStatMaxSamples(params, max_samples, error)) {
469  }
470  if (max_samples == 0) {
471  error = "'max-samples' parameter must not be zero";
473  }
474  MultiThreadingLock lock(*mutex_);
475  StatsMgr::instance().setMaxSampleCountDefaultInternal(max_samples);
476  StatsMgr::instance().setMaxSampleCountAllInternal(max_samples);
478  "All statistics count limit are set."));
479 }
480 
481 bool
482 StatsMgr::getStatName(const ConstElementPtr& params,
483  string& name,
484  string& reason) {
485  if (!params) {
486  reason = "Missing mandatory 'name' parameter.";
487  return (false);
488  }
489  ConstElementPtr stat_name = params->get("name");
490  if (!stat_name) {
491  reason = "Missing mandatory 'name' parameter.";
492  return (false);
493  }
494  if (stat_name->getType() != Element::string) {
495  reason = "'name' parameter expected to be a string.";
496  return (false);
497  }
498  name = stat_name->stringValue();
499  return (true);
500 }
501 
502 bool
503 StatsMgr::getStatDuration(const ConstElementPtr& params,
504  StatsDuration& duration,
505  string& reason) {
506  if (!params) {
507  reason = "Missing mandatory 'duration' parameter.";
508  return (false);
509  }
510  ConstElementPtr stat_duration = params->get("duration");
511  if (!stat_duration) {
512  reason = "Missing mandatory 'duration' parameter.";
513  return (false);
514  }
515  duration = std::chrono::seconds(stat_duration->intValue());
516  return (true);
517 }
518 
519 bool
520 StatsMgr::getStatMaxSamples(const ConstElementPtr& params,
521  uint32_t& max_samples,
522  string& reason) {
523  if (!params) {
524  reason = "Missing mandatory 'max-samples' parameter.";
525  return (false);
526  }
527  ConstElementPtr stat_max_samples = params->get("max-samples");
528  if (!stat_max_samples) {
529  reason = "Missing mandatory 'max-samples' parameter.";
530  return (false);
531  }
532  if (stat_max_samples->getType() != Element::integer) {
533  reason = "'max-samples' parameter expected to be an integer.";
534  return (false);
535  }
536  max_samples = stat_max_samples->intValue();
537  return (true);
538 }
539 
540 } // end of namespace stats
541 } // end of namespace isc
static const StatsDuration & getMaxSampleAgeDefault()
Get default maximum age of samples.
Definition: observation.cc:393
static uint32_t getMaxSampleCountDefault()
Get default maximum count of samples.
Definition: observation.cc:397
static void setMaxSampleCountDefault(uint32_t max_samples)
Determines default maximum count of samples.
Definition: observation.cc:379
static void setMaxSampleAgeDefault(const StatsDuration &duration)
Determines default maximum age of samples.
Definition: observation.cc:374
Statistics Manager class.
ObservationPtr getObservation(const std::string &name) const
Returns an observation.
ObservationPtr getObservationInternal(const std::string &name) const
Returns an observation in a thread safe context.
static StatsMgr & instance()
Statistics Manager accessor method.
void addObservationInternal(const ObservationPtr &stat)
Adds a new observation in a thread safe context.
void addValueInternal(const std::string &name, DataType value)
Adds specified value to a given statistic (internal version).
void addObservation(const ObservationPtr &stat)
Adds a new observation.
void setValueInternal(const std::string &name, DataType value)
Sets a given statistic to specified value (internal version).
This file contains several functions and constants that are used for handling commands and responses ...
isc::data::ConstElementPtr statisticSetMaxSampleCountAllHandler(const isc::data::ConstElementPtr &params)
Handles statistic-sample-count-set-all command.
static isc::data::ConstElementPtr statisticResetHandler(const std::string &name, const isc::data::ConstElementPtr &params)
Handles statistic-reset command.
static isc::data::ConstElementPtr statisticGetAllHandler(const std::string &name, const isc::data::ConstElementPtr &params)
Handles statistic-get-all command.
static isc::data::ConstElementPtr statisticRemoveHandler(const std::string &name, const isc::data::ConstElementPtr &params)
Handles statistic-remove command.
static isc::data::ConstElementPtr statisticGetHandler(const std::string &name, const isc::data::ConstElementPtr &params)
Handles statistic-get command.
isc::data::ConstElementPtr statisticSetMaxSampleAgeAllHandler(const isc::data::ConstElementPtr &params)
Handles statistic-sample-age-set-all command.
static isc::data::ConstElementPtr statisticResetAllHandler(const std::string &name, const isc::data::ConstElementPtr &params)
Handles statistic-reset-all command.
static isc::data::ConstElementPtr statisticSetMaxSampleAgeHandler(const std::string &name, const isc::data::ConstElementPtr &params)
Handles statistic-sample-age-set command.
static isc::data::ConstElementPtr statisticRemoveAllHandler(const std::string &name, const isc::data::ConstElementPtr &params)
Handles statistic-remove-all command.
static isc::data::ConstElementPtr statisticSetMaxSampleCountHandler(const std::string &name, const isc::data::ConstElementPtr &params)
Handles statistic-sample-count-set command.
bool reset(const std::string &name)
Resets specified statistic.
void removeAll()
Removes all collected statistics.
void resetAll()
Resets all collected statistics back to zero.
bool del(const std::string &name)
Removes specified statistic.
size_t count() const
Returns number of available statistics.
isc::data::ConstElementPtr getAll() const
Returns all statistics as a JSON structure.
size_t getSize(const std::string &name) const
Returns size of specified statistic.
isc::data::ConstElementPtr get(const std::string &name) const
Returns a single statistic as a JSON structure.
void setMaxSampleCountDefault(uint32_t max_samples)
Set default count limit.
bool setMaxSampleCount(const std::string &name, uint32_t max_samples)
Determines how many samples of a given statistic should be kept.
uint32_t getMaxSampleCountDefault() const
Get default count limit.
void setValue(const std::string &name, const int64_t value)
Records absolute integer observation.
bool setMaxSampleAge(const std::string &name, const StatsDuration &duration)
Determines maximum age of samples.
const StatsDuration & getMaxSampleAgeDefault() const
Get default duration limit.
void setMaxSampleAgeAll(const StatsDuration &duration)
Set duration limit for all collected statistics.
void setMaxSampleCountAll(uint32_t max_samples)
Set count limit for all collected statistics.
void addValue(const std::string &name, const int64_t value)
Records incremental integer observation.
void setMaxSampleAgeDefault(const StatsDuration &duration)
Set default duration limit.
const int CONTROL_RESULT_ERROR
Status code indicating a general failure.
ConstElementPtr createAnswer(const int status_code, const std::string &text, const ConstElementPtr &arg)
const int CONTROL_RESULT_SUCCESS
Status code indicating a successful operation.
boost::shared_ptr< const Element > ConstElementPtr
Definition: data.h:29
boost::shared_ptr< Element > ElementPtr
Definition: data.h:26
@ error
Definition: db_log.h:116
boost::shared_ptr< Observation > ObservationPtr
Observation pointer.
Definition: observation.h:479
std::chrono::system_clock::duration StatsDuration
Defines duration type.
Definition: observation.h:43
Definition: edns.h:19
boost::multiprecision::int128_t int128_t
Definition: bigints.h:19
Defines the logger used by the top-level component of kea-lfc.
Statistics context.
Definition: context.h:31
RAII lock object to protect the code in the same scope with a mutex.