diff --git a/modules/monitoring/application/controllers/ListController.php b/modules/monitoring/application/controllers/ListController.php index 2558525c6..4ad4af319 100644 --- a/modules/monitoring/application/controllers/ListController.php +++ b/modules/monitoring/application/controllers/ListController.php @@ -490,7 +490,16 @@ class Monitoring_ListController extends Controller 'services_critical_unhandled', 'services_warning_handled', 'services_warning_unhandled', - 'services_pending' + 'services_pending', + 'services_ok_last_state_change', + 'services_pending_last_state_change', + 'services_warning_last_state_change_handled', + 'services_critical_last_state_change_handled', + 'services_unknown_last_state_change_handled', + 'services_warning_last_state_change_unhandled', + 'services_critical_last_state_change_unhandled', + 'services_unknown_last_state_change_unhandled', + 'services_total' )); $this->filterQuery($query); $this->view->servicegroups = $query->paginate(); @@ -521,7 +530,16 @@ class Monitoring_ListController extends Controller 'services_critical_unhandled', 'services_warning_handled', 'services_warning_unhandled', - 'services_pending' + 'services_pending', + 'services_ok_last_state_change', + 'services_pending_last_state_change', + 'services_warning_last_state_change_handled', + 'services_critical_last_state_change_handled', + 'services_unknown_last_state_change_handled', + 'services_warning_last_state_change_unhandled', + 'services_critical_last_state_change_unhandled', + 'services_unknown_last_state_change_unhandled', + 'services_total' )); $this->filterQuery($query); $this->view->hostgroups = $query->paginate(); diff --git a/modules/monitoring/application/views/scripts/list/hostgroups.phtml b/modules/monitoring/application/views/scripts/list/hostgroups.phtml index 5a60c7a68..0a786132c 100644 --- a/modules/monitoring/application/views/scripts/list/hostgroups.phtml +++ b/modules/monitoring/application/views/scripts/list/hostgroups.phtml @@ -1,266 +1,253 @@ -compact): ?> -
- tabs ?> -
- +compact): ?>
-
- - - -
-

- - hostgroup; ?> - -

