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.