mirror of https://github.com/Icinga/icinga2.git
Fixed precision for percentage calculations with large units
The check_memory and check_swap plugins on Windows were incorrectly rounding the memory/swap measurements to the nearest unit prior to calculating a percentage. This was causing imprecise percentage values when the unit selected meant that the values in question had few significant figures. fixes #10497 Signed-off-by: Jean Flach <jean-marcel.flach@netways.de>
This commit is contained in:
parent
9a8458fd67
commit
5c18c1ed2d
|
@ -163,7 +163,6 @@ INT printOutput(printInfoStruct& printInfo)
|
|||
std::wcout << L"Constructing output string" << '\n';
|
||||
|
||||
state state = OK;
|
||||
double fswap = ((double)printInfo.aRam / (double)printInfo.tRam) * 100.0;
|
||||
|
||||
if (printInfo.warn.rend(printInfo.aRam, printInfo.tRam))
|
||||
state = WARNING;
|
||||
|
@ -173,17 +172,17 @@ INT printOutput(printInfoStruct& printInfo)
|
|||
|
||||
switch (state) {
|
||||
case OK:
|
||||
std::wcout << L"MEMORY OK - " << fswap << L"% free | memory=" << printInfo.aRam << BunitStr(printInfo.unit) << L";"
|
||||
std::wcout << L"MEMORY OK - " << printInfo.percentFree << L"% free | memory=" << printInfo.aRam << BunitStr(printInfo.unit) << L";"
|
||||
<< printInfo.warn.pString(printInfo.tRam) << L";" << printInfo.crit.pString(printInfo.tRam)
|
||||
<< L";0;" << printInfo.tRam << '\n';
|
||||
break;
|
||||
case WARNING:
|
||||
std::wcout << L"MEMORY WARNING - " << fswap << L"% free | memory=" << printInfo.aRam << BunitStr(printInfo.unit) << L";"
|
||||
std::wcout << L"MEMORY WARNING - " << printInfo.percentFree << L"% free | memory=" << printInfo.aRam << BunitStr(printInfo.unit) << L";"
|
||||
<< printInfo.warn.pString(printInfo.tRam) << L";" << printInfo.crit.pString(printInfo.tRam)
|
||||
<< L";0;" << printInfo.tRam << '\n';
|
||||
break;
|
||||
case CRITICAL:
|
||||
std::wcout << L"MEMORY CRITICAL - " << fswap << L"% free | memory=" << printInfo.aRam << BunitStr(printInfo.unit) << L";"
|
||||
std::wcout << L"MEMORY CRITICAL - " << printInfo.percentFree << L"% free | memory=" << printInfo.aRam << BunitStr(printInfo.unit) << L";"
|
||||
<< printInfo.warn.pString(printInfo.tRam) << L";" << printInfo.crit.pString(printInfo.tRam)
|
||||
<< L";0;" << printInfo.tRam << '\n';
|
||||
break;
|
||||
|
@ -205,6 +204,7 @@ INT check_memory(printInfoStruct& printInfo)
|
|||
|
||||
printInfo.tRam = round(pMemBuf->ullTotalPhys / pow(1024.0, printInfo.unit));
|
||||
printInfo.aRam = round(pMemBuf->ullAvailPhys / pow(1024.0, printInfo.unit));
|
||||
printInfo.percentFree = 100.0 * pMemBuf->ullAvailPhys / pMemBuf->ullTotalPhys;
|
||||
|
||||
if (debug)
|
||||
std::wcout << L"Found pMemBuf->dwTotalPhys: " << pMemBuf->ullTotalPhys << '\n'
|
||||
|
|
|
@ -26,7 +26,8 @@
|
|||
struct printInfoStruct
|
||||
{
|
||||
threshold warn, crit;
|
||||
DWORDLONG tRam, aRam;
|
||||
DOUBLE tRam, aRam;
|
||||
DOUBLE percentFree;
|
||||
Bunit unit = BunitMB;
|
||||
};
|
||||
|
||||
|
|
|
@ -163,7 +163,6 @@ INT printOutput(printInfoStruct& printInfo)
|
|||
std::wcout << L"Constructing output string" << '\n';
|
||||
|
||||
state state = OK;
|
||||
double fswap = ((double)printInfo.aSwap / (double)printInfo.tSwap) * 100.0;
|
||||
|
||||
if (printInfo.warn.rend(printInfo.aSwap, printInfo.tSwap))
|
||||
state = WARNING;
|
||||
|
@ -173,17 +172,17 @@ INT printOutput(printInfoStruct& printInfo)
|
|||
|
||||
switch (state) {
|
||||
case OK:
|
||||
std::wcout << L"SWAP OK - " << fswap << L"% free | swap=" << printInfo.aSwap << BunitStr(printInfo.unit) << L";"
|
||||
std::wcout << L"SWAP OK - " << printInfo.percentFree << L"% free | swap=" << printInfo.aSwap << BunitStr(printInfo.unit) << L";"
|
||||
<< printInfo.warn.pString(printInfo.tSwap) << L";" << printInfo.crit.pString(printInfo.tSwap)
|
||||
<< L";0;" << printInfo.tSwap << '\n';
|
||||
break;
|
||||
case WARNING:
|
||||
std::wcout << L"SWAP WARNING - " << fswap << L"% free | swap=" << printInfo.aSwap << BunitStr(printInfo.unit) << L";"
|
||||
std::wcout << L"SWAP WARNING - " << printInfo.percentFree << L"% free | swap=" << printInfo.aSwap << BunitStr(printInfo.unit) << L";"
|
||||
<< printInfo.warn.pString(printInfo.tSwap) << L";" << printInfo.crit.pString(printInfo.tSwap)
|
||||
<< L";0;" << printInfo.tSwap << '\n';
|
||||
break;
|
||||
case CRITICAL:
|
||||
std::wcout << L"SWAP CRITICAL - " << fswap << L"% free | swap=" << printInfo.aSwap << BunitStr(printInfo.unit) << L";"
|
||||
std::wcout << L"SWAP CRITICAL - " << printInfo.percentFree << L"% free | swap=" << printInfo.aSwap << BunitStr(printInfo.unit) << L";"
|
||||
<< printInfo.warn.pString(printInfo.tSwap) << L";" << printInfo.crit.pString(printInfo.tSwap)
|
||||
<< L";0;" << printInfo.tSwap << '\n';
|
||||
break;
|
||||
|
@ -204,6 +203,7 @@ INT check_swap(printInfoStruct& printInfo)
|
|||
|
||||
printInfo.tSwap = round(MemBuf.ullTotalPageFile / pow(1024.0, printInfo.unit));
|
||||
printInfo.aSwap = round(MemBuf.ullAvailPageFile / pow(1024.0, printInfo.unit));
|
||||
printInfo.percentFree = 100.0 * MemBuf.ullAvailPageFile / MemBuf.ullTotalPageFile;
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
|
|
@ -26,6 +26,7 @@ struct printInfoStruct
|
|||
{
|
||||
threshold warn, crit;
|
||||
DOUBLE tSwap, aSwap;
|
||||
DOUBLE percentFree;
|
||||
Bunit unit = BunitMB;
|
||||
};
|
||||
|
||||
|
|
Loading…
Reference in New Issue