-
- - - - - - - - - - - - - -
translate('Hosts'); ?>translate('Services'); ?>
-hosts_down_handled || $h->hosts_down_unhandled): ?> - -
-hosts_down_unhandled): ?> - - hosts_down_unhandled; ?> translate('DOWN', 'icinga.state') ?> - - -hosts_down_handled): ?> - - hosts_down_handled . ' ' . ($h->hosts_down_unhandled ? $this->translate('Acknowledged') : $this->translate('DOWN', 'icinga.state')); ?> - - -
- - -hosts_unreachable_handled || $h->hosts_unreachable_unhandled): ?> - -
-hosts_unreachable_unhandled): ?> - - hosts_unreachable_unhandled; ?> translate('UNREACHABLE', 'icinga.state') ?> - - -hosts_unreachable_handled): ?> - - hosts_unreachable_handled . ' ' . ($h->hosts_unreachable_unhandled ? $this->translate('Acknowledged') : $this->translate('UNREACHABLE', 'icinga.state')) ?> - - -
- - -hosts_up): ?> - -
- - hosts_up; ?> translate('UP', 'icinga.state') ?> - -
- - -hosts_pending): ?> - -
- - hosts_pending; ?> translate('PENDING', 'icinga.state') ?> - -
- - -
-services_critical_handled || $h->services_critical_unhandled): ?> - -
-services_critical_unhandled): ?> - - services_critical_unhandled; ?> translate('CRITICAL', 'icinga.state') ?> - - -services_critical_handled): ?> - - services_critical_handled . ' ' . ($h->services_critical_unhandled ? $this->translate('Acknowledged') : $this->translate('CRITICAL', 'icinga.state')); ?> - - -
- - -services_warning_handled || $h->services_warning_unhandled): ?> - -
-services_warning_unhandled): ?> - - services_warning_unhandled; ?> translate('WARNING', 'icinga.state') ?> - - -services_warning_handled): ?> - - services_warning_handled . ' ' . ($h->services_warning_unhandled ? $this->translate('Acknowledged') : $this->translate('WARNING', 'icinga.state')); ?> - - -
- - -services_unknown_handled || $h->services_unknown_unhandled): ?> - -
-services_unknown_unhandled): ?> - - services_unknown_unhandled; ?> translate('UNKNOWN', 'icinga.state') ?> - - -services_unknown_handled): ?> - - services_unknown_handled . ' ' . ($h->services_unknown_unhandled ? $this->translate('Acknowledged') : $this->translate('UNKNOWN', 'icinga.state')); ?> - - -
- - -services_ok): ?> - -
- - services_ok; ?> translate('OK', 'icinga.state') ?> - -
- - -services_pending): ?> - -
- - services_pending; ?> translate('PENDING', 'icinga.state') ?> - -
- - -
-
-
- -
+ +
+ tabs ?> + widget('limiter')->setMaxLimit(count($hostgroups)); ?> + paginationControl($hostgroups, null, null, array('preserve' => $this->preserve)); ?>
+
+ filterEditor; ?> + + translate('No host groups matching the filter'); + echo '
'; + return; + } + ?> + + + + + + + + + + + services_critical_last_state_change_unhandled): ?> + + services_unknown_last_state_change_unhandled): ?> + + services_warning_last_state_change_unhandled): ?> + + services_critical_last_state_change_handled): ?> + + services_unknown_last_state_change_handled): ?> + + services_warning_last_state_change_handled): ?> + + services_ok_last_state_change): ?> + + + + + + + + + + + + + + +
translate('Last Problem'); ?>translate('Host Group'); ?>translate('Total Services'); ?>translate('Service States'); ?>
+ translate('CRITICAL'); ?> +
+ prefixedTimeSince($h->services_critical_last_state_change_unhandled); ?> +
+ translate('UNKNOWN'); ?> +
+ prefixedTimeSince($h->services_unknown_last_state_change_unhandled); ?> +
+ translate('WARNING'); ?> +
+ prefixedTimeSince($h->services_warning_last_state_change_unhandled); ?> +
+ translate('CRITICAL'); ?> +
+ prefixedTimeSince($h->services_critical_last_state_change_handled); ?> +
+ translate('UNKNOWN'); ?> +
+ prefixedTimeSince($h->services_unknown_last_state_change_handled); ?> +
+ translate('WARNING'); ?> +
+ prefixedTimeSince($h->services_warning_last_state_change_handled); ?> +
+ translate('OK'); ?> +
+ prefixedTimeSince($h->services_ok_last_state_change); ?> +
+ translate('PENDING'); ?> +
+ prefixedTimeSince($h->services_pending_last_state_change); ?> +
+ + hostgroup; ?> + + + services_total; ?> + + services_ok): ?> + + + services_ok; ?> + + + + + - + + + + services_critical_unhandled): ?> + + + services_critical_unhandled; ?> + + + services_critical_handled): ?> + + + services_critical_handled; ?> + + + + services_critical_unhandled): ?> + + + services_critical_unhandled && !$h->services_critical_handled): ?> + + - + + + + services_unknown_unhandled): ?> + + + services_unknown_unhandled; ?> + + + services_unknown_handled): ?> + + + services_unknown_handled; ?> + + + + services_unknown_unhandled): ?> + + + services_unknown_unhandled && !$h->services_unknown_handled): ?> + + - + + + + services_warning_unhandled): ?> + + + services_warning_unhandled; ?> + + + services_warning_handled): ?> + + + services_warning_handled; ?> + + + + services_warning_unhandled): ?> + + + services_warning_unhandled && !$h->services_warning_handled): ?> + + - + + + + services_pending): ?> + + + services_pending; ?> + + + + + - + + +
+
\ No newline at end of file diff --git a/modules/monitoring/application/views/scripts/list/servicegroups.phtml b/modules/monitoring/application/views/scripts/list/servicegroups.phtml index 7f9e4dd3d..50f680100 100644 --- a/modules/monitoring/application/views/scripts/list/servicegroups.phtml +++ b/modules/monitoring/application/views/scripts/list/servicegroups.phtml @@ -1,269 +1,253 @@ -compact): ?> -
- tabs ?> -
- +compact): ?>
-
- - - -
-

