+2013-01-27, Version 5.2.1
+ * Build system: "make distcheck" has been fixed. Build fixes Solaris
+ and systems without gcrypt. Thanks to Yves Mettier for his patches.
+ * collectd: The complaint mechanism was fixed. It reported messages
+ more frequently than intended.
+ * collectd-tg: A manual page has been added.
+ * dns plugin: Build issues on FreeBSD have been fixed. Thanks to
+ Ed Schouten for his patch.
+ * ethstat plugin: Fix the "Map" config option. An incorrectly used
+ character pointer may lead to a segmentation fault.
+ * network plugin: Build issues on FreeBSD have been fixed. Thanks to
+ Ed Schouten for his patch.
+ * postgresql plugin: A memory leak in the writing code has been fixed.
+ A use-after-free issue that happened when more than one database was
+ configured was fixed. Thanks to Sebastian Harl for fixing these
+ problems.
+ * redis plugin: A build failure has been fixed. Thanks to Pierre-Yves
+ Ritschard for his patch.
+ * varnish plugin: Fix a problem with instances without name.
+ * write_graphite plugin: A regression which rendered the
+ "SeparateInstances" and "AlwaysAppendDS" options unusable has been
+ fixed. A failed assertion when using types with many data sources
+ has been fixed. Improve reporting of connection errors to not spam
+ log files too much. Thanks to Pierre-Yves Ritschard for reporting
+ the logging problem.
+ * zfs_arc plugin: Fix the type used for mutex misses. Thanks to Yves
+ Mettier for reporting this bug.
+
2012-11-17, Version 5.2.0
* collectd: The performance of the LISTVAL command has been improved.
Thanks to Yves Mettier for the patch.
* tcpconns plugin: Use a netlink socket rather than reading from /proc
for improved performance. Thanks to Michael Stapelberg for the patch.
+2013-01-25, Version 5.1.2
+ * Build system: "make distcheck" has been fixed. Thanks to Yves
+ Mettier for his patches.
+ * collectd: The complaint mechanism was fixed. It reported messages
+ more frequently than intended.
+ * dns plugin: Build issues on FreeBSD have been fixed. Thanks to
+ Ed Schouten for his patch.
+ * ethstat plugin: Fix the "Map" config option. An incorrectly used
+ character pointer may lead to a segmentation fault.
+ * network plugin: Build issues on FreeBSD have been fixed. Thanks to
+ Ed Schouten for his patch.
+ * varnish plugin: Fix a problem with instances without name.
+ * write_graphite: Improve reporting of connection errors to not spam
+ log files too much. Thanks to Pierre-Yves Ritschard for reporting
+ this problem.
+ * zfs_arc plugin: Fix the type used for mutex misses. Thanks to Yves
+ Mettier for reporting this bug.
+
2012-11-11, Version 5.1.1
* collectd: Create new directories with mode 0777 and let umask remove
unwanted permission bits.
endif
EXTRA_DIST = perl/Makefile.PL \
+ perl/uninstall_mod.pl \
perl/lib/Collectd.pm \
perl/lib/Collectd/Unixsock.pm \
perl/lib/Collectd/Plugins/Monitorus.pm \
# Perl 'make uninstall' does not work as well as wanted.
# So we do the work here.
uninstall-local:
- rm -f $(DESTDIR)$(mandir)/man3/Collectd::Unixsock.3pm
- rm -f $(DESTDIR)$(datarootdir)/perl5/Collectd.pm
- rm -f $(DESTDIR)$(datarootdir)/perl5/Collectd/Plugins/OpenVZ.pm
- rm -f $(DESTDIR)$(datarootdir)/perl5/Collectd/Unixsock.pm
- rm -f $(DESTDIR)$(prefix)/lib64/perl5/perllocal.pod
- rm -f $(DESTDIR)$(prefix)/lib64/perl5/auto/Collectd/.packlist
+ @PERL@ -I$(DESTDIR)$(prefix) $(srcdir)/perl/uninstall_mod.pl Collectd
+ find $(DESTDIR)$(prefix) -name "perllocal.pod" -exec rm {} \;
clean-local:
rm -rf buildperl
buildperl/Makefile: .perl-directory-stamp buildperl/Makefile.PL \
$(top_builddir)/config.status
- cd buildperl && @PERL@ Makefile.PL INSTALL_BASE=$(prefix) @PERL_BINDINGS_OPTIONS@
+ cd buildperl && @PERL@ Makefile.PL INSTALL_BASE=$(DESTDIR)$(prefix) @PERL_BINDINGS_OPTIONS@
buildperl/Makefile.PL: .perl-directory-stamp $(top_builddir)/config.status
--- /dev/null
+#! /usr/bin/perl
+
+use strict;
+use ExtUtils::Installed;
+
+my $mod = $ARGV[0] || die "Usage : $0 Module\n";
+my $inst = ExtUtils::Installed->new();
+unlink $inst->files($mod), $inst->packlist($mod)->packlist_file();
&& rm -f -r src/libcollectdclient/.libs \
&& rm -f src/libcollectdclient/*.o \
&& rm -f src/libcollectdclient/*.la \
-&& rm -f src/libcollectdclient/*.lo
+&& rm -f src/libcollectdclient/*.lo \
+&& rm -f bindings/.perl-directory-stamp \
+&& rm -f -r bindings/buildperl
]
)
-AM_INIT_AUTOMAKE(dist-bzip2)
+AM_INIT_AUTOMAKE([tar-pax dist-bzip2])
AC_LANG(C)
AC_PREFIX_DEFAULT("/opt/collectd")
AC_CHECK_HEADERS(netinet/ip_compat.h)
have_net_pfvar_h="no"
-AC_CHECK_HEADERS(net/pfvar.h, [have_net_pfvar_h="yes"])
+AC_CHECK_HEADERS(net/pfvar.h,
+ [have_net_pfvar_h="yes"],
+ [have_net_pfvar_h="no"],
+[
+#if HAVE_SYS_IOCTL_H
+# include <sys/ioctl.h>
+#endif
+#if HAVE_SYS_SOCKET_H
+# include <sys/socket.h>
+#endif
+#if HAVE_NET_IF_H
+# include <net/if.h>
+#endif
+])
# For the multimeter plugin
have_termios_h="no"
fi
pinba.pb-c.c pinba.pb-c.h: pinba.proto
- protoc-c --c_out . pinba.proto
+ protoc-c -I$(srcdir) --c_out . $(srcdir)/pinba.proto
riemann.pb-c.c riemann.pb-c.h: riemann.proto
protoc-c --c_out . riemann.proto
char *prefix;
char *postfix;
char escape_char;
+ unsigned int graphite_flags;
/* subscribe only */
char *exchange_type;
{
status = format_graphite (buffer, sizeof (buffer), ds, vl,
conf->prefix, conf->postfix, conf->escape_char,
- conf->store_rates);
+ conf->graphite_flags);
if (status != 0)
{
ERROR ("amqp plugin: format_graphite failed with status %i.",
conf->delivery_mode = CAMQP_DM_VOLATILE;
}
else if ((strcasecmp ("StoreRates", child->key) == 0) && publish)
+ {
status = cf_util_get_boolean (child, &conf->store_rates);
+ (void) cf_util_get_flag (child, &conf->graphite_flags,
+ GRAPHITE_STORE_RATES);
+ }
else if ((strcasecmp ("Format", child->key) == 0) && publish)
status = camqp_config_set_format (child, conf);
else if ((strcasecmp ("GraphitePrefix", child->key) == 0) && publish)
return (-1);
}
- curl_easy_setopt (st->curl, CURLOPT_NOSIGNAL, 1);
+ curl_easy_setopt (st->curl, CURLOPT_NOSIGNAL, 1L);
curl_easy_setopt (st->curl, CURLOPT_WRITEFUNCTION, apache_curl_callback);
curl_easy_setopt (st->curl, CURLOPT_WRITEDATA, st);
}
curl_easy_setopt (st->curl, CURLOPT_URL, st->url);
- curl_easy_setopt (st->curl, CURLOPT_FOLLOWLOCATION, 1);
+ curl_easy_setopt (st->curl, CURLOPT_FOLLOWLOCATION, 1L);
if (st->verify_peer != 0)
{
- curl_easy_setopt (st->curl, CURLOPT_SSL_VERIFYPEER, 1);
+ curl_easy_setopt (st->curl, CURLOPT_SSL_VERIFYPEER, 1L);
}
else
{
- curl_easy_setopt (st->curl, CURLOPT_SSL_VERIFYPEER, 0);
+ curl_easy_setopt (st->curl, CURLOPT_SSL_VERIFYPEER, 0L);
}
if (st->verify_host != 0)
{
- curl_easy_setopt (st->curl, CURLOPT_SSL_VERIFYHOST, 2);
+ curl_easy_setopt (st->curl, CURLOPT_SSL_VERIFYHOST, 2L);
}
else
{
- curl_easy_setopt (st->curl, CURLOPT_SSL_VERIFYHOST, 0);
+ curl_easy_setopt (st->curl, CURLOPT_SSL_VERIFYHOST, 0L);
}
if (st->cacert != NULL)
return (-1);
}
- curl_easy_setopt (curl, CURLOPT_NOSIGNAL, 1);
+ curl_easy_setopt (curl, CURLOPT_NOSIGNAL, 1L);
curl_easy_setopt (curl, CURLOPT_WRITEFUNCTION, ascent_curl_callback);
curl_easy_setopt (curl, CURLOPT_USERAGENT, PACKAGE_NAME"/"PACKAGE_VERSION);
curl_easy_setopt (curl, CURLOPT_ERRORBUFFER, ascent_curl_error);
}
curl_easy_setopt (curl, CURLOPT_URL, url);
- curl_easy_setopt (curl, CURLOPT_FOLLOWLOCATION, 1);
+ curl_easy_setopt (curl, CURLOPT_FOLLOWLOCATION, 1L);
if ((verify_peer == NULL) || IS_TRUE (verify_peer))
- curl_easy_setopt (curl, CURLOPT_SSL_VERIFYPEER, 1);
+ curl_easy_setopt (curl, CURLOPT_SSL_VERIFYPEER, 1L);
else
- curl_easy_setopt (curl, CURLOPT_SSL_VERIFYPEER, 0);
+ curl_easy_setopt (curl, CURLOPT_SSL_VERIFYPEER, 0L);
if ((verify_host == NULL) || IS_TRUE (verify_host))
- curl_easy_setopt (curl, CURLOPT_SSL_VERIFYHOST, 2);
+ curl_easy_setopt (curl, CURLOPT_SSL_VERIFYHOST, 2L);
else
- curl_easy_setopt (curl, CURLOPT_SSL_VERIFYHOST, 0);
+ curl_easy_setopt (curl, CURLOPT_SSL_VERIFYHOST, 0L);
if (cacert != NULL)
curl_easy_setopt (curl, CURLOPT_CAINFO, cacert);
return (-1);
}
- curl_easy_setopt (curl, CURLOPT_NOSIGNAL, 1);
+ curl_easy_setopt (curl, CURLOPT_NOSIGNAL, 1L);
curl_easy_setopt (curl, CURLOPT_WRITEFUNCTION, bind_curl_callback);
curl_easy_setopt (curl, CURLOPT_USERAGENT, PACKAGE_NAME"/"PACKAGE_VERSION);
curl_easy_setopt (curl, CURLOPT_ERRORBUFFER, bind_curl_error);
curl_easy_setopt (curl, CURLOPT_URL, (url != NULL) ? url : BIND_DEFAULT_URL);
- curl_easy_setopt (curl, CURLOPT_FOLLOWLOCATION, 1);
+ curl_easy_setopt (curl, CURLOPT_FOLLOWLOCATION, 1L);
return (0);
} /* }}} int bind_init */
cpu_temp_retry_counter = 0;
cpu_temp_retry_step = 1;
-
- DEBUG ("cpu_temp = %i", (int) cpu_temp);
#endif /* PROCESSOR_TEMPERATURE */
}
/* #endif PROCESSOR_CPU_LOAD_INFO */
return (-1);
}
- curl_easy_setopt (wp->curl, CURLOPT_NOSIGNAL, 1);
+ curl_easy_setopt (wp->curl, CURLOPT_NOSIGNAL, 1L);
curl_easy_setopt (wp->curl, CURLOPT_WRITEFUNCTION, cc_curl_callback);
curl_easy_setopt (wp->curl, CURLOPT_WRITEDATA, wp);
curl_easy_setopt (wp->curl, CURLOPT_USERAGENT,
PACKAGE_NAME"/"PACKAGE_VERSION);
curl_easy_setopt (wp->curl, CURLOPT_ERRORBUFFER, wp->curl_errbuf);
curl_easy_setopt (wp->curl, CURLOPT_URL, wp->url);
- curl_easy_setopt (wp->curl, CURLOPT_FOLLOWLOCATION, 1);
+ curl_easy_setopt (wp->curl, CURLOPT_FOLLOWLOCATION, 1L);
if (wp->user != NULL)
{
curl_easy_setopt (wp->curl, CURLOPT_USERPWD, wp->credentials);
}
- curl_easy_setopt (wp->curl, CURLOPT_SSL_VERIFYPEER, wp->verify_peer);
+ curl_easy_setopt (wp->curl, CURLOPT_SSL_VERIFYPEER, (long) wp->verify_peer);
curl_easy_setopt (wp->curl, CURLOPT_SSL_VERIFYHOST,
- wp->verify_host ? 2 : 0);
+ wp->verify_host ? 2L : 0L);
if (wp->cacert != NULL)
curl_easy_setopt (wp->curl, CURLOPT_CAINFO, wp->cacert);
return (-1);
}
- curl_easy_setopt (db->curl, CURLOPT_NOSIGNAL, 1);
+ curl_easy_setopt (db->curl, CURLOPT_NOSIGNAL, 1L);
curl_easy_setopt (db->curl, CURLOPT_WRITEFUNCTION, cj_curl_callback);
curl_easy_setopt (db->curl, CURLOPT_WRITEDATA, db);
curl_easy_setopt (db->curl, CURLOPT_USERAGENT,
curl_easy_setopt (db->curl, CURLOPT_USERPWD, db->credentials);
}
- curl_easy_setopt (db->curl, CURLOPT_SSL_VERIFYPEER, (int) db->verify_peer);
+ curl_easy_setopt (db->curl, CURLOPT_SSL_VERIFYPEER, (long) db->verify_peer);
curl_easy_setopt (db->curl, CURLOPT_SSL_VERIFYHOST,
- (int) (db->verify_host ? 2 : 0));
+ db->verify_host ? 2L : 0L);
if (db->cacert != NULL)
curl_easy_setopt (db->curl, CURLOPT_CAINFO, db->cacert);
return (-1);
}
- curl_easy_setopt (db->curl, CURLOPT_NOSIGNAL, 1);
+ curl_easy_setopt (db->curl, CURLOPT_NOSIGNAL, 1L);
curl_easy_setopt (db->curl, CURLOPT_WRITEFUNCTION, cx_curl_callback);
curl_easy_setopt (db->curl, CURLOPT_WRITEDATA, db);
curl_easy_setopt (db->curl, CURLOPT_USERAGENT,
BUILT_SOURCES = collectd/lcc_features.h
libcollectdclient_la_SOURCES = client.c network.c network_buffer.c
-libcollectdclient_la_CPPFLAGS = $(AM_CPPFLAGS)
+libcollectdclient_la_CPPFLAGS = $(AM_CPPFLAGS) -I$(top_srcdir)/src
libcollectdclient_la_LDFLAGS = -version-info 1:0:0
libcollectdclient_la_LIBADD =
if BUILD_WITH_LIBGCRYPT
cdtime_t timestamp_time)
{
FILE *fh;
- int do_close = 0;
+ _Bool do_close = 0;
struct tm timestamp_tm;
char timestamp_str[64];
char level_str[16] = "";
else
fprintf (fh, "%s%s\n", level_str, msg);
- if (do_close != 0)
+ if (do_close) {
fclose (fh);
+ } else {
+ fflush(fh);
+ }
}
pthread_mutex_unlock (&file_lock);
return (-1);
}
- curl_easy_setopt (curl, CURLOPT_NOSIGNAL, 1);
+ curl_easy_setopt (curl, CURLOPT_NOSIGNAL, 1L);
curl_easy_setopt (curl, CURLOPT_WRITEFUNCTION, nginx_curl_callback);
curl_easy_setopt (curl, CURLOPT_USERAGENT, PACKAGE_NAME"/"PACKAGE_VERSION);
curl_easy_setopt (curl, CURLOPT_ERRORBUFFER, nginx_curl_error);
curl_easy_setopt (curl, CURLOPT_URL, url);
}
- curl_easy_setopt (curl, CURLOPT_FOLLOWLOCATION, 1);
+ curl_easy_setopt (curl, CURLOPT_FOLLOWLOCATION, 1L);
if ((verify_peer == NULL) || IS_TRUE (verify_peer))
{
- curl_easy_setopt (curl, CURLOPT_SSL_VERIFYPEER, 1);
+ curl_easy_setopt (curl, CURLOPT_SSL_VERIFYPEER, 1L);
}
else
{
- curl_easy_setopt (curl, CURLOPT_SSL_VERIFYPEER, 0);
+ curl_easy_setopt (curl, CURLOPT_SSL_VERIFYPEER, 0L);
}
if ((verify_host == NULL) || IS_TRUE (verify_host))
{
- curl_easy_setopt (curl, CURLOPT_SSL_VERIFYHOST, 2);
+ curl_easy_setopt (curl, CURLOPT_SSL_VERIFYHOST, 2L);
}
else
{
- curl_easy_setopt (curl, CURLOPT_SSL_VERIFYHOST, 0);
+ curl_easy_setopt (curl, CURLOPT_SSL_VERIFYHOST, 0L);
}
if (cacert != NULL)
#include "plugin.h"
#include "common.h"
-#include <sys/ioctl.h>
-#include <sys/socket.h>
-#include <net/if.h>
+#if HAVE_SYS_IOCTL_H
+# include <sys/ioctl.h>
+#endif
+#if HAVE_SYS_SOCKET_H
+# include <sys/socket.h>
+#endif
+#if HAVE_NET_IF_H
+# include <net/if.h>
+#endif
+
#include <net/pfvar.h>
-#include <paths.h>
-#include <err.h>
-#include <pwd.h>
+
+#ifndef FCNT_NAMES
+# if FCNT_MAX != 3
+# error "Unexpected value for FCNT_MAX"
+# endif
+# define FCNT_NAMES {"search", "insert", "removals", NULL};
+#endif
+
+#ifndef SCNT_NAMES
+# if SCNT_MAX != 3
+# error "Unexpected value for SCNT_MAX"
+# endif
+# define SCNT_NAMES {"search", "insert", "removals", NULL};
+#endif
static char const *pf_reasons[PFRES_MAX+1] = PFRES_NAMES;
static char const *pf_lcounters[LCNT_MAX+1] = LCNT_NAMES;
static char const *pf_fcounters[FCNT_MAX+1] = FCNT_NAMES;
-static char const *pf_scounters[FCNT_MAX+1] = FCNT_NAMES;
+static char const *pf_scounters[SCNT_MAX+1] = SCNT_NAMES;
static char const *pf_device = "/dev/pf";
close (fd);
fd = -1;
- if (!status.running)
+ if (!state.running)
{
WARNING ("pf plugin: PF is not running.");
return (-1);
};
static int def_queries_num = STATIC_ARRAY_SIZE (def_queries);
-static c_psql_database_t *databases = NULL;
-static size_t databases_num = 0;
+static c_psql_database_t **databases = NULL;
+static size_t databases_num = 0;
-static udb_query_t **queries = NULL;
-static size_t queries_num = 0;
+static udb_query_t **queries = NULL;
+static size_t queries_num = 0;
-static c_psql_writer_t *writers = NULL;
-static size_t writers_num = 0;
+static c_psql_writer_t *writers = NULL;
+static size_t writers_num = 0;
static int c_psql_begin (c_psql_database_t *db)
{
static c_psql_database_t *c_psql_database_new (const char *name)
{
- c_psql_database_t *db;
+ c_psql_database_t **tmp;
+ c_psql_database_t *db;
- db = (c_psql_database_t *)realloc (databases,
- (databases_num + 1) * sizeof (*db));
+ db = (c_psql_database_t *)malloc (sizeof(*db));
if (NULL == db) {
log_err ("Out of memory.");
return NULL;
}
- databases = db;
- db = databases + databases_num;
+ tmp = (c_psql_database_t **)realloc (databases,
+ (databases_num + 1) * sizeof (*databases));
+ if (NULL == tmp) {
+ log_err ("Out of memory.");
+ sfree (db);
+ return NULL;
+ }
+
+ databases = tmp;
+ databases[databases_num] = db;
++databases_num;
db->conn = NULL;
sfree (db->service);
/* don't care about freeing or reordering the 'databases' array
- * this is done in 'shutdown' */
+ * this is done in 'shutdown'; also, don't free the database instance
+ * object just to make sure that in case anybody accesses it before
+ * shutdown won't segfault */
return;
} /* c_psql_database_delete */
__attribute__((unused)) const char *ident,
user_data_t *ud)
{
- c_psql_database_t *dbs = databases;
+ c_psql_database_t **dbs = databases;
size_t dbs_num = databases_num;
size_t i;
if ((ud != NULL) && (ud->data != NULL)) {
- dbs = ud->data;
+ dbs = (void *)&ud->data;
dbs_num = 1;
}
for (i = 0; i < dbs_num; ++i) {
- c_psql_database_t *db = dbs + i;
+ c_psql_database_t *db = dbs[i];
/* don't commit if the timeout is larger than the regular commit
* interval as in that case all requested data has already been
plugin_unregister_read_group ("postgresql");
for (i = 0; i < databases_num; ++i) {
- c_psql_database_t *db = databases + i;
+ c_psql_database_t *db = databases[i];
if (db->writers_num > 0) {
char cb_name[DATA_MAX_NAME_LEN];
plugin_unregister_flush (cb_name);
plugin_unregister_write (cb_name);
}
+
+ sfree (db);
}
udb_query_free (queries, queries_num);
/**
* collectd - src/utils_complain.c
- * Copyright (C) 2006-2007 Florian octo Forster
+ * Copyright (C) 2006-2013 Florian octo Forster
* Copyright (C) 2008 Sebastian tokkee Harl
*
* This program is free software; you can redistribute it and/or modify it
static int vcomplain (int level, c_complain_t *c,
const char *format, va_list ap)
{
- time_t now;
+ cdtime_t now;
char message[512];
- now = time (NULL);
+ now = cdtime ();
if (c->last + c->interval > now)
return 0;
else
c->interval *= 2;
- if (c->interval > 86400)
- c->interval = 86400;
+ if (c->interval > TIME_T_TO_CDTIME_T (86400))
+ c->interval = TIME_T_TO_CDTIME_T (86400);
vsnprintf (message, sizeof (message), format, ap);
message[sizeof (message) - 1] = '\0';
{
va_list ap;
- /* reset the old interval */
- if (c->interval < 0)
- c->interval *= -1;
-
va_start (ap, format);
- vcomplain (level, c, format, ap);
+ if (vcomplain (level, c, format, ap))
+ c->complained_once = 1;
va_end (ap);
} /* c_complain */
{
va_list ap;
- if (c->interval < 0)
+ if (c->complained_once)
return;
va_start (ap, format);
if (vcomplain (level, c, format, ap))
- c->interval *= -1;
+ c->complained_once = 1;
va_end (ap);
} /* c_complain_once */
return;
c->interval = 0;
+ c->complained_once = 0;
va_start (ap, format);
vsnprintf (message, sizeof (message), format, ap);
/**
* collectd - src/utils_complain.h
- * Copyright (C) 2006-2007 Florian octo Forster
+ * Copyright (C) 2006-2013 Florian octo Forster
* Copyright (C) 2008 Sebastian tokkee Harl
*
* This program is free software; you can redistribute it and/or modify it
#ifndef UTILS_COMPLAIN_H
#define UTILS_COMPLAIN_H 1
-#include <time.h>
+#include "utils_time.h"
typedef struct
{
/* time of the last report */
- time_t last;
+ cdtime_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;
+ /* How long to wait until reporting again.
+ * 0 indicates that the complaint is no longer valid. */
+ cdtime_t interval;
+
+ _Bool complained_once;
} c_complain_t;
-#define C_COMPLAIN_INIT_STATIC { 0, 0 }
-#define C_COMPLAIN_INIT(c) do { (c)->last = 0; (c)->interval = 0; } while (0)
+#define C_COMPLAIN_INIT_STATIC { 0, 0, 0 }
+#define C_COMPLAIN_INIT(c) do { \
+ (c)->last = 0; \
+ (c)->interval = 0; \
+ (c)->complained_once = 0; \
+} while (0)
/*
* NAME
#include "plugin.h"
#include "common.h"
-#if HAVE_NETINET_IN_SYSTM_H
-# include <netinet/in_systm.h>
-#endif
-#if HAVE_NETINET_IN_H
-# include <netinet/in.h>
-#endif
-#if HAVE_NETINET_IP6_H
-# include <netinet/ip6.h>
-#endif
-#if HAVE_NETINET_IP_COMPAT_H
-# include <netinet/ip_compat.h>
-#endif
-#if HAVE_ARPA_INET_H
-# include <arpa/inet.h>
-#endif
#if HAVE_SYS_SOCKET_H
# include <sys/socket.h>
#endif
-#if HAVE_ARPA_NAMESER_H
-# include <arpa/nameser.h>
-#endif
-#if HAVE_ARPA_NAMESER_COMPAT_H
-# include <arpa/nameser_compat.h>
-#endif
-
#if HAVE_NET_IF_ARP_H
# include <net/if_arp.h>
#endif
#if HAVE_NET_IF_H
# include <net/if.h>
#endif
-#if HAVE_NETINET_IF_ETHER_H
-# include <netinet/if_ether.h>
-#endif
#if HAVE_NET_PPP_DEFS_H
# include <net/ppp_defs.h>
#endif
# include <net/if_ppp.h>
#endif
-#if HAVE_NETDB_H
-# include <netdb.h>
+#if HAVE_NETINET_IN_SYSTM_H
+# include <netinet/in_systm.h>
+#endif
+#if HAVE_NETINET_IN_H
+# include <netinet/in.h>
+#endif
+#if HAVE_NETINET_IP6_H
+# include <netinet/ip6.h>
+#endif
+#if HAVE_NETINET_IP_COMPAT_H
+# include <netinet/ip_compat.h>
+#endif
+#if HAVE_NETINET_IF_ETHER_H
+# include <netinet/if_ether.h>
#endif
-
#if HAVE_NETINET_IP_H
# include <netinet/ip.h>
#endif
#ifdef HAVE_NETINET_IP_VAR_H
# include <netinet/ip_var.h>
#endif
-#if HAVE_NETINET_IP6_H
-# include <netinet/ip6.h>
-#endif
#if HAVE_NETINET_UDP_H
# include <netinet/udp.h>
#endif
+#if HAVE_ARPA_INET_H
+# include <arpa/inet.h>
+#endif
+#if HAVE_ARPA_NAMESER_H
+# include <arpa/nameser.h>
+#endif
+#if HAVE_ARPA_NAMESER_COMPAT_H
+# include <arpa/nameser_compat.h>
+#endif
+
+#if HAVE_NETDB_H
+# include <netdb.h>
+#endif
+
#if HAVE_PCAP_H
# include <pcap.h>
#endif
#include "plugin.h"
#include "common.h"
+#include "utils_format_graphite.h"
#include "utils_cache.h"
-#include "utils_format_json.h"
#include "utils_parse_option.h"
/* Utils functions to format data sets in graphite format.
}
static int gr_format_name (char *ret, int ret_len,
- const value_list_t *vl,
- const char *ds_name,
- char *prefix,
- char *postfix,
- char escape_char)
+ value_list_t const *vl,
+ char const *ds_name,
+ char const *prefix,
+ char const *postfix,
+ char const escape_char,
+ unsigned int flags)
{
char n_host[DATA_MAX_NAME_LEN];
char n_plugin[DATA_MAX_NAME_LEN];
if (n_plugin_instance[0] != '\0')
ssnprintf (tmp_plugin, sizeof (tmp_plugin), "%s%c%s",
n_plugin,
- '-',
+ (flags & GRAPHITE_SEPARATE_INSTANCES) ? '.' : '-',
n_plugin_instance);
else
sstrncpy (tmp_plugin, n_plugin, sizeof (tmp_plugin));
if (n_type_instance[0] != '\0')
ssnprintf (tmp_type, sizeof (tmp_type), "%s%c%s",
n_type,
- '-',
+ (flags & GRAPHITE_SEPARATE_INSTANCES) ? '.' : '-',
n_type_instance);
else
sstrncpy (tmp_type, n_type, sizeof (tmp_type));
+ /* Assert always_append_ds -> ds_name */
+ assert (!(flags & GRAPHITE_ALWAYS_APPEND_DS) || (ds_name != NULL));
if (ds_name != NULL)
ssnprintf (ret, ret_len, "%s%s%s.%s.%s.%s",
prefix, n_host, postfix, tmp_plugin, tmp_type, ds_name);
}
int format_graphite (char *buffer, size_t buffer_size,
- const data_set_t *ds, const value_list_t *vl, char *prefix,
- char *postfix, char escape_char,
- _Bool store_rates)
+ data_set_t const *ds, value_list_t const *vl,
+ char const *prefix, char const *postfix, char const escape_char,
+ unsigned int flags)
{
int status = 0;
int i;
int buffer_pos = 0;
gauge_t *rates = NULL;
- if (store_rates)
+ if (flags & GRAPHITE_STORE_RATES)
rates = uc_get_rate (ds, vl);
for (i = 0; i < ds->ds_num; i++)
{
- const char *ds_name = NULL;
+ char const *ds_name = NULL;
char key[10*DATA_MAX_NAME_LEN];
char values[512];
size_t message_len;
char message[1024];
- ds_name = ds->ds[i].name;
+ if ((flags & GRAPHITE_ALWAYS_APPEND_DS)
+ || (ds->ds_num > 1))
+ ds_name = ds->ds[i].name;
/* Copy the identifier to `key' and escape it. */
status = gr_format_name (key, sizeof (key), vl, ds_name,
- prefix, postfix, escape_char);
+ prefix, postfix, escape_char, flags);
if (status != 0)
{
ERROR ("format_graphite: error with gr_format_name");
#include "collectd.h"
#include "plugin.h"
+#define GRAPHITE_STORE_RATES 0x01
+#define GRAPHITE_SEPARATE_INSTANCES 0x02
+#define GRAPHITE_ALWAYS_APPEND_DS 0x04
+
int format_graphite (char *buffer,
size_t buffer_size, const data_set_t *ds,
const value_list_t *vl, const char *prefix,
const char *postfix, const char escape_char,
- _Bool store_rates);
+ unsigned int flags);
#endif /* UTILS_FORMAT_GRAPHITE_H */
if (buf[len - 1] != '\n')
break;
buf[len - 1] = '\0';
+ len--;
}
status = callback (data, buf, buflen);
* Copyright (C) 2011 Scott Sanders
* Copyright (C) 2009 Paul Sadauskas
* Copyright (C) 2009 Doug MacEachern
- * Copyright (C) 2007-2012 Florian octo Forster
+ * Copyright (C) 2007-2013 Florian octo Forster
*
* 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
#include "configfile.h"
#include "utils_cache.h"
+#include "utils_complain.h"
#include "utils_parse_option.h"
#include "utils_format_graphite.h"
char *postfix;
char escape_char;
- _Bool store_rates;
- _Bool separate_instances;
- _Bool always_append_ds;
+ unsigned int format_flags;
char send_buf[WG_SEND_BUF_SIZE];
size_t send_buf_free;
cdtime_t send_buf_init_time;
pthread_mutex_t send_lock;
+ c_complain_t init_complaint;
};
if (cb->sock_fd < 0)
{
char errbuf[1024];
- ERROR ("write_graphite plugin: Connecting to %s:%s failed. "
+ c_complain (LOG_ERR, &cb->init_complaint,
+ "write_graphite plugin: Connecting to %s:%s failed. "
"The last error was: %s", node, service,
sstrerror (errno, errbuf, sizeof (errbuf)));
close (cb->sock_fd);
return (-1);
}
+ else
+ {
+ c_release (LOG_INFO, &cb->init_complaint,
+ "write_graphite plugin: Successfully connected to %s:%s.",
+ node, service);
+ }
wg_reset_buffer (cb);
status = wg_callback_init (cb);
if (status != 0)
{
- ERROR ("write_graphite plugin: wg_callback_init failed.");
+ /* An error message has already been printed. */
pthread_mutex_unlock (&cb->send_lock);
return (-1);
}
status = wg_callback_init (cb);
if (status != 0)
{
- ERROR ("write_graphite plugin: wg_callback_init failed.");
+ /* An error message has already been printed. */
pthread_mutex_unlock (&cb->send_lock);
return (-1);
}
static int wg_write_messages (const data_set_t *ds, const value_list_t *vl,
struct wg_callback *cb)
{
- char buffer[4096];
+ char buffer[WG_SEND_BUF_SIZE];
int status;
if (0 != strcmp (ds->type, vl->type))
memset (buffer, 0, sizeof (buffer));
status = format_graphite (buffer, sizeof (buffer), ds, vl,
- cb->prefix, cb->postfix, cb->escape_char, cb->store_rates);
+ cb->prefix, cb->postfix, cb->escape_char, cb->format_flags);
if (status != 0) /* error message has been printed already. */
return (status);
+ /* Send the message to graphite */
wg_send_message (buffer, cb);
if (status != 0)
{
- ERROR ("write_graphite plugin: wg_send_message failed "
- "with status %i.", status);
+ /* An error message has already been printed. */
return (status);
}
cb->prefix = NULL;
cb->postfix = NULL;
cb->escape_char = WG_DEFAULT_ESCAPE;
- cb->store_rates = 1;
+ cb->format_flags = GRAPHITE_STORE_RATES;
/* FIXME: Legacy configuration syntax. */
if (strcasecmp ("Carbon", ci->key) != 0)
}
pthread_mutex_init (&cb->send_lock, /* attr = */ NULL);
+ C_COMPLAIN_INIT (&cb->init_complaint);
for (i = 0; i < ci->children_num; i++)
{
else if (strcasecmp ("Postfix", child->key) == 0)
cf_util_get_string (child, &cb->postfix);
else if (strcasecmp ("StoreRates", child->key) == 0)
- cf_util_get_boolean (child, &cb->store_rates);
+ cf_util_get_flag (child, &cb->format_flags,
+ GRAPHITE_STORE_RATES);
else if (strcasecmp ("SeparateInstances", child->key) == 0)
- cf_util_get_boolean (child, &cb->separate_instances);
+ cf_util_get_flag (child, &cb->format_flags,
+ GRAPHITE_SEPARATE_INSTANCES);
else if (strcasecmp ("AlwaysAppendDS", child->key) == 0)
- cf_util_get_boolean (child, &cb->always_append_ds);
+ cf_util_get_flag (child, &cb->format_flags,
+ GRAPHITE_ALWAYS_APPEND_DS);
else if (strcasecmp ("EscapeCharacter", child->key) == 0)
config_set_char (&cb->escape_char, child);
else
return (-1);
}
- curl_easy_setopt (cb->curl, CURLOPT_NOSIGNAL, 1);
+ curl_easy_setopt (cb->curl, CURLOPT_NOSIGNAL, 1L);
curl_easy_setopt (cb->curl, CURLOPT_USERAGENT, PACKAGE_NAME"/"PACKAGE_VERSION);
headers = NULL;
curl_easy_setopt (cb->curl, CURLOPT_HTTPAUTH, CURLAUTH_ANY);
}
- curl_easy_setopt (cb->curl, CURLOPT_SSL_VERIFYPEER, cb->verify_peer);
+ curl_easy_setopt (cb->curl, CURLOPT_SSL_VERIFYPEER, (long) cb->verify_peer);
curl_easy_setopt (cb->curl, CURLOPT_SSL_VERIFYHOST,
- cb->verify_host ? 2 : 0);
+ cb->verify_host ? 2L : 0L);
if (cb->cacert != NULL)
curl_easy_setopt (cb->curl, CURLOPT_CAINFO, cb->cacert);
#!/usr/bin/env bash
-DEFAULT_VERSION="5.2.0.git"
+DEFAULT_VERSION="5.2.1.git"
VERSION="`git describe 2> /dev/null | sed -e 's/^collectd-//'`"