[collectd] [PATCH 1/3] perl plugin: Added support to dispatch notifications to Perl plugins.

Sebastian Harl sh at tokkee.org
Mon Jan 28 12:20:29 CET 2008


Perl plugin may now register a callback of type Collectd::TYPE_NOTIF which
accepts a single hash argument with the following members:

  severity
  time
  message
  host
  plugin
  plugin_instance
  type
  type_instance

Severity may be any of the following values (exported by the "notif" tag):

  Collectd::NOTIF_FAILURE
  Collectd::NOTIF_WARNING
  Collectd::NOTIF_OKAY

Signed-off-by: Sebastian Harl <sh at tokkee.org>
---
 bindings/perl/Collectd.pm |    9 ++++-
 src/perl.c                |   88 ++++++++++++++++++++++++++++++++++++++++++++-
 2 files changed, 95 insertions(+), 2 deletions(-)

diff --git a/bindings/perl/Collectd.pm b/bindings/perl/Collectd.pm
index 95a8a0a..e0700f0 100644
--- a/bindings/perl/Collectd.pm
+++ b/bindings/perl/Collectd.pm
@@ -50,6 +50,7 @@ our %EXPORT_TAGS = (
 			TYPE_WRITE
 			TYPE_SHUTDOWN
 			TYPE_LOG
+			TYPE_NOTIF
 			TYPE_DATASET
 	) ],
 	'ds_types' => [ qw(
@@ -68,6 +69,11 @@ our %EXPORT_TAGS = (
 			LOG_INFO
 			LOG_DEBUG
 	) ],
+	'notif' => [ qw(
+			NOTIF_FAILURE
+			NOTIF_WARNING
+			NOTIF_OKAY
+	) ],
 	'globals' => [ qw(
 			$hostname_g
 			$interval_g
@@ -89,7 +95,8 @@ my %types = (
 	TYPE_READ,     "read",
 	TYPE_WRITE,    "write",
 	TYPE_SHUTDOWN, "shutdown",
-	TYPE_LOG,      "log"
+	TYPE_LOG,      "log",
+	TYPE_NOTIF,    "notify"
 );
 
 foreach my $type (keys %types) {
diff --git a/src/perl.c b/src/perl.c
index b87d6b7..4fca92a 100644
--- a/src/perl.c
+++ b/src/perl.c
@@ -60,8 +60,9 @@
 #define PLUGIN_WRITE    2
 #define PLUGIN_SHUTDOWN 3
 #define PLUGIN_LOG      4
+#define PLUGIN_NOTIF    5
 
-#define PLUGIN_TYPES    5
+#define PLUGIN_TYPES    6
 
 #define PLUGIN_DATASET  255
 
@@ -143,6 +144,7 @@ struct {
 	{ "Collectd::TYPE_WRITE",      PLUGIN_WRITE },
 	{ "Collectd::TYPE_SHUTDOWN",   PLUGIN_SHUTDOWN },
 	{ "Collectd::TYPE_LOG",        PLUGIN_LOG },
+	{ "Collectd::TYPE_NOTIF",      PLUGIN_NOTIF },
 	{ "Collectd::TYPE_DATASET",    PLUGIN_DATASET },
 	{ "Collectd::DS_TYPE_COUNTER", DS_TYPE_COUNTER },
 	{ "Collectd::DS_TYPE_GAUGE",   DS_TYPE_GAUGE },
@@ -151,6 +153,9 @@ struct {
 	{ "Collectd::LOG_NOTICE",      LOG_NOTICE },
 	{ "Collectd::LOG_INFO",        LOG_INFO },
 	{ "Collectd::LOG_DEBUG",       LOG_DEBUG },
+	{ "Collectd::NOTIF_FAILURE",   NOTIF_FAILURE },
+	{ "Collectd::NOTIF_WARNING",   NOTIF_WARNING },
+	{ "Collectd::NOTIF_OKAY",      NOTIF_OKAY },
 	{ "", 0 }
 };
 
@@ -366,6 +371,43 @@ static int value_list2hv (pTHX_ value_list_t *vl, data_set_t *ds, HV *hash)
 	return 0;
 } /* static int value2av (value_list_t *, data_set_t *, HV *) */
 
+static int notification2hv (pTHX_ notification_t *n, HV *hash)
+{
+	if (NULL == hv_store (hash, "severity", 8, newSViv (n->severity), 0))
+		return -1;
+
+	if (0 != n->time)
+		if (NULL == hv_store (hash, "time", 4, newSViv (n->time), 0))
+			return -1;
+
+	if ('\0' != *n->message)
+		if (NULL == hv_store (hash, "message", 7, newSVpv (n->message, 0), 0))
+			return -1;
+
+	if ('\0' != *n->host)
+		if (NULL == hv_store (hash, "host", 4, newSVpv (n->host, 0), 0))
+			return -1;
+
+	if ('\0' != *n->plugin)
+		if (NULL == hv_store (hash, "plugin", 6, newSVpv (n->plugin, 0), 0))
+			return -1;
+
+	if ('\0' != *n->plugin_instance)
+		if (NULL == hv_store (hash, "plugin_instance", 15,
+				newSVpv (n->plugin_instance, 0), 0))
+			return -1;
+
+	if ('\0' != *n->type)
+		if (NULL == hv_store (hash, "type", 4, newSVpv (n->type, 0), 0))
+			return -1;
+
+	if ('\0' != *n->type_instance)
+		if (NULL == hv_store (hash, "type_instance", 13,
+				newSVpv (n->type_instance, 0), 0))
+			return -1;
+	return 0;
+} /* static int notification2hv (notification_t *, HV *) */
+
 /*
  * Internal functions.
  */
@@ -610,6 +652,30 @@ static int pplugin_call_all (pTHX_ int type, ...)
 		XPUSHs (sv_2mortal (newSViv (va_arg (ap, int))));
 		XPUSHs (sv_2mortal (newSVpv (va_arg (ap, char *), 0)));
 	}
+	else if (PLUGIN_NOTIF == type) {
+		/*
+		 * $_[0] =
+		 * {
+		 *   severity => $severity,
+		 *   time     => $time,
+		 *   message  => $msg,
+		 *   host     => $host,
+		 *   plugin   => $plugin,
+		 *   type     => $type,
+		 *   plugin_instance => $instance,
+		 *   type_instance   => $type_instance
+		 * };
+		 */
+		notification_t *n;
+		HV *notif = newHV ();
+
+		n = va_arg (ap, notification_t *);
+
+		if (-1 == notification2hv (aTHX_ n, notif))
+			return -1;
+
+		XPUSHs (sv_2mortal (newRV_noinc ((SV *)notif)));
+	}
 
 	PUTBACK;
 
@@ -994,6 +1060,25 @@ static void perl_log (int level, const char *msg)
 	return;
 } /* static void perl_log (int, const char *) */
 
+static int perl_notify (const notification_t *notif)
+{
+	dTHX;
+
+	if (NULL == perl_threads)
+		return 0;
+
+	if (NULL == aTHX) {
+		c_ithread_t *t = NULL;
+
+		pthread_mutex_lock (&perl_threads->mutex);
+		t = c_ithread_create (perl_threads->head->interp);
+		pthread_mutex_unlock (&perl_threads->mutex);
+
+		aTHX = t->interp;
+	}
+	return pplugin_call_all (aTHX_ PLUGIN_NOTIF, notif);
+} /* static int perl_notify (const notification_t *) */
+
 static int perl_shutdown (void)
 {
 	c_ithread_t *t = NULL;
@@ -1198,6 +1283,7 @@ static int init_pi (int argc, char **argv)
 	perl_run (aTHX);
 
 	plugin_register_log ("perl", perl_log);
+	plugin_register_notification ("perl", perl_notify);
 	plugin_register_init ("perl", perl_init);
 
 	plugin_register_read ("perl", perl_read);
-- 
1.5.4.rc4.23.gcab31

-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 189 bytes
Desc: Digital signature
Url : http://mailman.verplant.org/pipermail/collectd/attachments/20080128/5e03be51/attachment.pgp 


More information about the collectd mailing list