socsvn commit: r270204 - soc2014/zkorchev/freebsd_head/usr.sbin/iostat
zkorchev at FreeBSD.org
zkorchev at FreeBSD.org
Mon Jun 30 08:01:05 UTC 2014
Author: zkorchev
Date: Mon Jun 30 08:01:03 2014
New Revision: 270204
URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=270204
Log:
libsol support for iostat
Modified:
soc2014/zkorchev/freebsd_head/usr.sbin/iostat/Makefile
soc2014/zkorchev/freebsd_head/usr.sbin/iostat/iostat.c
Modified: soc2014/zkorchev/freebsd_head/usr.sbin/iostat/Makefile
==============================================================================
--- soc2014/zkorchev/freebsd_head/usr.sbin/iostat/Makefile Mon Jun 30 05:33:52 2014 (r270203)
+++ soc2014/zkorchev/freebsd_head/usr.sbin/iostat/Makefile Mon Jun 30 08:01:03 2014 (r270204)
@@ -5,7 +5,8 @@
MAN= iostat.8
DPADD= ${LIBDEVSTAT} ${LIBKVM} ${LIBM}
-LDADD= -ldevstat -lkvm -lm
+LDADD= -ldevstat -lkvm -lm -lsol
+CFLAGS+=-DSOL_ON -I/usr/local/include
WARNS?= 1
Modified: soc2014/zkorchev/freebsd_head/usr.sbin/iostat/iostat.c
==============================================================================
--- soc2014/zkorchev/freebsd_head/usr.sbin/iostat/iostat.c Mon Jun 30 05:33:52 2014 (r270203)
+++ soc2014/zkorchev/freebsd_head/usr.sbin/iostat/iostat.c Mon Jun 30 08:01:03 2014 (r270204)
@@ -115,6 +115,9 @@
#include <string.h>
#include <termios.h>
#include <unistd.h>
+#if defined(SOL_ON)
+# include <sol.h>
+#endif
struct nlist namelist[] = {
#define X_TTY_NIN 0
@@ -139,6 +142,11 @@
int dflag = 0, Iflag = 0, Cflag = 0, Tflag = 0, oflag = 0, Kflag = 0;
int xflag = 0, zflag = 0;
+int sol_format;
+#if defined(SOL_ON)
+static struct sol_stream sol_stream;
+#endif
+
/* local function declarations */
static void usage(void);
static void needhdr(int signo);
@@ -442,6 +450,11 @@
wrows = IOSTAT_DEFAULT_ROWS;
}
+#if defined(SOL_ON)
+ sol_format = sol_init(&sol_stream);
+ if (sol_format) sol_map_start(&sol_stream);
+#endif
+
for (headercount = 1;;) {
struct devinfo *tmp_dinfo;
long tmp;
@@ -585,9 +598,22 @@
last.cp_time[i] = tmp;
}
- if (xflag == 0 && Tflag > 0)
- printf("%4.0Lf %5.0Lf", cur.tk_nin / etime,
- cur.tk_nout / etime);
+ if (xflag == 0 && Tflag > 0) {
+#if defined(SOL_ON)
+ if (sol_format)
+ {
+ SOL_MAP_KEYL(&sol_stream, "tin");
+ sol_float(&sol_stream, cur.tk_nin / etime);
+ SOL_MAP_KEYL(&sol_stream, "tout");
+ sol_float(&sol_stream, cur.tk_nout / etime);
+ }
+ else
+#endif
+ {
+ printf("%4.0Lf %5.0Lf", cur.tk_nin / etime,
+ cur.tk_nout / etime);
+ }
+ }
devstats(hflag, etime, havelast);
@@ -606,6 +632,13 @@
havelast = 1;
}
+#if defined(SOL_ON)
+ if (sol_format) {
+ sol_map_end(&sol_stream);
+ sol_term(&sol_stream);
+ }
+#endif
+
exit(0);
}
@@ -666,6 +699,10 @@
int i, printed;
char devbuf[256];
+#if defined(SOL_ON)
+ if (sol_format) return;
+#endif
+
/*
* If xflag is set, we need a per-loop header, not a page header, so
* just return. We'll print the header in devstats().
@@ -738,7 +775,11 @@
int firstline = 1;
char *devname;
+#if defined(SOL_ON)
+ if ((xflag > 0) && !sol_format) {
+#else
if (xflag > 0) {
+#endif
printf(" extended device statistics ");
if (Tflag > 0)
printf(" tty ");
@@ -819,73 +860,180 @@
mb_per_second_read > ((long double).0005)/1024 ||
mb_per_second_write > ((long double).0005)/1024 ||
busy_pct > 0.5) {
- if (Iflag == 0)
- printf("%-8.8s %5.1Lf %5.1Lf %7.1Lf %7.1Lf %4" PRIu64 " %5.1Lf %3.0Lf ",
- devname, transfers_per_second_read,
- transfers_per_second_write,
- mb_per_second_read * 1024,
- mb_per_second_write * 1024,
- queue_len,
- ms_per_transaction, busy_pct);
+#if defined(SOL_ON)
+ if (sol_format)
+ {
+ SOL_MAP_KEYL(&sol_stream, "device");
+ sol_string(&sol_stream, devname, strlen(devname));
+ if (Iflag == 0) {
+ SOL_MAP_KEYL(&sol_stream, "r/s");
+ sol_float(&sol_stream, transfers_per_second_read);
+ SOL_MAP_KEYL(&sol_stream, "w/s");
+ sol_float(&sol_stream, transfers_per_second_write);
+ SOL_MAP_KEYL(&sol_stream, "kr/s");
+ sol_float(&sol_stream, mb_per_second_read * 1024);
+ SOL_MAP_KEYL(&sol_stream, "kw/s");
+ sol_float(&sol_stream, mb_per_second_write * 1024);
+ SOL_MAP_KEYL(&sol_stream, "qlen");
+ sol_float(&sol_stream, queue_len);
+ SOL_MAP_KEYL(&sol_stream, "svc_t");
+ sol_float(&sol_stream, ms_per_transaction);
+ SOL_MAP_KEYL(&sol_stream, "%b");
+ sol_float(&sol_stream, busy_pct);
+ }
+ else {
+ SOL_MAP_KEYL(&sol_stream, "r/i");
+ sol_float(&sol_stream, total_transfers_read);
+ SOL_MAP_KEYL(&sol_stream, "w/i");
+ sol_float(&sol_stream, total_transfers_write);
+ SOL_MAP_KEYL(&sol_stream, "kr/i");
+ sol_float(&sol_stream, total_bytes_read / 1024);
+ SOL_MAP_KEYL(&sol_stream, "kw/i");
+ sol_float(&sol_stream, total_bytes_write / 1024);
+ SOL_MAP_KEYL(&sol_stream, "qlen");
+ sol_float(&sol_stream, queue_len);
+ SOL_MAP_KEYL(&sol_stream, "tsvc_t/i");
+ sol_float(&sol_stream, total_duration);
+ SOL_MAP_KEYL(&sol_stream, "sb/i");
+ sol_float(&sol_stream, busy_time);
+ }
+
+ if (firstline) {
+ /*
+ * If this is the first device
+ * we're printing, also print
+ * CPU or TTY stats if requested.
+ */
+ firstline = 0;
+ if (Tflag > 0) {
+ SOL_MAP_KEYL(&sol_stream, "tin");
+ sol_float(&sol_stream, cur.tk_nin / etime);
+ SOL_MAP_KEYL(&sol_stream, "tout");
+ sol_float(&sol_stream, cur.tk_nout / etime);
+ }
+ if (Cflag > 0)
+ cpustats();
+ }
+ }
else
- printf("%-8.8s %11.1Lf %11.1Lf "
- "%12.1Lf %12.1Lf %4" PRIu64
- " %10.1Lf %9.1Lf ",
- devname,
- (long double)total_transfers_read,
- (long double)total_transfers_write,
- (long double)
- total_bytes_read / 1024,
- (long double)
- total_bytes_write / 1024,
- queue_len,
- total_duration, busy_time);
- if (firstline) {
- /*
- * If this is the first device
- * we're printing, also print
- * CPU or TTY stats if requested.
- */
- firstline = 0;
- if (Tflag > 0)
- printf("%4.0Lf%5.0Lf",
- cur.tk_nin / etime,
- cur.tk_nout / etime);
- if (Cflag > 0)
- cpustats();
+#endif
+ {
+ if (Iflag == 0)
+ printf("%-8.8s %5.1Lf %5.1Lf %7.1Lf %7.1Lf %4" PRIu64 " %5.1Lf %3.0Lf ",
+ devname, transfers_per_second_read,
+ transfers_per_second_write,
+ mb_per_second_read * 1024,
+ mb_per_second_write * 1024,
+ queue_len,
+ ms_per_transaction, busy_pct);
+ else
+ printf("%-8.8s %11.1Lf %11.1Lf "
+ "%12.1Lf %12.1Lf %4" PRIu64
+ " %10.1Lf %9.1Lf ",
+ devname,
+ (long double)total_transfers_read,
+ (long double)total_transfers_write,
+ (long double)
+ total_bytes_read / 1024,
+ (long double)
+ total_bytes_write / 1024,
+ queue_len,
+ total_duration, busy_time);
+ if (firstline) {
+ /*
+ * If this is the first device
+ * we're printing, also print
+ * CPU or TTY stats if requested.
+ */
+ firstline = 0;
+ if (Tflag > 0)
+ printf("%4.0Lf%5.0Lf",
+ cur.tk_nin / etime,
+ cur.tk_nout / etime);
+ if (Cflag > 0)
+ cpustats();
+ }
+ printf("\n");
}
- printf("\n");
}
free(devname);
} else if (oflag > 0) {
- int msdig = (ms_per_transaction < 100.0) ? 1 : 0;
-
- if (Iflag == 0)
- printf("%4.0Lf%4.0Lf%5.*Lf ",
- blocks_per_second,
- transfers_per_second,
- msdig,
- ms_per_transaction);
+#if defined(SOL_ON)
+ if (sol_format)
+ {
+ if (Iflag == 0) {
+ SOL_MAP_KEYL(&sol_stream, "sps");
+ sol_float(&sol_stream, blocks_per_second);
+ SOL_MAP_KEYL(&sol_stream, "tps");
+ sol_float(&sol_stream, transfers_per_second);
+ }
+ else {
+ SOL_MAP_KEYL(&sol_stream, "blk");
+ sol_float(&sol_stream, total_blocks);
+ SOL_MAP_KEYL(&sol_stream, "xfr");
+ sol_float(&sol_stream, total_transfers);
+ }
+ SOL_MAP_KEYL(&sol_stream, "msps");
+ sol_float(&sol_stream, ms_per_transaction);
+ }
else
- printf("%4.1" PRIu64 "%4.1" PRIu64 "%5.*Lf ",
- total_blocks,
- total_transfers,
- msdig,
- ms_per_transaction);
+#endif
+ {
+ int msdig = (ms_per_transaction < 100.0) ? 1 : 0;
+
+ if (Iflag == 0)
+ printf("%4.0Lf%4.0Lf%5.*Lf ",
+ blocks_per_second,
+ transfers_per_second,
+ msdig,
+ ms_per_transaction);
+ else
+ printf("%4.1" PRIu64 "%4.1" PRIu64 "%5.*Lf ",
+ total_blocks,
+ total_transfers,
+ msdig,
+ ms_per_transaction);
+ }
} else {
- if (Iflag == 0)
- printf(" %5.2Lf %3.0Lf %5.2Lf ",
- kb_per_transfer,
- transfers_per_second,
- mb_per_second);
- else {
- total_mb = total_bytes;
- total_mb /= 1024 * 1024;
-
- printf(" %5.2Lf %3.1" PRIu64 " %5.2Lf ",
- kb_per_transfer,
- total_transfers,
- total_mb);
+#if defined(SOL_ON)
+ if (sol_format)
+ {
+ SOL_MAP_KEYL(&sol_stream, "KB/t");
+ sol_float(&sol_stream, kb_per_transfer);
+
+ if (Iflag == 0) {
+ SOL_MAP_KEYL(&sol_stream, "tps");
+ sol_float(&sol_stream, transfers_per_second);
+ SOL_MAP_KEYL(&sol_stream, "MB/s");
+ sol_float(&sol_stream, mb_per_second);
+ }
+ else {
+ total_mb = total_bytes;
+ total_mb /= 1024 * 1024;
+
+ SOL_MAP_KEYL(&sol_stream, "xfrs");
+ sol_float(&sol_stream, total_transfers);
+ SOL_MAP_KEYL(&sol_stream, "MB");
+ sol_float(&sol_stream, total_mb);
+ }
+ }
+ else
+#endif
+ {
+ if (Iflag == 0)
+ printf(" %5.2Lf %3.0Lf %5.2Lf ",
+ kb_per_transfer,
+ transfers_per_second,
+ mb_per_second);
+ else {
+ total_mb = total_bytes;
+ total_mb /= 1024 * 1024;
+
+ printf(" %5.2Lf %3.1" PRIu64 " %5.2Lf ",
+ kb_per_transfer,
+ total_transfers,
+ total_mb);
+ }
}
}
}
@@ -896,13 +1044,27 @@
* lines I/O because they were all zero,
* print TTY/CPU stats.
*/
- printf("%52s","");
- if (Tflag > 0)
- printf("%4.0Lf %5.0Lf", cur.tk_nin / etime,
- cur.tk_nout / etime);
- if (Cflag > 0)
- cpustats();
- printf("\n");
+#if defined(SOL_ON)
+ if (sol_format)
+ {
+ SOL_MAP_KEYL(&sol_stream, "tin");
+ sol_float(&sol_stream, cur.tk_nin / etime);
+ SOL_MAP_KEYL(&sol_stream, "tout");
+ sol_float(&sol_stream, cur.tk_nout / etime);
+ if (Cflag > 0)
+ cpustats();
+ }
+ else
+#endif
+ {
+ printf("%52s","");
+ if (Tflag > 0)
+ printf("%4.0Lf %5.0Lf", cur.tk_nin / etime,
+ cur.tk_nout / etime);
+ if (Cflag > 0)
+ cpustats();
+ printf("\n");
+ }
}
}
@@ -916,9 +1078,20 @@
for (state = 0; state < CPUSTATES; ++state)
time += cur.cp_time[state];
- for (state = 0; state < CPUSTATES; ++state)
- printf(" %2.0f",
- rint(100. * cur.cp_time[state] / (time ? time : 1)));
+#if defined(SOL_ON)
+ if (sol_format) {
+ SOL_MAP_KEYL(&sol_stream, "cpu");
+ sol_array_start(&sol_stream);
+ for (state = 0; state < CPUSTATES; ++state)
+ sol_float(&sol_stream,
+ rint(100. * cur.cp_time[state] / (time ? time : 1)));
+ sol_array_end(&sol_stream);
+ }
+ else
+#endif
+ for (state = 0; state < CPUSTATES; ++state)
+ printf(" %2.0f",
+ rint(100. * cur.cp_time[state] / (time ? time : 1)));
}
static int
More information about the svn-soc-all
mailing list