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 */
signature.asc
Description: Digital signature
_______________________________________________ collectd mailing list [email protected] http://mailman.verplant.org/listinfo/collectd
