Merge branch 'collectd-5.7'
authorRuben Kerkhof <ruben@rubenkerkhof.com>
Sun, 19 Feb 2017 12:07:39 +0000 (13:07 +0100)
committerRuben Kerkhof <ruben@rubenkerkhof.com>
Sun, 19 Feb 2017 12:07:39 +0000 (13:07 +0100)
Conflicts:
contrib/redhat/collectd.spec
src/Makefile.am
src/dpdkstat.c

1  2 
contrib/redhat/collectd.spec
src/daemon/plugin.c
src/intel_rdt.c
src/mqtt.c

@@@ -88,7 -88,6 +88,7 @@@
  %define with_lvm 0%{!?_without_lvm:1}
  %define with_madwifi 0%{!?_without_madwifi:1}
  %define with_mbmon 0%{!?_without_mbmon:1}
 +%define with_mcelog 0%{!?_without_mcelog:1}
  %define with_md 0%{!?_without_md:1}
  %define with_memcachec 0%{!?_without_memcachec:1}
  %define with_memcached 0%{!?_without_memcached:1}
  %define with_olsrd 0%{!?_without_olsrd:1}
  %define with_openldap 0%{!?_without_openldap:1}
  %define with_openvpn 0%{!?_without_openvpn:1}
 +%define with_ovs_events 0%{!?_without_ovs_events:1}
  %define with_perl 0%{!?_without_perl:1}
  %define with_pinba 0%{!?_without_pinba:1}
  %define with_ping 0%{!?_without_ping:1}
  %define with_cpusleep 0
  %define with_gps 0
  %define with_mqtt 0
 +%define with_ovs_events 0
  %define with_redis 0
  %define with_rrdcached 0
  %define with_write_redis 0
  
  Summary:      Statistics collection and monitoring daemon
  Name:         collectd
- Version:      5.7.0
- Release:      4%{?dist}
+ Version:      5.7.1
+ Release:      1%{?dist}
  URL:          https://collectd.org
  Source:               https://collectd.org/files/%{name}-%{version}.tar.bz2
  License:      GPLv2
  Group:                System Environment/Daemons
  BuildRoot:    %{_tmppath}/%{name}-%{version}-root
 -BuildRequires:        libgcrypt-devel, kernel-headers, libtool-ltdl-devel, libcap-devel, which
 +BuildRequires:        libgcrypt-devel, kernel-headers, libcap-devel, which
  Vendor:               collectd development team <collectd@verplant.org>
  
  %if 0%{?fedora} || 0%{?rhel} >= 7
@@@ -542,16 -539,6 +542,16 @@@ This plugin collects size of “Logica
  of Linux' “Logical Volume Manager” (LVM).
  %endif
  
 +%if %{with_mcelog}
 +%package mcelog
 +Summary:      Mcelog plugin for collectd
 +Group:                System Environment/Daemons
 +Requires:     %{name}%{?_isa} = %{version}-%{release}
 +%description mcelog
 +This plugin monitors machine check exceptions reported by mcelog and generates
 +appropriate notifications when machine check exceptions are detected.
 +%endif
 +
  %if %{with_memcachec}
  %package memcachec
  Summary:      Memcachec plugin for collectd
@@@ -667,18 -654,6 +667,18 @@@ BuildRequires: openldap-deve
  This plugin reads monitoring information from OpenLDAP's cn=Monitor subtree.
  %endif
  
 +%if %{with_ovs_events}
 +%package ovs_events
 +Summary:       Open vSwitch events plugin for collectd
 +Group:         System Environment/Daemons
 +Requires:      %{name}%{?_isa} = %{version}-%{release}
 +BuildRequires: yajl-devel
 +%description ovs_events
 +This plugin monitors the link status of Open vSwitch (OVS) connected
 +interfaces, dispatches the values to collectd and sends notifications
 +whenever a link state change occurs in the OVS database.
 +%endif
 +
  %if %{with_perl}
  %package perl
  Summary:      Perl plugin for collectd
