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:
Per von Zweigbergk 2015-10-31 14:47:36 +01:00 committed by Jean Flach
parent 9a8458fd67
commit 5c18c1ed2d
4 changed files with 11 additions and 9 deletions

View File

@ -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'

View File

@ -26,7 +26,8 @@
struct printInfoStruct
{
threshold warn, crit;
DWORDLONG tRam, aRam;
DOUBLE tRam, aRam;
DOUBLE percentFree;
Bunit unit = BunitMB;
};

View File

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

View File

@ -26,6 +26,7 @@ struct printInfoStruct
{
threshold warn, crit;
DOUBLE tSwap, aSwap;
DOUBLE percentFree;
Bunit unit = BunitMB;
};