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
Monty Brandenberg 2010-12-11 16:16:07 -05:00
parent 11d420dd32
commit bb53d27b7a
5 changed files with 64 additions and 48 deletions

View File

@ -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);
}
}

View File

@ -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;

View File

@ -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();

View File

@ -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;

View File

@ -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");