Skip to content

Commit

Permalink
Add getOverview endpoint for general stats
Browse files Browse the repository at this point in the history
  • Loading branch information
nzxl101 committed Sep 24, 2024
1 parent d26e2b1 commit d2056c7
Show file tree
Hide file tree
Showing 5 changed files with 122 additions and 13 deletions.
4 changes: 4 additions & 0 deletions root/app/www/public/ajax/tasks.php
Original file line number Diff line number Diff line change
Expand Up @@ -116,6 +116,10 @@
<td>API: View containers</td>
<td align="center"><i class="far fa-play-circle text-info" style="cursor: pointer;" onclick="runTask('containersList')"></i></td>
</tr>
<tr>
<td>API: Get overview stats</td>
<td align="center"><i class="far fa-play-circle text-info" style="cursor: pointer;" onclick="runTask('overviewStats')"></i></td>
</tr>
</tbody>
</table>
</div>
Expand Down
4 changes: 3 additions & 1 deletion root/app/www/public/functions/api.php
Original file line number Diff line number Diff line change
Expand Up @@ -259,7 +259,9 @@ function apiRequestLocal($endpoint, $parameters = [], $payload = [])

return defined('DOCKWATCH_COMMITS') && defined('DOCKWATCH_BRANCH') ? 'v' . APP_X . '.' . APP_Y . '.' . DOCKWATCH_COMMITS . ' - ' . DOCKWATCH_BRANCH : 'v0.0.0';
case 'stats-getContainersList':
return apiResponse(200, getContainersList());
return apiResponse(200, getContainerStats());
case 'stats-getOverview':
return apiResponse(200, getOverviewStats());
default:
apiResponse(405, ['error' => 'Invalid GET request (endpoint=' . $endpoint . ')']);
break;
Expand Down
113 changes: 107 additions & 6 deletions root/app/www/public/functions/stats.php
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,10 @@
----------------------------------
*/

