add performance graphs to serverinfo
move serverinfo-bar to seperate file add serverinfo fps chart add network i/o chart
This commit is contained in:
@@ -0,0 +1,40 @@
|
||||
<nav class="navbar navbar-default" ng-controller="ServerInfoController" ng-show="serverinfo">
|
||||
<div class="container">
|
||||
<div class="navbar-header">
|
||||
<button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar-collapse-header" aria-expanded="false">
|
||||
<span class="sr-only">Toggle navigation</span>
|
||||
<span class="icon-bar"></span>
|
||||
<span class="icon-bar"></span>
|
||||
<span class="icon-bar"></span>
|
||||
</button>
|
||||
|
||||
<a class="navbar-brand" href="#">{{serverinfo.Hostname}}</a>
|
||||
</div>
|
||||
|
||||
<div class="collapse navbar-collapse" id="navbar-collapse-header">
|
||||
<p class="navbar-text" title="Uptime">
|
||||
<span class="glyphicon glyphicon-time"></span>
|
||||
{{serverinfo.Uptime|SecondsToDuration}}
|
||||
</p>
|
||||
<p class="navbar-text" title="Map Name">
|
||||
<span class="glyphicon glyphicon-globe"></span>
|
||||
{{serverinfo.Map}}
|
||||
</p>
|
||||
<p class="navbar-text" title="Current Players/Maximum Players">
|
||||
<span class="glyphicon glyphicon-user"></span>
|
||||
{{serverinfo.Players|number}}/{{serverinfo.MaxPlayers|number}}
|
||||
</p>
|
||||
<p class="navbar-text" title="Framerate">
|
||||
<span class="glyphicon glyphicon-hourglass"></span>
|
||||
{{serverinfo.Framerate|number}}fps
|
||||
</p>
|
||||
<p class="navbar-text" title="Entity Count">
|
||||
<span class="glyphicon glyphicon-oil"></span>
|
||||
{{serverinfo.EntityCount|number}}
|
||||
</p>
|
||||
|
||||
<button class="btn btn-danger navbar-btn navbar-right" type="button" ng-click="Disconnect()">Disconnect</button>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</nav>
|
||||
+11
-42
@@ -1,57 +1,26 @@
|
||||
|
||||
<div ng-controller="ServerInfoController" flex layout="column" id="ServerInfoController">
|
||||
|
||||
<div class="row">
|
||||
|
||||
<div class="col-sm-12">
|
||||
<h2>
|
||||
{{info.Hostname}}
|
||||
</h2>
|
||||
<h2>{{serverinfo.Hostname}}</h2>
|
||||
</div>
|
||||
|
||||
<div class="col-sm-4" ng-repeat="(key, value) in info">
|
||||
<p><span class="text-muted">{{key}}:</span> <span>{{value}}</span></p>
|
||||
<div class="col-sm-4" ng-repeat="(key, value) in serverinfo">
|
||||
<p>
|
||||
<span class="text-muted">{{key}}:</span>
|
||||
<span>{{value}}</span>
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<!--
|
||||
<div class="col-sm-4">
|
||||
<p>Map: {{info.Map}}</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
|
||||
<div class="col-sm-4">
|
||||
<p>Max Players: {{info.MaxPlayers}}</p>
|
||||
<div class="col-sm-12">
|
||||
<nvd3 options="fpsChart.options" data="fpsChart.data"></nvd3>
|
||||
<nvd3 options="netChart.options" data="netChart.data"></nvd3>
|
||||
</div>
|
||||
|
||||
<div class="col-sm-4">
|
||||
<p>GameTime: {{info.GameTime}}</p>
|
||||
</div>
|
||||
|
||||
<div class="col-sm-4">
|
||||
<p>Framerate: <span class="badge">{{info.Framerate}}</span></p>
|
||||
</div>
|
||||
|
||||
<div class="col-sm-4">
|
||||
<p>EntityCount: <span class="badge">{{info.EntityCount}}</span></p>
|
||||
</div>
|
||||
|
||||
<div class="col-sm-4">
|
||||
<p>Uptime: <span class="badge">{{info.Uptime}}</span></p>
|
||||
</div>
|
||||
|
||||
<div class="col-sm-4">
|
||||
<p>Players: <span class="badge">{{info.Players}}</span></p>
|
||||
</div>
|
||||
|
||||
<div class="col-sm-4">
|
||||
<p>Joining: <span class="badge">{{info.Joining}}</span></p>
|
||||
</div>
|
||||
|
||||
<div class="col-sm-4">
|
||||
<p>Queued: <span class="badge">{{info.Queued}}</span></p>
|
||||
</div>
|
||||
|
||||
-->
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
+1
-56
@@ -12,62 +12,7 @@
|
||||
</head>
|
||||
<body ng-controller="RconController">
|
||||
|
||||
<nav class="navbar navbar-default" ng-controller="ServerInfoController" ng-show="Connected">
|
||||
<div class="container">
|
||||
<div class="navbar-header">
|
||||
<button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar-collapse-header" aria-expanded="false">
|
||||
<span class="sr-only">Toggle navigation</span>
|
||||
<span class="icon-bar"></span>
|
||||
<span class="icon-bar"></span>
|
||||
<span class="icon-bar"></span>
|
||||
</button>
|
||||
|
||||
<a class="navbar-brand" href="#">{{info.Hostname}}</a>
|
||||
</div>
|
||||
|
||||
<div class="collapse navbar-collapse" id="navbar-collapse-header">
|
||||
<ul class="nav navbar-nav">
|
||||
<li>
|
||||
<p class="navbar-text" title="Uptime">
|
||||
<span class="glyphicon glyphicon-time"></span>
|
||||
{{info.Uptime|SecondsToDuration}}
|
||||
</p>
|
||||
</li>
|
||||
<li>
|
||||
<p class="navbar-text" title="Map Name">
|
||||
<span class="glyphicon glyphicon-globe"></span>
|
||||
{{info.Map}}
|
||||
</p>
|
||||
</li>
|
||||
<li>
|
||||
<p class="navbar-text" title="Current Players/Maximum Players">
|
||||
<span class="glyphicon glyphicon-user"></span>
|
||||
{{info.Players|number}}/{{info.MaxPlayers|number}}
|
||||
</p>
|
||||
</li>
|
||||
<li>
|
||||
<p class="navbar-text" title="Framerate">
|
||||
<span class="glyphicon glyphicon-hourglass"></span>
|
||||
{{info.Framerate|number}}fps
|
||||
</p>
|
||||
</li>
|
||||
<li>
|
||||
<p class="navbar-text" title="Entity Count">
|
||||
<span class="glyphicon glyphicon-oil"></span>
|
||||
{{info.EntityCount|number}}
|
||||
</p>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<ul class="nav navbar-nav navbar-right">
|
||||
<li>
|
||||
<button class="btn btn-danger navbar-btn" type="button" ng-click="Disconnect()">Disconnect</button>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</nav>
|
||||
<div ng-include="'html/header.html'" ng-show="Connected"></div>
|
||||
|
||||
<div class="container">
|
||||
|
||||
|
||||
+130
-13
@@ -1,19 +1,136 @@
|
||||
app.controller('ServerInfoController', ServerInfoController);
|
||||
|
||||
app.controller( 'ServerInfoController', ServerInfoController );
|
||||
function ServerInfoController($scope, rconService, $routeParams, $interval) {
|
||||
|
||||
function ServerInfoController( $scope, rconService, $routeParams, $interval )
|
||||
{
|
||||
$scope.info = {};
|
||||
var fpsData = [];
|
||||
var netData = [];
|
||||
|
||||
$scope.refresh = function ()
|
||||
{
|
||||
rconService.Request( 'serverinfo', $scope, function ( msg ) {
|
||||
$scope.info = JSON.parse( msg.Message );
|
||||
} );
|
||||
}
|
||||
// TODO: move serverinfo to service
|
||||
$scope.serverinfo = {};
|
||||
|
||||
rconService.InstallService( $scope, $scope.refresh );
|
||||
$scope.playersChart = {
|
||||
options: {
|
||||
chart: {
|
||||
type: "pieChart",
|
||||
height: 400,
|
||||
x: function(d) {
|
||||
return d.key;
|
||||
},
|
||||
y: function(d) {
|
||||
return d.value;
|
||||
},
|
||||
showLabels: false
|
||||
}
|
||||
},
|
||||
data: []
|
||||
};
|
||||
|
||||
$scope.fpsChart = {
|
||||
options: {
|
||||
chart: {
|
||||
type: 'lineChart',
|
||||
height: 200,
|
||||
y: function(d) {
|
||||
return d.y;
|
||||
},
|
||||
useInteractiveGuideline: true,
|
||||
showXAxis: false,
|
||||
duration: 0,
|
||||
yAxis: {
|
||||
axisLabel: 'FPS',
|
||||
tickFormat: function(d) {
|
||||
return d3.format('.d')(d);
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
data: [
|
||||
{
|
||||
values: [],
|
||||
key: 'FPS'
|
||||
}
|
||||
]
|
||||
};
|
||||
|
||||
$scope.netChart = {
|
||||
options: {
|
||||
chart: {
|
||||
"type": "stackedAreaChart",
|
||||
"height": 250,
|
||||
"useVoronoi": false,
|
||||
"duration": 0,
|
||||
"useInteractiveGuideline": true,
|
||||
showXAxis: false,
|
||||
"yAxis": {
|
||||
axisLabel: 'Network',
|
||||
tickFormat: function(d) {
|
||||
return d3.format('.d')(d) + 'kb';
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
data: [
|
||||
{
|
||||
key: 'IN',
|
||||
values: []
|
||||
}, {
|
||||
key: 'OUT',
|
||||
values: []
|
||||
}
|
||||
]
|
||||
};
|
||||
|
||||
rconService.InstallService($scope, _refresh);
|
||||
|
||||
// TODO: move updateinterval to service
|
||||
var timer = $interval(_refresh, 1000);
|
||||
$scope.$on("$destroy", function() {
|
||||
$interval.cancel(timer);
|
||||
$scope.serverinfo = {};
|
||||
});
|
||||
|
||||
function _refresh() {
|
||||
rconService.Request('serverinfo', $scope, function(msg) {
|
||||
_updateData(JSON.parse(msg.Message));
|
||||
});
|
||||
}
|
||||
|
||||
function _updateData(data) {
|
||||
$scope.serverinfo = data;
|
||||
|
||||
$scope.playersChart.data.push({'players': data.Players, 'queued': data.Queued, 'joining': data.Joining});
|
||||
|
||||
_collectChartData(data);
|
||||
_generateChartData();
|
||||
}
|
||||
|
||||
function _collectChartData(data) {
|
||||
fpsData.push(data.Framerate);
|
||||
if (fpsData.length > 100) {
|
||||
fpsData.shift();
|
||||
}
|
||||
|
||||
netData.push({in: data.NetworkIn, out: data.NetworkOut});
|
||||
if (netData.length > 100) {
|
||||
netData.shift();
|
||||
}
|
||||
}
|
||||
|
||||
function _generateChartData() {
|
||||
var fpsChartValues = [];
|
||||
for (var i = 0; i < fpsData.length; i++) {
|
||||
fpsChartValues.push({x: i, y: fpsData[i]});
|
||||
}
|
||||
$scope.fpsChart.data[0].values = fpsChartValues;
|
||||
|
||||
var netInChartValues = [];
|
||||
var netOutChartValues = [];
|
||||
for (var i = 0; i < netData.length; i++) {
|
||||
netInChartValues.push({x: i, y: netData[i]. in});
|
||||
netOutChartValues.push({x: i, y: netData[i].out});
|
||||
}
|
||||
$scope.netChart.data[0].values = netInChartValues;
|
||||
$scope.netChart.data[1].values = netOutChartValues;
|
||||
}
|
||||
|
||||
var timer = $interval( $scope.refresh, 500 );
|
||||
$scope.$on( "$destroy", function () { $interval.cancel( timer ); } );
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user