From 5e2594d250c5c43403b08e8a8b1c1572b70cf1d9 Mon Sep 17 00:00:00 2001 From: Matthias Jentsch Date: Tue, 13 Jan 2015 10:59:33 +0100 Subject: [PATCH] Parse perfdata thresholds provisionary Use a heuristic to determine whether thresholds should be inverted, to support plugins with non-standard perfdata output while still being able to parse standard-compliant perfdata input. --- .../application/views/helpers/Perfdata.php | 4 +- .../library/Monitoring/Plugin/Perfdata.php | 60 ++++++++++++++----- 2 files changed, 47 insertions(+), 17 deletions(-) diff --git a/modules/monitoring/application/views/helpers/Perfdata.php b/modules/monitoring/application/views/helpers/Perfdata.php index dd451bc1a..4c2bee89a 100644 --- a/modules/monitoring/application/views/helpers/Perfdata.php +++ b/modules/monitoring/application/views/helpers/Perfdata.php @@ -8,7 +8,7 @@ use Icinga\Module\Monitoring\Plugin\Perfdata; use Icinga\Module\Monitoring\Plugin\PerfdataSet; class Zend_View_Helper_Perfdata extends Zend_View_Helper_Abstract -{ +{# /** * Display the given perfdata string to the user @@ -19,7 +19,7 @@ class Zend_View_Helper_Perfdata extends Zend_View_Helper_Abstract * * @return string */ - public function perfdata($perfdataStr, $compact = false, $color = Perfdata::PERFDATA_DEFAULT) + public function perfdata($perfdataStr, $compact = false, $color = Perfdata::PERFDATA_OK) { $pieChartData = PerfdataSet::fromString($perfdataStr)->asArray(); diff --git a/modules/monitoring/library/Monitoring/Plugin/Perfdata.php b/modules/monitoring/library/Monitoring/Plugin/Perfdata.php index 3e0237184..f51801192 100644 --- a/modules/monitoring/library/Monitoring/Plugin/Perfdata.php +++ b/modules/monitoring/library/Monitoring/Plugin/Perfdata.php @@ -12,8 +12,9 @@ use Zend_Controller_Front; class Perfdata { - const PERFDATA_DEFAULT = 'green'; - const PERFDATA_RED = 'red'; + const PERFDATA_OK = 'ok'; + const PERFDATA_WARNING = 'warning'; + const PERFDATA_CRITICAL = 'critical'; /** * The performance data value being parsed @@ -60,6 +61,8 @@ class Perfdata /** * The WARNING threshold * + * TODO: Should be parsed Range-Object instead of string + * * @var string */ protected $warningThreshold; @@ -67,6 +70,8 @@ class Perfdata /** * The CRITICAL threshold * + * TODO: Should be parsed Range-Object instead of string + * * @var string */ protected $criticalThreshold; @@ -240,7 +245,7 @@ class Perfdata /** * Return the minimum value or null if it is not available * - * @return null|float + * @return null|string */ public function getMinimumValue() { @@ -295,9 +300,9 @@ class Perfdata $this->minValue = self::convert($parts[3], $this->unit); } case 3: - $this->criticalThreshold = trim($parts[2]) ? self::convert(trim($parts[2]), $this->unit) : null; + $this->criticalThreshold = trim($parts[2]) ? trim($parts[2]) : null; case 2: - $this->warningThreshold = trim($parts[1]) ? self::convert(trim($parts[1]), $this->unit) : null; + $this->warningThreshold = trim($parts[1]) ? trim($parts[1]) : null; } } @@ -332,7 +337,7 @@ class Perfdata } } - protected function calculatePieChartData( $color) + protected function calculatePieChartData() { $rawValue = $this->getValue(); $minValue = $this->getMinimumValue() !== null ? $this->getMinimumValue() : 0; @@ -340,36 +345,61 @@ class Perfdata $usedValue = ($rawValue - $minValue); $unusedValue = ($maxValue - $minValue) - $usedValue; + $warningThreshold = $this->convert($this->warningThreshold, $this->unit); + $criticalThreshold = $this->convert($this->criticalThreshold, $this->unit); + $gray = $unusedValue; $green = $orange = $red = 0; - switch ($color) { - case self::PERFDATA_DEFAULT: + $pieState = self::PERFDATA_OK; + if ($warningThreshold > $criticalThreshold) { + // inverted threshold parsing OK > warning > critical + if (isset($warningThreshold) && $this->value <= $warningThreshold) { + $pieState = self::PERFDATA_WARNING; + } + if (isset($criticalThreshold) && $this->value <= $criticalThreshold) { + $pieState = self::PERFDATA_CRITICAL; + } + + } else { + // TODO: Use standard perfdata range format to decide the state #8194 + + // regular threshold parsing OK < warning < critical + if (isset($warningThreshold) && $rawValue > $warningThreshold) { + $pieState = self::PERFDATA_WARNING; + } + if (isset($criticalThreshold) && $rawValue > $criticalThreshold) { + $pieState = self::PERFDATA_CRITICAL; + } + } + + switch ($pieState) { + case self::PERFDATA_OK: $green = $usedValue; break; - case self::PERFDATA_RED: + case self::PERFDATA_CRITICAL: $red = $usedValue; break; - case self::PERFDATA_ORANGE: + case self::PERFDATA_WARNING: $orange = $usedValue; break; } - // TODO(#6122): Add proper treshold parsing. return array($green, $orange, $red, $gray); } - public function asInlinePie($color) + public function asInlinePie() { if (! $this->isVisualizable()) { throw new ProgrammingError('Cannot calculate piechart data for unvisualizable perfdata entry.'); } - $data = $this->calculatePieChartData($color); + $data = $this->calculatePieChartData(); $pieChart = new InlinePie($data, $this); + $pieChart->setColors(array('#44bb77', '#ffaa44', '#ff5566', '#ddccdd')); $pieChart->setSparklineClass('sparkline-perfdata'); if (Zend_Controller_Front::getInstance()->getRequest()->isXmlHttpRequest()) { @@ -419,8 +449,8 @@ class Perfdata 'value' => $this->format($this->getvalue()), 'min' => isset($this->minValue) && !$this->isPercentage() ? $this->format($this->minValue) : '', 'max' => isset($this->maxValue) && !$this->isPercentage() ? $this->format($this->maxValue) : '', - 'warn' => isset($this->warningThreshold) ? $this->format($this->warningThreshold) : '', - 'crit' => isset($this->criticalThreshold) ? $this->format($this->criticalThreshold) : '' + 'warn' => isset($this->warningThreshold) ? $this->format(self::convert($this->warningThreshold, $this->unit)) : '', + 'crit' => isset($this->criticalThreshold) ? $this->format(self::convert($this->criticalThreshold, $this->unit)) : '' ); return $parts; }