function getContainersList() {
global $docker;

function getContainerStats()
{
$stateFile = getFile(STATE_FILE);
$pullsFile = getFile(PULL_FILE);

$containers = [];

foreach ($stateFile as $container) {
Expand Down Expand Up @@ -49,12 +47,12 @@ function getContainersList() {

//-- GET PRIVATE PORT
if (preg_match('/->(\d+)\//', $port, $matches)) {
$privatePort = $matches[1];
$privatePort = $matches[1];
}

//-- GET PUBLIC PORT
if (preg_match('/:(\d+)->|->(\d+)\//', $port, $matches)) {
$publicPort = $matches[1];
$publicPort = $matches[1];
}

//-- GET EXPOSED PORT
Expand Down Expand Up @@ -115,4 +113,107 @@ function getContainersList() {
}

return $containers;
}

function getOverviewStats()
{
$data = getContainerStats();
$stats = [
'status' => [
'running' => 0,
'stopped' => 0,
'total' => 0
],
'health' => [
'healthy' => 0,
'unhealthy' => 0,
'unknown' => 0
],
'updates' => [
'uptodate' => 0,
'outdated' => 0,
'unchecked' => 0
],
'usage' => [
'disk' => 0,
'cpu' => 0,
'memory' => 0,
'netIO' => 0
],
'network' => [],
'ports' => []
];

foreach ($data as $container) {
// -- STATUS
if ($container['status'] == 'running') {
$stats['status']['running']++;
}
if ($container['status'] == 'exited') {
$stats['status']['stopped']++;
}
$stats['status']['total'] = $stats['status']['running'] + $stats['status']['stopped'];

// -- HEALTH
if ($container['health'] == 'healthy') {
$stats['health']['healthy']++;
}
if ($container['health'] == 'unhealthy') {
$stats['health']['unhealthy']++;
}
if ($container['health'] == null) {
$stats['health']['unknown']++;
}

// -- UPDATES
if (!empty($container['dockwatch']) && $container['dockwatch']['pull'] == 'Up to date') {
$stats['updates']['uptodate']++;
}
if (!empty($container['dockwatch']) && $container['dockwatch']['pull'] == 'Outdated') {
$stats['updates']['outdated']++;
}
if (empty($container['dockwatch'])) {
$stats['updates']['unchecked']++;
}

// -- USAGE
if ($container['imageSize'] !== null) {
$stats['usage']['disk'] += bytesFromString($container['imageSize']);
}
if ($container['usage']['cpuPerc'] !== null) {
$stats['usage']['cpu'] += floatval(str_replace('%', '', $container['usage']['cpuPerc']));
}
if ($container['usage']['memPerc'] !== null) {
$stats['usage']['memory'] += floatval(str_replace('%', '', $container['usage']['memPerc']));
}
if ($container['usage']['netIO'] !== null) {
list($netUsed, $netAllowed) = explode(' / ', $container['usage']['netIO']);
$stats['usage']['netIO'] += bytesFromString($netUsed);
}

// -- NETWORK
if ($container['networkMode'] !== null && !$stats['network'][$container['networkMode']]) {
$stats['network'][$container['networkMode']] = 0;
}
$stats['network'][$container['networkMode']]++;

// -- PORTS
if (!$stats['ports'][$container['name']]) {
if (str_starts_with($container['networkMode'], 'container:')) {
continue;
}
if (str_starts_with($container['networkMode'], 'host')) {
continue;
}

$stats['ports'][$container['name']] = [];
}
foreach ($container['ports'] as $port) {
if (!empty($port['publicPort']) && !in_array($port['publicPort'], $stats['ports'][$container['name']])) {
$stats['ports'][$container['name']][] = $port['publicPort'];
}
}
}

return $stats;
}
4 changes: 3 additions & 1 deletion root/app/www/public/functions/tasks.php
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,9 @@ function executeTask($task)
case 'dependencyFile':
return json_encode(getFile(DEPENDENCY_FILE), JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES);
case 'containersList':
return json_encode(getContainersList(), JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES);
return json_encode(getContainerStats(), JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES);
case 'overviewStats':
return json_encode(getOverviewStats(), JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES);
default:
return 'Invalid task requested (task=' . $task . ')';
}
Expand Down
10 changes: 5 additions & 5 deletions root/app/www/public/loader.php
Original file line number Diff line number Diff line change
Expand Up @@ -143,11 +143,11 @@
$pullsFile = apiRequest('file-pull')['result'];
}

$getContainersList = $_GET['request'] === 'stats-getContainersList';
$statsApi = ['stats-getContainersList', 'stats-getOverview'];

$fetchProc = in_array($_POST['page'], $getProc) || $_POST['hash'] || $getContainersList;
$fetchStats = in_array($_POST['page'], $getStats) || $_POST['hash'] || $getContainersList;
$fetchInspect = in_array($_POST['page'], $getInspect) || $_POST['hash'] || $getContainersList;
$fetchProc = in_array($_POST['page'], $getProc) || $_POST['hash'] || in_array($_GET['request'], $statsApi);
$fetchStats = in_array($_POST['page'], $getStats) || $_POST['hash'] || in_array($_GET['request'], $statsApi);
$fetchInspect = in_array($_POST['page'], $getInspect) || $_POST['hash'] || in_array($_GET['request'], $statsApi);

$loadTimes[] = trackTime('getExpandedProcessList ->');
$getExpandedProcessList = getExpandedProcessList($fetchProc, $fetchStats, $fetchInspect);
Expand All @@ -158,7 +158,7 @@
$loadTimes[] = trackTime('getExpandedProcessList <-');

//-- UPDATE THE STATE FILE WHEN EVERYTHING IS FETCHED
if ($_POST['page'] == 'overview' || $_POST['page'] == 'containers' || $getContainersList) {
if ($_POST['page'] == 'overview' || $_POST['page'] == 'containers' || in_array($_GET['request'], $statsApi)) {
if ($processList) {
apiRequest('file-state', [], ['contents' => $processList]);
}
Expand Down

0 comments on commit d2056c7

Please sign in to comment.