Availability calculations, handle bad data (#16368)

* Availability calculations, handle bad data
Add some unit tests as well

* whitespace
This commit is contained in:
Tony Murray 2024-09-06 13:27:39 -05:00 committed by GitHub
parent 0ae58d1883
commit fc9b77c672
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 24 additions and 2 deletions

View File

@ -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;
}
}

View File

@ -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));
}
}