@@@ -1305,12 -1280,6 +1305,12 @@@ Collectd utilitie
  %define _with_mbmon --disable-mbmon
  %endif
  
 +%if %{with_mcelog}
 +%define _with_mcelog --enable-mcelog
 +%else
 +%define _with_mbmon --disable-mcelog
 +%endif
 +
  %if %{with_md}
  %define _with_md --enable-md
  %else
  %define _with_oracle --disable-oracle
  %endif
  
 +%if %{with_ovs_events}
 +%define _with_ovs_events --enable-ovs_events
 +%else
 +%define _with_ovs_events --disable-ovs_events
 +%endif
 +
  %if %{with_perl}
  %define _with_perl --enable-perl --with-perl-bindings="INSTALLDIRS=vendor"
  %else
  %configure CFLAGS="%{optflags} -DLT_LAZY_OR_NOW=\"RTLD_LAZY|RTLD_GLOBAL\"" \
        %{?_python_config} \
        --disable-static \
 -      --without-included-ltdl \
        --enable-all-plugins=yes \
        --enable-match_empty_counter \
        --enable-match_hashed \
        %{?_with_lvm} \
        %{?_with_madwifi} \
        %{?_with_mbmon} \
 +      %{?_with_mcelog} \
        %{?_with_md} \
        %{?_with_memcachec} \
        %{?_with_memcached} \
        %{?_with_openldap} \
        %{?_with_openvpn} \
        %{?_with_oracle} \
 +      %{?_with_ovs_events} \
        %{?_with_perl} \
        %{?_with_pf} \
        %{?_with_pinba} \
  %if %{with_mbmon}
  %{_libdir}/%{name}/mbmon.so
  %endif
 +%if %{with_mcelog}
 +%{_libdir}/%{name}/mcelog.so
 +%endif
  %if %{with_md}
  %{_libdir}/%{name}/md.so
  %endif
  %if %{with_olsrd}
  %{_libdir}/%{name}/olsrd.so
  %endif
 +%if %{with_ovs_events}
 +%{_libdir}/%{name}/ovs_events.so
 +%endif
  %if %{with_powerdns}
  %{_libdir}/%{name}/powerdns.so
  %endif
  %doc contrib/
  
  %changelog
+ * Tue Jan 01 2017 Marc Fournier <marc.fournier@camptocamp.com> - 5.7.1-1
+ - New upstream version
 +* Sat Dec 31 2016 Ruben Kerkhof <ruben@rubenkerkhof.com> - 5.7.0-4
 +- Add new ovs_events plugin
 +
 +* Sat Dec 31 2016 Ruben Kerkhof <ruben@rubenkerkhof.com> - 5.7.0-3
 +- Add new mcelog plugin
 +
  * Tue Nov 29 2016 Ruben Kerkhof <ruben@rubenkerkhof.com> - 5.7.0-2
  - Disable redis plugin on RHEL 6, hiredis has been retired from EPEL6
  
