diff options
author | Don Kjer <don@lindenlab.com> | 2007-06-09 21:27:18 +0000 |
---|---|---|
committer | Don Kjer <don@lindenlab.com> | 2007-06-09 21:27:18 +0000 |
commit | 309b56280bff46f1696aee73cbd25f2e61232bc7 (patch) | |
tree | c26829d02900cb3d1e56ce37f4a2c1e833e6ce82 /indra | |
parent | 61324a18b98d1fe0ca50d52f6b6019299a64794d (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.cpp | 145 | ||||
-rw-r--r-- | indra/llcommon/llmetrics.h | 42 |
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 + |