ESC-211 ESC-212 Use arrays in payload to grid and compact payload
First, introduced a compact payload format that allows blocks of metrics to be dropped from the viewer->collector payload compressing 1200 bytes of LLSD into about 300, give-or-take. Then converted to using LLSD arrays in the payload to enumerate the regions encountered. This simplifies much data handling from the viewer all the way into the final formatter of the metrics on the grid.master
parent
11d420dd32
commit
bb53d27b7a
|
|
@ -3808,7 +3808,7 @@ void LLAppViewer::idle()
|
|||
// ViewerMetrics FPS piggy-backing on the debug timer.
|
||||
// The 5-second interval is nice for this purpose. If the object debug
|
||||
// bit moves or is disabled, please give this a suitable home.
|
||||
LLViewerAssetStatsFF::record_fps_main(frame_rate_clamped);
|
||||
LLViewerAssetStatsFF::record_fps_main(gFPSClamped);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -2915,7 +2915,7 @@ TFReqSendMetrics::doWork(LLTextureFetch * fetcher)
|
|||
|
||||
// Merge existing stats into those from main, convert to LLSD
|
||||
main_stats.merge(*gViewerAssetStatsThread1);
|
||||
LLSD merged_llsd = main_stats.asLLSD();
|
||||
LLSD merged_llsd = main_stats.asLLSD(true);
|
||||
|
||||
// Add some additional meta fields to the content
|
||||
merged_llsd["session_id"] = mSessionID;
|
||||
|
|
|
|||
|
|
@ -33,6 +33,7 @@
|
|||
#include "llviewerprecompiledheaders.h"
|
||||
|
||||
#include "llviewerassetstats.h"
|
||||
#include "llregionhandle.h"
|
||||
|
||||
#include "stdtypes.h"
|
||||
|
||||
|
|
@ -258,7 +259,7 @@ LLViewerAssetStats::recordFPS(F32 fps)
|
|||
}
|
||||
|
||||
LLSD
|
||||
LLViewerAssetStats::asLLSD()
|
||||
LLViewerAssetStats::asLLSD(bool compact_output)
|
||||
{
|
||||
// Top-level tags
|
||||
static const LLSD::String tags[EVACCount] =
|
||||
|
|
@ -290,7 +291,7 @@ LLViewerAssetStats::asLLSD()
|
|||
const duration_t now = LLViewerAssetStatsFF::get_timestamp();
|
||||
mCurRegionStats->accumulateTime(now);
|
||||
|
||||
LLSD regions = LLSD::emptyMap();
|
||||
LLSD regions = LLSD::emptyArray();
|
||||
for (PerRegionContainer::iterator it = mRegionStats.begin();
|
||||
mRegionStats.end() != it;
|
||||
++it)
|
||||
|
|
@ -307,16 +308,25 @@ LLViewerAssetStats::asLLSD()
|
|||
|
||||
for (int i = 0; i < LL_ARRAY_SIZE(tags); ++i)
|
||||
{
|
||||
LLSD & slot = reg_stat[tags[i]];
|
||||
slot = LLSD::emptyMap();
|
||||
slot[enq_tag] = LLSD(S32(stats.mRequests[i].mEnqueued.getCount()));
|
||||
slot[deq_tag] = LLSD(S32(stats.mRequests[i].mDequeued.getCount()));
|
||||
slot[rcnt_tag] = LLSD(S32(stats.mRequests[i].mResponse.getCount()));
|
||||
slot[rmin_tag] = LLSD(F64(stats.mRequests[i].mResponse.getMin() * 1.0e-6));
|
||||
slot[rmax_tag] = LLSD(F64(stats.mRequests[i].mResponse.getMax() * 1.0e-6));
|
||||
slot[rmean_tag] = LLSD(F64(stats.mRequests[i].mResponse.getMean() * 1.0e-6));
|
||||
PerRegionStats::prs_group & group(stats.mRequests[i]);
|
||||
|
||||
if ((! compact_output) ||
|
||||
group.mEnqueued.getCount() ||
|
||||
group.mDequeued.getCount() ||
|
||||
group.mResponse.getCount())
|
||||
{
|
||||
LLSD & slot = reg_stat[tags[i]];
|
||||
slot = LLSD::emptyMap();
|
||||
slot[enq_tag] = LLSD(S32(stats.mRequests[i].mEnqueued.getCount()));
|
||||
slot[deq_tag] = LLSD(S32(stats.mRequests[i].mDequeued.getCount()));
|
||||
slot[rcnt_tag] = LLSD(S32(stats.mRequests[i].mResponse.getCount()));
|
||||
slot[rmin_tag] = LLSD(F64(stats.mRequests[i].mResponse.getMin() * 1.0e-6));
|
||||
slot[rmax_tag] = LLSD(F64(stats.mRequests[i].mResponse.getMax() * 1.0e-6));
|
||||
slot[rmean_tag] = LLSD(F64(stats.mRequests[i].mResponse.getMean() * 1.0e-6));
|
||||
}
|
||||
}
|
||||
|
||||
if ((! compact_output) || stats.mFPS.getCount())
|
||||
{
|
||||
LLSD & slot = reg_stat["fps"];
|
||||
slot = LLSD::emptyMap();
|
||||
|
|
@ -326,12 +336,12 @@ LLViewerAssetStats::asLLSD()
|
|||
slot[mean_tag] = LLSD(F64(stats.mFPS.getMean()));
|
||||
}
|
||||
|
||||
reg_stat["duration"] = LLSD::Real(stats.mTotalTime * 1.0e-6);
|
||||
std::stringstream reg_handle;
|
||||
reg_handle.width(16);
|
||||
reg_handle.fill('0');
|
||||
reg_handle << std::hex << it->first;
|
||||
regions[reg_handle.str()] = reg_stat;
|
||||
U32 grid_x(0), grid_y(0);
|
||||
grid_from_region_handle(it->first, &grid_x, &grid_y);
|
||||
reg_stat["grid_x"] = LLSD::Integer(grid_x);
|
||||
reg_stat["grid_y"] = LLSD::Integer(grid_y);
|
||||
reg_stat["duration"] = LLSD::Real(stats.mTotalTime * 1.0e-6);
|
||||
regions.append(reg_stat);
|
||||
}
|
||||
|
||||
LLSD ret = LLSD::emptyMap();
|
||||
|
|
|
|||
|
|
@ -155,7 +155,7 @@ public:
|
|||
duration_t mStartTimestamp;
|
||||
LLSimpleStatMMM<> mFPS;
|
||||
|
||||
struct
|
||||
struct prs_group
|
||||
{
|
||||
LLSimpleStatCounter mEnqueued;
|
||||
LLSimpleStatCounter mDequeued;
|
||||
|
|
@ -232,7 +232,13 @@ public:
|
|||
// }
|
||||
// }
|
||||
// }
|
||||
LLSD asLLSD();
|
||||
//
|
||||
// @param compact_output If true, omits from conversion any mmm_block
|
||||
// or stats_block that would contain all zero data.
|
||||
// Useful for transmission when the receiver knows
|
||||
// what is expected and will assume zero for missing
|
||||
// blocks.
|
||||
LLSD asLLSD(bool compact_output);
|
||||
|
||||
protected:
|
||||
typedef std::map<region_handle_t, LLPointer<PerRegionStats> > PerRegionContainer;
|
||||
|
|
|
|||
|
|
@ -155,7 +155,7 @@ namespace tut
|
|||
|
||||
ensure("Global gViewerAssetStatsMain should still be NULL", (NULL == gViewerAssetStatsMain));
|
||||
|
||||
LLSD sd_full = it->asLLSD();
|
||||
LLSD sd_full = it->asLLSD(false);
|
||||
|
||||
// Default (NULL) region ID doesn't produce LLSD results so should
|
||||
// get an empty map back from output
|
||||
|
|
@ -163,7 +163,7 @@ namespace tut
|
|||
|
||||
// Once the region is set, we will get a response even with no data collection
|
||||
it->setRegion(region1_handle);
|
||||
sd_full = it->asLLSD();
|
||||
sd_full = it->asLLSD(false);
|
||||
ensure("Correct single-key LLSD map root", is_double_key_map(sd_full, "duration", "regions"));
|
||||
ensure("Correct single-key LLSD map regions", is_single_key_map(sd_full["regions"], region1_handle_str));
|
||||
|
||||
|
|
@ -204,7 +204,7 @@ namespace tut
|
|||
LLViewerAssetStats * it = new LLViewerAssetStats();
|
||||
it->setRegion(region1_handle);
|
||||
|
||||
LLSD sd = it->asLLSD();
|
||||
LLSD sd = it->asLLSD(false);
|
||||
ensure("Correct single-key LLSD map root", is_double_key_map(sd, "regions", "duration"));
|
||||
ensure("Correct single-key LLSD map regions", is_single_key_map(sd["regions"], region1_handle_str));
|
||||
sd = sd[region1_handle_str];
|
||||
|
|
@ -229,7 +229,7 @@ namespace tut
|
|||
LLViewerAssetStatsFF::record_enqueue_main(LLViewerAssetType::AT_BODYPART, false, false);
|
||||
LLViewerAssetStatsFF::record_dequeue_main(LLViewerAssetType::AT_BODYPART, false, false);
|
||||
|
||||
LLSD sd = gViewerAssetStatsMain->asLLSD();
|
||||
LLSD sd = gViewerAssetStatsMain->asLLSD(false);
|
||||
ensure("Correct single-key LLSD map root", is_double_key_map(sd, "regions", "duration"));
|
||||
ensure("Correct single-key LLSD map regions", is_single_key_map(sd["regions"], region1_handle_str));
|
||||
sd = sd["regions"][region1_handle_str];
|
||||
|
|
@ -244,7 +244,7 @@ namespace tut
|
|||
// Reset and check zeros...
|
||||
// Reset leaves current region in place
|
||||
gViewerAssetStatsMain->reset();
|
||||
sd = gViewerAssetStatsMain->asLLSD()["regions"][region1_handle_str];
|
||||
sd = gViewerAssetStatsMain->asLLSD(false)["regions"][region1_handle_str];
|
||||
|
||||
delete gViewerAssetStatsMain;
|
||||
gViewerAssetStatsMain = NULL;
|
||||
|
|
@ -267,9 +267,9 @@ namespace tut
|
|||
LLViewerAssetStatsFF::record_enqueue_main(LLViewerAssetType::AT_BODYPART, false, false);
|
||||
LLViewerAssetStatsFF::record_dequeue_main(LLViewerAssetType::AT_BODYPART, false, false);
|
||||
|
||||
LLSD sd = gViewerAssetStatsThread1->asLLSD();
|
||||
LLSD sd = gViewerAssetStatsThread1->asLLSD(false);
|
||||
ensure("Other collector is empty", is_no_stats_map(sd));
|
||||
sd = gViewerAssetStatsMain->asLLSD();
|
||||
sd = gViewerAssetStatsMain->asLLSD(false);
|
||||
ensure("Correct single-key LLSD map root", is_double_key_map(sd, "regions", "duration"));
|
||||
ensure("Correct single-key LLSD map regions", is_single_key_map(sd["regions"], region1_handle_str));
|
||||
sd = sd["regions"][region1_handle_str];
|
||||
|
|
@ -284,7 +284,7 @@ namespace tut
|
|||
// Reset and check zeros...
|
||||
// Reset leaves current region in place
|
||||
gViewerAssetStatsMain->reset();
|
||||
sd = gViewerAssetStatsMain->asLLSD()["regions"][region1_handle_str];
|
||||
sd = gViewerAssetStatsMain->asLLSD(false)["regions"][region1_handle_str];
|
||||
|
||||
delete gViewerAssetStatsMain;
|
||||
gViewerAssetStatsMain = NULL;
|
||||
|
|
@ -316,7 +316,7 @@ namespace tut
|
|||
LLViewerAssetStatsFF::record_enqueue_main(LLViewerAssetType::AT_GESTURE, false, false);
|
||||
LLViewerAssetStatsFF::record_enqueue_main(LLViewerAssetType::AT_GESTURE, false, false);
|
||||
|
||||
LLSD sd = gViewerAssetStatsMain->asLLSD();
|
||||
LLSD sd = gViewerAssetStatsMain->asLLSD(false);
|
||||
|
||||
// std::cout << sd << std::endl;
|
||||
|
||||
|
|
@ -340,7 +340,7 @@ namespace tut
|
|||
// Reset and check zeros...
|
||||
// Reset leaves current region in place
|
||||
gViewerAssetStatsMain->reset();
|
||||
sd = gViewerAssetStatsMain->asLLSD();
|
||||
sd = gViewerAssetStatsMain->asLLSD(false);
|
||||
ensure("Correct single-key LLSD map root", is_double_key_map(sd, "regions", "duration"));
|
||||
ensure("Correct single-key LLSD map regions", is_single_key_map(sd["regions"], region2_handle_str));
|
||||
sd2 = sd["regions"][region2_handle_str];
|
||||
|
|
@ -388,7 +388,7 @@ namespace tut
|
|||
LLViewerAssetStatsFF::record_enqueue_main(LLViewerAssetType::AT_GESTURE, false, false);
|
||||
LLViewerAssetStatsFF::record_enqueue_main(LLViewerAssetType::AT_GESTURE, false, false);
|
||||
|
||||
LLSD sd = gViewerAssetStatsMain->asLLSD();
|
||||
LLSD sd = gViewerAssetStatsMain->asLLSD(false);
|
||||
|
||||
ensure("Correct double-key LLSD map root", is_double_key_map(sd, "duration", "regions"));
|
||||
ensure("Correct double-key LLSD map regions", is_double_key_map(sd["regions"], region1_handle_str, region2_handle_str));
|
||||
|
|
@ -410,7 +410,7 @@ namespace tut
|
|||
// Reset and check zeros...
|
||||
// Reset leaves current region in place
|
||||
gViewerAssetStatsMain->reset();
|
||||
sd = gViewerAssetStatsMain->asLLSD();
|
||||
sd = gViewerAssetStatsMain->asLLSD(false);
|
||||
ensure("Correct single-key LLSD map root", is_double_key_map(sd, "duration", "regions"));
|
||||
ensure("Correct single-key LLSD map regions", is_single_key_map(sd["regions"], region2_handle_str));
|
||||
sd2 = sd["regions"][region2_handle_str];
|
||||
|
|
@ -453,9 +453,9 @@ namespace tut
|
|||
|
||||
LLViewerAssetStatsFF::record_enqueue_main(LLViewerAssetType::AT_LSL_BYTECODE, true, true);
|
||||
|
||||
LLSD sd = gViewerAssetStatsThread1->asLLSD();
|
||||
LLSD sd = gViewerAssetStatsThread1->asLLSD(false);
|
||||
ensure("Other collector is empty", is_no_stats_map(sd));
|
||||
sd = gViewerAssetStatsMain->asLLSD();
|
||||
sd = gViewerAssetStatsMain->asLLSD(false);
|
||||
ensure("Correct single-key LLSD map root", is_double_key_map(sd, "regions", "duration"));
|
||||
ensure("Correct single-key LLSD map regions", is_single_key_map(sd["regions"], region1_handle_str));
|
||||
sd = sd["regions"][region1_handle_str];
|
||||
|
|
@ -473,7 +473,7 @@ namespace tut
|
|||
// Reset and check zeros...
|
||||
// Reset leaves current region in place
|
||||
gViewerAssetStatsMain->reset();
|
||||
sd = gViewerAssetStatsMain->asLLSD()["regions"][region1_handle_str];
|
||||
sd = gViewerAssetStatsMain->asLLSD(false)["regions"][region1_handle_str];
|
||||
|
||||
delete gViewerAssetStatsMain;
|
||||
gViewerAssetStatsMain = NULL;
|
||||
|
|
@ -507,7 +507,7 @@ namespace tut
|
|||
|
||||
s2.merge(s1);
|
||||
|
||||
LLSD s2_llsd = s2.asLLSD();
|
||||
LLSD s2_llsd = s2.asLLSD(false);
|
||||
|
||||
ensure_equals("count after merge", 8, s2_llsd["regions"][region1_handle_str]["get_texture_temp_http"]["resp_count"].asInteger());
|
||||
ensure_approximately_equals("min after merge", 2.0, s2_llsd["regions"][region1_handle_str]["get_texture_temp_http"]["resp_min"].asReal(), 22);
|
||||
|
|
@ -562,8 +562,8 @@ namespace tut
|
|||
{
|
||||
s2.merge(s1);
|
||||
|
||||
LLSD src = s1.asLLSD();
|
||||
LLSD dst = s2.asLLSD();
|
||||
LLSD src = s1.asLLSD(false);
|
||||
LLSD dst = s2.asLLSD(false);
|
||||
|
||||
// Remove time stamps, they're a problem
|
||||
src.erase("duration");
|
||||
|
|
@ -621,8 +621,8 @@ namespace tut
|
|||
{
|
||||
s2.merge(s1);
|
||||
|
||||
LLSD src = s1.asLLSD();
|
||||
LLSD dst = s2.asLLSD();
|
||||
LLSD src = s1.asLLSD(false);
|
||||
LLSD dst = s2.asLLSD(false);
|
||||
|
||||
// Remove time stamps, they're a problem
|
||||
src.erase("duration");
|
||||
|
|
@ -689,8 +689,8 @@ namespace tut
|
|||
{
|
||||
s2.merge(s1);
|
||||
|
||||
LLSD src = s1.asLLSD();
|
||||
LLSD dst = s2.asLLSD();
|
||||
LLSD src = s1.asLLSD(false);
|
||||
LLSD dst = s2.asLLSD(false);
|
||||
|
||||
// Remove time stamps, they're a problem
|
||||
src.erase("duration");
|
||||
|
|
@ -745,8 +745,8 @@ namespace tut
|
|||
{
|
||||
s1.merge(s2);
|
||||
|
||||
LLSD src = s2.asLLSD();
|
||||
LLSD dst = s1.asLLSD();
|
||||
LLSD src = s2.asLLSD(false);
|
||||
LLSD dst = s1.asLLSD(false);
|
||||
|
||||
// Remove time stamps, they're a problem
|
||||
src.erase("duration");
|
||||
|
|
@ -804,8 +804,8 @@ namespace tut
|
|||
{
|
||||
s2.merge(s1);
|
||||
|
||||
LLSD src = s1.asLLSD();
|
||||
LLSD dst = s2.asLLSD();
|
||||
LLSD src = s1.asLLSD(false);
|
||||
LLSD dst = s2.asLLSD(false);
|
||||
|
||||
// Remove time stamps, they're a problem
|
||||
src.erase("duration");
|
||||
|
|
@ -859,8 +859,8 @@ namespace tut
|
|||
{
|
||||
s1.merge(s2);
|
||||
|
||||
LLSD src = s2.asLLSD();
|
||||
LLSD dst = s1.asLLSD();
|
||||
LLSD src = s2.asLLSD(false);
|
||||
LLSD dst = s1.asLLSD(false);
|
||||
|
||||
// Remove time stamps, they're a problem
|
||||
src.erase("duration");
|
||||
|
|
|
|||
Loading…
Reference in New Issue