+///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+// COUNTERS RECORD PROCEDURE //////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+class MyCounterRecorderClock : public anna::timex::Clock {
+ public:
+ MyCounterRecorderClock(const char *clockName, const anna::Millisecond & timeout) :
+ anna::timex::Clock(clockName, timeout) {;}
+ //virtual ~MyCounterRecorderClock();
+
+ virtual bool tick() throw (RuntimeException) {
+ anna::diameter::comm::OamModule::instantiate().recordCounters();
+ anna::diameter::codec::OamModule::instantiate().recordCounters();
+ return true;
+ }
+};
+
+class MyCounterRecorder : public anna::oam::CounterRecorder {
+
+ // attributes
+ int a_stream;
+ std::string a_fileNamePrefix;
+ std::string a_fileName;
+ time_t a_previousTime;
+ std::string a_fixedLine;
+
+ // pure virtual definitions:
+ void open() throw(anna::RuntimeException) {
+ static char str [256];
+
+ const time_t now = ::time (NULL);
+ struct tm tmNow;
+ struct tm tmPrevious;
+
+ anna_memcpy (&tmNow, localtime (&now), sizeof (tmNow));
+ anna_memcpy (&tmPrevious, localtime (&a_previousTime), sizeof (tmPrevious));
+
+ sprintf (
+ str,".Date%04d%02d%02d.Time%02d%02d%02d",
+ 1900 + (tmNow.tm_year), (tmNow.tm_mon) + 1,
+ tmNow.tm_mday, tmNow.tm_hour, tmNow.tm_min, tmNow.tm_sec);
+
+ a_fileName = a_fileNamePrefix;
+ a_fileName += str;
+
+ LOGDEBUG (
+ std::string msg ("Flush counters | ");
+ msg += a_fileName;
+ anna::Logger::debug(msg, ANNA_FILE_LOCATION);
+ );
+
+ if ((a_stream = ::open (a_fileName.c_str (), O_WRONLY | O_CREAT, S_IWUSR)) == -1)
+ throw RuntimeException (anna::functions::asString("Error opening file '%s'; errno = %d", a_fileName.c_str(), errno), ANNA_FILE_LOCATION);
+
+ sprintf (str, "%04d-%02d-%02d %02d:%02d|%04d-%02d-%02d %02d:%02d",
+ 1900 + (tmPrevious.tm_year), (tmPrevious.tm_mon) + 1,
+ tmPrevious.tm_mday, tmPrevious.tm_hour, tmPrevious.tm_min,
+ 1900 + (tmNow.tm_year), (tmNow.tm_mon) + 1,
+ tmNow.tm_mday, tmNow.tm_hour, tmNow.tm_min
+ );
+
+ a_fixedLine = str;
+ }
+
+
+ void apply(const anna::oam::Counter& counter) throw(anna::RuntimeException) {
+ static char line [356];
+ anna::oam::Counter::type_t value = counter;
+ sprintf (line, "%s|%06d|%07u|%s\n", a_fixedLine.c_str (), counter.getReference(), value, counter.getName ().c_str ());
+ if (write (a_stream, line, anna_strlen (line)) == -1)
+ throw RuntimeException (anna::functions::asString("Error writting to file '%s'; errno = %d", a_fileName.c_str(), errno), ANNA_FILE_LOCATION);
+ }
+
+ void close() throw() {
+ if (a_stream != -1) {
+ ::close (a_stream);
+ a_stream = -1;
+ }
+ chmod (a_fileName.c_str (), S_IWUSR | S_IRUSR);
+ a_previousTime = ::time (NULL);
+ }
+
+ std::string asString() const throw() {
+ std::string result = "Physical counters dump at file '";
+ result += a_fileName;
+ result += "'. Another way to see counters: context dump (kill -10 <pid>";
+ return result;
+ }
+
+ public:
+ MyCounterRecorder(const std::string &fnp) : a_stream(-1), a_fileNamePrefix(fnp) {
+ a_previousTime = ::time (NULL);
+ }
+};
+
+///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+