- - servicegroup; ?> - -

-
- - - - - - - - - - - - - -
translate('Hosts'); ?>translate('Services'); ?>
-hosts_down_handled || $servicegroup->hosts_down_unhandled): ?> - -
-hosts_down_unhandled): ?> - - hosts_down_unhandled; ?> translate('DOWN', 'icinga.state') ?> - - -hosts_down_handled): ?> - - hosts_down_handled . ' ' . ($servicegroup->hosts_down_unhandled ? $this->translate('Acknowledged') : 'DOWN'); ?> - - -
- - -hosts_unreachable_handled || $servicegroup->hosts_unreachable_unhandled): ?> - -
-hosts_unreachable_unhandled): ?> - - hosts_unreachable_unhandled; ?> translate('UNREACHABLE', 'icinga.state') ?> - - -hosts_unreachable_handled): ?> - - hosts_unreachable_handled . ' ' . ($servicegroup->hosts_unreachable_unhandled ? $this->translate('Acknowledged') : 'UNREACHABLE'); ?> - - -
- - -hosts_up): ?> - -
- - hosts_up; ?> translate('UP', 'icinga.state') ?> - -
- - -hosts_pending): ?> - -
- - hosts_pending; ?> translate('PENDING', 'icinga.state') ?> - -
- - -
-services_critical_handled || $servicegroup->services_critical_unhandled): ?> - -
-services_critical_unhandled): ?> - - services_critical_unhandled; ?> translate('CRITICAL', 'icinga.state') ?> - - -services_critical_handled): ?> - - services_critical_handled . ' ' . ($servicegroup->services_critical_unhandled ? $this->translate('Acknowledged') : 'CRITICAL'); ?> - - -
- - -services_warning_handled || $servicegroup->services_warning_unhandled): ?> - -
-services_warning_unhandled): ?> - - services_warning_unhandled; ?> translate('WARNING', 'icinga.state') ?> - - -services_warning_handled): ?> - - services_warning_handled . ' ' . ($servicegroup->services_warning_unhandled ? $this->translate('Acknowledged') : 'WARNING'); ?> - - -
- - -services_unknown_handled || $servicegroup->services_unknown_unhandled): ?> - -
-services_unknown_unhandled): ?> - - services_unknown_unhandled; ?> translate('UNKNOWN', 'icinga.state') ?> - - -services_unknown_handled): ?> - - services_unknown_handled . ' ' . ($servicegroup->services_unknown_unhandled ? $this->translate('Acknowledged') : 'UNKNOWN'); ?> - - -
- - -services_ok): ?> - -
- - services_ok; ?> translate('OK', 'icinga.state') ?> - -
- - -services_pending): ?> - -
- - services_pending; ?> translate('PENDING', 'icinga.state') ?> - -
- - -
-
-
- -
+ +
+ tabs ?> + widget('limiter')->setMaxLimit(count($servicegroups)); ?> + paginationControl($servicegroups, null, null, array('preserve' => $this->preserve)); ?>
+
+ filterEditor; ?> + + translate('No service groups matching the filter'); + echo '
'; + return; + } + ?> + + + + + + + + + + + services_critical_last_state_change_unhandled): ?> + + services_unknown_last_state_change_unhandled): ?> + + services_warning_last_state_change_unhandled): ?> + + services_critical_last_state_change_handled): ?> + + services_unknown_last_state_change_handled): ?> + + services_warning_last_state_change_handled): ?> + + services_ok_last_state_change): ?> + + + + + + + + + + + + + + +
translate('Last Problem'); ?>translate('Service Group'); ?>translate('Total Services'); ?>translate('Service States'); ?>
+ translate('CRITICAL'); ?> +
+ prefixedTimeSince($s->services_critical_last_state_change_unhandled); ?> +
+ translate('UNKNOWN'); ?> +
+ prefixedTimeSince($s->services_unknown_last_state_change_unhandled); ?> +
+ translate('WARNING'); ?> +
+ prefixedTimeSince($s->services_warning_last_state_change_unhandled); ?> +
+ translate('CRITICAL'); ?> +
+ prefixedTimeSince($s->services_critical_last_state_change_handled); ?> +
+ translate('UNKNOWN'); ?> +
+ prefixedTimeSince($s->services_unknown_last_state_change_handled); ?> +
+ translate('WARNING'); ?> +
+ prefixedTimeSince($s->services_warning_last_state_change_handled); ?> +
+ translate('OK'); ?> +
+ prefixedTimeSince($s->services_ok_last_state_change); ?> +
+ translate('PENDING'); ?> +
+ prefixedTimeSince($s->services_pending_last_state_change); ?> +
+ + servicegroup; ?> + + + services_total; ?> + + services_ok): ?> + + + services_ok; ?> + + + + + - + + + + services_critical_unhandled): ?> + + + services_critical_unhandled; ?> + + + services_critical_handled): ?> + + + services_critical_handled; ?> + + + + services_critical_unhandled): ?> + + + services_critical_unhandled && !$s->services_critical_handled): ?> + + - + + + + services_unknown_unhandled): ?> + + + services_unknown_unhandled; ?> + + + services_unknown_handled): ?> + + + services_unknown_handled; ?> + + + + services_unknown_unhandled): ?> + + + services_unknown_unhandled && !$s->services_unknown_handled): ?> + + - + + + + services_warning_unhandled): ?> + + + services_warning_unhandled; ?> + + + services_warning_handled): ?> + + + services_warning_handled; ?> + + + + services_warning_unhandled): ?> + + + services_warning_unhandled && !$s->services_warning_handled): ?> + + - + + + + services_pending): ?> + + + services_pending; ?> + + + + + - + + +
+
\ No newline at end of file diff --git a/modules/monitoring/library/Monitoring/Backend/Ido/Query/GroupsummaryQuery.php b/modules/monitoring/library/Monitoring/Backend/Ido/Query/GroupsummaryQuery.php index 5a6bce41f..d38c40c8f 100644 --- a/modules/monitoring/library/Monitoring/Backend/Ido/Query/GroupsummaryQuery.php +++ b/modules/monitoring/library/Monitoring/Backend/Ido/Query/GroupsummaryQuery.php @@ -24,6 +24,7 @@ class GroupSummaryQuery extends IdoQuery 'hostgroup' => 'hostgroup' ), 'servicestatussummary' => array( + 'services_total' => 'SUM(CASE WHEN object_type = \'service\' THEN 1 ELSE 0 END)', 'services_ok' => 'SUM(CASE WHEN object_type = \'service\' AND state = 0 THEN 1 ELSE 0 END)', 'services_pending' => 'SUM(CASE WHEN object_type = \'service\' AND state = 99 THEN 1 ELSE 0 END)', 'services_warning' => 'SUM(CASE WHEN object_type = \'service\' AND state = 1 THEN 1 ELSE 0 END)', @@ -35,6 +36,14 @@ class GroupSummaryQuery extends IdoQuery 'services_warning_unhandled' => 'SUM(CASE WHEN object_type = \'service\' AND state = 1 AND acknowledged + in_downtime + host_state = 0 THEN 1 ELSE 0 END)', 'services_critical_unhandled' => 'SUM(CASE WHEN object_type = \'service\' AND state = 2 AND acknowledged + in_downtime + host_state = 0 THEN 1 ELSE 0 END)', 'services_unknown_unhandled' => 'SUM(CASE WHEN object_type = \'service\' AND state = 3 AND acknowledged + in_downtime + host_state = 0 THEN 1 ELSE 0 END)', + 'services_ok_last_state_change' => 'MAX(CASE WHEN object_type = \'service\' AND state = 0 THEN state_change ELSE 0 END)', + 'services_pending_last_state_change' => 'MAX(CASE WHEN object_type = \'service\' AND state = 99 THEN state_change ELSE 0 END)', + 'services_warning_last_state_change_handled' => 'MAX(CASE WHEN object_type = \'service\' AND state = 1 AND acknowledged + in_downtime + host_state > 0 THEN state_change ELSE 0 END)', + 'services_critical_last_state_change_handled' => 'MAX(CASE WHEN object_type = \'service\' AND state = 2 AND acknowledged + in_downtime + host_state > 0 THEN state_change ELSE 0 END)', + 'services_unknown_last_state_change_handled' => 'MAX(CASE WHEN object_type = \'service\' AND state = 3 AND acknowledged + in_downtime + host_state > 0 THEN state_change ELSE 0 END)', + 'services_warning_last_state_change_unhandled' => 'MAX(CASE WHEN object_type = \'service\' AND state = 1 AND acknowledged + in_downtime + host_state = 0 THEN state_change ELSE 0 END)', + 'services_critical_last_state_change_unhandled' => 'MAX(CASE WHEN object_type = \'service\' AND state = 2 AND acknowledged + in_downtime + host_state = 0 THEN state_change ELSE 0 END)', + 'services_unknown_last_state_change_unhandled' => 'MAX(CASE WHEN object_type = \'service\' AND state = 3 AND acknowledged + in_downtime + host_state = 0 THEN state_change ELSE 0 END)', 'servicegroup' => 'servicegroup' ) ); @@ -57,7 +66,8 @@ class GroupSummaryQuery extends IdoQuery $columns + array( 'state' => 'host_state', 'acknowledged' => 'host_acknowledged', - 'in_downtime' => 'host_in_downtime' + 'in_downtime' => 'host_in_downtime', + 'state_change' => 'host_last_state_change' ) ); if (in_array('servicegroup', $this->desiredColumns)) { @@ -68,7 +78,8 @@ class GroupSummaryQuery extends IdoQuery $columns + array( 'state' => 'service_state', 'acknowledged' => 'service_acknowledged', - 'in_downtime' => 'service_in_downtime' + 'in_downtime' => 'service_in_downtime', + 'state_change' => 'service_last_state_change' ) ); diff --git a/public/css/icinga/monitoring-colors.less b/public/css/icinga/monitoring-colors.less index c2abd9aba..f705b7844 100644 --- a/public/css/icinga/monitoring-colors.less +++ b/public/css/icinga/monitoring-colors.less @@ -820,3 +820,126 @@ div.timeline { } /* End of monitoring timeline styles */ + +/* Monitoring groupsummary styles */ + +table.groupview { + width: 100%; + margin-top: 1em; + border-collapse: separate; + border-spacing: 0.1em; + + thead th { + font-size: 0.9em; + } + + tbody { + tr { + &:hover { + color: #333; + } + + a { + color: #333; + text-decoration: none; + + &:hover { + text-decoration: underline; + } + } + } + + td.services-total { + width: 10%; + text-align: center; + } + + td.state { + width: 10%; + color: white; + text-align: center; + + &.change { + width: 10%; + white-space: nowrap; + padding: 0.3em 0.5em 0.3em 0.5em; + + strong { + font-size: 0.8em; + } + + span.timesince { + font-size: 0.8em; + } + } + + &.ok { + color: #333; + border-left-style: solid; + border-left-width: 1.5em; + border-color: @colorOk; + } + + &.pending { + color: #333; + border-left-style: solid; + border-left-width: 1.5em; + border-color: @colorPending; + } + + &.warning { + background-color: @colorWarning; + + &.handled { + background-color: inherit; + color: #333; + border-left-style: solid; + border-left-width: 1.5em; + border-color: @colorWarningHandled; + } + } + + &.unknown { + background-color: @colorUnknown; + + &.handled { + color: #333; + background-color: inherit; + border-left-style: solid; + border-left-width: 1.5em; + border-color: @colorUnknownHandled; + } + } + + &.critical { + background-color: @colorCritical; + + &.handled { + color: #333; + background-color: inherit; + border-left-style: solid; + border-left-width: 1.5em; + border-color: @colorCriticalHandled; + } + } + + span { + &.no-state { + color: #333; + } + + &.state { + &.handled { + margin-right: 2px; + } + + a { + color: white; + } + } + } + } + } +} + +/* End of monitoring groupsummary styles */