Show critical count badge in left menu

The critical count badge of `Business Process` menu section represent number configs that are in critical state.
The critical count badge of configs sub section under represent number of critical root nodes of that specific config.
This commit is contained in:
raviks789 2022-08-01 17:10:28 +02:00 committed by Johannes Meyer
parent 4ca8c72a05
commit bd2cb52292
3 changed files with 117 additions and 0 deletions

View file

@ -1,9 +1,11 @@
<?php
use Icinga\Module\Businessprocess\Storage\LegacyStorage;
use Icinga\Module\Businessprocess\Web\Navigation\Renderer\ProcessProblemsBadge;
/** @var \Icinga\Application\Modules\Module $this */
$section = $this->menuSection(N_('Business Processes'), array(
'renderer' => 'ProcessesProblemsBadge',
'url' => 'businessprocess',
'icon' => 'sitemap',
'priority' => 46
@ -30,6 +32,7 @@ try {
}
$section->add($meta->getTitle(), array(
'renderer' => (new ProcessProblemsBadge())->setBpConfigName($name),
'url' => 'businessprocess/process/show',
'urlParameters' => array('config' => $name),
'priority' => $prio

View file

@ -0,0 +1,61 @@
<?php
namespace Icinga\Module\Businessprocess\Web\Navigation\Renderer;
use Icinga\Module\Businessprocess\Storage\LegacyStorage;
use Icinga\Web\Navigation\Renderer\BadgeNavigationItemRenderer;
class ProcessProblemsBadge extends BadgeNavigationItemRenderer
{
/**
* Cached count
*
* @var int
*/
protected $count;
/** @var string */
private $bpConfigName;
public function getCount()
{
if ($this->count === null) {
$storage = LegacyStorage::getInstance();
$count = 0;
$bp = $storage->loadProcess($this->getBpConfigName());
foreach ($bp->getRootNodes() as $rootNode) {
if (! $rootNode->isEmpty() &&
$rootNode->getState() !== $rootNode::ICINGA_PENDING
&& $rootNode->hasProblems()) {
$count++;
}
}
$this->count = $count;
$this->setState(self::STATE_CRITICAL);
}
if ($count) {
$this->setTitle(sprintf(
tp('One unhandled root node critical', '%d unhandled root nodes critical', $count),
$count
));
}
return $this->count;
}
public function setBpConfigName($bpConfigName)
{
$this->bpConfigName = $bpConfigName;
return $this;
}
public function getBpConfigName()
{
return $this->bpConfigName;
}
}

View file

@ -0,0 +1,53 @@
<?php
namespace Icinga\Module\Businessprocess\Web\Navigation\Renderer;
use Icinga\Application\Modules\Module;
use Icinga\Module\Businessprocess\ProvidedHook\Icingadb\IcingadbSupport;
use Icinga\Module\Businessprocess\State\IcingaDbState;
use Icinga\Module\Businessprocess\State\MonitoringState;
use Icinga\Module\Businessprocess\Storage\LegacyStorage;
use Icinga\Web\Navigation\Renderer\BadgeNavigationItemRenderer;
class ProcessesProblemsBadge extends BadgeNavigationItemRenderer
{
/**
* Cached count
*
* @var int
*/
protected $count;
public function getCount()
{
if ($this->count === null) {
$storage = LegacyStorage::getInstance();
$count = 0;
foreach ($storage->listProcessNames() as $processName) {
$bp = $storage->loadProcess($processName);
if (Module::exists('icingadb') &&
(! $bp->hasBackendName() && IcingadbSupport::useIcingaDbAsBackend())
) {
IcingaDbState::apply($bp);
} else {
MonitoringState::apply($bp);
}
foreach ($bp->getRootNodes() as $rootNode) {
if (! $rootNode->isEmpty() &&
$rootNode->getState() !== $rootNode::ICINGA_PENDING
&& $rootNode->hasProblems()) {
$count++;
break;
}
}
}
$this->count = $count;
$this->setState(self::STATE_CRITICAL);
}
return $this->count;
}
}