update calculating disk status.
This commit is contained in:
@@ -51,16 +51,45 @@ object MonitorJsonParser {
|
|||||||
if (disk == null) return null
|
if (disk == null) return null
|
||||||
disk.number("used_pct")?.let { return it }
|
disk.number("used_pct")?.let { return it }
|
||||||
disk.number("used_percent")?.let { return it }
|
disk.number("used_percent")?.let { return it }
|
||||||
|
|
||||||
|
disk.obj("filesystem")?.let { filesystem ->
|
||||||
|
filesystem.obj("/")?.diskUsagePercent()?.let { return it }
|
||||||
|
var max: Double? = null
|
||||||
|
val names = filesystem.keys()
|
||||||
|
while (names.hasNext()) {
|
||||||
|
val item = filesystem.optJSONObject(names.next()) ?: continue
|
||||||
|
val usage = item.diskUsagePercent()
|
||||||
|
if (usage != null && (max == null || usage > max!!)) max = usage
|
||||||
|
}
|
||||||
|
if (max != null) return max
|
||||||
|
}
|
||||||
|
|
||||||
val filesystems = disk.array("filesystems") ?: disk.array("mounts") ?: return null
|
val filesystems = disk.array("filesystems") ?: disk.array("mounts") ?: return null
|
||||||
var max: Double? = null
|
var max: Double? = null
|
||||||
for (index in 0 until filesystems.length()) {
|
for (index in 0 until filesystems.length()) {
|
||||||
val item = filesystems.optJSONObject(index) ?: continue
|
val item = filesystems.optJSONObject(index) ?: continue
|
||||||
val usage = item.number("used_pct") ?: item.number("used_percent") ?: item.number("usage")
|
val usage = item.diskUsagePercent()
|
||||||
|
if (usage != null && item.mountPath() == "/") return usage
|
||||||
if (usage != null && (max == null || usage > max!!)) max = usage
|
if (usage != null && (max == null || usage > max!!)) max = usage
|
||||||
}
|
}
|
||||||
return max
|
return max
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun JSONObject.diskUsagePercent(): Double? {
|
||||||
|
number("used_pct")?.let { return it }
|
||||||
|
number("used_percent")?.let { return it }
|
||||||
|
number("usage")?.let { return it }
|
||||||
|
number("usage_pct")?.let { return it }
|
||||||
|
val used = firstNumber("used", "used_size", "used_bytes", "used_kb")
|
||||||
|
val total = firstNumber("total", "total_size", "total_bytes", "size", "size_bytes", "total_kb")
|
||||||
|
return usedPercentFromSizes(used, total)
|
||||||
|
}
|
||||||
|
|
||||||
|
internal fun usedPercentFromSizes(used: Double?, total: Double?): Double? {
|
||||||
|
if (used == null || total == null || total <= 0.0) return null
|
||||||
|
return used / total * 100.0
|
||||||
|
}
|
||||||
|
|
||||||
private fun normalizePercent(value: Double?): Double? {
|
private fun normalizePercent(value: Double?): Double? {
|
||||||
if (value == null) return null
|
if (value == null) return null
|
||||||
return if (value in 0.0..1.0) value * 100.0 else value
|
return if (value in 0.0..1.0) value * 100.0 else value
|
||||||
@@ -69,16 +98,30 @@ object MonitorJsonParser {
|
|||||||
private fun JSONObject.obj(name: String): JSONObject? = optJSONObject(name)
|
private fun JSONObject.obj(name: String): JSONObject? = optJSONObject(name)
|
||||||
private fun JSONObject.array(name: String): JSONArray? = optJSONArray(name)
|
private fun JSONObject.array(name: String): JSONArray? = optJSONArray(name)
|
||||||
|
|
||||||
|
private fun JSONObject.firstNumber(vararg names: String): Double? {
|
||||||
|
for (name in names) number(name)?.let { return it }
|
||||||
|
return null
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun JSONObject.mountPath(): String? {
|
||||||
|
return string("path") ?: string("mount") ?: string("mount_point") ?: string("mounted_on")
|
||||||
|
}
|
||||||
|
|
||||||
private fun JSONObject.number(name: String): Double? {
|
private fun JSONObject.number(name: String): Double? {
|
||||||
if (!has(name) || isNull(name)) return null
|
if (!has(name) || isNull(name)) return null
|
||||||
val value = opt(name)
|
val value = opt(name)
|
||||||
return when (value) {
|
return when (value) {
|
||||||
is Number -> value.toDouble()
|
is Number -> value.toDouble()
|
||||||
is String -> value.toDoubleOrNull()
|
is String -> value.trim().removeSuffix("%").replace(",", "").toDoubleOrNull()
|
||||||
else -> null
|
else -> null
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun JSONObject.string(name: String): String? {
|
||||||
|
if (!has(name) || isNull(name)) return null
|
||||||
|
return optString(name).takeIf { it.isNotBlank() }
|
||||||
|
}
|
||||||
|
|
||||||
private fun JSONObject.int(name: String): Int? {
|
private fun JSONObject.int(name: String): Int? {
|
||||||
if (!has(name) || isNull(name)) return null
|
if (!has(name) || isNull(name)) return null
|
||||||
val value = opt(name)
|
val value = opt(name)
|
||||||
|
|||||||
@@ -0,0 +1,30 @@
|
|||||||
|
package net.rodakot.ngxhttpmonitoringclient.data
|
||||||
|
|
||||||
|
import org.junit.Assert.assertEquals
|
||||||
|
import org.junit.Assert.assertNull
|
||||||
|
import org.junit.Test
|
||||||
|
|
||||||
|
class DiskUsageCalculationTest {
|
||||||
|
@Test
|
||||||
|
fun usedPercentFromSizes_calculatesStoragePercent() {
|
||||||
|
assertEquals(25.0, MonitorJsonParser.usedPercentFromSizes(500.0, 2000.0) ?: -1.0, 0.001)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun usedPercentFromSizes_matchesMonitorApiRootFilesystemSample() {
|
||||||
|
assertEquals(
|
||||||
|
20.307,
|
||||||
|
MonitorJsonParser.usedPercentFromSizes(
|
||||||
|
used = 100_424_171_520.0,
|
||||||
|
total = 494_532_001_792.0,
|
||||||
|
) ?: -1.0,
|
||||||
|
0.001,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun usedPercentFromSizes_ignoresInvalidTotals() {
|
||||||
|
assertNull(MonitorJsonParser.usedPercentFromSizes(500.0, 0.0))
|
||||||
|
assertNull(MonitorJsonParser.usedPercentFromSizes(500.0, null))
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user