tested with: CFLAGS=-m64 against: collectd 4.10.2.

This patch will add a plugin that measures the percentage of cpu load
per container (zone) under Solaris 10 and higher. I will try and add
more per-zone measurements in the future, but in it's current form it
might be useful for some.

        me

-- 
        "Anyone who is capable of getting themselves made President 
        should on no account be allowed to do the job." 
                                        -- Some wisdom from The Book. 
diff -ru collectd-4.10.2/configure.in collectd-4.10.2.zone/configure.in
--- collectd-4.10.2/configure.in	Tue Mar 22 14:05:12 2011
+++ collectd-4.10.2.zone/configure.in	Tue Mar 22 14:32:27 2011
@@ -4006,6 +4006,7 @@
 plugin_vserver="no"
 plugin_wireless="no"
 plugin_zfs_arc="no"
+plugin_zone="no"
 
 # Linux
 if test "x$ac_system" = "xLinux"
@@ -4073,6 +4074,7 @@
 then
 	plugin_uptime="yes"
 	plugin_zfs_arc="yes"
+	plugin_zone="yes"
 fi
 
 if test "x$with_devinfo$with_kstat" = "xyesyes"
@@ -4361,6 +4363,7 @@
 AC_PLUGIN([write_http],  [$with_libcurl],      [HTTP output plugin])
 AC_PLUGIN([xmms],        [$with_libxmms],      [XMMS statistics])
 AC_PLUGIN([zfs_arc],     [$plugin_zfs_arc],    [ZFS ARC statistics])
+AC_PLUGIN([zone],        [$plugin_zone],       [Solaris container statistics])
 
 dnl Default configuration file
 # Load either syslog or logfile
@@ -4677,6 +4680,7 @@
     write_http  . . . . . $enable_write_http
     xmms  . . . . . . . . $enable_xmms
     zfs_arc . . . . . . . $enable_zfs_arc
+    zone  . . . . . . . . $enable_zone
 
 EOF
 
diff -ru collectd-4.10.2/src/Makefile.am collectd-4.10.2.zone/src/Makefile.am
--- collectd-4.10.2/src/Makefile.am	Sat Nov 27 11:10:38 2010
+++ collectd-4.10.2.zone/src/Makefile.am	Tue Mar 15 10:18:22 2011
@@ -1202,6 +1202,15 @@
 collectd_DEPENDENCIES += zfs_arc.la
 endif
 
+if BUILD_PLUGIN_ZONE
+pkglib_LTLIBRARIES += zone.la
+zone_la_SOURCES = zone.c
+zone_la_CFLAGS = $(AM_CFLAGS)
+zone_la_LDFLAGS = -module -avoid-version
+collectd_LDADD += "-dlopen" zone.la
+collectd_DEPENDENCIES += zone.la
+endif
+
 dist_man_MANS = collectd.1 \
 		collectd.conf.5 \
 		collectd-email.5 \
diff -ru collectd-4.10.2/src/collectd.conf.in collectd-4.10.2.zone/src/collectd.conf.in
--- collectd-4.10.2/src/collectd.conf.in	Sat Nov 27 11:10:38 2010
+++ collectd-4.10.2.zone/src/collectd.conf.in	Tue Mar 15 11:16:01 2011
@@ -139,6 +139,7 @@
 #@BUILD_PLUGIN_WRITE_HTTP_TRUE@LoadPlugin write_http
 #@BUILD_PLUGIN_XMMS_TRUE@LoadPlugin xmms
 #@BUILD_PLUGIN_ZFS_ARC_TRUE@LoadPlugin zfs_arc
+#@BUILD_PLUGIN_ZONE_TRUE@LoadPlugin zone
 
 ##############################################################################
 # Plugin configuration                                                       #
diff -ru collectd-4.10.2/src/config.h.in collectd-4.10.2.zone/src/config.h.in
--- collectd-4.10.2/src/config.h.in	Tue Mar 22 14:10:27 2011
+++ collectd-4.10.2.zone/src/config.h.in	Tue Mar 22 14:37:42 2011
@@ -853,6 +853,9 @@
 /* Define to 1 if the zfs_arc plugin is enabled. */
 #undef HAVE_PLUGIN_ZFS_ARC
 
+/* Define to 1 if the zone plugin is enabled. */
+#undef HAVE_PLUGIN_ZONE
+
 /* Define to 1 if you have the <poll.h> header file. */
 #undef HAVE_POLL_H
 
diff -ru collectd-4.10.2/src/types.db collectd-4.10.2.zone/src/types.db
--- collectd-4.10.2/src/types.db	Sat Nov 27 11:10:38 2010
+++ collectd-4.10.2.zone/src/types.db	Fri Mar 18 14:50:10 2011
@@ -171,3 +171,4 @@
 vs_memory		value:GAUGE:0:9223372036854775807
 vs_processes		value:GAUGE:0:65535
 vs_threads		value:GAUGE:0:65535
