stats_mgr.cc 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240
  1. // Copyright (C) 2015 Internet Systems Consortium, Inc. ("ISC")
  2. //
  3. // Permission to use, copy, modify, and/or distribute this software for any
  4. // purpose with or without fee is hereby granted, provided that the above
  5. // copyright notice and this permission notice appear in all copies.
  6. //
  7. // THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
  8. // REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
  9. // AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
  10. // INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
  11. // LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
  12. // OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
  13. // PERFORMANCE OF THIS SOFTWARE.
  14. #include <exceptions/exceptions.h>
  15. #include <stats/stats_mgr.h>
  16. #include <cc/data.h>
  17. #include <cc/command_interpreter.h>
  18. using namespace std;
  19. using namespace isc::data;
  20. using namespace isc::config;
  21. namespace isc {
  22. namespace stats {
  23. StatsMgr& StatsMgr::instance() {
  24. static StatsMgr stats_mgr;
  25. return (stats_mgr);
  26. }
  27. StatsMgr::StatsMgr()
  28. :global_(new StatContext()) {
  29. }
  30. void StatsMgr::setValue(const std::string& name, const int64_t value) {
  31. setValueInternal(name, value);
  32. }
  33. void StatsMgr::setValue(const std::string& name, const double value) {
  34. setValueInternal(name, value);
  35. }
  36. void StatsMgr::setValue(const std::string& name, const StatsDuration& value) {
  37. setValueInternal(name, value);
  38. }
  39. void StatsMgr::setValue(const std::string& name, const std::string& value) {
  40. setValueInternal(name, value);
  41. }
  42. void StatsMgr::addValue(const std::string& name, const int64_t value) {
  43. addValueInternal(name, value);
  44. }
  45. void StatsMgr::addValue(const std::string& name, const double value) {
  46. addValueInternal(name, value);
  47. }
  48. void StatsMgr::addValue(const std::string& name, const StatsDuration& value) {
  49. addValueInternal(name, value);
  50. }
  51. void StatsMgr::addValue(const std::string& name, const std::string& value) {
  52. addValueInternal(name, value);
  53. }
  54. ObservationPtr StatsMgr::getObservation(const std::string& name) const {
  55. /// @todo: Implement contexts.
  56. // Currently we keep everyting in a global context.
  57. return (global_->get(name));
  58. }
  59. void StatsMgr::addObservation(const ObservationPtr& stat) {
  60. /// @todo: Implement contexts.
  61. // Currently we keep everyting in a global context.
  62. return (global_->add(stat));
  63. }
  64. bool StatsMgr::deleteObservation(const std::string& name) {
  65. /// @todo: Implement contexts.
  66. // Currently we keep everyting in a global context.
  67. return (global_->del(name));
  68. }
  69. void StatsMgr::setMaxSampleAge(const std::string& ,
  70. const StatsDuration&) {
  71. isc_throw(NotImplemented, "setMaxSampleAge not implemented");
  72. }
  73. void StatsMgr::setMaxSampleCount(const std::string& , uint32_t){
  74. isc_throw(NotImplemented, "setMaxSampleCount not implemented");
  75. }
  76. bool StatsMgr::reset(const std::string& name) {
  77. ObservationPtr obs = getObservation(name);
  78. if (obs) {
  79. obs->reset();
  80. return (true);
  81. } else {
  82. return (false);
  83. }
  84. }
  85. bool StatsMgr::del(const std::string& name) {
  86. return (global_->del(name));
  87. }
  88. void StatsMgr::removeAll() {
  89. global_->stats_.clear();
  90. }
  91. isc::data::ConstElementPtr StatsMgr::get(const std::string& name) const {
  92. isc::data::ElementPtr response = isc::data::Element::createMap(); // a map
  93. ObservationPtr obs = getObservation(name);
  94. if (obs) {
  95. response->set(name, obs->getJSON()); // that contains the observation
  96. }
  97. return (response);
  98. }
  99. isc::data::ConstElementPtr StatsMgr::getAll() const {
  100. isc::data::ElementPtr map = isc::data::Element::createMap(); // a map
  101. // Let's iterate over all stored statistics...
  102. for (std::map<std::string, ObservationPtr>::iterator s = global_->stats_.begin();
  103. s != global_->stats_.end(); ++s) {
  104. // ... and add each of them to the map.
  105. map->set(s->first, s->second->getJSON());
  106. }
  107. return (map);
  108. }
  109. void StatsMgr::resetAll() {
  110. // Let's iterate over all stored statistics...
  111. for (std::map<std::string, ObservationPtr>::iterator s = global_->stats_.begin();
  112. s != global_->stats_.end(); ++s) {
  113. // ... and reset each statistic.
  114. s->second->reset();
  115. }
  116. }
  117. size_t StatsMgr::count() const {
  118. return (global_->stats_.size());
  119. }
  120. isc::data::ConstElementPtr
  121. StatsMgr::statisticGetHandler(const std::string& /*name*/,
  122. const isc::data::ConstElementPtr& params) {
  123. std::string name, error;
  124. if (!getStatName(params, name, error)) {
  125. return (createAnswer(CONTROL_RESULT_ERROR, error));
  126. }
  127. return (createAnswer(CONTROL_RESULT_SUCCESS,
  128. instance().get(name)));
  129. }
  130. isc::data::ConstElementPtr
  131. StatsMgr::statisticResetHandler(const std::string& /*name*/,
  132. const isc::data::ConstElementPtr& params) {
  133. std::string name, error;
  134. if (!getStatName(params, name, error)) {
  135. return (createAnswer(CONTROL_RESULT_ERROR, error));
  136. }
  137. if (instance().reset(name)) {
  138. return (createAnswer(CONTROL_RESULT_SUCCESS,
  139. "Statistic '" + name + "' reset."));
  140. } else {
  141. return (createAnswer(CONTROL_RESULT_ERROR,
  142. "No '" + name + "' statistic found"));
  143. }
  144. }
  145. isc::data::ConstElementPtr
  146. StatsMgr::statisticRemoveHandler(const std::string& /*name*/,
  147. const isc::data::ConstElementPtr& params) {
  148. std::string name, error;
  149. if (!getStatName(params, name, error)) {
  150. return (createAnswer(CONTROL_RESULT_ERROR, error));
  151. }
  152. if (instance().del(name)) {
  153. return (createAnswer(CONTROL_RESULT_SUCCESS,
  154. "Statistic '" + name + "' removed."));
  155. } else {
  156. return (createAnswer(CONTROL_RESULT_ERROR,
  157. "No '" + name + "' statistic found"));
  158. }
  159. }
  160. isc::data::ConstElementPtr
  161. StatsMgr::statisticRemoveAllHandler(const std::string& /*name*/,
  162. const isc::data::ConstElementPtr& /*params*/) {
  163. instance().removeAll();
  164. return (createAnswer(CONTROL_RESULT_SUCCESS,
  165. "All statistics removed."));
  166. }
  167. isc::data::ConstElementPtr
  168. StatsMgr::statisticGetAllHandler(const std::string& /*name*/,
  169. const isc::data::ConstElementPtr& /*params*/) {
  170. ConstElementPtr all_stats = instance().getAll();
  171. return (createAnswer(CONTROL_RESULT_SUCCESS, all_stats));
  172. }
  173. isc::data::ConstElementPtr
  174. StatsMgr::statisticResetAllHandler(const std::string& /*name*/,
  175. const isc::data::ConstElementPtr& /*params*/) {
  176. instance().resetAll();
  177. return (createAnswer(CONTROL_RESULT_SUCCESS,
  178. "All statistics reset to neutral values."));
  179. }
  180. bool
  181. StatsMgr::getStatName(const isc::data::ConstElementPtr& params,
  182. std::string& name,
  183. std::string& reason) {
  184. if (!params) {
  185. reason = "Missing mandatory 'name' parameter.";
  186. return (false);
  187. }
  188. ConstElementPtr stat_name = params->get("name");
  189. if (!stat_name) {
  190. reason = "Missing mandatory 'name' parameter.";
  191. return (false);
  192. }
  193. if (stat_name->getType() != Element::string) {
  194. reason = "'name' parameter expected to be a string.";
  195. return (false);
  196. }
  197. name = stat_name->stringValue();
  198. return (true);
  199. }
  200. };
  201. };