Kea  1.5.0
stats_mgr.cc
Go to the documentation of this file.
1 // Copyright (C) 2015,2017 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>
13 
14 using namespace std;
15 using namespace isc::data;
16 using namespace isc::config;
17 
18 namespace isc {
19 namespace stats {
20 
21 StatsMgr& StatsMgr::instance() {
22  static StatsMgr stats_mgr;
23  return (stats_mgr);
24 }
25 
26 StatsMgr::StatsMgr()
27  :global_(new StatContext()) {
28 
29 }
30 
31 void StatsMgr::setValue(const std::string& name, const int64_t value) {
32  setValueInternal(name, value);
33 }
34 
35 void StatsMgr::setValue(const std::string& name, const double value) {
36  setValueInternal(name, value);
37 }
38 
39 void StatsMgr::setValue(const std::string& name, const StatsDuration& value) {
40  setValueInternal(name, value);
41 }
42 void StatsMgr::setValue(const std::string& name, const std::string& value) {
43  setValueInternal(name, value);
44 }
45 
46 void StatsMgr::addValue(const std::string& name, const int64_t value) {
47  addValueInternal(name, value);
48 }
49 
50 void StatsMgr::addValue(const std::string& name, const double value) {
51  addValueInternal(name, value);
52 }
53 
54 void StatsMgr::addValue(const std::string& name, const StatsDuration& value) {
55  addValueInternal(name, value);
56 }
57 
58 void StatsMgr::addValue(const std::string& name, const std::string& value) {
59  addValueInternal(name, value);
60 }
61 
62 ObservationPtr StatsMgr::getObservation(const std::string& name) const {
64  // Currently we keep everything in a global context.
65  return (global_->get(name));
66 }
67 
70  // Currently we keep everything in a global context.
71  return (global_->add(stat));
72 }
73 
74 bool StatsMgr::deleteObservation(const std::string& name) {
76  // Currently we keep everything in a global context.
77  return (global_->del(name));
78 }
79 
80 void StatsMgr::setMaxSampleAge(const std::string& ,
81  const StatsDuration&) {
82  isc_throw(NotImplemented, "setMaxSampleAge not implemented");
83 }
84 
85 void StatsMgr::setMaxSampleCount(const std::string& , uint32_t){
86  isc_throw(NotImplemented, "setMaxSampleCount not implemented");
87 }
88 
89 bool StatsMgr::reset(const std::string& name) {
90  ObservationPtr obs = getObservation(name);
91  if (obs) {
92  obs->reset();
93  return (true);
94  } else {
95  return (false);
96  }
97 }
98 
99 bool StatsMgr::del(const std::string& name) {
100  return (global_->del(name));
101 }
102 
104  global_->stats_.clear();
105 }
106 
107 isc::data::ConstElementPtr StatsMgr::get(const std::string& name) const {
109  ObservationPtr obs = getObservation(name);
110  if (obs) {
111  response->set(name, obs->getJSON()); // that contains the observation
112  }
113  return (response);
114 }
115 
118 
119  // Let's iterate over all stored statistics...
120  for (std::map<std::string, ObservationPtr>::iterator s = global_->stats_.begin();
121  s != global_->stats_.end(); ++s) {
122 
123  // ... and add each of them to the map.
124  map->set(s->first, s->second->getJSON());
125  }
126  return (map);
127 }
128 
130  // Let's iterate over all stored statistics...
131  for (std::map<std::string, ObservationPtr>::iterator s = global_->stats_.begin();
132  s != global_->stats_.end(); ++s) {
133 
134  // ... and reset each statistic.
135  s->second->reset();
136  }
137 }
138 
139 size_t StatsMgr::count() const {
140  return (global_->stats_.size());
141 }
142 
144 StatsMgr::statisticGetHandler(const std::string& /*name*/,
145  const isc::data::ConstElementPtr& params) {
146  std::string name, error;
147  if (!getStatName(params, name, error)) {
148  return (createAnswer(CONTROL_RESULT_ERROR, error));
149  }
151  instance().get(name)));
152 }
153 
155 StatsMgr::statisticResetHandler(const std::string& /*name*/,
156  const isc::data::ConstElementPtr& params) {
157  std::string name, error;
158  if (!getStatName(params, name, error)) {
159  return (createAnswer(CONTROL_RESULT_ERROR, error));
160  }
161 
162  if (instance().reset(name)) {
164  "Statistic '" + name + "' reset."));
165  } else {
167  "No '" + name + "' statistic found"));
168  }
169 }
170 
172 StatsMgr::statisticRemoveHandler(const std::string& /*name*/,
173  const isc::data::ConstElementPtr& params) {
174  std::string name, error;
175  if (!getStatName(params, name, error)) {
176  return (createAnswer(CONTROL_RESULT_ERROR, error));
177  }
178  if (instance().del(name)) {
180  "Statistic '" + name + "' removed."));
181  } else {
183  "No '" + name + "' statistic found"));
184  }
185 
186 }
187 
189 StatsMgr::statisticRemoveAllHandler(const std::string& /*name*/,
190  const isc::data::ConstElementPtr& /*params*/) {
191  instance().removeAll();
193  "All statistics removed."));
194 }
195 
197 StatsMgr::statisticGetAllHandler(const std::string& /*name*/,
198  const isc::data::ConstElementPtr& /*params*/) {
199  ConstElementPtr all_stats = instance().getAll();
200  return (createAnswer(CONTROL_RESULT_SUCCESS, all_stats));
201 }
202 
204 StatsMgr::statisticResetAllHandler(const std::string& /*name*/,
205  const isc::data::ConstElementPtr& /*params*/) {
206  instance().resetAll();
208  "All statistics reset to neutral values."));
209 }
210 
211 bool
212 StatsMgr::getStatName(const isc::data::ConstElementPtr& params,
213  std::string& name,
214  std::string& reason) {
215  if (!params) {
216  reason = "Missing mandatory 'name' parameter.";
217  return (false);
218  }
219  ConstElementPtr stat_name = params->get("name");
220  if (!stat_name) {
221  reason = "Missing mandatory 'name' parameter.";
222  return (false);
223  }
224  if (stat_name->getType() != Element::string) {
225  reason = "'name' parameter expected to be a string.";
226  return (false);
227  }
228 
229  name = stat_name->stringValue();
230  return (true);
231 }
232 
233 };
234 };
ObservationPtr getObservation(const std::string &name) const
Returns an observation.
Definition: stats_mgr.cc:62
A generic exception that is thrown when a function is not implemented.
static isc::data::ConstElementPtr statisticResetAllHandler(const std::string &name, const isc::data::ConstElementPtr &params)
Handles statistic-reset-all command.
Definition: stats_mgr.cc:204
void addObservation(const ObservationPtr &stat)
Adds a new observation.
Definition: stats_mgr.cc:68
ConstElementPtr createAnswer(const int status_code, const std::string &text, const ConstElementPtr &arg)
const int CONTROL_RESULT_SUCCESS
Status code indicating a successful operation.
static isc::data::ConstElementPtr statisticRemoveAllHandler(const std::string &name, const isc::data::ConstElementPtr &params)
Handles statistic-remove-all command.
Definition: stats_mgr.cc:189
void setMaxSampleCount(const std::string &name, uint32_t max_samples)
Determines how many samples of a given statistic should be kept.
Definition: stats_mgr.cc:85
void addValueInternal(const std::string &name, DataType value)
Adds specified value to a given statistic (internal version).
size_t count() const
Returns number of available statistics.
Definition: stats_mgr.cc:139
const int CONTROL_RESULT_ERROR
Status code indicating a general failure.
boost::shared_ptr< Element > ElementPtr
Definition: data.h:20
static ElementPtr createMap(const Position &pos=ZERO_POSITION())
Creates an empty MapElement type ElementPtr.
Definition: data.cc:268
static StatsMgr & instance()
Statistics Manager accessor method.
Definition: stats_mgr.cc:21
Statistics Manager class.
void removeAll()
Removes all collected statistics.
Definition: stats_mgr.cc:103
#define isc_throw(type, stream)
A shortcut macro to insert known values into exception arguments.
void setMaxSampleAge(const std::string &name, const StatsDuration &duration)
Determines maximum age of samples.
Definition: stats_mgr.cc:80
bool del(const std::string &name)
Removes specified statistic.
Definition: stats_mgr.cc:99
isc::data::ConstElementPtr getAll() const
Returns all statistics as a JSON structure.
Definition: stats_mgr.cc:116
static isc::data::ConstElementPtr statisticGetHandler(const std::string &name, const isc::data::ConstElementPtr &params)
Handles statistic-get command.
Definition: stats_mgr.cc:144
boost::shared_ptr< const Element > ConstElementPtr
Definition: data.h:23
Statistics context.
Definition: context.h:30
void addValue(const std::string &name, const int64_t value)
Records incremental integer observation.
Definition: stats_mgr.cc:46
void resetAll()
Resets all collected statistics back to zero.
Definition: stats_mgr.cc:129
Defines the logger used by the top-level component of kea-dhcp-ddns.
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 ...
boost::posix_time::time_duration StatsDuration
Defines duration resolution.
Definition: observation.h:33
bool reset(const std::string &name)
Resets specified statistic.
Definition: stats_mgr.cc:89
static isc::data::ConstElementPtr statisticResetHandler(const std::string &name, const isc::data::ConstElementPtr &params)
Handles statistic-reset command.
Definition: stats_mgr.cc:155
static isc::data::ConstElementPtr statisticRemoveHandler(const std::string &name, const isc::data::ConstElementPtr &params)
Handles statistic-remove command.
Definition: stats_mgr.cc:172
static isc::data::ConstElementPtr statisticGetAllHandler(const std::string &name, const isc::data::ConstElementPtr &params)
Handles statistic-get-all command.
Definition: stats_mgr.cc:197
boost::shared_ptr< Observation > ObservationPtr
Observation pointer.
Definition: observation.h:261
void setValue(const std::string &name, const int64_t value)
Records absolute integer observation.
Definition: stats_mgr.cc:31
isc::data::ConstElementPtr get(const std::string &name) const
Returns a single statistic as a JSON structure.
Definition: stats_mgr.cc:107