Message statistics
[anna.git] / source / diameter.comm / MessageStatistics.cpp
diff --git a/source/diameter.comm/MessageStatistics.cpp b/source/diameter.comm/MessageStatistics.cpp
new file mode 100644 (file)
index 0000000..00ba91a
--- /dev/null
@@ -0,0 +1,57 @@
+// ANNA - Anna is Not Nothingness Anymore                                                         //
+//                                                                                                //
+// (c) Copyright 2005-2015 Eduardo Ramos Testillano & Francisco Ruiz Rayo                         //
+//                                                                                                //
+// See project site at http://redmine.teslayout.com/projects/anna-suite                           //
+// See accompanying file LICENSE or copy at http://www.teslayout.com/projects/public/anna.LICENSE //
+
+// Standard
+#include <string>
+
+// Project
+#include <anna/diameter.comm/MessageStatistics.hpp>
+#include <anna/statistics/Engine.hpp>
+#include <anna/diameter/functions.hpp>
+#include <anna/diameter/helpers/defines.hpp>
+#include <anna/diameter/codec/Message.hpp>
+#include <anna/diameter/codec/Engine.hpp>
+#include <anna/diameter/codec/EngineManager.hpp>
+
+
+void anna::diameter::comm::MessageStatistics::initialize(const std::string &name) throw(anna::RuntimeException) {
+  a_accumulator = anna::statistics::Engine::instantiate().createAccumulator(name);
+}
+
+
+void anna::diameter::comm::MessageStatistics::process(const ConceptType::_v &conceptType, const anna::diameter::CommandId &cid, const double & value) throw(anna::RuntimeException) {
+
+  // Development issue:
+//  if (!a_accumulator) {
+//    LOGWARNING(anna::Logger::warning("Cannot process uninitialized 'MessageStatistics' instance", ANNA_FILE_LOCATION));
+//    return;
+//  }
+
+  // retrieve the concept id for the pair:
+  ConceptId conceptId(cid, conceptType);
+  int engine_concept_id = 0;
+  concepts_map_it it = a_concepts.find(conceptId);
+  if (it != a_concepts.end()) { // found
+    engine_concept_id = it->second;
+  }
+  else { // register a new concept id
+    std::string description;
+    if(conceptType == ConceptType::SentRequestProcessingTime) {
+      description = anna::functions::asString("Processing time for outgoing requests (code = %d)", cid.first);
+    }
+    else if (conceptType == ConceptType::ReceivedMessageSize) {
+      description = "Message size for received messages ";
+      description += anna::diameter::functions::commandIdAsPairString(cid);
+    }
+
+    engine_concept_id = a_accumulator->addConcept(description, "ms", true/* integer values */);
+    a_concepts[conceptId] = engine_concept_id;
+  }
+
+  a_accumulator->process(engine_concept_id, value);
+}
+