[collectd] Additonal mode: log

Christophe Kalt collectd at klb.taranis.org
Mon Apr 10 21:28:32 CEST 2006


Hi,

The attached diff adds a new mode to collectd: Log
This mode is the same as Local except that the data is not
stored in RRD files, but in logged in text form.  One file is
created per day.

I hope you will integrate this in the next release.  This
would allow me to drop collectd in as a replacement for Orca
which has been problematic lately.

Thanks!
Christophe
-------------- next part --------------
diff -ru collectd-3.8.4/src/collectd.1 collectd-3.8.4+log/src/collectd.1
--- collectd-3.8.4/src/collectd.1	2006-04-09 10:07:18.000000000 -0400
+++ collectd-3.8.4+log/src/collectd.1	2006-04-10 15:22:16.362617000 -0400
@@ -198,16 +198,17 @@
 written in \s-1RRD\s0 files that reside in \fIDataDir\fR. This is the default mode when
 collectd is linked against \f(CW\*(C`librrd\*(C'\fR.
 .PP
-The other two modes, \fBclient mode\fR and \fBserver mode\fR, are used to send data
+Two other modes, \fBclient mode\fR and \fBserver mode\fR, are used to send data
 over a network and receive it again.
 .PP
-In \fBclient mode\fR the daemon collects the data locally and sends it's results
-to one or more network addresses. No \s-1RRD\s0 files are written in this case. This
-is the only mode available if collectd is not linked against \f(CW\*(C`librrd\*(C'\fR.
-.PP
+In \fBclient mode\fR the daemon collects the data locally and sends its results
+to one or more network addresses. No \s-1RRD\s0 files are written in this case. .PP
 If started in \fBserver mode\fR the daemon will listen on one or more interfaces
 and write the data it receives to \s-1RRD\s0 files. No data is collected locally.
 .PP
+In the last mode, \fBlog mode\fR, data is collected locally and written in
+text files that reside in \fIDataDir\fR.
+.PP
 Please refer to \fIcollectd.conf\fR\|(5) for the configuration options and default
 values.
 .SH "SPECIAL PLUGINS"
diff -ru collectd-3.8.4/src/collectd.c collectd-3.8.4+log/src/collectd.c
--- collectd-3.8.4/src/collectd.c	2006-04-09 10:07:17.000000000 -0400
+++ collectd-3.8.4+log/src/collectd.c	2006-04-10 12:38:41.955966000 -0400
@@ -42,9 +42,7 @@
  */
 time_t curtime;
 
-#if HAVE_LIBRRD
 int operating_mode;
-#endif
 
 static void sigIntHandler (int signal)
 {
@@ -403,7 +401,7 @@
 #if HAVE_LIBRRD
 	if (operating_mode == MODE_SERVER)
 		start_server ();
-	else /* if (operating_mode == MODE_CLIENT || operating_mode == MODE_LOCAL) */
+	else /* if (operating_mode == MODE_CLIENT || operating_mode == MODE_LOCAL || operating_mode == MODE_LOG) */
 #endif
 		start_client ();
 
diff -ru collectd-3.8.4/src/collectd.conf.5 collectd-3.8.4+log/src/collectd.conf.5
--- collectd-3.8.4/src/collectd.conf.5	2006-04-09 10:07:18.000000000 -0400
+++ collectd-3.8.4+log/src/collectd.conf.5	2006-04-10 15:22:29.558904000 -0400
@@ -169,7 +169,7 @@
 .SH "GLOBAL OPTIONS"
 .IX Header "GLOBAL OPTIONS"
 .IP "\fBMode\fR (\fBLocal\fR|\fBClient\fR|\fBServer\fR)" 4
-.IX Item "Mode (Local|Client|Server)"
+.IX Item "Mode (Local|Client|Server|Log)"
 Sets the operating mode. See the section \fB\s-1MODES\s0\fR in \fIcollectd\fR\|(1) for a
 description. This option determines which other options are allowed. Defaults
 to \fBLocal\fR.
diff -ru collectd-3.8.4/src/collectd.h collectd-3.8.4+log/src/collectd.h
--- collectd-3.8.4/src/collectd.h	2006-04-09 10:07:17.000000000 -0400
+++ collectd-3.8.4+log/src/collectd.h	2006-04-10 12:27:39.376362000 -0400
@@ -198,6 +198,7 @@
 #define MODE_SERVER 0x01
 #define MODE_CLIENT 0x02
 #define MODE_LOCAL  0x04
+#define MODE_LOG    0x08
 
 extern time_t curtime;
 
diff -ru collectd-3.8.4/src/common.c collectd-3.8.4+log/src/common.c
--- collectd-3.8.4/src/common.c	2006-04-09 10:07:18.000000000 -0400
+++ collectd-3.8.4+log/src/common.c	2006-04-10 15:16:38.991152000 -0400
@@ -25,6 +25,8 @@
 #include "common.h"
 #include "utils_debug.h"
 
+extern int operating_mode;
+
 #ifdef HAVE_LIBKSTAT
 extern kstat_ctl_t *kc;
 #endif
@@ -181,7 +183,6 @@
 	return (0);
 }
 
-#ifdef HAVE_LIBRRD
 int check_create_dir (const char *file_orig)
 {
 	struct stat statbuf;
@@ -288,52 +289,96 @@
 
 int rrd_create_file (char *filename, char **ds_def, int ds_num)
 {
-	char **argv;
-	int argc;
-	int i, j;
-	int status = 0;
-
 	if (check_create_dir (filename))
 		return (-1);
 
-	argc = ds_num + rra_num + 4;
-
-	if ((argv = (char **) malloc (sizeof (char *) * (argc + 1))) == NULL)
-	{
-		syslog (LOG_ERR, "rrd_create failed: %s", strerror (errno));
-		return (-1);
-	}
-
-	argv[0] = "create";
-	argv[1] = filename;
-	argv[2] = "-s";
-	argv[3] = "10";
-
-	j = 4;
-	for (i = 0; i < ds_num; i++)
-		argv[j++] = ds_def[i];
-	for (i = 0; i < rra_num; i++)
-		argv[j++] = rra_def[i];
-	argv[j] = NULL;
-
-	optind = 0; /* bug in librrd? */
-	rrd_clear_error ();
-	if (rrd_create (argc, argv) == -1)
-	{
-		syslog (LOG_ERR, "rrd_create failed: %s: %s", filename, rrd_get_error ());
-		status = -1;
-	}
+#ifdef HAVE_LIBRRD
+        if (operating_mode != MODE_LOG)
+        {
+                char **argv;
+                int argc;
+                int i, j;
+                int status = 0;
+
+                argc = ds_num + rra_num + 4;
+
+                if ((argv = (char **) malloc (sizeof (char *) * (argc + 1))) == NULL)
+                {
+                        syslog (LOG_ERR, "rrd_create failed: %s", strerror (errno));
+                        return (-1);
+                }
+
+	        argv[0] = "create";
+                argv[1] = filename;
+                argv[2] = "-s";
+                argv[3] = "10";
+                
+                j = 4;
+                for (i = 0; i < ds_num; i++)
+                    argv[j++] = ds_def[i];
+                for (i = 0; i < rra_num; i++)
+                    argv[j++] = rra_def[i];
+                argv[j] = NULL;
+                
+                optind = 0; /* bug in librrd? */
+                rrd_clear_error ();
+                if (rrd_create (argc, argv) == -1)
+                {
+                        syslog (LOG_ERR, "rrd_create failed: %s: %s", filename, rrd_get_error ());
+                        status = -1;
+                }
 
-	free (argv);
+                free (argv);
 	
-	return (status);
-}
+                return (status);
+        } else
 #endif /* HAVE_LIBRRD */
+        {
+                FILE *log;
+                int i;
+
+                log = fopen(filename, "w");
+                if (log == NULL)
+                {
+                        syslog (LOG_WARNING, "Failed to create %s: %s", filename, strerror(errno));
+                        return (-1);
+                }
+
+                for(i = 0; i < ds_num; i++)
+                {
+                        char *name, *tmp;
+
+                        name = index(ds_def[i], ':');
+                        if (name == NULL)
+                        {
+                                syslog (LOG_WARNING, "Invalid DS definition '%s' for %s", ds_def[i], filename);
+                                fclose(log);
+                                remove(filename);
+                                return (-1);
+                        }
+                        name += 1;
+                        tmp = index(name, ':');
+                        if (tmp == NULL)
+                        {
+                                syslog (LOG_WARNING, "Invalid DS definition '%s' for %s", ds_def[i], filename);
+                                fclose(log);
+                                remove(filename);
+                                return (-1);
+                        }
+                        fprintf(log, "%.*s", (tmp - name), name);
+                        if (i < ds_num -1)
+                                fprintf(log, ":");
+                }
+                fprintf(log, "\n");
+                fclose(log);
+
+                return 0;
+        }
+}
 
 int rrd_update_file (char *host, char *file, char *values,
 		char **ds_def, int ds_num)
 {
-#ifdef HAVE_LIBRRD
 	struct stat statbuf;
 	char full_file[1024];
 	char *argv[4] = { "update", full_file, values, NULL };
@@ -350,6 +395,22 @@
 			return (-1);
 	}
 
+        if (operating_mode == MODE_LOG)
+        {
+                char *tmp;
+
+                tmp = full_file + strlen(full_file) - 4;
+                if (strcmp(rrd, ".rrd") == 0)
+                {
+                        time_t now;
+                        struct tm *tm;
+
+                        now = time(NULL);
+                        tm = localtime(&now);
+                        strftime(tmp, 1024 - (tmp-full_file), "-%Y-%m-%d", tm);
+                }
+        }
+
 	if (stat (full_file, &statbuf) == -1)
 	{
 		if (errno == ENOENT)
@@ -369,14 +430,31 @@
 		return (-1);
 	}
 
-	optind = 0; /* bug in librrd? */
-	rrd_clear_error ();
-	if (rrd_update (3, argv) == -1)
-	{
-		syslog (LOG_WARNING, "rrd_update failed: %s: %s", full_file, rrd_get_error ());
-		return (-1);
+#ifdef HAVE_LIBRRD
+        if (operating_mode != MODE_LOG)
+        {
+                optind = 0; /* bug in librrd? */
+                rrd_clear_error ();
+                if (rrd_update (3, argv) == -1)
+                {
+                        syslog (LOG_WARNING, "rrd_update failed: %s: %s", full_file, rrd_get_error ());
+                        return (-1);
+                }
 	}
+        else
 #endif /* HAVE_LIBRRD */
+        {
+                FILE *log;
+
+                log = fopen(full_file, "a");
+                if (log == NULL)
+                {
+                        syslog (LOG_WARNING, "Failed to append to %s: %s", full_file, strerror(errno));
+                        return (-1);
+                }
+                fprintf(log, "%s\n", values);
+                fclose(log);
+        }
 
 	return (0);
 }
diff -ru collectd-3.8.4/src/configfile.c collectd-3.8.4+log/src/configfile.c
--- collectd-3.8.4/src/configfile.c	2006-04-09 10:07:18.000000000 -0400
+++ collectd-3.8.4+log/src/configfile.c	2006-04-10 15:15:34.005727000 -0400
@@ -37,11 +37,7 @@
 #define ERR_NEEDS_ARG "Section `%s' needs an argument.\n"
 #define ERR_NEEDS_SECTION "`%s' can only be used within a section.\n"
 
-#ifdef HAVE_LIBRRD
 extern int operating_mode;
-#else
-static int operating_mode = MODE_CLIENT;
-#endif
 
 typedef struct cf_callback
 {
@@ -67,9 +63,9 @@
 static cf_mode_item_t cf_mode_list[] =
 {
 	{"TimeToLive",  NULL, MODE_CLIENT                           },
-	{"PIDFile",     NULL, MODE_CLIENT | MODE_SERVER | MODE_LOCAL},
-	{"DataDir",     NULL, MODE_CLIENT | MODE_SERVER | MODE_LOCAL},
-	{"LogFile",     NULL, MODE_CLIENT | MODE_SERVER | MODE_LOCAL}
+	{"PIDFile",     NULL, MODE_CLIENT | MODE_SERVER | MODE_LOCAL | MODE_LOG },
+	{"DataDir",     NULL, MODE_CLIENT | MODE_SERVER | MODE_LOCAL | MODE_LOG },
+	{"LogFile",     NULL, MODE_CLIENT | MODE_SERVER | MODE_LOCAL | MODE_LOG }
 };
 static int cf_mode_num = 4;
 
@@ -240,14 +236,19 @@
 		void *extra)
 {
 	DBG ("shortvar = %s, var = %s, arguments = %s, value = %s, ...",
-			shortvar, var, arguments, value);
+             shortvar, var, (arguments) ? arguments : "<NULL>",
+             (value) ? value : "?");
 
 	if (strcasecmp (value, "Client") == 0)
 		operating_mode = MODE_CLIENT;
+#if HAVE_LIBRRD
 	else if (strcasecmp (value, "Server") == 0)
 		operating_mode = MODE_SERVER;
 	else if (strcasecmp (value, "Local") == 0)
 		operating_mode = MODE_LOCAL;
+#endif
+	else if (strcasecmp (value, "Log") == 0)
+		operating_mode = MODE_LOG;
 	else
 	{
 		syslog (LOG_ERR, "Invalid value for config option `Mode': `%s'", value);
@@ -270,7 +271,8 @@
 		void *extra)
 {
 	DBG ("shortvar = %s, var = %s, arguments = %s, value = %s, ...",
-			shortvar, var, arguments, value);
+             shortvar, var, (arguments) ? arguments : "<NULL>",
+             (value) ? value : "?");
 
 	plugin_set_dir (value);
 
@@ -284,7 +286,8 @@
 	cf_mode_item_t *item;
 
 	DBG ("shortvar = %s, var = %s, arguments = %s, value = %s, ...",
-			shortvar, var, arguments, value);
+             shortvar, var, (arguments) ? arguments : "<NULL>",
+             (value) ? value : "?");
 
 	if (extra == NULL)
 	{
@@ -334,7 +337,8 @@
 		void *extra)
 {
 	DBG ("shortvar = %s, var = %s, arguments = %s, value = %s, ...",
-			shortvar, var, arguments, value);
+             shortvar, var, (arguments) ? arguments : "<NULL>",
+             (value) ? value : "?");
 
 	if (plugin_load (value))
 		syslog (LOG_ERR, "plugin_load (%s): failed to load plugin", value);
@@ -357,7 +361,8 @@
 	char *service = NET_DEFAULT_PORT;
 
 	DBG ("shortvar = %s, var = %s, arguments = %s, value = %s, ...",
-			shortvar, var, arguments, value);
+             shortvar, var, (arguments) ? arguments : "<NULL>",
+             (value) ? value : "?");
 
 	buffer = strdup (value);
 	if (buffer == NULL)
@@ -400,7 +405,8 @@
 		void *extra)
 {
 	DBG ("shortvar = %s, var = %s, arguments = %s, value = %s, ...",
-			shortvar, var, arguments, value);
+             shortvar, var, (arguments) ? arguments : "<NULL>",
+             (value) ? value : "?");
 
 	if (flags == LC_FLAGS_SECTIONSTART)
 	{
@@ -461,7 +467,8 @@
 		void *extra)
 {
 	DBG ("shortvar = %s, var = %s, arguments = %s, value = %s, ...",
-			shortvar, var, arguments, value);
+             shortvar, var, (arguments) ? arguments : "<NULL>",
+             (value) ? value : "?");
 
 	if ((nesting_depth == 0) || (current_module == NULL))
 	{
diff -ru collectd-3.8.4/src/network.c collectd-3.8.4+log/src/network.c
--- collectd-3.8.4/src/network.c	2006-04-09 10:07:18.000000000 -0400
+++ collectd-3.8.4+log/src/network.c	2006-04-10 12:39:57.310616000 -0400
@@ -49,11 +49,7 @@
 
 #define BUFF_SIZE 4096
 
-#ifdef HAVE_LIBRRD
 extern int operating_mode;
-#else
-static int operating_mode = MODE_CLIENT;
-#endif
 
 typedef struct sockent
 {
@@ -218,7 +214,7 @@
 
 	DBG ("node = %s, service = %s", node, service);
 
-	if (operating_mode == MODE_LOCAL)
+	if (operating_mode == MODE_LOCAL || operating_mode == MODE_LOG)
 		return (-1);
 
 	socklist_tail = socklist_head;
diff -ru collectd-3.8.4/src/plugin.c collectd-3.8.4+log/src/plugin.c
--- collectd-3.8.4/src/plugin.c	2006-04-09 10:07:18.000000000 -0400
+++ collectd-3.8.4+log/src/plugin.c	2006-04-10 13:33:50.128277000 -0400
@@ -38,9 +38,7 @@
 
 static plugin_t *first_plugin = NULL;
 
-#ifdef HAVE_LIBRRD
 extern int operating_mode;
-#endif
 
 static char *plugindir = NULL;
 
@@ -290,7 +288,7 @@
 		return;
 
 #ifdef HAVE_LIBRRD
-	if ((operating_mode == MODE_LOCAL) || (operating_mode == MODE_CLIENT))
+	if (operating_mode != MODE_SERVER)
 #endif
 		if ((init != NULL) && (read == NULL))
 			syslog (LOG_NOTICE, "Plugin `%s' doesn't provide a read function.", type);
@@ -316,7 +314,6 @@
  * Send received data back to the plugin/module which will append DS
  * definitions and pass it on to ``rrd_update_file''.
  */
-#ifdef HAVE_LIBRRD
 void plugin_write (char *host, char *type, char *inst, char *val)
 {
 	plugin_t *p;
@@ -329,7 +326,6 @@
 
 	(*p->write) (host, inst, val);
 }
-#endif /* HAVE_LIBRRD */
 
 /*
  * Receive data from the plugin/module and get it somehow to ``plugin_write'':
@@ -338,14 +334,8 @@
  */
 void plugin_submit (char *type, char *inst, char *val)
 {
-#ifdef HAVE_LIBRRD
-	if (operating_mode == MODE_LOCAL)
-		plugin_write (NULL, type, inst, val);
-	else if (operating_mode == MODE_CLIENT)
+        if (operating_mode == MODE_CLIENT)
 		network_send (type, inst, val);
-	else /* operating_mode == MODE_SERVER */
-		syslog (LOG_ERR, "WTF is the server doing in ``plugin_submit''?!?\n");
-#else
-	network_send (type, inst, val);
-#endif
+	else
+		plugin_write (NULL, type, inst, val);
 }


More information about the collectd mailing list