+zone_cpu		value:GAUGE:0:100.1
--- /dev/null	Wed Mar 23 14:33:07 2011
+++ collectd-4.10.2.zone/src/zone.c	Tue Mar 22 14:42:39 2011
@@ -1,0 +1,191 @@
+/**
+ * collectd - src/zone.c
+ * Copyright (C) 2011       Mathijs Mohlmann
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; only version 2 of the License is applicable.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin St, Fifth Floor, Boston, MA  02110-1301 USA
+ *
+ * Authors:
+ *   Mathijs Mohlmann
+ **/
+
+#define _BSD_SOURCE
+
+#include "collectd.h"
+#include "common.h"
+#include "plugin.h"
+
+#include <sys/types.h>
+#include <sys/vm_usage.h>
+#include <procfs.h>
+#include <zone.h>
+
+#include "utils_avltree.h"
+
+#define	MAX_PROCFS_PATH	40
+#define MAX_ZONE_NAME 20
+#define FRC2PCT(pp)(((float)(pp))/0x8000*100)
+
+typedef struct zone_stats {
+	ushort_t      pctcpu;
+	ushort_t      pctmem;
+} zone_stats_t;
+
+static long pagesize;
+
+static int
+zone_compare(const zoneid_t *a, const zoneid_t *b)
+{
+	if (*a == *b)
+		return(0);
+	if (*a < *b)
+		return(-1);
+	return(1);
+}
+
+static int
+zone_read_procfile(char *pidstr, char *file, void *buf, size_t bufsize)
+{
+	int fd;
+
+	char procfile[MAX_PROCFS_PATH];
+	(void)snprintf(procfile, MAX_PROCFS_PATH, "/proc/%s/%s", pidstr, file);
+	while ((fd = open(procfile, O_RDONLY)) == -1) {
+		if ((errno != EMFILE) || (errno != ENFILE)) {
+			return(1);
+		}
+	}
+
+	if (pread(fd, buf, bufsize, 0) != bufsize) {
+		close(fd);
+		return (1);
+	}
+	close(fd);
+	return (0);
+}
+
+static int
+zone_submit_value(char *zone, gauge_t value)
+{
+	value_list_t vl = VALUE_LIST_INIT;
+	value_t      values[1];
+
+	values[0].gauge = value;
+
+	vl.values = values;
+	vl.values_len = 1; /*STATIC_ARRAY_SIZE (values);*/
+	sstrncpy (vl.host, hostname_g, sizeof (vl.host));
+	sstrncpy (vl.plugin, "zone", sizeof (vl.plugin));
+ 	sstrncpy (vl.type, "zone_cpu", sizeof (vl.type));
+ 	sstrncpy (vl.type_instance, zone, sizeof (vl.type_instance));
+
+	return(plugin_dispatch_values (&vl));
+}
+
+static zone_stats_t *
+zone_find_stats(c_avl_tree_t *tree, zoneid_t zoneid)
+{
+	zone_stats_t *ret = NULL;
+	zoneid_t     *key = NULL;
+
+	if (c_avl_get(tree, (void **)&zoneid, (void **)&ret)) {
+		if (!(ret = malloc(sizeof(zone_stats_t)))) {
+			WARNING("no memory");
+			return(NULL);
+		}
+		if (!(key = malloc(sizeof(zoneid_t)))) {
+			WARNING("no memory");
+			return(NULL);
+		}
+		*key = zoneid;
+		if (c_avl_insert(tree, key, ret)) {
+			WARNING("error inserting into tree");
+			return(NULL);
+		}
+	}
+	return(ret);
+}
+
+static void
+zone_submit_values(c_avl_tree_t *tree)
+{
+	char          zonename[MAX_ZONE_NAME];
+	zoneid_t     *zoneid = NULL;
+	zone_stats_t *stats  = NULL;
+
+	while (c_avl_pick (tree, (void **)&zoneid, (void **)&stats) == 0)
+	{
+		getzonenamebyid(*zoneid, zonename, MAX_ZONE_NAME-1);
+		zone_submit_value(zonename, (gauge_t)FRC2PCT(stats->pctcpu));
+		free(stats);
+		free(zoneid);
+	}
+	c_avl_destroy(tree);
+}
+
+static c_avl_tree_t *
+zone_scandir(DIR *procdir)
+{
+	char         *pidstr;
+	pid_t         pid;
+	dirent_t     *direntp;
+	psinfo_t      psinfo;
+	c_avl_tree_t *tree;
+	zone_stats_t *stats;
+/*	size_t    physmem = sysconf(_SC_PHYS_PAGES) * pagesize;*/
+
+	if (!(tree=c_avl_create((int (*)
+				 (const void *, const void *))zone_compare))) {
+		WARNING("Failed to create tree");
+		return(NULL);
+	}
+
+	for (rewinddir(procdir); (direntp = readdir(procdir)); ) {
+		pidstr = direntp->d_name;
+		if (pidstr[0] == '.')	/* skip "." and ".."  */
+			continue;
+		pid = atoi(pidstr);
+		if (pid == 0 || pid == 2 || pid == 3)
+			continue;	/* skip sched, pageout and fsflush */
+		if (zone_read_procfile(pidstr, "psinfo", &psinfo, 
+				  sizeof(psinfo_t)) != 0)
+			continue;
+		stats = zone_find_stats(tree, psinfo.pr_zoneid);
+		stats->pctcpu += psinfo.pr_pctcpu;
+		stats->pctmem += psinfo.pr_pctmem;
+	}
+	return(tree);
+}
+
+
+static int zone_read (void)
+{
+	DIR          *procdir;
+	c_avl_tree_t *tree;
+
+	pagesize = sysconf(_SC_PAGESIZE);
+	if ((procdir = opendir("/proc")) == NULL) {
+		ERROR("cannot open /proc directory\n");
+		exit(1);
+	}
+
+	tree=zone_scandir(procdir);
+	closedir(procdir);
+	zone_submit_values(tree); /* this also frees tree */
+	return (0);
+}
+
+void module_register (void)
+{
+	plugin_register_read ("zone", zone_read);
+} /* void module_register */

Attachment: signature.asc
Description: Digital signature

_______________________________________________
collectd mailing list
collectd@verplant.org
http://mailman.verplant.org/listinfo/collectd

Reply via email to