From d1247a271c1822a0cc655473430b724ab10bc004 Mon Sep 17 00:00:00 2001 From: Sebastian Harl Date: Thu, 22 May 2008 13:34:54 +0200 Subject: [PATCH] src/utils_complain.[ch]: Reintroduced an improved version of the complain mechanism. This has been asked for a couple of times and since I need it now, here it goes... ;-) I've done the following modifications to Florian's original version: * Renamed "plugin_complain" to "c_complain". * Renamed "plugin_relief" to "c_release", thus using two verbs which is more consistent imho. * Added "c_complain_once" to report a complaint only once. * Use timestamps instead of counting multiples of "interval_g" to determine when to report again. Thus, multiple calls to the complain- functions in one interval are allowed. Signed-off-by: Sebastian Harl Signed-off-by: Florian Forster --- src/Makefile.am | 1 + src/utils_complain.c | 101 +++++++++++++++++++++++++++++++++++++++++++ src/utils_complain.h | 91 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 193 insertions(+) create mode 100644 src/utils_complain.c create mode 100644 src/utils_complain.h diff --git a/src/Makefile.am b/src/Makefile.am index 194c1a7b..42a1124a 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -31,6 +31,7 @@ collectd_SOURCES = collectd.c collectd.h \ plugin.c plugin.h \ utils_avltree.c utils_avltree.h \ utils_cache.c utils_cache.h \ + utils_complain.c utils_complain.h \ utils_ignorelist.c utils_ignorelist.h \ utils_llist.c utils_llist.h \ utils_tail_match.c utils_tail_match.h \ diff --git a/src/utils_complain.c b/src/utils_complain.c new file mode 100644 index 00000000..9d0f4669 --- /dev/null +++ b/src/utils_complain.c @@ -0,0 +1,101 @@ +/** + * collectd - src/utils_complain.c + * Copyright (C) 2006-2007 Florian octo Forster + * Copyright (C) 2008 Sebastian tokkee Harl + * + * 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: + * Florian octo Forster + * Sebastian tokkee Harl + **/ + +#include "utils_complain.h" +#include "plugin.h" + +/* vcomplain returns 0 if it did not report, 1 else */ +static int vcomplain (int level, c_complain_t *c, + const char *format, va_list ap) +{ + time_t now; + char message[512]; + + now = time (NULL); + + if (c->last + c->interval > now) + return 0; + + c->last = now; + + if (c->interval < interval_g) + c->interval = interval_g; + else + c->interval *= 2; + + if (c->interval > 86400) + c->interval = 86400; + + vsnprintf (message, sizeof (message), format, ap); + message[sizeof (message) - 1] = '\0'; + + plugin_log (level, message); + return 1; +} /* vcomplain */ + +void c_complain (int level, c_complain_t *c, const char *format, ...) +{ + va_list ap; + + /* reset the old interval */ + if (c->interval < 0) + c->interval *= -1; + + va_start (ap, format); + vcomplain (level, c, format, ap); + va_end (ap); +} /* c_complain */ + +void c_complain_once (int level, c_complain_t *c, const char *format, ...) +{ + va_list ap; + + if (c->interval < 0) + return; + + va_start (ap, format); + if (vcomplain (level, c, format, ap)) + c->interval *= -1; + va_end (ap); +} /* c_complain_once */ + +void c_release (int level, c_complain_t *c, const char *format, ...) +{ + char message[512]; + va_list ap; + + if (c->interval == 0) + return; + + c->interval = 0; + + va_start (ap, format); + vsnprintf (message, sizeof (message), format, ap); + message[sizeof (message) - 1] = '\0'; + va_end (ap); + + plugin_log (level, message); +} /* c_release */ + +/* vim: set sw=4 ts=4 tw=78 noexpandtab : */ + diff --git a/src/utils_complain.h b/src/utils_complain.h new file mode 100644 index 00000000..56e74eab --- /dev/null +++ b/src/utils_complain.h @@ -0,0 +1,91 @@ +/** + * collectd - src/utils_complain.h + * Copyright (C) 2006-2007 Florian octo Forster + * Copyright (C) 2008 Sebastian tokkee Harl + * + * 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: + * Florian octo Forster + * Sebastian tokkee Harl + **/ + +#ifndef UTILS_COMPLAIN_H +#define UTILS_COMPLAIN_H 1 + +#include + +typedef struct +{ + /* time of the last report */ + time_t last; + + /* how long to wait until reporting again + * 0 indicates that the complaint is no longer valid + * < 0 indicates that the complaint has been reported once + * => c_complain_once will not report again + * => c_complain uses the absolute value to reset the old value */ + int interval; +} c_complain_t; + +#define C_COMPLAIN_INIT { 0, 0 } + +/* + * NAME + * c_complain + * + * DESCRIPTION + * Complain about something. This function will report a message (usually + * indicating some error condition) using the collectd logging mechanism. + * When this function is called again, reporting the message again will be + * deferred by an increasing interval (up to one day) to prevent flooding + * the logs. A call to `c_release' resets the counter. + * + * PARAMETERS + * `level' The log level passed to `plugin_log'. + * `c' Identifier for the complaint. + * `format' Message format - see the documentation of printf(3). + */ +void c_complain (int level, c_complain_t *c, const char *format, ...); + +/* + * NAME + * c_complain_once + * + * DESCRIPTION + * Complain about something once. This function will not report anything + * again, unless `c_release' has been called in between. If used after some + * calls to `c_complain', it will report again on the next interval and stop + * after that. + * + * See `c_complain' for further details and a description of the parameters. + */ +void c_complain_once (int level, c_complain_t *c, const char *format, ...); + +/* + * NAME + * c_release + * + * DESCRIPTION + * Release a complaint. This will report a message once, marking the + * complaint as released. + * + * See `c_complain' for a description of the parameters. + */ +void c_release (int level, c_complain_t *c, const char *format, ...); + +#endif /* UTILS_COMPLAIN_H */ + +/* vim: set sw=4 ts=4 tw=78 noexpandtab : */ + -- 2.30.2