@cryptotaxi247 / netdata-1 / commits / c98b121fd

Improve Disk Usage Measure (Windows.plugin) (#20752)

thiagoftsm committed Aug 4, 2025 at 11:20 UTC c98b121fdc31b13a693fddd4af93a3d85404531c
1 file changed +41 -3
src/collectors/windows.plugin/perflib-storage.c
+41 -3
@@ -238,6 +238,44 @@ static const char *drive_type_to_str(UINT type)
238 }
239 }
240
241 +static inline LONGLONG convertToBytes(LONGLONG value, double factor) {
242 + double dvalue = value;
243 + dvalue /= (factor);
244 +
245 + return (LONGLONG) dvalue*100;
246 +}
247 +
248 +static inline void netdata_set_hd_usage(PERF_DATA_BLOCK *pDataBlock,
249 + PERF_OBJECT_TYPE *pObjectType,
250 + PERF_INSTANCE_DEFINITION *pi,
251 + struct logical_disk *d)
252 +{
253 + ULARGE_INTEGER totalNumberOfBytes;
254 + ULARGE_INTEGER totalNumberOfFreeBytes;
255 +
256 +// https://learn.microsoft.com/en-us/windows/win32/fileio/maximum-file-path-limitation?tabs=registry
257 +#define MAX_DRIVE_LENGTH 255
258 + char path[MAX_DRIVE_LENGTH + 1];
259 + snprintfz(path, MAX_DRIVE_LENGTH, "%s\\", windows_shared_buffer);
260 +
261 + // Description of incompatibilities present in both methods we are using
262 + // https://devblogs.microsoft.com/oldnewthing/20071101-00/?p=24613
263 + // We are using the variable that should not be affected by qyota ()
264 + if ((GetDriveTypeA(path) != DRIVE_FIXED) || !GetDiskFreeSpaceExA(path,
265 + NULL,
266 + &totalNumberOfBytes,
267 + &totalNumberOfFreeBytes)) {
268 + perflibGetInstanceCounter(pDataBlock, pObjectType, pi, &d->percentDiskFree);
269 +
270 + d->percentDiskFree.current.Data = convertToBytes(d->percentDiskFree.current.Data, 1024);
271 + d->percentDiskFree.current.Time = convertToBytes(d->percentDiskFree.current.Time, 1024);
272 + return;
273 + }
274 +
275 + d->percentDiskFree.current.Data = convertToBytes(totalNumberOfFreeBytes.QuadPart, 1024 * 1024 * 1024);
276 + d->percentDiskFree.current.Time = convertToBytes(totalNumberOfBytes.QuadPart, 1024 * 1024 * 1024);
277 +}
278 +
279 static bool do_logical_disk(PERF_DATA_BLOCK *pDataBlock, int update_every, usec_t now_ut)
280 {
281 DICTIONARY *dict = logicalDisks;
@@ -266,7 +304,7 @@ static bool do_logical_disk(PERF_DATA_BLOCK *pDataBlock, int update_every, usec_
304 d->collected_metadata = true;
305 }
306
269 - perflibGetInstanceCounter(pDataBlock, pObjectType, pi, &d->percentDiskFree);
307 + netdata_set_hd_usage(pDataBlock, pObjectType, pi, d);
308 // perflibGetInstanceCounter(pDataBlock, pObjectType, pi, &d->freeMegabytes);
309
310 if (!d->st_disk_space) {
@@ -300,8 +338,8 @@ static bool do_logical_disk(PERF_DATA_BLOCK *pDataBlock, int update_every, usec_
338 rrdlabels_add(d->st_disk_space->rrdlabels, "serial_number", buf, RRDLABEL_SRC_AUTO);
339 }
340
303 - d->rd_disk_space_free = rrddim_add(d->st_disk_space, "avail", NULL, 1, 1024, RRD_ALGORITHM_ABSOLUTE);
304 - d->rd_disk_space_used = rrddim_add(d->st_disk_space, "used", NULL, 1, 1024, RRD_ALGORITHM_ABSOLUTE);
341 + d->rd_disk_space_free = rrddim_add(d->st_disk_space, "avail", NULL, 1, 100, RRD_ALGORITHM_ABSOLUTE);
342 + d->rd_disk_space_used = rrddim_add(d->st_disk_space, "used", NULL, 1, 100, RRD_ALGORITHM_ABSOLUTE);
343 }
344
345 // percentDiskFree has the free space in Data and the size of the disk in Time, in MiB.