mirror of
https://github.com/librenms/librenms.git
synced 2024-09-21 02:18:39 +00:00
Availability calculations, handle bad data (#16368)
* Availability calculations, handle bad data Add some unit tests as well * whitespace
This commit is contained in:
parent
0ae58d1883
commit
fc9b77c672
@ -28,6 +28,7 @@ namespace LibreNMS\Device;
|
||||
use App\Models\Device;
|
||||
use App\Models\DeviceOutage;
|
||||
use Illuminate\Support\Collection;
|
||||
use Illuminate\Support\Facades\Log;
|
||||
use LibreNMS\Util\Number;
|
||||
|
||||
class Availability
|
||||
@ -115,7 +116,7 @@ class Availability
|
||||
|
||||
// no recorded outages found, so use current status
|
||||
if ($found_outages->isEmpty()) {
|
||||
return 100 * $device->status;
|
||||
return $device->status ? 100 : 0;
|
||||
}
|
||||
|
||||
// don't calculate for time when the device didn't exist
|
||||
@ -125,6 +126,16 @@ class Availability
|
||||
|
||||
$outage_summary = self::outageSummary($found_outages, $duration, $now);
|
||||
|
||||
return Number::calculatePercent($duration - $outage_summary, $duration, $precision);
|
||||
$percent = Number::calculatePercent($duration - $outage_summary, $duration, $precision);
|
||||
if ($percent < 0) {
|
||||
Log::debug("Invalid availability calculation ($percent), normalizing to 0");
|
||||
$percent = 0;
|
||||
}
|
||||
if ($percent > 100) {
|
||||
Log::debug("Invalid availability calculation ($percent), normalizing to 100");
|
||||
$percent = 100;
|
||||
}
|
||||
|
||||
return $percent;
|
||||
}
|
||||
}
|
||||
|
@ -36,4 +36,15 @@ class NumberTest extends TestCase
|
||||
$this->assertNan(Number::toBytes('1234asd'));
|
||||
$this->assertNan(Number::toBytes('fluff'));
|
||||
}
|
||||
|
||||
public function testPercentCalculation(): void
|
||||
{
|
||||
$this->assertEquals(99, Number::calculatePercent(99, 100));
|
||||
$this->assertEquals(0.03, Number::calculatePercent(345, 1023450));
|
||||
$this->assertEquals(0.0337, Number::calculatePercent(345, 1023450, 4));
|
||||
$this->assertEquals(0, Number::calculatePercent(-1, 43));
|
||||
$this->assertEquals(0, Number::calculatePercent(-1, -43));
|
||||
$this->assertEquals(0, Number::calculatePercent(43, -43));
|
||||
$this->assertEquals(29394.26, Number::calculatePercent(12639.53, 43));
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user