From: Florian Forster Date: Tue, 5 Dec 2023 10:27:28 +0000 (+0100) Subject: disk plugin: Use standard system metric names (OTEP #119) X-Git-Tag: 6.0.0-rc0~40^2~1 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=e5f544240b9439f400ef33c0958aacc640bd95ae;p=thirdparty%2Fcollectd.git disk plugin: Use standard system metric names (OTEP #119) https://github.com/open-telemetry/oteps/blob/main/text/0119-standard-system-metrics.md --- diff --git a/src/disk.c b/src/disk.c index f7bab9986..c4f9b3928 100644 --- a/src/disk.c +++ b/src/disk.c @@ -380,38 +380,23 @@ static signed long long dict_get_value(CFDictionaryRef dict, const char *key) { #endif /* HAVE_IOKIT_IOKITLIB_H */ static int disk_read(void) { - metric_family_t fam_disk_read_bytes = { - .name = "disk_read_bytes_total", + metric_family_t fam_io = { + .name = "system.disk.io", .type = METRIC_TYPE_COUNTER, }; - metric_family_t fam_disk_read_merged = { - .name = "disk_read_merged_total", + metric_family_t fam_ops = { + .name = "system.disk.operations", .type = METRIC_TYPE_COUNTER, }; - metric_family_t fam_disk_read_ops = { - .name = "disk_read_ops_total", + metric_family_t fam_time = { + .name = "system.disk.time", .type = METRIC_TYPE_COUNTER, }; - metric_family_t fam_disk_read_time = { - .name = "disk_read_time_total", - .type = METRIC_TYPE_COUNTER, - }; - metric_family_t fam_disk_write_bytes = { - .name = "disk_write_bytes_total", - .type = METRIC_TYPE_COUNTER, - }; - metric_family_t fam_disk_write_merged = { - .name = "disk_write_merged_total", - .type = METRIC_TYPE_COUNTER, - }; - metric_family_t fam_disk_write_ops = { - .name = "disk_write_ops_total", - .type = METRIC_TYPE_COUNTER, - }; - metric_family_t fam_disk_write_time = { - .name = "disk_write_time_total", + metric_family_t fam_merged = { + .name = "system.disk.merged", .type = METRIC_TYPE_COUNTER, }; + metric_family_t fam_disk_io_time = { .name = "disk_io_time_total", .type = METRIC_TYPE_COUNTER, @@ -424,6 +409,7 @@ static int disk_read(void) { .name = "disk_pending_operations", .type = METRIC_TYPE_GAUGE, }; + #if KERNEL_LINUX metric_family_t fam_disk_utilization = { .name = "disk_utilization", @@ -432,14 +418,11 @@ static int disk_read(void) { #endif metric_family_t *fams[] = { - &fam_disk_read_bytes, - &fam_disk_read_merged, - &fam_disk_read_ops, - &fam_disk_read_time, - &fam_disk_write_bytes, - &fam_disk_write_merged, - &fam_disk_write_ops, - &fam_disk_write_time, + &fam_io, + &fam_ops, + &fam_time, + &fam_merged, + &fam_disk_io_time, &fam_disk_io_weighted_time, &fam_disk_pending_operations, @@ -588,25 +571,22 @@ static int disk_read(void) { metric_t m = {0}; metric_label_set(&m, "device", disk_name); if ((read_byt != -1LL) || (write_byt != -1LL)) { - m.value.counter = read_byt; - metric_family_metric_append(&fam_disk_read_bytes, m); - - m.value.counter = write_byt; - metric_family_metric_append(&fam_disk_write_bytes, m); + metric_family_append(&fam_io, "direction", "read", + (value_t){.counter = read_byt}, &m); + metric_family_append(&fam_io, "direction", "write", + (value_t){.counter = write_byt}, &m); } if ((read_ops != -1LL) || (write_ops != -1LL)) { - m.value.counter = read_ops; - metric_family_metric_append(&fam_disk_read_ops, m); - - m.value.counter = write_ops; - metric_family_metric_append(&fam_disk_write_ops, m); + metric_family_append(&fam_ops, "direction", "read", + (value_t){.counter = read_ops}, &m); + metric_family_append(&fam_ops, "direction", "write", + (value_t){.counter = write_ops}, &m); } if ((read_tme != -1LL) || (write_tme != -1LL)) { - m.value.counter = read_tme / 1000; - metric_family_metric_append(&fam_disk_read_time, m); - - m.value.counter = write_tme / 1000; - metric_family_metric_append(&fam_disk_write_time, m); + metric_family_append(&fam_time, "direction", "read", + (value_t){.counter = read_tme / 1000}, &m); + metric_family_append(&fam_time, "direction", "write", + (value_t){.counter = write_tme / 1000}, &m); } metric_reset(&m); } @@ -708,31 +688,36 @@ static int disk_read(void) { if ((snap_iter->bytes[DEVSTAT_READ] != 0) || (snap_iter->bytes[DEVSTAT_WRITE] != 0)) { - m.value.counter = (counter_t)snap_iter->bytes[DEVSTAT_READ]; - metric_family_metric_append(&fam_disk_read_bytes, m); - - m.value.counter = (counter_t)snap_iter->bytes[DEVSTAT_WRITE]; - metric_family_metric_append(&fam_disk_write_bytes, m); + metric_family_append( + &fam_io, "direction", "read", + (value_t){.counter = (counter_t)snap_iter->bytes[DEVSTAT_READ]}, &m); + metric_family_append( + &fam_io, "direction", "write", + (value_t){.counter = (counter_t)snap_iter->bytes[DEVSTAT_WRITE]}, &m); } if ((snap_iter->operations[DEVSTAT_READ] != 0) || (snap_iter->operations[DEVSTAT_WRITE] != 0)) { - m.value.counter = (counter_t)snap_iter->operations[DEVSTAT_READ]; - metric_family_metric_append(&fam_disk_read_ops, m); - - m.value.counter = (counter_t)snap_iter->operations[DEVSTAT_WRITE]; - metric_family_metric_append(&fam_disk_write_ops, m); + metric_family_append( + &fam_ops, "direction", "read", + (value_t){.counter = (counter_t)snap_iter->operations[DEVSTAT_READ]}, + &m); + metric_family_append( + &fam_ops, "direction", "write", + (value_t){.counter = (counter_t)snap_iter->operations[DEVSTAT_WRITE]}, + &m); } read_time = devstat_compute_etime(&snap_iter->duration[DEVSTAT_READ], NULL); write_time = devstat_compute_etime(&snap_iter->duration[DEVSTAT_WRITE], NULL); if ((read_time != 0) || (write_time != 0)) { - m.value.counter = (counter_t)(read_time * 1000); - metric_family_metric_append(&fam_disk_read_time, m); - - m.value.counter = (counter_t)(write_time * 1000); - metric_family_metric_append(&fam_disk_write_time, m); + metric_family_append(&fam_time, "direction", "read", + (value_t){.counter = (counter_t)(read_time * 1000)}, + &m); + metric_family_append(&fam_time, "direction", "write", + (value_t){.counter = (counter_t)(write_time * 1000)}, + &m); } if (devstat_compute_statistics(snap_iter, NULL, 1.0, DSM_TOTAL_BUSY_TIME, &busy_time, DSM_TOTAL_DURATION, @@ -954,36 +939,35 @@ static int disk_read(void) { metric_label_set(&m, "device", output_name); if ((ds->read_bytes != 0) || (ds->write_bytes != 0)) { - m.value.counter = (counter_t)ds->read_bytes; - metric_family_metric_append(&fam_disk_read_bytes, m); - - m.value.counter = (counter_t)ds->write_bytes; - metric_family_metric_append(&fam_disk_write_bytes, m); + metric_family_append(&fam_io, "direction", "read", + (value_t){.counter = (counter_t)ds->read_bytes}, &m); + metric_family_append(&fam_io, "direction", "write", + (value_t){.counter = (counter_t)ds->write_bytes}, + &m); } if ((ds->read_ops != 0) || (ds->write_ops != 0)) { - m.value.counter = (counter_t)read_ops; - metric_family_metric_append(&fam_disk_read_ops, m); - - m.value.counter = (counter_t)write_ops; - metric_family_metric_append(&fam_disk_write_ops, m); + metric_family_append(&fam_ops, "direction", "read", + (value_t){.counter = (counter_t)ds->read_ops}, &m); + metric_family_append(&fam_ops, "direction", "write", + (value_t){.counter = (counter_t)ds->write_ops}, &m); } if ((ds->avg_read_time != 0) || (ds->avg_write_time != 0)) { - m.value.counter = (counter_t)ds->avg_read_time; - metric_family_metric_append(&fam_disk_read_time, m); - - m.value.counter = (counter_t)ds->avg_write_time; - metric_family_metric_append(&fam_disk_write_time, m); + metric_family_append(&fam_time, "direction", "read", + (value_t){.counter = (counter_t)ds->avg_read_time}, + &m); + metric_family_append(&fam_time, "direction", "write", + (value_t){.counter = (counter_t)ds->avg_write_time}, + &m); } if (is_disk) { if (ds->has_merged) { - m.value.counter = (counter_t)read_merged; - metric_family_metric_append(&fam_disk_read_merged, m); - - m.value.counter = (counter_t)write_merged; - metric_family_metric_append(&fam_disk_write_merged, m); + metric_family_append(&fam_merged, "direction", "read", + (value_t){.counter = (counter_t)read_merged}, &m); + metric_family_append(&fam_merged, "direction", "write", + (value_t){.counter = (counter_t)write_merged}, &m); } if (ds->has_in_progress) { m.value.gauge = in_progress; @@ -1063,57 +1047,39 @@ static int disk_read(void) { return -1; for (int i = 0; i < numdisk; i++) { - if (kstat_read(kc, ksp[i], &kio) == -1) + if (kstat_read(kc, ksp[i], &kio) == -1) { continue; + } + if ((strncmp(ksp[i]->ks_class, "disk", 4) != 0) && + (strncmp(ksp[i]->ks_class, "partition", 9) != 0)) { + continue; + } + if (ignorelist_match(ignorelist, ksp[i]->ks_name) != 0) { + continue; + } - if (strncmp(ksp[i]->ks_class, "disk", 4) == 0) { - if (ignorelist_match(ignorelist, ksp[i]->ks_name) != 0) - continue; - - metric_t m = {0}; - metric_label_set(&m, "device", ksp[i]->ks_name); - - m.value.counter = kio.KIO_ROCTETS; - metric_family_metric_append(&fam_disk_read_bytes, m); - - m.value.counter = kio.KIO_WOCTETS; - metric_family_metric_append(&fam_disk_write_bytes, m); + metric_t m = {0}; + metric_label_set(&m, "device", ksp[i]->ks_name); - m.value.counter = kio.KIO_ROPS; - metric_family_metric_append(&fam_disk_read_ops, m); + metric_family_append(&fam_io, "direction", "read", + (value_t){.counter = kio.KIO_ROCTETS}, &m); + metric_family_append(&fam_io, "direction", "write", + (value_t){.counter = kio.KIO_WOCTETS}, &m); - m.value.counter = kio.KIO_WOPS; - metric_family_metric_append(&fam_disk_write_ops, m); + metric_family_append(&fam_ops, "direction", "read", + (value_t){.counter = kio.KIO_ROPS}, &m); + metric_family_append(&fam_ops, "direction", "write", + (value_t){.counter = kio.KIO_WOPS}, &m); + if (strncmp(ksp[i]->ks_class, "disk", 4) == 0) { /* FIXME: Convert this to microseconds if necessary */ - m.value.counter = kio.KIO_RTIME; - metric_family_metric_append(&fam_disk_read_time, m); - - m.value.counter = kio.KIO_WTIME; - metric_family_metric_append(&fam_disk_write_time, m); - - metric_reset(&m); - } else if (strncmp(ksp[i]->ks_class, "partition", 9) == 0) { - if (ignorelist_match(ignorelist, ksp[i]->ks_name) != 0) - continue; - - metric_t m = {0}; - metric_label_set(&m, "device", ksp[i]->ks_name); - - m.value.counter = kio.KIO_ROCTETS; - metric_family_metric_append(&fam_disk_read_bytes, m); - - m.value.counter = kio.KIO_WOCTETS; - metric_family_metric_append(&fam_disk_write_bytes, m); - - m.value.counter = kio.KIO_ROPS; - metric_family_metric_append(&fam_disk_read_ops, m); - - m.value.counter = kio.KIO_WOPS; - metric_family_metric_append(&fam_disk_write_ops, m); - - metric_reset(&m); + metric_family_append(&fam_time, "direction", "read", + (value_t){.counter = kio.KIO_RTIME}, &m); + metric_family_append(&fam_time, "direction", "write", + (value_t){.counter = kio.KIO_WTIME}, &m); } + + metric_reset(&m); } /* #endif defined(HAVE_LIBKSTAT) */ @@ -1124,28 +1090,22 @@ static int disk_read(void) { #else int disks; #endif - char name[DATA_MAX_NAME_LEN]; if ((ds = sg_get_disk_io_stats(&disks)) == NULL) return 0; for (int counter = 0; counter < disks; counter++) { - strncpy(name, ds->disk_name, sizeof(name)); - name[sizeof(name) - 1] = - '\0'; /* strncpy doesn't terminate longer strings */ - - if (ignorelist_match(ignorelist, name) != 0) { + if (ignorelist_match(ignorelist, ds->disk_name) != 0) { ds++; continue; } metric_t m = {0}; - metric_label_set(&m, "device", name); + metric_label_set(&m, "device", ds->disk_name); - m.value.counter = ds->read_bytes; - metric_family_metric_append(&fam_disk_read_bytes, m); - - m.value.counter = ds->write_bytes; - metric_family_metric_append(&fam_disk_write_bytes, m); + metric_family_append(&fam_io, "direction", "read", + (value_t){.counter = ds->read_bytes}, &m); + metric_family_append(&fam_io, "direction", "write", + (value_t){.counter = ds->write_bytes}, &m); metric_reset(&m); ds++; @@ -1153,15 +1113,6 @@ static int disk_read(void) { /* #endif defined(HAVE_LIBSTATGRAB) */ #elif defined(HAVE_PERFSTAT) - derive_t read_sectors; - derive_t write_sectors; - derive_t read_time; - derive_t write_time; - derive_t read_ops; - derive_t write_ops; - perfstat_id_t firstpath; - int rnumdisk; - if ((numdisk = perfstat_disk(NULL, NULL, sizeof(perfstat_disk_t), 0)) < 0) { WARNING("disk plugin: perfstat_disk: %s", STRERRNO); return -1; @@ -1173,9 +1124,12 @@ static int disk_read(void) { } pnumdisk = numdisk; - firstpath.name[0] = '\0'; - if ((rnumdisk = perfstat_disk(&firstpath, stat_disk, sizeof(perfstat_disk_t), - numdisk)) < 0) { + perfstat_id_t firstpath = { + .name = "", + }; + int rnumdisk = + perfstat_disk(&firstpath, stat_disk, sizeof(perfstat_disk_t), numdisk); + if (rnumdisk < 0) { WARNING("disk plugin: perfstat_disk : %s", STRERRNO); return -1; } @@ -1186,35 +1140,35 @@ static int disk_read(void) { metric_t m = {0}; metric_label_set(&m, "device", stat_disk[i].name); - read_sectors = stat_disk[i].rblks * stat_disk[i].bsize; - m.value.counter = (counter_t)read_sectors; - metric_family_metric_append(&fam_disk_read_bytes, m); - - write_sectors = stat_disk[i].wblks * stat_disk[i].bsize; - m.value.counter = (counter_t)write_sectors; - metric_family_metric_append(&fam_disk_write_bytes, m); - - read_ops = stat_disk[i].xrate; - m.value.counter = (counter_t)read_ops; - metric_family_metric_append(&fam_disk_read_ops, m); - - write_ops = stat_disk[i].xfers - stat_disk[i].xrate; - m.value.counter = (counter_t)write_ops; - metric_family_metric_append(&fam_disk_write_ops, m); - - read_time = stat_disk[i].rserv; + metric_family_append(&fam_io, "direction", "read", + (value_t){.counter = (counter_t)(stat_disk[i].rblks * + stat_disk[i].bsize)}, + &m); + metric_family_append(&fam_io, "direction", "write", + (value_t){.counter = (counter_t)(stat_disk[i].wblks * + stat_disk[i].bsize)}, + &m); + + metric_family_append(&fam_ops, "direction", "read", + (value_t){.counter = (counter_t)stat_disk[i].xrate}, + &m); + metric_family_append(&fam_ops, "direction", "write", + (value_t){.counter = (counter_t)(stat_disk[i].xfers - + stat_disk[i].xrate)}, + &m); + + derive_t read_time = stat_disk[i].rserv; read_time *= ((double)(_system_configuration.Xint) / (double)(_system_configuration.Xfrac)) / 1000000.0; - m.value.counter = (counter_t)read_time; - metric_family_metric_append(&fam_disk_read_time, m); - - write_time = stat_disk[i].wserv; + derive_t write_time = stat_disk[i].wserv; write_time *= ((double)(_system_configuration.Xint) / (double)(_system_configuration.Xfrac)) / 1000000.0; - m.value.counter = (counter_t)write_time; - metric_family_metric_append(&fam_disk_write_time, m); + metric_family_append(&fam_time, "direction", "read", + (value_t){.counter = (counter_t)read_time}, &m); + metric_family_append(&fam_time, "direction", "write", + (value_t){.counter = (counter_t)} write_time, &m); metric_reset(&m); } @@ -1265,17 +1219,15 @@ static int disk_read(void) { metric_t m = {0}; metric_label_set(&m, "device", drives[i].name); - m.value.counter = drives[i].rbytes; - metric_family_metric_append(&fam_disk_read_bytes, m); - - m.value.counter = drives[i].wbytes; - metric_family_metric_append(&fam_disk_write_bytes, m); - - m.value.counter = drives[i].rxfer; - metric_family_metric_append(&fam_disk_read_ops, m); + metric_family_append(&fam_io, "direction", "read", + (value_t){.counter = drives[i].rbytes}, &m); + metric_family_append(&fam_io, "direction", "write", + (value_t){.counter = drives[i].wbytes}, &m); - m.value.counter = drives[i].wxfer; - metric_family_metric_append(&fam_disk_write_ops, m); + metric_family_append(&fam_ops, "direction", "read", + (value_t){.counter = drives[i].rxfer}, &m); + metric_family_append(&fam_ops, "direction", "write", + (value_t){.counter = drives[i].wxfer}, &m); m.value.counter = drives[i].time_sec * 1000 + drives[i].time_usec / 1000; metric_family_metric_append(&fam_disk_io_time, m); @@ -1285,14 +1237,15 @@ static int disk_read(void) { #endif /* HAVE_SYSCTL && KERNEL_NETBSD */ for (size_t i = 0; fams[i] != NULL; i++) { - if (fams[i]->metric.num > 0) { - int status = plugin_dispatch_metric_family(fams[i]); - if (status != 0) { - ERROR("disk: plugin_dispatch_metric_family failed: %s", - STRERROR(status)); - } - metric_family_metric_reset(fams[i]); + if (fams[i]->metric.num == 0) { + continue; + } + + int status = plugin_dispatch_metric_family(fams[i]); + if (status != 0) { + ERROR("disk: plugin_dispatch_metric_family failed: %s", STRERROR(status)); } + metric_family_metric_reset(fams[i]); } return 0;