socsvn commit: r268778 - soc2014/zkorchev/freebsd_head/usr.bin/vmstat
zkorchev at FreeBSD.org
zkorchev at FreeBSD.org
Wed May 28 17:03:07 UTC 2014
Author: zkorchev
Date: Wed May 28 17:03:05 2014
New Revision: 268778
URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=268778
Log:
implemented vmstat json output for several options
Modified:
soc2014/zkorchev/freebsd_head/usr.bin/vmstat/Makefile
soc2014/zkorchev/freebsd_head/usr.bin/vmstat/vmstat.8
soc2014/zkorchev/freebsd_head/usr.bin/vmstat/vmstat.c
Modified: soc2014/zkorchev/freebsd_head/usr.bin/vmstat/Makefile
==============================================================================
--- soc2014/zkorchev/freebsd_head/usr.bin/vmstat/Makefile Wed May 28 17:01:51 2014 (r268777)
+++ soc2014/zkorchev/freebsd_head/usr.bin/vmstat/Makefile Wed May 28 17:03:05 2014 (r268778)
@@ -2,9 +2,11 @@
# $FreeBSD$
PROG= vmstat
+SRCS= vmstat.c sol.c
MAN= vmstat.8
DPADD= ${LIBDEVSTAT} ${LIBKVM} ${LIBMEMSTAT} ${LIBUTIL}
-LDADD= -ldevstat -lkvm -lmemstat -lutil
+LDADD= -L/usr/local/lib -ldevstat -lkvm -lmemstat -lutil -lyajl
+CFLAGS+= -DSOL_ON -I/usr/local/include
WARNS?= 1
Modified: soc2014/zkorchev/freebsd_head/usr.bin/vmstat/vmstat.8
==============================================================================
--- soc2014/zkorchev/freebsd_head/usr.bin/vmstat/vmstat.8 Wed May 28 17:01:51 2014 (r268777)
+++ soc2014/zkorchev/freebsd_head/usr.bin/vmstat/vmstat.8 Wed May 28 17:03:05 2014 (r268778)
@@ -116,6 +116,8 @@
by type.
.It Fl n
Change the maximum number of disks to display from the default of 2.
+.It Fl O
+Output the results in JSON format.
.It Fl P
Report per-cpu system/user/idle cpu statistics.
.It Fl p
Modified: soc2014/zkorchev/freebsd_head/usr.bin/vmstat/vmstat.c
==============================================================================
--- soc2014/zkorchev/freebsd_head/usr.bin/vmstat/vmstat.c Wed May 28 17:01:51 2014 (r268777)
+++ soc2014/zkorchev/freebsd_head/usr.bin/vmstat/vmstat.c Wed May 28 17:03:05 2014 (r268778)
@@ -76,6 +76,12 @@
#include <unistd.h>
#include <libutil.h>
+#include "sol.h"
+
+#if defined(SOL_ON)
+static struct sol_stream sol_stream;
+#endif
+
static char da[] = "da";
static struct nlist namelist[] = {
@@ -133,6 +139,7 @@
static int nflag;
static int Pflag;
static int hflag;
+static int Oflag;
static kvm_t *kd;
@@ -181,7 +188,7 @@
interval = reps = todo = 0;
maxshowdevs = 2;
hflag = isatty(1);
- while ((c = getopt(argc, argv, "ac:fhHiM:mN:n:Pp:stw:z")) != -1) {
+ while ((c = getopt(argc, argv, "ac:fhHiM:mN:n:OPp:stw:z")) != -1) {
switch (c) {
case 'a':
aflag++;
@@ -220,6 +227,9 @@
errx(1, "number of devices %d is < 0",
maxshowdevs);
break;
+ case 'O':
+ Oflag = 1;
+ break;
case 'p':
if (devstat_buildmatch(optarg, &matches, &num_matches) != 0)
errx(1, "%s", devstat_errbuf);
@@ -305,6 +315,10 @@
} else if (reps)
interval = 1 * 1000;
+#if defined(SOL_ON)
+ if (Oflag) sol_init(&sol_stream, SOL_JSON);
+#endif
+
if (todo & FORKSTAT)
doforkst();
if (todo & MEMSTAT)
@@ -321,6 +335,11 @@
dointr();
if (todo & VMSTAT)
dovmstat(interval, reps);
+
+#if defined(SOL_ON)
+ if (Oflag) sol_term(&sol_stream);
+#endif
+
exit(0);
}
@@ -1012,18 +1031,65 @@
doforkst(void)
{
fill_vmmeter(&sum);
- (void)printf("%u forks, %u pages, average %.2f\n",
- sum.v_forks, sum.v_forkpages,
- sum.v_forks == 0 ? 0.0 :
- (double)sum.v_forkpages / sum.v_forks);
- (void)printf("%u vforks, %u pages, average %.2f\n",
- sum.v_vforks, sum.v_vforkpages,
- sum.v_vforks == 0 ? 0.0 :
- (double)sum.v_vforkpages / sum.v_vforks);
- (void)printf("%u rforks, %u pages, average %.2f\n",
- sum.v_rforks, sum.v_rforkpages,
- sum.v_rforks == 0 ? 0.0 :
- (double)sum.v_rforkpages / sum.v_rforks);
+
+#if defined(SOL_ON)
+ if (Oflag) {
+ sol_map_start(&sol_stream);
+
+ sol_map_key(&sol_stream, "fork", 4);
+ sol_map_start(&sol_stream);
+ sol_map_key(&sol_stream, "count", 5);
+ sol_map_integer(&sol_stream, sum.v_forks);
+ sol_map_key(&sol_stream, "pages", 5);
+ sol_map_integer(&sol_stream, sum.v_forkpages);
+ sol_map_key(&sol_stream, "average", 7);
+ sol_map_float(&sol_stream, ((sum.v_forks == 0) ?
+ 0.0 :
+ (double)sum.v_forkpages / sum.v_forks));
+ sol_map_end(&sol_stream);
+
+ sol_map_key(&sol_stream, "vfork", 5);
+ sol_map_start(&sol_stream);
+ sol_map_key(&sol_stream, "count", 5);
+ sol_map_integer(&sol_stream, sum.v_vforks);
+ sol_map_key(&sol_stream, "pages", 5);
+ sol_map_integer(&sol_stream, sum.v_vforkpages);
+ sol_map_key(&sol_stream, "average", 7);
+ sol_map_float(&sol_stream, ((sum.v_vforks == 0) ?
+ 0.0 :
+ (double)sum.v_vforkpages / sum.v_vforks));
+ sol_map_end(&sol_stream);
+
+ sol_map_key(&sol_stream, "rfork", 5);
+ sol_map_start(&sol_stream);
+ sol_map_key(&sol_stream, "count", 5);
+ sol_map_integer(&sol_stream, sum.v_rforks);
+ sol_map_key(&sol_stream, "pages", 5);
+ sol_map_integer(&sol_stream, sum.v_rforkpages);
+ sol_map_key(&sol_stream, "average", 7);
+ sol_map_float(&sol_stream, ((sum.v_rforks == 0) ?
+ 0.0 :
+ (double)sum.v_rforkpages / sum.v_rforks));
+ sol_map_end(&sol_stream);
+
+ sol_map_end(&sol_stream);
+ }
+ else
+#endif
+ {
+ (void)printf("%u forks, %u pages, average %.2f\n",
+ sum.v_forks, sum.v_forkpages,
+ sum.v_forks == 0 ? 0.0 :
+ (double)sum.v_forkpages / sum.v_forks);
+ (void)printf("%u vforks, %u pages, average %.2f\n",
+ sum.v_vforks, sum.v_vforkpages,
+ sum.v_vforks == 0 ? 0.0 :
+ (double)sum.v_vforkpages / sum.v_vforks);
+ (void)printf("%u rforks, %u pages, average %.2f\n",
+ sum.v_rforks, sum.v_rforkpages,
+ sum.v_rforks == 0 ? 0.0 :
+ (double)sum.v_rforkpages / sum.v_rforks);
+ }
}
static void
@@ -1226,29 +1292,71 @@
memstat_strerror(error));
}
}
- printf("%13s %5s %6s %7s %8s Size(s)\n", "Type", "InUse", "MemUse",
- "HighUse", "Requests");
+
+#if defined(SOL_ON)
+ if (Oflag)
+ sol_map_start(&sol_stream);
+ else
+#endif
+ printf("%13s %5s %6s %7s %8s Size(s)\n", "Type", "InUse", "MemUse",
+ "HighUse", "Requests");
+
for (mtp = memstat_mtl_first(mtlp); mtp != NULL;
mtp = memstat_mtl_next(mtp)) {
if (memstat_get_numallocs(mtp) == 0 &&
memstat_get_count(mtp) == 0)
continue;
- printf("%13s %5" PRIu64 " %5" PRIu64 "K %7s %8" PRIu64 " ",
- memstat_get_name(mtp), memstat_get_count(mtp),
- (memstat_get_bytes(mtp) + 1023) / 1024, "-",
- memstat_get_numallocs(mtp));
- first = 1;
- for (i = 0; i < 32; i++) {
- if (memstat_get_sizemask(mtp) & (1 << i)) {
- if (!first)
- printf(",");
- printf("%d", 1 << (i + 4));
- first = 0;
+
+#if defined(SOL_ON)
+ if (Oflag)
+ {
+ const char *name = memstat_get_name(mtp);
+ sol_map_key(&sol_stream, name, strlen(name));
+ sol_map_start(&sol_stream);
+
+ sol_map_key(&sol_stream, "inuse", 5);
+ sol_map_integer(&sol_stream, memstat_get_count(mtp));
+
+ sol_map_key(&sol_stream, "memuse", 6);
+ sol_map_integer(&sol_stream, (memstat_get_bytes(mtp) + 1023) / 1024);
+
+ sol_map_key(&sol_stream, "requests", 8);
+ sol_map_integer(&sol_stream, memstat_get_numallocs(mtp));
+
+ sol_map_key(&sol_stream, "size", 4);
+ sol_array_start(&sol_stream);
+ for (i = 0; i < 32; i++)
+ if (memstat_get_sizemask(mtp) & (1 << i))
+ sol_integer(&sol_stream, 1 << (i + 4));
+ sol_array_end(&sol_stream);
+
+ sol_map_end(&sol_stream);
+ }
+ else
+#endif
+ {
+ printf("%13s %5" PRIu64 " %5" PRIu64 "K %7s %8" PRIu64 " ",
+ memstat_get_name(mtp), memstat_get_count(mtp),
+ (memstat_get_bytes(mtp) + 1023) / 1024, "-",
+ memstat_get_numallocs(mtp));
+
+ first = 1;
+ for (i = 0; i < 32; i++) {
+ if (memstat_get_sizemask(mtp) & (1 << i)) {
+ if (!first)
+ printf(",");
+ printf("%d", 1 << (i + 4));
+ first = 0;
+ }
}
+ printf("\n");
}
- printf("\n");
}
memstat_mtl_free(mtlp);
+
+#if defined(SOL_ON)
+ if (Oflag) sol_map_end(&sol_stream);
+#endif
}
static void
@@ -1350,7 +1458,7 @@
usage(void)
{
(void)fprintf(stderr, "%s%s",
- "usage: vmstat [-afHhimPsz] [-c count] [-M core [-N system]] [-w wait]\n",
+ "usage: vmstat [-afHhimPsz] [-c count] [-M core [-N system]] [-w wait] [-O]\n",
" [-n devs] [-p type,if,pass] [disks]\n");
exit(1);
}
More information about the svn-soc-all
mailing list