Kea 3.1.3
lib/stats/stats_mgr.h
Go to the documentation of this file.
1// Copyright (C) 2015-2025 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#ifndef STATSMGR_H
8#define STATSMGR_H
9
10#include <stats/observation.h>
11#include <stats/context.h>
12#include <util/bigints.h>
13
14#include <boost/noncopyable.hpp>
15#include <boost/scoped_ptr.hpp>
16
17#include <map>
18#include <mutex>
19#include <string>
20#include <vector>
21#include <sstream>
22
23namespace isc {
24namespace stats {
25
65class StatsMgr : public boost::noncopyable {
66public:
67
69 static StatsMgr& instance();
70
76
82 void setValue(const std::string& name, const int64_t value);
83
89 void setValue(const std::string& name, const isc::util::int128_t& value);
90
96 void setValue(const std::string& name, const double value);
97
103 void setValue(const std::string& name, const StatsDuration& value);
104
110 void setValue(const std::string& name, const std::string& value);
111
117 void addValue(const std::string& name, const int64_t value);
118
124 void addValue(const std::string& name, const isc::util::int128_t& value);
125
131 void addValue(const std::string& name, const double value);
132
138 void addValue(const std::string& name, const StatsDuration& value);
139
145 void addValue(const std::string& name, const std::string& value);
146
163 bool setMaxSampleAge(const std::string& name, const StatsDuration& duration);
164
177 bool setMaxSampleCount(const std::string& name, uint32_t max_samples);
178
182 void setMaxSampleAgeAll(const StatsDuration& duration);
183
187 void setMaxSampleCountAll(uint32_t max_samples);
188
192 void setMaxSampleAgeDefault(const StatsDuration& duration);
193
198 void setMaxSampleCountDefault(uint32_t max_samples);
199
204
209 uint32_t getMaxSampleCountDefault() const;
210
212
218
226 bool reset(const std::string& name);
227
232 bool del(const std::string& name);
233
235 void resetAll();
236
239 void removeAll();
240
245 size_t getSize(const std::string& name) const;
246
250 size_t count() const;
251
255 isc::data::ConstElementPtr get(const std::string& name) const;
256
261
266
268
277 ObservationPtr getObservation(const std::string& name) const;
278
286 ObservationPtr getObservationInternal(const std::string& name) const;
287
302 template<typename Type>
303 static std::string generateName(const std::string& context, Type index,
304 const std::string& stat_name) {
305 std::stringstream name;
306 name << context << "[" << index << "]." << stat_name;
307 return (name.str());
308 }
309
315
331 statisticGetHandler(const std::string& name,
332 const isc::data::ConstElementPtr& params);
333
349 statisticResetHandler(const std::string& name,
350 const isc::data::ConstElementPtr& params);
351
367 statisticRemoveHandler(const std::string& name,
368 const isc::data::ConstElementPtr& params);
369
389 statisticSetMaxSampleAgeHandler(const std::string& name,
390 const isc::data::ConstElementPtr& params);
391
411 statisticSetMaxSampleCountHandler(const std::string& name,
412 const isc::data::ConstElementPtr& params);
413
423 statisticGetAllHandler(const std::string& name,
424 const isc::data::ConstElementPtr& params);
425
435 statisticGlobalGetAllHandler(const std::string& name,
436 const isc::data::ConstElementPtr& params);
437
447 statisticResetAllHandler(const std::string& name,
448 const isc::data::ConstElementPtr& params);
449
461 statisticRemoveAllHandler(const std::string& name,
462 const isc::data::ConstElementPtr& params);
463
480
498
500
501private:
502
504
509 StatsMgr();
510
512
523 template<typename DataType>
524 void setValueInternal(const std::string& name, DataType value) {
525 // If we want to log each observation, here would be the best place for it.
527 if (stat) {
528 stat->setValue(value);
529 } else {
530 stat.reset(new Observation(name, value));
532 }
533 }
534
536
547 template<typename DataType>
548 void addValueInternal(const std::string& name, DataType value) {
549 // If we want to log each observation, here would be the best place for it.
550 ObservationPtr existing = getObservationInternal(name);
551 if (!existing) {
552 // We tried to add to a non-existing statistic. We can recover from
553 // that. Simply add the new incremental value as a new statistic and
554 // we're done.
555 setValueInternal(name, value);
556 return;
557 } else {
558 // Let's hope it is of correct type. If not, the underlying
559 // addValue() method will throw.
560 existing->addValue(value);
561 }
562 }
563
565
573 void addObservation(const ObservationPtr& stat);
574
576
584 void addObservationInternal(const ObservationPtr& stat);
585
587
594 bool deleteObservation(const std::string& name);
595
597
604 bool deleteObservationInternal(const std::string& name);
605
607
615 bool setMaxSampleAgeInternal(const std::string& name, const StatsDuration& duration);
616
618
626 bool setMaxSampleCountInternal(const std::string& name, uint32_t max_samples);
627
629
635 void setMaxSampleAgeAllInternal(const StatsDuration& duration);
636
638
644 void setMaxSampleCountAllInternal(uint32_t max_samples);
645
647
653 void setMaxSampleAgeDefaultInternal(const StatsDuration& duration);
654
661 void setMaxSampleCountDefaultInternal(uint32_t max_samples);
662
664
670 const StatsDuration& getMaxSampleAgeDefaultInternal() const;
671
678 uint32_t getMaxSampleCountDefaultInternal() const;
679
681
688 bool resetInternal(const std::string& name);
689
691
698 bool delInternal(const std::string& name);
699
701
705 void resetAllInternal();
706
708
712 void removeAllInternal();
713
715
722 size_t getSizeInternal(const std::string& name) const;
723
725
731 size_t countInternal() const;
732
734
740 isc::data::ConstElementPtr getInternal(const std::string& name) const;
741
743
749 isc::data::ConstElementPtr getAllInternal() const;
750
756 isc::data::ConstElementPtr getAllGlobalInternal() const;
757
759
772 static bool getStatName(const isc::data::ConstElementPtr& params,
773 std::string& name,
774 std::string& reason);
775
777
794 static bool getStatDuration(const isc::data::ConstElementPtr& params,
795 StatsDuration& duration,
796 std::string& reason);
797
799
815 static bool getStatMaxSamples(const isc::data::ConstElementPtr& params,
816 uint32_t& max_samples,
817 std::string& reason);
818
820 StatContextPtr global_;
821
823 const boost::scoped_ptr<std::mutex> mutex_;
824};
825
826} // namespace stats
827} // namespace isc
828
829#endif // STATS_MGR
Represents a single observable characteristic (a 'statistic')
Definition observation.h:91
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).
static std::string generateName(const std::string &context, Type index, const std::string &stat_name)
Generates statistic name in a given context.
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.
static isc::data::ConstElementPtr statisticGlobalGetAllHandler(const std::string &name, const isc::data::ConstElementPtr &params)
Handles statistic-global-get-all 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.
isc::data::ConstElementPtr getAllGlobal() const
Returns all global statistics (omitting subnet statistics) as a JSON structure.
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.
boost::shared_ptr< const Element > ConstElementPtr
Definition data.h:29
boost::shared_ptr< Observation > ObservationPtr
Observation pointer.
boost::shared_ptr< StatContext > StatContextPtr
Pointer to the statistics context.
Definition context.h:91
std::chrono::system_clock::duration StatsDuration
Defines duration type.
Definition observation.h:43
boost::multiprecision::checked_int128_t int128_t
Definition bigints.h:19
Defines the logger used by the top-level component of kea-lfc.