diff --combined src/daemon/plugin.c
@@@ -46,7 -46,7 +46,7 @@@
  #include <pthread_np.h> /* for pthread_set_name_np(3) */
  #endif
  
 -#include <ltdl.h>
 +#include <dlfcn.h>
  
  /*
   * Private structures
@@@ -153,14 -153,13 +153,13 @@@ static const char *plugin_get_dir(void
      return (plugindir);
  }
  
- static void plugin_update_internal_statistics(void) { /* {{{ */
+ static int plugin_update_internal_statistics(void) { /* {{{ */
    gauge_t copy_write_queue_length = (gauge_t)write_queue_length;
  
    /* Initialize `vl' */
    value_list_t vl = VALUE_LIST_INIT;
-   sstrncpy(vl.host, hostname_g, sizeof(vl.host));
    sstrncpy(vl.plugin, "collectd", sizeof(vl.plugin));
+   vl.interval = plugin_get_interval();
  
    /* Write queue */
    sstrncpy(vl.plugin_instance, "write_queue", sizeof(vl.plugin_instance));
    vl.type_instance[0] = 0;
    plugin_dispatch_values(&vl);
  
-   return;
- } /* }}} void plugin_update_internal_statistics */
+   return 0;
+ } /* }}} int plugin_update_internal_statistics */
  
  static void destroy_callback(callback_func_t *cf) /* {{{ */
  {
@@@ -389,25 -388,40 +388,25 @@@ static int plugin_unregister(llist_t *l
   * object, but it will bitch about a shared object not having a
   * ``module_register'' symbol..
   */
 -static int plugin_load_file(char *file, uint32_t flags) {
 -  lt_dlhandle dlh;
 +static int plugin_load_file(const char *file, _Bool global) {
    void (*reg_handle)(void);
  
 -  lt_dlinit();
 -  lt_dlerror(); /* clear errors */
 +  int flags = RTLD_NOW;
 +  if (global)
 +    flags |= RTLD_GLOBAL;
  
 -#if LIBTOOL_VERSION == 2
 -  if (flags & PLUGIN_FLAGS_GLOBAL) {
 -    lt_dladvise advise;
 -    lt_dladvise_init(&advise);
 -    lt_dladvise_global(&advise);
 -    dlh = lt_dlopenadvise(file, advise);
 -    lt_dladvise_destroy(&advise);
 -  } else {
 -    dlh = lt_dlopen(file);
 -  }
 -#else /* if LIBTOOL_VERSION == 1 */
 -  if (flags & PLUGIN_FLAGS_GLOBAL)
 -    WARNING("plugin_load_file: The global flag is not supported, "
 -            "libtool 2 is required for this.");
 -  dlh = lt_dlopen(file);
 -#endif
 +  void *dlh = dlopen(file, flags);
  
    if (dlh == NULL) {
      char errbuf[1024] = "";
  
      ssnprintf(errbuf, sizeof(errbuf),
 -              "lt_dlopen (\"%s\") failed: %s. "
 +              "dlopen (\"%s\") failed: %s. "
                "The most common cause for this problem is "
                "missing dependencies. Use ldd(1) to check "
                "the dependencies of the plugin "
                "/ shared object.",
 -              file, lt_dlerror());
 +              file, dlerror());
  
      ERROR("%s", errbuf);
      /* Make sure this is printed to STDERR in any case, but also
      return (1);
    }
  
 -  if ((reg_handle = (void (*)(void))lt_dlsym(dlh, "module_register")) == NULL) {
 +  reg_handle = (void (*)(void))dlsym(dlh, "module_register");
 +  if (reg_handle == NULL) {
      WARNING("Couldn't find symbol \"module_register\" in \"%s\": %s\n", file,
 -            lt_dlerror());
 -    lt_dlclose(dlh);
 +            dlerror());
 +    dlclose(dlh);
      return (-1);
    }
  
@@@ -959,7 -972,7 +958,7 @@@ static void plugin_free_loaded(void) 
  }
  
  #define BUFSIZE 512
 -int plugin_load(char const *plugin_name, uint32_t flags) {
 +int plugin_load(char const *plugin_name, _Bool global) {
    DIR *dh;
    const char *dir;
    char filename[BUFSIZE] = "";
     */
    if ((strcasecmp("perl", plugin_name) == 0) ||
        (strcasecmp("python", plugin_name) == 0))
 -    flags |= PLUGIN_FLAGS_GLOBAL;
 +    global = 1;
  
    /* `cpu' should not match `cpufreq'. To solve this we add `.so' to the
     * type when matching the filename */
        continue;
      }
  
 -    status = plugin_load_file(filename, flags);
 +    status = plugin_load_file(filename, global);
      if (status == 0) {
        /* success */
        plugin_mark_loaded(plugin_name);
@@@ -1558,8 -1571,10 +1557,10 @@@ int plugin_init_all(void) 
    /* Init the value cache */
    uc_init();
  
-   if (IS_TRUE(global_option_get("CollectInternalStats")))
+   if (IS_TRUE(global_option_get("CollectInternalStats"))) {
      record_statistics = 1;
+     plugin_register_read("collectd", plugin_update_internal_statistics);
+   }
  
    chain_name = global_option_get("PreCacheChain");
    pre_cache_chain = fc_chain_get_by_name(chain_name);
  
  /* TODO: Rename this function. */
  void plugin_read_all(void) {
-   if (record_statistics) {
-     plugin_update_internal_statistics();
-   }
    uc_check_timeout();
  
    return;
@@@ -2578,3 -2590,5 +2576,3 @@@ int plugin_thread_create(pthread_t *thr
  
    return 0;
  } /* int plugin_thread_create */
 -
 -/* vim: set sw=8 ts=8 noet fdm=marker : */
diff --combined src/intel_rdt.c
  #define RDT_MAX_SOCKET_CORES 64
  #define RDT_MAX_CORES (RDT_MAX_SOCKET_CORES * RDT_MAX_SOCKETS)
  
+ typedef enum {
+   UNKNOWN = 0,
+   CONFIGURATION_ERROR,
+ } rdt_config_status;
  struct rdt_core_group_s {
    char *desc;
    size_t num_cores;
@@@ -56,6 -61,8 +61,8 @@@ typedef struct rdt_ctx_s rdt_ctx_t
  
  static rdt_ctx_t *g_rdt = NULL;
  
+ static rdt_config_status g_state = UNKNOWN;
  static int isdup(const uint64_t *nums, size_t size, uint64_t val) {
    for (size_t i = 0; i < size; i++)
      if (nums[i] == val)
@@@ -460,10 -467,6 +467,10 @@@ static int rdt_config_cgroups(oconfig_i
    return (0);
  }
  
 +static void rdt_pqos_log(void *context, const size_t size, const char *msg) {
 +  DEBUG(RDT_PLUGIN ": %s", msg);
 +}
 +
  static int rdt_preinit(void) {
    int ret;
  
      return (-ENOMEM);
    }
  
 -  /* In case previous instance of the application was not closed properly
 -   * call fini and ignore return code. */
 -  pqos_fini();
 +  struct pqos_config pqos = {.fd_log = -1,
 +                             .callback_log = rdt_pqos_log,
 +                             .context_log = NULL,
 +                             .verbose = 0};
  
 -  /* TODO:
 -   * stdout should not be used here. Will be reworked when support of log
 -   * callback is added to PQoS library.
 -  */
 -  ret = pqos_init(&(struct pqos_config){.fd_log = STDOUT_FILENO});
 +  ret = pqos_init(&pqos);
    if (ret != PQOS_RETVAL_OK) {
      ERROR(RDT_PLUGIN ": Error initializing PQoS library!");
      goto rdt_preinit_error1;
      goto rdt_preinit_error2;
    }
  
 +  /* Reset pqos monitoring groups registers */
 +  pqos_mon_reset();
 +
    return (0);
  
  rdt_preinit_error2:
@@@ -527,8 -530,14 +534,14 @@@ static int rdt_config(oconfig_item_t *c
    int ret = 0;
  
    ret = rdt_preinit();
-   if (ret != 0)
-     return ret;
+   if (ret != 0) {
+     g_state = CONFIGURATION_ERROR;
+     /* if we return -1 at this point collectd
+       reports a failure in configuration and
+       aborts
+     */
+     goto exit;
+   }
  
    for (int i = 0; i < ci->children_num; i++) {
      oconfig_item_t *child = ci->children + i;
      if (strcasecmp("Cores", child->key) == 0) {
  
        ret = rdt_config_cgroups(child);
-       if (ret != 0)
-         return ret;
+       if (ret != 0) {
+         g_state = CONFIGURATION_ERROR;
+         /* if we return -1 at this point collectd
+            reports a failure in configuration and
+            aborts
+          */
+         goto exit;
+       }
  
  #if COLLECT_DEBUG
        rdt_dump_cgroups();
      }
    }
  
+ exit:
    return (0);
  }
  
@@@ -630,6 -646,9 +650,9 @@@ static int rdt_read(__attribute__((unus
  static int rdt_init(void) {
    int ret;
  
+   if(g_state == CONFIGURATION_ERROR)
+     return (-1);
    ret = rdt_preinit();
    if (ret != 0)
      return ret;
diff --combined src/mqtt.c
@@@ -448,6 -448,7 +448,7 @@@ static int publish(mqtt_client_conf_t *
       * measure; we will try to reconnect the next time we have to publish a
       * message */
      conf->connected = 0;
+     mosquitto_disconnect(conf->mosq);
  
      pthread_mutex_unlock(&conf->lock);
      return (-1);
@@@ -461,6 -462,7 +462,7 @@@ static int format_topic(char *buf, size
                          value_list_t const *vl, mqtt_client_conf_t *conf) {
    char name[MQTT_MAX_TOPIC_SIZE];
    int status;
+   char *c;
  
    if ((conf->topic_prefix == NULL) || (conf->topic_prefix[0] == 0))
      return (FORMAT_VL(buf, buf_len, vl));
    if ((status < 0) || (((size_t)status) >= buf_len))
      return (ENOMEM);
  
+   while((c = strchr(buf, '#')) || (c = strchr(buf, '+'))) {
+        *c = '_';
+   }
    return (0);
  } /* int format_topic */
  
@@@ -751,3 -757,5 +757,3 @@@ void module_register(void) 
    plugin_register_complex_config("mqtt", mqtt_config);
    plugin_register_init("mqtt", mqtt_init);
  } /* void module_register */
 -
 -/* vim: set sw=4 sts=4 et fdm=marker : */