Date: Sat, 24 Nov 2012 18:30:13 GMT From: Paul Guyot <pguyot@kallisys.net> To: FreeBSD-gnats-submit@FreeBSD.org Subject: ports/173894: [PATCH] net-mgmt/collectd5: enable users and zfs_arc plugins Message-ID: <201211241830.qAOIUDtd031217@excelsa.semiocast.net> Resent-Message-ID: <201211241840.qAOIe0J9059587@freefall.freebsd.org>
next in thread | raw e-mail | index | archive | help
>Number: 173894 >Category: ports >Synopsis: [PATCH] net-mgmt/collectd5: enable users and zfs_arc plugins >Confidential: no >Severity: non-critical >Priority: low >Responsible: freebsd-ports-bugs >State: open >Quarter: >Keywords: >Date-Required: >Class: change-request >Submitter-Id: current-users >Arrival-Date: Sat Nov 24 18:40:00 UTC 2012 >Closed-Date: >Last-Modified: >Originator: Paul Guyot >Release: FreeBSD 9.1-PRERELEASE amd64 >Organization: Semiocast >Environment: System: FreeBSD excelsa.semiocast.net 9.1-PRERELEASE FreeBSD 9.1-PRERELEASE #0: Tue Nov 20 14:52:12 UTC 2012 root@excelsa.semiocast.net:/usr/obj/usr/src/sys/GENERIC amd64 >Description: The attached patch does the following: - enable users plugin, which works as is; - enable zfs_arc plugin, which has been ported to FreeBSD (patch has also been submitted upstream); - make write_graphite optional, allowing it as the single output plugin (otherwise, at least another output plugin is required). The port epoch hasn't been updated. The patch includes a new file (to be added in svn): files/patch-src__zfs_arc.c >How-To-Repeat: >Fix: --- collectd5.diff begins here --- diff -Nru /usr/ports/net-mgmt/collectd5/Makefile freebsd-collectd5-port/Makefile --- /usr/ports/net-mgmt/collectd5/Makefile 2012-11-17 06:00:31.000000000 +0000 +++ freebsd-collectd5-port/Makefile 2012-11-24 17:58:06.465128352 +0000 @@ -23,7 +23,7 @@ OPTIONS_DEFINE= CGI BIND DEBUG GCRYPT VIRT OPTIONS_MULTI= INPUT OUTPUT -OPTIONS_MULTI_OUTPUT= RRDTOOL RRDCACHED WRITE_HTTP +OPTIONS_MULTI_OUTPUT= RRDTOOL RRDCACHED WRITE_GRAPHITE WRITE_HTTP OPTIONS_MULTI_INPUT= APACHE APCUPS CURL CURL_JSON CURL_XML DBI DISK \ GCRYPT NUTUPS INTERFACE MBMON MEMCACHED MYSQL NGINX OPENVPN \ PDNS PGSQL PING PYTHON ROUTEROS SNMP TOKYOTYRANT XMMS @@ -60,6 +60,7 @@ # OUTPUT RRDTOOL_DESC= RRDTool RRDCACHED_DESC= RRDTool Cached (requires RRDTOOL) +WRITE_GRAPHITE_DESC= write_graphite WRITE_HTTP_DESC= write_http MAN1= collectd.1 collectd-nagios.1 collectdmon.1 collectdctl.1 @@ -133,11 +134,9 @@ --disable-teamspeak2 \ --disable-ted \ --disable-thermal \ - --disable-users \ --disable-vmem \ --disable-vserver \ --disable-wireless \ - --disable-zfs_arc \ --without-perl-bindings \ --without-librabbitmq \ --disable-varnish \ @@ -405,6 +404,14 @@ PLIST_SUB+= VIRT="@comment " .endif +.if ${PORT_OPTIONS:MWRITE_GRAPHITE} +CONFIGURE_ARGS+=--enable-write_graphite +PLIST_SUB+= WRITE_GRAPHITE="" +.else +CONFIGURE_ARGS+=--disable-write_graphite +PLIST_SUB+= WRITE_GRAPHITE="@comment " +.endif + .if ${PORT_OPTIONS:MWRITE_HTTP} CONFIGURE_ARGS+=--enable-write_http PLIST_SUB+= WRITE_HTTP="" diff -Nru /usr/ports/net-mgmt/collectd5/files/patch-configure.in freebsd-collectd5-port/files/patch-configure.in --- /usr/ports/net-mgmt/collectd5/files/patch-configure.in 2012-04-12 05:56:09.000000000 +0000 +++ freebsd-collectd5-port/files/patch-configure.in 2012-11-24 17:58:06.206512805 +0000 @@ -1,6 +1,16 @@ ---- configure.in.orig 2011-10-14 12:49:49.000000000 -0800 -+++ configure.in 2012-03-20 08:09:25.000000000 -0800 -@@ -98,7 +98,7 @@ +--- configure.in.orig 2012-04-02 08:04:58.000000000 +0000 ++++ configure.in 2012-11-23 22:00:22.424129087 +0000 +@@ -67,6 +67,9 @@ + *openbsd*) + ac_system="OpenBSD" + ;; ++ *freebsd*) ++ ac_system="FreeBSD" ++ ;; + *aix*) + AC_DEFINE([KERNEL_AIX], 1, [True if program is to be compiled for a AIX kernel]) + ac_system="AIX" +@@ -98,7 +101,7 @@ fi # Where to install .pc files. @@ -9,7 +19,24 @@ AC_SUBST(pkgconfigdir) # Check for standards compliance mode -@@ -1745,9 +1745,6 @@ +@@ -1378,6 +1381,7 @@ + then + AC_CHECK_LIB(kstat, kstat_open, [with_kstat="yes"], [with_kstat="no (libkstat not found)"], []) + fi ++ + if test "x$with_kstat" = "xyes" + then + AC_CHECK_LIB(devinfo, di_init, [with_devinfo="yes"], [with_devinfo="no (not found)"], []) +@@ -1387,6 +1391,8 @@ + then + AC_DEFINE(HAVE_LIBKSTAT, 1, + [Define to 1 if you have the 'kstat' library (-lkstat)]) ++ BUILD_WITH_LIBKSTAT_LIBS="-lkstat" ++ AC_SUBST(BUILD_WITH_LIBKSTAT_LIBS) + fi + AM_CONDITIONAL(BUILD_WITH_LIBKSTAT, test "x$with_kstat" = "xyes") + AM_CONDITIONAL(BUILD_WITH_LIBDEVINFO, test "x$with_devinfo" = "xyes") +@@ -1807,9 +1813,6 @@ [with_libgcrypt="yes"], [with_libgcrypt="no (symbol gcry_md_hash_buffer not found)"]) @@ -19,7 +46,7 @@ fi CPPFLAGS="$SAVE_CPPFLAGS" -@@ -3165,7 +3162,7 @@ +@@ -3297,7 +3300,7 @@ if test "x$with_python" = "xyes" then AC_MSG_CHECKING([for Python LIBS]) @@ -28,7 +55,7 @@ python_config_status=$? if test "$python_config_status" -ne 0 || test "x$python_library_flags" = "x" -@@ -3180,7 +3177,7 @@ +@@ -3312,7 +3315,7 @@ if test "x$with_python" = "xyes" then LDFLAGS="-L$python_library_path $LDFLAGS" @@ -37,3 +64,16 @@ AC_CHECK_FUNC(PyObject_CallFunction, [with_python="yes"], +@@ -4580,6 +4583,12 @@ + plugin_zfs_arc="yes" + fi + ++# FreeBSD ++if test "x$ac_system" = "xFreeBSD" ++then ++ plugin_zfs_arc="yes" ++fi ++ + if test "x$with_devinfo$with_kstat" = "xyesyes" + then + plugin_cpu="yes" diff -Nru /usr/ports/net-mgmt/collectd5/files/patch-src__Makefile.am freebsd-collectd5-port/files/patch-src__Makefile.am --- /usr/ports/net-mgmt/collectd5/files/patch-src__Makefile.am 2012-01-09 21:13:48.000000000 +0000 +++ freebsd-collectd5-port/files/patch-src__Makefile.am 2012-11-24 17:58:06.206512805 +0000 @@ -1,6 +1,87 @@ ---- src/Makefile.am.orig 2012-01-08 16:05:12.000000000 +0100 -+++ src/Makefile.am 2012-01-08 16:05:53.000000000 +0100 -@@ -1337,12 +1337,7 @@ +--- src/Makefile.am.orig 2012-04-02 08:04:58.000000000 +0000 ++++ src/Makefile.am 2012-11-23 22:01:15.169498221 +0000 +@@ -63,7 +63,7 @@ + collectd_LDADD += -lpthread + endif + if BUILD_WITH_LIBKSTAT +-collectd_LDADD += -lkstat ++collectd_LDADD += $(BUILD_WITH_LIBKSTAT_LIBS) + endif + if BUILD_WITH_LIBDEVINFO + collectd_LDADD += -ldevinfo +@@ -224,7 +224,7 @@ + cpu_la_LDFLAGS = -module -avoid-version + cpu_la_LIBADD = + if BUILD_WITH_LIBKSTAT +-cpu_la_LIBADD += -lkstat ++cpu_la_LIBADD += $(BUILD_WITH_LIBKSTAT_LIBS) + endif + if BUILD_WITH_LIBDEVINFO + cpu_la_LIBADD += -ldevinfo +@@ -322,7 +322,7 @@ + disk_la_LDFLAGS = -module -avoid-version + disk_la_LIBADD = + if BUILD_WITH_LIBKSTAT +-disk_la_LIBADD += -lkstat ++disk_la_LIBADD += $(BUILD_WITH_LIBKSTAT_LIBS) + endif + if BUILD_WITH_LIBDEVINFO + disk_la_LIBADD += -ldevinfo +@@ -429,7 +429,7 @@ + interface_la_LIBADD += $(BUILD_WITH_LIBSTATGRAB_LDFLAGS) + else + if BUILD_WITH_LIBKSTAT +-interface_la_LIBADD += -lkstat ++interface_la_LIBADD += $(BUILD_WITH_LIBKSTAT_LIBS) + endif + if BUILD_WITH_LIBDEVINFO + interface_la_LIBADD += -ldevinfo +@@ -634,7 +634,7 @@ + collectd_LDADD += "-dlopen" memory.la + collectd_DEPENDENCIES += memory.la + if BUILD_WITH_LIBKSTAT +-memory_la_LIBADD += -lkstat ++memory_la_LIBADD += $(BUILD_WITH_LIBKSTAT_LIBS) + endif + if BUILD_WITH_LIBDEVINFO + memory_la_LIBADD += -ldevinfo +@@ -1021,7 +1021,7 @@ + collectd_LDADD += "-dlopen" swap.la + collectd_DEPENDENCIES += swap.la + if BUILD_WITH_LIBKSTAT +-swap_la_LIBADD += -lkstat ++swap_la_LIBADD += $(BUILD_WITH_LIBKSTAT_LIBS) + endif + if BUILD_WITH_LIBDEVINFO + swap_la_LIBADD += -ldevinfo +@@ -1067,7 +1067,7 @@ + pkglib_LTLIBRARIES += tape.la + tape_la_SOURCES = tape.c + tape_la_LDFLAGS = -module -avoid-version +-tape_la_LIBADD = -lkstat -ldevinfo ++tape_la_LIBADD = $(BUILD_WITH_LIBKSTAT_LIBS) -ldevinfo + collectd_LDADD += "-dlopen" tape.la + collectd_DEPENDENCIES += tape.la + endif +@@ -1190,7 +1190,7 @@ + uptime_la_LDFLAGS = -module -avoid-version + uptime_la_LIBADD = + if BUILD_WITH_LIBKSTAT +-uptime_la_LIBADD += -lkstat ++uptime_la_LIBADD += $(BUILD_WITH_LIBKSTAT_LIBS) + endif + collectd_LDADD += "-dlopen" uptime.la + collectd_DEPENDENCIES += uptime.la +@@ -1313,7 +1313,7 @@ + zfs_arc_la_SOURCES = zfs_arc.c + zfs_arc_la_CFLAGS = $(AM_CFLAGS) + zfs_arc_la_LDFLAGS = -module -avoid-version +-zfs_arc_la_LIBADD = -lkstat ++zfs_arc_la_LIBADD = $(BUILD_WITH_LIBKSTAT_LIBS) + collectd_LDADD += "-dlopen" zfs_arc.la + collectd_DEPENDENCIES += zfs_arc.la + endif +@@ -1374,12 +1374,7 @@ install-exec-hook: $(mkinstalldirs) $(DESTDIR)$(sysconfdir) diff -Nru /usr/ports/net-mgmt/collectd5/files/patch-src__zfs_arc.c freebsd-collectd5-port/files/patch-src__zfs_arc.c --- /usr/ports/net-mgmt/collectd5/files/patch-src__zfs_arc.c 1970-01-01 00:00:00.000000000 +0000 +++ freebsd-collectd5-port/files/patch-src__zfs_arc.c 2012-11-24 17:58:06.207128973 +0000 @@ -0,0 +1,232 @@ +--- src/zfs_arc.c.orig 2012-04-02 08:04:58.000000000 +0000 ++++ src/zfs_arc.c 2012-11-24 17:54:21.715129054 +0000 +@@ -25,11 +25,57 @@ + #include "common.h" + #include "plugin.h" + ++#if !defined(HAVE_LIBKSTAT) && defined(HAVE_SYSCTLBYNAME) ++#include <sys/sysctl.h> ++#endif ++ + /* + * Global variables + */ +-static kstat_t *ksp; ++#if defined(HAVE_LIBKSTAT) + extern kstat_ctl_t *kc; ++#endif ++ ++/* ++ * Context ++ */ ++struct za_context { ++#if defined(HAVE_LIBKSTAT) ++ kstat_t *ksp; ++#endif ++}; ++ ++static int za_init_context(struct za_context *ctx) ++{ ++#if defined(HAVE_LIBKSTAT) ++ get_kstat (&ctx->ksp, "zfs", 0, "arcstats"); ++ if (ctx->ksp == NULL) ++ { ++ ERROR ("zfs_arc plugin: Cannot find zfs:0:arcstats kstat."); ++ return (-1); ++ } ++#endif ++ return 0; ++} ++ ++static long long za_get_value(struct za_context *ctx, const char* name) ++{ ++#if defined(HAVE_LIBKSTAT) ++ return get_kstat_value(ctx->ksp, name); ++#elif defined(HAVE_SYSCTLBYNAME) ++ // kstat values are available on FreeBSD through sysctl ++ char fullname[512]; ++ long long result = 0; ++ size_t size = sizeof(result); ++ ssnprintf(fullname, sizeof(fullname), "kstat.zfs.misc.arcstats.%s", name); ++ if (sysctlbyname(fullname, &result, &size, NULL, 0) != 0 || size != sizeof(result)) ++ { ++ ERROR ("zfs_arc plugin: Cannot find stats using sysctl"); ++ result = 0; ++ } ++ return result; ++#endif ++} + + static void za_submit (const char* type, const char* type_instance, value_t* values, int values_len) + { +@@ -54,13 +100,13 @@ + za_submit (type, type_instance, &vv, 1); + } + +-static int za_read_derive (kstat_t *ksp, const char *kstat_value, ++static int za_read_derive (struct za_context *ctx, const char *kstat_value, + const char *type, const char *type_instance) + { + long long tmp; + value_t v; + +- tmp = get_kstat_value (ksp, kstat_value); ++ tmp = za_get_value (ctx, (char *)kstat_value); + if (tmp == -1LL) + { + ERROR ("zfs_arc plugin: Reading kstat value \"%s\" failed.", kstat_value); +@@ -69,15 +115,16 @@ + + v.derive = (derive_t) tmp; + za_submit (type, type_instance, /* values = */ &v, /* values_num = */ 1); ++ return (0); + } + +-static int za_read_gauge (kstat_t *ksp, const char *kstat_value, ++static int za_read_gauge (struct za_context *ctx, const char *kstat_value, + const char *type, const char *type_instance) + { + long long tmp; + value_t v; + +- tmp = get_kstat_value (ksp, kstat_value); ++ tmp = za_get_value (ctx, (char *)kstat_value); + if (tmp == -1LL) + { + ERROR ("zfs_arc plugin: Reading kstat value \"%s\" failed.", kstat_value); +@@ -86,18 +133,14 @@ + + v.gauge = (gauge_t) tmp; + za_submit (type, type_instance, /* values = */ &v, /* values_num = */ 1); ++ return (0); + } + +-static void za_submit_ratio (const char* type_instance, gauge_t hits, gauge_t misses) ++static void za_submit_ratio (const char* type_instance, long long hits, long long misses) + { + gauge_t ratio = NAN; + +- if (!isfinite (hits) || (hits < 0.0)) +- hits = 0.0; +- if (!isfinite (misses) || (misses < 0.0)) +- misses = 0.0; +- +- if ((hits != 0.0) || (misses != 0.0)) ++ if ((hits > 0) || (misses > 0)) + ratio = hits / (hits + misses); + + za_submit_gauge ("cache_ratio", type_instance, ratio); +@@ -105,56 +148,55 @@ + + static int za_read (void) + { +- gauge_t arc_hits, arc_misses, l2_hits, l2_misses; ++ long long arc_hits, arc_misses, l2_hits, l2_misses; + value_t l2_io[2]; ++ struct za_context ctx; + +- get_kstat (&ksp, "zfs", 0, "arcstats"); +- if (ksp == NULL) ++ if (za_init_context (&ctx) < 0) + { +- ERROR ("zfs_arc plugin: Cannot find zfs:0:arcstats kstat."); + return (-1); + } + + /* Sizes */ +- za_read_gauge (ksp, "size", "cache_size", "arc"); +- za_read_gauge (ksp, "l2_size", "cache_size", "L2"); ++ za_read_gauge (&ctx, "size", "cache_size", "arc"); ++ za_read_gauge (&ctx, "l2_size", "cache_size", "L2"); + +- /* Operations */ +- za_read_derive (ksp, "allocated","cache_operation", "allocated"); +- za_read_derive (ksp, "deleted", "cache_operation", "deleted"); +- za_read_derive (ksp, "stolen", "cache_operation", "stolen"); +- +- /* Issue indicators */ +- za_read_derive (ksp, "mutex_miss", "mutex_operation", "miss"); +- za_read_derive (ksp, "hash_collisions", "hash_collisions", ""); ++ /* Operations */ ++ za_read_derive (&ctx, "allocated","cache_operation", "allocated"); ++ za_read_derive (&ctx, "deleted", "cache_operation", "deleted"); ++ za_read_derive (&ctx, "stolen", "cache_operation", "stolen"); ++ ++ /* Issue indicators */ ++ za_read_derive (&ctx, "mutex_miss", "mutex_operation", "miss"); ++ za_read_derive (&ctx, "hash_collisions", "hash_collisions", ""); + +- /* Evictions */ +- za_read_derive (ksp, "evict_l2_cached", "cache_eviction", "cached"); +- za_read_derive (ksp, "evict_l2_eligible", "cache_eviction", "eligible"); +- za_read_derive (ksp, "evict_l2_ineligible", "cache_eviction", "ineligible"); ++ /* Evictions */ ++ za_read_derive (&ctx, "evict_l2_cached", "cache_eviction", "cached"); ++ za_read_derive (&ctx, "evict_l2_eligible", "cache_eviction", "eligible"); ++ za_read_derive (&ctx, "evict_l2_ineligible", "cache_eviction", "ineligible"); + + /* Hits / misses */ +- za_read_derive (ksp, "demand_data_hits", "cache_result", "demand_data-hit"); +- za_read_derive (ksp, "demand_metadata_hits", "cache_result", "demand_metadata-hit"); +- za_read_derive (ksp, "prefetch_data_hits", "cache_result", "prefetch_data-hit"); +- za_read_derive (ksp, "prefetch_metadata_hits", "cache_result", "prefetch_metadata-hit"); +- za_read_derive (ksp, "demand_data_misses", "cache_result", "demand_data-miss"); +- za_read_derive (ksp, "demand_metadata_misses", "cache_result", "demand_metadata-miss"); +- za_read_derive (ksp, "prefetch_data_misses", "cache_result", "prefetch_data-miss"); +- za_read_derive (ksp, "prefetch_metadata_misses", "cache_result", "prefetch_metadata-miss"); ++ za_read_derive (&ctx, "demand_data_hits", "cache_result", "demand_data-hit"); ++ za_read_derive (&ctx, "demand_metadata_hits", "cache_result", "demand_metadata-hit"); ++ za_read_derive (&ctx, "prefetch_data_hits", "cache_result", "prefetch_data-hit"); ++ za_read_derive (&ctx, "prefetch_metadata_hits", "cache_result", "prefetch_metadata-hit"); ++ za_read_derive (&ctx, "demand_data_misses", "cache_result", "demand_data-miss"); ++ za_read_derive (&ctx, "demand_metadata_misses", "cache_result", "demand_metadata-miss"); ++ za_read_derive (&ctx, "prefetch_data_misses", "cache_result", "prefetch_data-miss"); ++ za_read_derive (&ctx, "prefetch_metadata_misses", "cache_result", "prefetch_metadata-miss"); + + /* Ratios */ +- arc_hits = (gauge_t) get_kstat_value(ksp, "hits"); +- arc_misses = (gauge_t) get_kstat_value(ksp, "misses"); +- l2_hits = (gauge_t) get_kstat_value(ksp, "l2_hits"); +- l2_misses = (gauge_t) get_kstat_value(ksp, "l2_misses"); ++ arc_hits = za_get_value (&ctx, "hits"); ++ arc_misses = za_get_value (&ctx, "misses"); ++ l2_hits = za_get_value (&ctx, "l2_hits"); ++ l2_misses = za_get_value (&ctx, "l2_misses"); + + za_submit_ratio ("arc", arc_hits, arc_misses); + za_submit_ratio ("L2", l2_hits, l2_misses); + + /* I/O */ +- l2_io[0].derive = get_kstat_value(ksp, "l2_read_bytes"); +- l2_io[1].derive = get_kstat_value(ksp, "l2_write_bytes"); ++ l2_io[0].derive = za_get_value (&ctx, "l2_read_bytes"); ++ l2_io[1].derive = za_get_value (&ctx, "l2_write_bytes"); + + za_submit ("io_octets", "L2", l2_io, /* num values = */ 2); + +@@ -163,14 +205,23 @@ + + static int za_init (void) /* {{{ */ + { +- ksp = NULL; +- ++#if defined(HAVE_LIBKSTAT) + /* kstats chain already opened by update_kstat (using *kc), verify everything went fine. */ + if (kc == NULL) + { + ERROR ("zfs_arc plugin: kstat chain control structure not available."); + return (-1); + } ++#elif defined(HAVE_SYSCTLBYNAME) ++ /* make sure ARC is available (arc_size is not null) */ ++ unsigned long long arc_size; ++ size_t size = sizeof(arc_size); ++ if (sysctlbyname("kstat.zfs.misc.arcstats.size", &arc_size, &size, NULL, 0) != 0 || arc_size == 0) ++ { ++ ERROR ("zfs_arc plugin: could not get ARC size using sysctl, is ARC enabled?"); ++ return (-1); ++ } ++#endif + + return (0); + } /* }}} int za_init */ diff -Nru /usr/ports/net-mgmt/collectd5/pkg-plist freebsd-collectd5-port/pkg-plist --- /usr/ports/net-mgmt/collectd5/pkg-plist 2012-09-13 13:04:44.000000000 +0000 +++ freebsd-collectd5-port/pkg-plist 2012-11-24 17:58:06.465128352 +0000 @@ -103,12 +103,16 @@ lib/collectd/unixsock.so lib/collectd/uptime.la lib/collectd/uptime.so +lib/collectd/users.la +lib/collectd/users.so lib/collectd/uuid.la lib/collectd/uuid.so %%VIRT%%lib/collectd/libvirt.la %%VIRT%%lib/collectd/libvirt.so -lib/collectd/write_graphite.so -lib/collectd/write_graphite.la +%%WRITE_GRAPHITE%%lib/collectd/write_graphite.so +%%WRITE_GRAPHITE%%lib/collectd/write_graphite.la +lib/collectd/zfs_arc.la +lib/collectd/zfs_arc.so lib/libcollectdclient.la lib/libcollectdclient.so lib/libcollectdclient.so.0 --- collectd5.diff ends here --- >Release-Note: >Audit-Trail: >Unformatted:
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201211241830.qAOIUDtd031217>