new: [server] Compare server events overlap

pull/6874/head
Jakub Onderka 2021-01-18 11:23:26 +01:00
parent 56ef2f9874
commit 7c28f9b966
5 changed files with 159 additions and 0 deletions

View File

@ -503,6 +503,7 @@ class ACLComponent extends Component
'postTest' => array('perm_sync'),
'previewEvent' => array(),
'previewIndex' => array(),
'compareServers' => [],
'pull' => array(),
'purgeSessions' => array(),
'push' => array(),

View File

@ -203,6 +203,14 @@ class ServersController extends AppController
$this->set('title_for_layout', __('Remote event preview'));
}
public function compareServers()
{
list($servers, $overlap) = $this->Server->serverEventsOverlap();
$this->set('servers', $servers);
$this->set('overlap', $overlap);
$this->set('title_for_layout', __('Server overlap analysis matrix'));
}
public function filterEventIndex($id)
{
if (!$this->_isSiteAdmin()) {

View File

@ -809,6 +809,56 @@ class Server extends AppModel
return $eventUuids;
}
public function serverEventsOverlap()
{
$servers = $this->find('all', [
'conditions' => ['OR' => [
'pull' => 1,
// 'push' => 1,
]],
'order' => ['Server.id ASC'],
'recursive' => -1,
]);
if (count($servers) < 2) {
return [$servers, []];
}
$serverUuids = [];
foreach ($servers as $server) {
try {
$uuids = $this->getEventIdsFromServer($server, true, null, true, 'events', true);
$serverUuids[$server['Server']['id']] = $uuids;
} catch (Exception $e) {
$this->logException("Could not get event UUIDs for server {$server['Server']['id']}", $e);
}
}
$compared = [];
foreach ($servers as $server) {
if (!isset($serverUuids[$server['Server']['id']])) {
continue;
}
foreach ($servers as $server2) {
if ($server['Server']['id'] == $server2['Server']['id']) {
continue;
}
if (!isset($serverUuids[$server2['Server']['id']])) {
continue;
}
$intersect = count(array_intersect($serverUuids[$server['Server']['id']], $serverUuids[$server2['Server']['id']]));
$percentage = round(100 * $intersect / count($serverUuids[$server['Server']['id']]));
$compared[$server['Server']['id']][$server2['Server']['id']] = [
'percentage' => $percentage,
'events' => $intersect,
];
}
}
return [$servers, $compared];
}
/**
* @param int $id Server ID
* @param string|int $technique Can be 'full', 'incremental' or event ID

View File

@ -752,6 +752,10 @@ $divider = $this->element('/genericElements/SideMenu/side_menu_divider');
'url' => $baseurl . '/servers/add',
'text' => __('New Servers')
));
echo $this->element('/genericElements/SideMenu/side_menu_link', array(
'url' => $baseurl . '/servers/compareServers',
'text' => __('Server overlap analysis matrix'),
));
echo $this->element('/genericElements/SideMenu/side_menu_link', array(
'url' => $baseurl . '/communities/index',
'text' => __('List Communities'),

View File

@ -0,0 +1,96 @@
<?php
$serverTemplate = array(
'id', 'name', 'url'
);
?>
<div class="index">
<h2><?php echo __('Server events overlap analysis matrix');?></h2>
<?php
if (count($servers) >= 2):
?>
<div>
<table class="table table-striped table-hover table-condensed" style="width:100px;">
<tr>
<th>&nbsp;</th>
<?php
foreach ($servers as $server):
$popover = '';
foreach ($serverTemplate as $element) {
$popover .= '<span class=\'bold\'>' . Inflector::humanize($element) . '</span>: <span class=\'bold blue\'>' . h($server['Server'][$element]) . '</span><br>';
}
?>
<th>
<div data-toggle="popover" data-content="<?= $popover; ?>" data-trigger="hover">
<?= 'S' . h($server['Server']['id']) ?>
</div>
</th>
<?php
endforeach;
?>
</tr>
<?php
foreach ($servers as $item):
$popover = '';
foreach ($serverTemplate as $element) {
$popover .= '<span class=\'bold\'>' . Inflector::humanize($element) . '</span>: <span class=\'bold blue\'>' . h($item['Server'][$element]) . '</span><br>';
}
?>
<tr>
<td class="short">
<div data-toggle="popover" data-content="<?php echo $popover;?>" data-trigger="hover">
<?= __('Server #%s: %s', h($item['Server']['id']), h($item['Server']['name'])) ?>
</div>
</td>
<?php
foreach ($servers as $item2):
$percentage = $count = null;
if (isset($overlap[$item['Server']['id']][$item2['Server']['id']])) {
$percentage = $overlap[$item['Server']['id']][$item2['Server']['id']]['percentage'];
$count = $overlap[$item['Server']['id']][$item2['Server']['id']]['events'];
}
$class = 'bold';
if ($percentage !== null) {
if ($percentage <= 5) {
$class .= ' green';
} else if ($percentage <= 50) {
$class .= ' orange';
} else {
$class .= ' red';
}
}
if ($percentage === null) {
$popover = '';
} else if ($percentage == 0) {
$popover = __('None or less than 1 % of the events of %s is contained in %s (%s matching events)', $item['Server']['name'], $item2['Server']['name'], $count);
} else if ($percentage > 0) {
$popover = __('%s % of the events of %s is contained in %s (%s matching events)', $percentage, $item['Server']['name'], $item2['Server']['name'], $count);
}
?>
<td class="<?= h($class); ?>">
<div data-toggle="popover" data-content="<?php echo h($popover);?>" data-trigger="hover">
<?= $percentage === null ? '-' : h($percentage) . '&nbsp;%' ?>
</div>
</td>
<?php
endforeach;
?>
</tr>
<?php
endforeach;
?>
</table>
</div>
<?php
else:
echo '<p class="red bold">Not enough remote servers. Make sure you have at least 2 server that are enabled and available.</p>';
endif;
?>
</div>
<script type="text/javascript">
$(function(){
popoverStartup();
});
</script>
<?= $this->element('/genericElements/SideMenu/side_menu', array('menuList' => 'sync', 'menuItem' => 'compareServers'));