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