<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>Simulator statistics</title> <link rel="stylesheet" href="sim.css" type="text/css"/> <!-- <script type="text/javascript" src="jquery.js"></script> --> <!-- <script type="text/javascript" src="https://code.jquery.com/jquery-1.9.0.min.js"></script> --> <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.0/jquery.min.js"></script> <!-- <script type="text/javascript" src="https://ajax.aspnetcdn.com/ajax/libs/jQuery/jquery-1.9.0.min.js"></script> --> <noscript> <p color="red"> Your browser does not support Javascript. This won't work for you. </p> </noscript> <script type="text/javascript"> $(document).ready(function() { // Major divisions in the content accordioning $('.SimSection').show('slow'); $('.SimSectionHeader').click(function() { $(this).next().slideToggle('slow'); return false; }); // Start the timed functions TimerDataStuff(); }); // One of the sections is viewer statistics. Poll for the data. var statTimerHandle; var graphFPS; var lastFPS = 10; var xxThru = 0; function TimerDataStuff() { statTimerHandle = setInterval('TimerStatDisplay()', 5000); } // called by timer to fetch and display statistic information var doingStatDisplay = false; function TimerStatDisplay() { if (doingStatDisplay) return; doingStatDisplay = true; if ($('#SimSimStats').is(':visible')) { DisplaySimStats(); } if ($('#SimRegionStats').is(':visible')) { DisplayPerRegionStats(); } if ($('#SimSessionStats').is(':visible')) { DisplaySessionStats(); } if ($('#SimLogFile').is(':visible')) { DisplayLogFile(); } doingStatDisplay = false; } var simName = "127.0.0.1"; var simPort = "9000"; function DisplaySimStats() { var statURL = "http://" + simName + ":" + simPort + "/SStats/?json=1"; $.ajax({ type: "GET", url: statURL, dataType: 'json', timeout: 1000, success: function(data, status) { if (status == 'success') { DisplaySimStatDetails(data); } }, error: function(xmlHTTPRequest, errorType) { // DebugLog('Failed fetch'); } }); } function DisplayPerRegionStats() { var statURL = "http://" + simName + ":" + simPort + "/SStats/simstatsajax.html?json=1"; $.ajax({ type: "GET", url: statURL, dataType: 'json', timeout: 1000, success: function(data, status) { if (status == 'success') { DisplayRegionStatDetails(data); } }, error: function(xmlHTTPRequest, errorType) { // DebugLog('Failed fetch'); } }); }; function DisplayLogFile() { var statURL = "http://" + simName + ":" + simPort + "/SStats/activelogajax.html?json=1"; $.ajax({ type: "GET", url: statURL, dataType: 'json', timeout: 1000, success: function(data, status) { if (status == 'success') { DisplayLogFileDetails(data); } }, error: function(xmlHTTPRequest, errorType) { // DebugLog('Failed fetch'); } }); }; function DisplaySessionStats() { var statURL = "http://" + simName + ":" + simPort + "/SStats/activeconnectionsajax.html?json=1"; $.ajax({ type: "GET", url: statURL, dataType: 'json', timeout: 1000, success: function(data, status) { if (status == 'success') { DisplaySessionStatsDetails(data); } }, error: function(xmlHTTPRequest, errorType) { // DebugLog('Failed fetch'); } }); }; function DisplaySimStatDetails(data) { var simInfo = new StringBuffer(); simInfo.append('<table id="RegionStatsTable">'); simInfo.append('<tr>'); simInfo.append('<th>Total Users</th>'); simInfo.append('<th>Total Sessions</th>'); simInfo.append('<th>Avg client FPS</th>'); simInfo.append('<th>Avg client Mem</th>'); simInfo.append('<th>Avg ping time</th>'); simInfo.append('<th>KB out</th>'); simInfo.append('<th>KB in</th>'); simInfo.append('</tr>'); simInfo.append('<tr>'); simInfo.append('<td>' + data.totalUsers + '</td>'); simInfo.append('<td>' + data.totalSessions + '</td>'); simInfo.append('<td>' + data.averageClientFPS + '</td>'); simInfo.append('<td>' + data.averageClientMem + '</td>'); simInfo.append('<td>' + data.averagePingTime + '</td>'); simInfo.append('<td>' + data.totalKBOut + '</td>'); simInfo.append('<td>' + data.totalKBIn + '</td>'); simInfo.append('</tr>'); simInfo.append('</table>'); $('#SimSimStats').empty(); $('#SimSimStats').append(simInfo.toString()); } function DisplayRegionStatDetails(data) { var regionInfo = new StringBuffer(); regionInfo.append('<table id="RegionStatsTable">'); regionInfo.append('<tr>'); regionInfo.append('<th>Region</th>'); regionInfo.append('<th>Agents</th>'); regionInfo.append('<th>Child</th>'); regionInfo.append('<th>FPS</th>'); regionInfo.append('<th>Frame Time</th>'); regionInfo.append('<th>Phys Time</th>'); regionInfo.append('<th>Prims</th>'); regionInfo.append('</tr>'); for (region in data) { regionInfo.append('<tr>'); regionInfo.append('<td>' + data[region].region + '</td>'); regionInfo.append('<td>' + data[region].rootAgents + '</td>'); regionInfo.append('<td>' + data[region].childAgents + '</td>'); regionInfo.append('<td>' + data[region].simFPS + '</td>'); regionInfo.append('<td>' + data[region].totalFrameTime + '</td>'); regionInfo.append('<td>' + data[region].physicsFrameTime + '</td>'); regionInfo.append('<td>' + data[region].totalPrims + '</td>'); regionInfo.append('</tr>'); } regionInfo.append('</table>'); $('#SimRegionStats').empty(); $('#SimRegionStats').append(regionInfo.toString()); } function DisplayLogFileDetails(data) { var logInfo = new StringBuffer(); var logPattern = /^(.+),\d\d\d .* \[(.+)\]: (.+)$/; for (logLine in data['logLines']) { logInfo.append('<div>'); var logPieces = logPattern.exec(data['logLines'][logLine]); if (logPieces) { logInfo.append(logPieces[1] + ' [' + logPieces[2] + '] ' + logPieces[3]); } else { logInfo.append(data['logLines'][logLine]); } logInfo.append('</div>'); } $('#SimLogFile').empty(); $('#SimLogFile').append(logInfo.toString()); } function DisplaySessionStatsDetails(data) { var userInfo = new StringBuffer(); userInfo.append('<table>'); userInfo.append('<tr>'); userInfo.append('<th>region</th>'); userInfo.append('<th>user</th>'); userInfo.append('<th></th>'); userInfo.append('<th>position</th>'); userInfo.append('</tr>'); for (region in data) { for (user in data[region]) { if (user != 'queues') { userInfo.append('<tr>'); userInfo.append('<td>' + region + '</td>'); userInfo.append('<td>' + data[region][user].Name + '</td>'); if (data[region][user].isRoot == 'true') { userInfo.append('<td>root</td>'); } else { userInfo.append('<td>child</td>'); } userInfo.append('<td>' + data[region][user].position + '</td>'); userInfo.append('</tr>'); } } } userInfo.append('</table>'); $('#SimSessionStats').empty(); $('#SimSessionStats').append(userInfo.toString()); } function DebugLog(msg) { $("#DEBUG").append('<div>' + msg + '</div>'); $("#DEBUG").show(); } function StringBuffer() { this.__strings__ = new Array; } StringBuffer.prototype.append = function(str) { this.__strings__.push(str); } StringBuffer.prototype.toString = function() { return this.__strings__.join(""); } </script> </head> <body id="SimBody"> <div id="SimHeader"></div> <div id="SimContent"> <!-- ============================================== --> <div class="SimSectionContainer"> <a class="SimSectionHeader" href="#">Simulator Stats</a> <div id="SimSimStats" class="SimSection"> </div> <!-- SimSimStats --> </div> <!-- SimSectionContainer --> <!-- ============================================== --> <div class="SimSectionContainer"> <a class="SimSectionHeader" href="#">Region Stats</a> <div id="SimRegionStats" class="SimSection"> </div> <!-- SimRegionStats --> </div> <!-- SimSectionContainer --> <!-- ============================================== --> <div class="SimSectionContainer"> <a class="SimSectionHeader" href="#">Sessions</a> <div id="SimSessionStats" class="SimSection"> </div> <!-- SimSessionStats --> </div> <!-- SimSectionContainer --> <!-- ============================================== --> <div class="SimSectionContainer"> <a class="SimSectionHeader" href="#">Log File</a> <div id="SimLogFile" class="SimSection"> </div> <!-- SimLogFile --> </div> <!-- SimSectionContainer --> <!-- ============================================== --> </div> <!-- SimContent --> <div id="DEBUG"></div> <div id="SimFooter"></div> </body> </html>