From c8521b55b9bd1bd7ea62bf447b28ddbbdff39290 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Tue, 22 Oct 2024 11:08:44 +0800 Subject: [PATCH] CPUUsage / DiskIO / NetIO: add option `waitTime` --- doc/json_schema.json | 18 ++++++++++++++++++ src/data/help.json | 24 ++++++++++++++++++++++++ src/detection/cpuusage/cpuusage.c | 6 +++--- src/detection/cpuusage/cpuusage.h | 2 +- src/detection/diskio/diskio.c | 4 ++-- src/detection/netio/netio.c | 4 ++-- src/modules/cpuusage/cpuusage.c | 19 ++++++++++++++++--- src/modules/cpuusage/option.h | 1 + src/modules/diskio/diskio.c | 13 +++++++++++++ src/modules/diskio/option.h | 1 + src/modules/netio/netio.c | 13 +++++++++++++ src/modules/netio/option.h | 1 + 12 files changed, 95 insertions(+), 11 deletions(-) diff --git a/doc/json_schema.json b/doc/json_schema.json index c9bf60831..6c30442c4 100644 --- a/doc/json_schema.json +++ b/doc/json_schema.json @@ -1181,6 +1181,12 @@ "description": "Display CPU usage per CPU logical core, instead of an average result", "default": false }, + "waitTime": { + "type": "integer", + "description": "Wait time (in ms). CPU usage = (inUseEnd - inUseStart) / waitTime", + "default": 200, + "minimum": 1 + }, "key": { "$ref": "#/$defs/key" }, @@ -1472,6 +1478,12 @@ "type": "boolean", "default": false }, + "waitTime": { + "type": "integer", + "description": "Wait time (in ms). Disk I/O = (totalBytesEnd - totalBytesStart) / waitTime", + "default": 200, + "minimum": 1 + }, "key": { "$ref": "#/$defs/key" }, @@ -1841,6 +1853,12 @@ "type": "boolean", "default": false }, + "waitTime": { + "type": "integer", + "description": "Wait time (in ms). Disk I/O = (totalBytesEnd - totalBytesStart) / waitTime", + "default": 200, + "minimum": 1 + }, "key": { "$ref": "#/$defs/key" }, diff --git a/src/data/help.json b/src/data/help.json index bdce5411f..c7e4a88ec 100644 --- a/src/data/help.json +++ b/src/data/help.json @@ -916,6 +916,14 @@ "type": "str" } }, + { + "long": "diskio-wait-time", + "desc": "Set the wait time (in ms) when detecting disk usage", + "arg": { + "type": "num", + "default": 1000 + } + }, { "long": "physicaldisk-name-prefix", "desc": "Show disks with given name prefix only", @@ -1070,6 +1078,14 @@ "default": false } }, + { + "long": "cpuusage-wait-time", + "desc": "Set the wait time (in ms) when detecting CPU usage", + "arg": { + "type": "num", + "default": 200 + } + }, { "long": "de-slow-version-detection", "desc": "Set if DE version should be detected with slow operations", @@ -1305,6 +1321,14 @@ "default": false } }, + { + "long": "netio-wait-time", + "desc": "Set the wait time (in ms) when detecting network usage", + "arg": { + "type": "num", + "default": 1000 + } + }, { "long": "publicip-timeout", "desc": "Time in milliseconds to wait for the public ip server to respond", diff --git a/src/detection/cpuusage/cpuusage.c b/src/detection/cpuusage/cpuusage.c index 292a91a28..f6cfd37ce 100644 --- a/src/detection/cpuusage/cpuusage.c +++ b/src/detection/cpuusage/cpuusage.c @@ -13,7 +13,7 @@ void ffPrepareCPUUsage(void) ffGetCpuUsageInfo(&cpuTimes1); } -const char* ffGetCpuUsageResult(FFlist* result) +const char* ffGetCpuUsageResult(FFCPUUsageOptions* options, FFlist* result) { const char* error = NULL; if(cpuTimes1.elementSize == 0) @@ -21,7 +21,7 @@ const char* ffGetCpuUsageResult(FFlist* result) ffListInit(&cpuTimes1, sizeof(FFCpuUsageInfo)); error = ffGetCpuUsageInfo(&cpuTimes1); if(error) return error; - ffTimeSleep(200); + ffTimeSleep(options->waitTime); } if(cpuTimes1.length == 0) return "No CPU cores found"; @@ -43,7 +43,7 @@ retry: if (++retryCount <= 3) { ffListClear(&cpuTimes2); - ffTimeSleep(200); + ffTimeSleep(options->waitTime); goto retry; } } diff --git a/src/detection/cpuusage/cpuusage.h b/src/detection/cpuusage/cpuusage.h index 839902e6e..7950d452b 100644 --- a/src/detection/cpuusage/cpuusage.h +++ b/src/detection/cpuusage/cpuusage.h @@ -8,4 +8,4 @@ typedef struct FFCpuUsageInfo { } FFCpuUsageInfo; const char* ffGetCpuUsageInfo(FFlist* cpuTimes); -const char* ffGetCpuUsageResult(FFlist* result); // list of double +const char* ffGetCpuUsageResult(FFCPUUsageOptions* options, FFlist* result); // list of double diff --git a/src/detection/diskio/diskio.c b/src/detection/diskio/diskio.c index 11c8dc26d..4c129d794 100644 --- a/src/detection/diskio/diskio.c +++ b/src/detection/diskio/diskio.c @@ -41,9 +41,9 @@ const char* ffDetectDiskIO(FFlist* result, FFDiskIOOptions* options) return "No physical disk found"; uint64_t time2 = ffTimeGetNow(); - while (time2 - time1 < 1000) + while (time2 - time1 < options->waitTime) { - ffTimeSleep((uint32_t) (1000 - (time2 - time1))); + ffTimeSleep((uint32_t) (options->waitTime - (time2 - time1))); time2 = ffTimeGetNow(); } diff --git a/src/detection/netio/netio.c b/src/detection/netio/netio.c index f72ecb452..bcb64bca0 100644 --- a/src/detection/netio/netio.c +++ b/src/detection/netio/netio.c @@ -41,9 +41,9 @@ const char* ffDetectNetIO(FFlist* result, FFNetIOOptions* options) return "No network interfaces found"; uint64_t time2 = ffTimeGetNow(); - while (time2 - time1 < 1000) + while (time2 - time1 < options->waitTime) { - ffTimeSleep((uint32_t) (1000 - (time2 - time1))); + ffTimeSleep((uint32_t) (options->waitTime - (time2 - time1))); time2 = ffTimeGetNow(); } diff --git a/src/modules/cpuusage/cpuusage.c b/src/modules/cpuusage/cpuusage.c index 873fd77b9..ab5e4b9d2 100644 --- a/src/modules/cpuusage/cpuusage.c +++ b/src/modules/cpuusage/cpuusage.c @@ -11,7 +11,7 @@ void ffPrintCPUUsage(FFCPUUsageOptions* options) { FF_LIST_AUTO_DESTROY percentages = ffListCreate(sizeof(double)); - const char* error = ffGetCpuUsageResult(&percentages); + const char* error = ffGetCpuUsageResult(options, &percentages); if(error) { @@ -111,6 +111,12 @@ bool ffParseCPUUsageCommandOptions(FFCPUUsageOptions* options, const char* key, return true; } + if (ffStrEqualsIgnCase(subKey, "wait-time")) + { + options->waitTime = ffOptionParseUInt32(key, value); + return true; + } + if (ffPercentParseCommandOptions(key, subKey, value, &options->percent)) return true; @@ -136,6 +142,12 @@ void ffParseCPUUsageJsonObject(FFCPUUsageOptions* options, yyjson_val* module) continue; } + if (ffStrEqualsIgnCase(key, "waitTime")) + { + options->waitTime = (uint32_t) yyjson_get_uint(val); + continue; + } + if (ffPercentParseJsonObject(key, val, &options->percent)) continue; @@ -156,10 +168,10 @@ void ffGenerateCPUUsageJsonConfig(FFCPUUsageOptions* options, yyjson_mut_doc* do ffPercentGenerateJsonConfig(doc, module, defaultOptions.percent, options->percent); } -void ffGenerateCPUUsageJsonResult(FF_MAYBE_UNUSED FFCPUUsageOptions* options, yyjson_mut_doc* doc, yyjson_mut_val* module) +void ffGenerateCPUUsageJsonResult(FFCPUUsageOptions* options, yyjson_mut_doc* doc, yyjson_mut_val* module) { FF_LIST_AUTO_DESTROY percentages = ffListCreate(sizeof(double)); - const char* error = ffGetCpuUsageResult(&percentages); + const char* error = ffGetCpuUsageResult(options, &percentages); if(error) { @@ -203,6 +215,7 @@ void ffInitCPUUsageOptions(FFCPUUsageOptions* options) ffOptionInitModuleArg(&options->moduleArgs, "󰓅"); options->separate = false; options->percent = (FFColorRangeConfig) { 50, 80 }; + options->waitTime = 200; } void ffDestroyCPUUsageOptions(FFCPUUsageOptions* options) diff --git a/src/modules/cpuusage/option.h b/src/modules/cpuusage/option.h index 92d298f30..844828b94 100644 --- a/src/modules/cpuusage/option.h +++ b/src/modules/cpuusage/option.h @@ -12,4 +12,5 @@ typedef struct FFCPUUsageOptions bool separate; FFColorRangeConfig percent; + uint32_t waitTime; // in ms } FFCPUUsageOptions; diff --git a/src/modules/diskio/diskio.c b/src/modules/diskio/diskio.c index 086f46d9d..da4e8e607 100644 --- a/src/modules/diskio/diskio.c +++ b/src/modules/diskio/diskio.c @@ -115,6 +115,12 @@ bool ffParseDiskIOCommandOptions(FFDiskIOOptions* options, const char* key, cons return true; } + if (ffStrEqualsIgnCase(subKey, "wait-time")) + { + options->waitTime = ffOptionParseUInt32(key, value); + return true; + } + return false; } @@ -143,6 +149,12 @@ void ffParseDiskIOJsonObject(FFDiskIOOptions* options, yyjson_val* module) continue; } + if (ffStrEqualsIgnCase(key, "waitTime")) + { + options->waitTime = (uint32_t) yyjson_get_uint(val); + continue; + } + ffPrintError(FF_DISKIO_MODULE_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "Unknown JSON key %s", key); } } @@ -222,6 +234,7 @@ void ffInitDiskIOOptions(FFDiskIOOptions* options) ffStrbufInit(&options->namePrefix); options->detectTotal = false; + options->waitTime = 1000; } void ffDestroyDiskIOOptions(FFDiskIOOptions* options) diff --git a/src/modules/diskio/option.h b/src/modules/diskio/option.h index a8daa0b4b..c41e0428b 100644 --- a/src/modules/diskio/option.h +++ b/src/modules/diskio/option.h @@ -10,5 +10,6 @@ typedef struct FFDiskIOOptions FFModuleArgs moduleArgs; FFstrbuf namePrefix; + uint32_t waitTime; bool detectTotal; } FFDiskIOOptions; diff --git a/src/modules/netio/netio.c b/src/modules/netio/netio.c index e6eebd4df..89113c375 100644 --- a/src/modules/netio/netio.c +++ b/src/modules/netio/netio.c @@ -129,6 +129,12 @@ bool ffParseNetIOCommandOptions(FFNetIOOptions* options, const char* key, const return true; } + if (ffStrEqualsIgnCase(subKey, "wait-time")) + { + options->waitTime = ffOptionParseUInt32(key, value); + return true; + } + return false; } @@ -163,6 +169,12 @@ void ffParseNetIOJsonObject(FFNetIOOptions* options, yyjson_val* module) continue; } + if (ffStrEqualsIgnCase(key, "waitTime")) + { + options->waitTime = (uint32_t) yyjson_get_uint(val); + continue; + } + ffPrintError(FF_NETIO_MODULE_NAME, 0, &options->moduleArgs, FF_PRINT_TYPE_DEFAULT, "Unknown JSON key %s", key); } } @@ -259,6 +271,7 @@ void ffInitNetIOOptions(FFNetIOOptions* options) #endif ; options->detectTotal = false; + options->waitTime = 1000; } void ffDestroyNetIOOptions(FFNetIOOptions* options) diff --git a/src/modules/netio/option.h b/src/modules/netio/option.h index 3cd0ad5fb..7709b21e1 100644 --- a/src/modules/netio/option.h +++ b/src/modules/netio/option.h @@ -10,6 +10,7 @@ typedef struct FFNetIOOptions FFModuleArgs moduleArgs; FFstrbuf namePrefix; + uint32_t waitTime; bool defaultRouteOnly; bool detectTotal; } FFNetIOOptions;