llmetrics.cpp
上传用户:king477883
上传日期:2021-03-01
资源大小:9553k
文件大小:5k
源码类别:

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file llmetrics.cpp
  3.  * @author Kelly
  4.  * @date 2007-05-25
  5.  * @brief Metrics accumulation and associated functions
  6.  *
  7.  * $LicenseInfo:firstyear=2007&license=viewergpl$
  8.  * 
  9.  * Copyright (c) 2007-2010, Linden Research, Inc.
  10.  * 
  11.  * Second Life Viewer Source Code
  12.  * The source code in this file ("Source Code") is provided by Linden Lab
  13.  * to you under the terms of the GNU General Public License, version 2.0
  14.  * ("GPL"), unless you have obtained a separate licensing agreement
  15.  * ("Other License"), formally executed by you and Linden Lab.  Terms of
  16.  * the GPL can be found in doc/GPL-license.txt in this distribution, or
  17.  * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
  18.  * 
  19.  * There are special exceptions to the terms and conditions of the GPL as
  20.  * it is applied to this Source Code. View the full text of the exception
  21.  * in the file doc/FLOSS-exception.txt in this software distribution, or
  22.  * online at
  23.  * http://secondlifegrid.net/programs/open_source/licensing/flossexception
  24.  * 
  25.  * By copying, modifying or distributing this software, you acknowledge
  26.  * that you have read and understood your obligations described above,
  27.  * and agree to abide by those obligations.
  28.  * 
  29.  * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
  30.  * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
  31.  * COMPLETENESS OR PERFORMANCE.
  32.  * $/LicenseInfo$
  33.  */
  34. #include "linden_common.h"
  35. #include "llmetrics.h"
  36. #include "llsd.h"
  37. #include "llsdserialize.h"
  38. #include "llframetimer.h"
  39. class LLMetricsImpl
  40. {
  41. public:
  42. LLMetricsImpl() { }
  43. ~LLMetricsImpl();
  44. void recordEvent(const std::string& location, const std::string& mesg, bool success);
  45. void printTotals(LLSD metadata);
  46. void recordEventDetails(const std::string& location, 
  47. const std::string& mesg, 
  48. bool success, 
  49. LLSD stats);
  50. private:
  51. LLFrameTimer mLastPrintTimer;
  52. LLSD mMetricsMap;
  53. };
  54. LLMetricsImpl::~LLMetricsImpl()
  55. {
  56. }
  57. void LLMetricsImpl::recordEventDetails(const std::string& location, 
  58. const std::string& mesg, 
  59. bool success, 
  60. LLSD stats)
  61. {
  62. recordEvent(location,mesg,success);
  63. LLSD metrics = LLSD::emptyMap();
  64. metrics["location"] = location;
  65. metrics["stats"]  = stats;
  66. llinfos << "LLMETRICS: " << (LLSDNotationStreamer(metrics)) << llendl; 
  67. }
  68. // Store this:
  69. // [ {'location_1':{'mesg_1':{'success':i10, 'fail':i0},
  70. // 'mesg_2':{'success':i10, 'fail':i0}},
  71. //   {'location_2',{'mesg_3':{'success':i10, 'fail':i0}} ]
  72. void LLMetricsImpl::recordEvent(const std::string& location, const std::string& mesg, bool success)
  73. {
  74. LLSD& stats = mMetricsMap[location][mesg];
  75. if (success)
  76. {
  77. stats["success"] = stats["success"].asInteger() + 1;
  78. }
  79. else
  80. {
  81. stats["fail"] = stats["fail"].asInteger() + 1;
  82. }
  83. }
  84. // Print this:
  85. // { 'meta':
  86. // { 'elapsed_time':r3600.000 }
  87. //   'stats':
  88. // [ {'location':'location_1', 'mesg':'mesg_1', 'success':i10, 'fail':i0},
  89. //   {'location':'location_1', 'mesg':'mesg_2', 'success':i10, 'fail':i0},
  90. //   {'location':'location_2', 'mesg':'mesg_3', 'success':i10, 'fail':i0} ] }
  91. void LLMetricsImpl::printTotals(LLSD metadata)
  92. {
  93. F32 elapsed_time = mLastPrintTimer.getElapsedTimeAndResetF32();
  94. metadata["elapsed_time"] = elapsed_time;
  95. LLSD out_sd = LLSD::emptyMap();
  96. out_sd["meta"] = metadata;
  97. LLSD stats = LLSD::emptyArray();
  98. LLSD::map_const_iterator loc_it = mMetricsMap.beginMap();
  99. LLSD::map_const_iterator loc_end = mMetricsMap.endMap();
  100. for ( ; loc_it != loc_end; ++loc_it)
  101. {
  102. const std::string& location = (*loc_it).first;
  103. const LLSD& loc_map = (*loc_it).second;
  104. LLSD::map_const_iterator mesg_it = loc_map.beginMap();
  105. LLSD::map_const_iterator mesg_end = loc_map.endMap();
  106. for ( ; mesg_it != mesg_end; ++mesg_it)
  107. {
  108. const std::string& mesg = (*mesg_it).first;
  109. const LLSD& mesg_map = (*mesg_it).second;
  110. LLSD entry = LLSD::emptyMap();
  111. entry["location"] = location;
  112. entry["mesg"] = mesg;
  113. entry["success"] = mesg_map["success"];
  114. entry["fail"] = mesg_map["fail"];
  115. stats.append(entry);
  116. }
  117. }
  118. out_sd["stats"] = stats;
  119. llinfos << "LLMETRICS: AGGREGATE: " << LLSDOStreamer<LLSDNotationFormatter>(out_sd) << llendl;
  120. }
  121. LLMetrics::LLMetrics()
  122. {
  123. mImpl = new LLMetricsImpl();
  124. }
  125. LLMetrics::~LLMetrics()
  126. {
  127. delete mImpl;
  128. mImpl = NULL;
  129. }
  130. void LLMetrics::recordEvent(const std::string& location, const std::string& mesg, bool success)
  131. {
  132. if (mImpl) mImpl->recordEvent(location,mesg,success);
  133. }
  134. void LLMetrics::printTotals(LLSD meta)
  135. {
  136. if (mImpl) mImpl->printTotals(meta);
  137. }
  138. void LLMetrics::recordEventDetails(const std::string& location, 
  139. const std::string& mesg, 
  140. bool success, 
  141. LLSD stats)
  142. {
  143. if (mImpl) mImpl->recordEventDetails(location,mesg,success,stats);
  144. }