]> granicus.if.org Git - icinga2/commitdiff
Fixed precision for percentage calculations with large units
authorPer von Zweigbergk <pvz@itassistans.se>
Sat, 31 Oct 2015 13:47:36 +0000 (14:47 +0100)
committerJean Flach <jean-marcel.flach@netways.de>
Fri, 19 Feb 2016 10:30:12 +0000 (11:30 +0100)
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>
plugins/check_memory.cpp
plugins/check_memory.h
plugins/check_swap.cpp
plugins/check_swap.h

index 254c2b2d946b367d9290bde8ca6abdd69fbed113..48cd60424b90ae7555adfa5ed2323f45b4fc488f 100644 (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'
index b3ef53cd8fccb78e074ee7f0d595476147f33b20..ccb05fc3719b9473814075ac25b81693cead03b2 100644 (file)
@@ -26,7 +26,8 @@
 struct printInfoStruct
 {
        threshold warn, crit;
-       DWORDLONG tRam, aRam;
+       DOUBLE tRam, aRam;
+       DOUBLE percentFree;
        Bunit unit = BunitMB;
 };
 
index d321bad040f5a2f700fbf06027232961c54ad586..1ecaa0df5337eb9308f50686d586bd3373187059 100644 (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;
 }
index 894ed2adbd64711a0e991a1b1c04860fb0aea720..4f51e5fa8eabec3cbabea0fe788af8b98f92c074 100644 (file)
@@ -26,6 +26,7 @@ struct printInfoStruct
 {
        threshold warn, crit;
        DOUBLE tSwap, aSwap;
+       DOUBLE percentFree;
        Bunit unit = BunitMB;
 };