[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