summaryrefslogtreecommitdiff
path: root/indra
diff options
context:
space:
mode:
authorDon Kjer <don@lindenlab.com>2007-06-09 21:27:18 +0000
committerDon Kjer <don@lindenlab.com>2007-06-09 21:27:18 +0000
commit309b56280bff46f1696aee73cbd25f2e61232bc7 (patch)
treec26829d02900cb3d1e56ce37f4a2c1e833e6ce82 /indra
parent61324a18b98d1fe0ca50d52f6b6019299a64794d (diff)
svn merge -r 63284:63298 svn+ssh://svn/svn/linden/branches/content-loss-metrics-4 into release
Diffstat (limited to 'indra')
-rw-r--r--indra/llcommon/llmetrics.cpp145
-rw-r--r--indra/llcommon/llmetrics.h42
2 files changed, 187 insertions, 0 deletions
diff --git a/indra/llcommon/llmetrics.cpp b/indra/llcommon/llmetrics.cpp
new file mode 100644
index 0000000000..fee20b43ef
--- /dev/null
+++ b/indra/llcommon/llmetrics.cpp
@@ -0,0 +1,145 @@
+/**
+ * @file llmetrics.cpp
+ * @author Kelly
+ * @date 2007-05-25
+ * @brief Metrics accumulation and associated functions
+ *
+ * Copyright (c) 2007-$CurrentYear$, Linden Research, Inc.
+ * $License$
+ */
+
+#include "linden_common.h"
+#include "llmetrics.h"
+
+#include "llsd.h"
+#include "llsdserialize.h"
+#include "llframetimer.h"
+
+class LLMetricsImpl
+{
+public:
+ LLMetricsImpl() { }
+ ~LLMetricsImpl();
+
+ void recordEvent(const std::string& location, const std::string& mesg, bool success);
+ void printTotals(LLSD metadata);
+ void recordEventDetails(const std::string& location,
+ const std::string& mesg,
+ bool success,
+ LLSD stats);
+private:
+ LLFrameTimer mLastPrintTimer;
+ LLSD mMetricsMap;
+};
+
+LLMetricsImpl::~LLMetricsImpl()
+{
+}
+
+void LLMetricsImpl::recordEventDetails(const std::string& location,
+ const std::string& mesg,
+ bool success,
+ LLSD stats)
+{
+ recordEvent(location,mesg,success);
+
+ LLSD metrics = LLSD::emptyMap();
+ metrics["location"] = location;
+ metrics["stats"] = stats;
+
+ llinfos << "LLMETRICS: " << LLSDOStreamer<LLSDNotationFormatter>(metrics) << llendl;
+}
+
+// Store this:
+// [ {'location_1':{'mesg_1':{'success':i10, 'fail':i0},
+// 'mesg_2':{'success':i10, 'fail':i0}},
+// {'location_2',{'mesg_3':{'success':i10, 'fail':i0}} ]
+void LLMetricsImpl::recordEvent(const std::string& location, const std::string& mesg, bool success)
+{
+ LLSD& stats = mMetricsMap[location][mesg];
+ if (success)
+ {
+ stats["success"] = stats["success"].asInteger() + 1;
+ }
+ else
+ {
+ stats["fail"] = stats["fail"].asInteger() + 1;
+ }
+}
+
+// Print this:
+// { 'meta':
+// { 'elapsed_time':r3600.000 }
+// 'stats':
+// [ {'location':'location_1', 'mesg':'mesg_1', 'success':i10, 'fail':i0},
+// {'location':'location_1', 'mesg':'mesg_2', 'success':i10, 'fail':i0},
+// {'location':'location_2', 'mesg':'mesg_3', 'success':i10, 'fail':i0} ] }
+void LLMetricsImpl::printTotals(LLSD metadata)
+{
+ F32 elapsed_time = mLastPrintTimer.getElapsedTimeAndResetF32();
+ metadata["elapsed_time"] = elapsed_time;
+
+ LLSD out_sd = LLSD::emptyMap();
+ out_sd["meta"] = metadata;
+
+ LLSD stats = LLSD::emptyArray();
+
+ LLSD::map_const_iterator loc_it = mMetricsMap.beginMap();
+ LLSD::map_const_iterator loc_end = mMetricsMap.endMap();
+ for ( ; loc_it != loc_end; ++loc_it)
+ {
+ const std::string& location = (*loc_it).first;
+
+ const LLSD& loc_map = (*loc_it).second;
+ LLSD::map_const_iterator mesg_it = loc_map.beginMap();
+ LLSD::map_const_iterator mesg_end = loc_map.endMap();
+ for ( ; mesg_it != mesg_end; ++mesg_it)
+ {
+ const std::string& mesg = (*mesg_it).first;
+ const LLSD& mesg_map = (*mesg_it).second;
+
+ LLSD entry = LLSD::emptyMap();
+ entry["location"] = location;
+ entry["mesg"] = mesg;
+ entry["success"] = mesg_map["success"];
+ entry["fail"] = mesg_map["fail"];
+
+ stats.append(entry);
+ }
+ }
+
+ out_sd["stats"] = stats;
+
+ llinfos << "LLMETRICS: AGGREGATE: " << LLSDOStreamer<LLSDNotationFormatter>(out_sd) << llendl;
+}
+
+LLMetrics::LLMetrics()
+{
+ mImpl = new LLMetricsImpl();
+}
+
+LLMetrics::~LLMetrics()
+{
+ delete mImpl;
+ mImpl = NULL;
+}
+
+void LLMetrics::recordEvent(const std::string& location, const std::string& mesg, bool success)
+{
+ if (mImpl) mImpl->recordEvent(location,mesg,success);
+}
+
+void LLMetrics::printTotals(LLSD meta)
+{
+ if (mImpl) mImpl->printTotals(meta);
+}
+
+
+void LLMetrics::recordEventDetails(const std::string& location,
+ const std::string& mesg,
+ bool success,
+ LLSD stats)
+{
+ if (mImpl) mImpl->recordEventDetails(location,mesg,success,stats);
+}
+
diff --git a/indra/llcommon/llmetrics.h b/indra/llcommon/llmetrics.h
new file mode 100644
index 0000000000..ec5cebcfdc
--- /dev/null
+++ b/indra/llcommon/llmetrics.h
@@ -0,0 +1,42 @@
+/**
+ * @file llmetrics.h
+ * @author Kelly
+ * @date 2007-05-25
+ * @brief Declaration of metrics accumulation and associated functions
+ *
+ * Copyright (c) 2007-$CurrentYear$, Linden Research, Inc.
+ * $License$
+ */
+
+#ifndef LL_LLMETRICS_H
+#define LL_LLMETRICS_H
+
+class LLMetricsImpl;
+class LLSD;
+
+class LLMetrics
+{
+public:
+ LLMetrics();
+ virtual ~LLMetrics();
+
+ // Adds this event to aggregate totals and records details to syslog (llinfos)
+ virtual void recordEventDetails(const std::string& location,
+ const std::string& mesg,
+ bool success,
+ LLSD stats);
+
+ // Adds this event to aggregate totals
+ virtual void recordEvent(const std::string& location, const std::string& mesg, bool success);
+
+ // Prints aggregate totals and resets the counts.
+ virtual void printTotals(LLSD meta);
+
+
+private:
+
+ LLMetricsImpl* mImpl;
+};
+
+#endif
+