Merge branch 'collectd-4.5' into collectd-4.6
authorFlorian Forster <octo@leeloo.lan.home.verplant.org>
Sat, 2 May 2009 08:50:56 +0000 (10:50 +0200)
committerFlorian Forster <octo@leeloo.lan.home.verplant.org>
Sat, 2 May 2009 08:50:56 +0000 (10:50 +0200)
1  2 
src/email.c
src/memory.c
src/processes.c

diff --combined src/email.c
@@@ -360,8 -360,8 +360,8 @@@ static void *collect (void *arg
                        }
                } /* while (loop) */
  
-               log_debug ("[thread #%5lu] shutting down connection on fd #%i",
-                               pthread_self (), fileno (this->socket));
+               log_debug ("Shutting down connection on fd #%i",
+                               fileno (this->socket));
  
                fclose (connection->socket);
                free (connection);
        pthread_exit ((void *)0);
  } /* static void *collect (void *) */
  
 -static void *open_connection (void *arg)
 +static void *open_connection (void __attribute__((unused)) *arg)
  {
        struct sockaddr_un addr;
  
@@@ -656,6 -656,7 +656,6 @@@ static void email_submit (const char *t
  
        vl.values = values;
        vl.values_len = 1;
 -      vl.time = time (NULL);
        sstrncpy (vl.host, hostname_g, sizeof (vl.host));
        sstrncpy (vl.plugin, "email", sizeof (vl.plugin));
        sstrncpy (vl.type, type, sizeof (vl.type));
diff --combined src/memory.c
@@@ -111,6 -111,7 +111,6 @@@ static void memory_submit (const char *
  
        vl.values = values;
        vl.values_len = 1;
 -      vl.time = time (NULL);
        sstrncpy (vl.host, hostname_g, sizeof (vl.host));
        sstrncpy (vl.plugin, "memory", sizeof (vl.plugin));
        sstrncpy (vl.type, "memory", sizeof (vl.type));
@@@ -208,7 -209,7 +208,7 @@@ static int memory_read (void
                                        NULL, 0) == 0)
                {
                        sysctl_vals[i] = value;
-                       DEBUG ("memory plugin: %26s: %6i", sysctl_keys[i], sysctl_vals[i]);
+                       DEBUG ("memory plugin: %26s: %g", sysctl_keys[i], sysctl_vals[i]);
                }
                else
                {
diff --combined src/processes.c
@@@ -23,7 -23,6 +23,7 @@@
   *   Lyonel Vincent <lyonel at ezix.org>
   *   Florian octo Forster <octo at verplant.org>
   *   Oleg King <king2 at kaluga.ru>
 + *   Sebastian Harl <sh at tokkee.org>
   **/
  
  #include "collectd.h"
  # include <regex.h>
  #endif
  
 +#ifndef ARG_MAX
 +#  define ARG_MAX 4096
 +#endif
 +
  #define BUFSIZE 256
  
  static const char *config_keys[] =
@@@ -123,9 -118,7 +123,9 @@@ typedef struct procstat_entry_
  
        unsigned long num_proc;
        unsigned long num_lwp;
 +      unsigned long vmem_size;
        unsigned long vmem_rss;
 +      unsigned long stack_size;
  
        unsigned long vmem_minflt;
        unsigned long vmem_majflt;
@@@ -150,9 -143,7 +150,9 @@@ typedef struct procsta
  
        unsigned long num_proc;
        unsigned long num_lwp;
 +      unsigned long vmem_size;
        unsigned long vmem_rss;
 +      unsigned long stack_size;
  
        unsigned long vmem_minflt_counter;
        unsigned long vmem_majflt_counter;
@@@ -324,17 -315,13 +324,17 @@@ static void ps_list_add (const char *na
                }
  
                pse->age = 0;
 -              pse->num_proc = entry->num_proc;
 -              pse->num_lwp  = entry->num_lwp;
 -              pse->vmem_rss = entry->vmem_rss;
 -
 -              ps->num_proc += pse->num_proc;
 -              ps->num_lwp  += pse->num_lwp;
 -              ps->vmem_rss += pse->vmem_rss;
 +              pse->num_proc   = entry->num_proc;
 +              pse->num_lwp    = entry->num_lwp;
 +              pse->vmem_size  = entry->vmem_size;
 +              pse->vmem_rss   = entry->vmem_rss;
 +              pse->stack_size = entry->stack_size;
 +
 +              ps->num_proc   += pse->num_proc;
 +              ps->num_lwp    += pse->num_lwp;
 +              ps->vmem_size  += pse->vmem_size;
 +              ps->vmem_rss   += pse->vmem_rss;
 +              ps->stack_size += pse->stack_size;
  
                if ((entry->vmem_minflt_counter == 0)
                                && (entry->vmem_majflt_counter == 0))
@@@ -423,9 -410,7 +423,9 @@@ static void ps_list_reset (void
        {
                ps->num_proc    = 0;
                ps->num_lwp     = 0;
 +              ps->vmem_size   = 0;
                ps->vmem_rss    = 0;
 +              ps->stack_size  = 0;
  
                pse_prev = NULL;
                pse = ps->instances;
@@@ -474,18 -459,12 +474,18 @@@ static int ps_config (const char *key, 
                int fields_num;
  
                new_val = strdup (value);
 -              if (new_val == NULL)
 +              if (new_val == NULL) {
 +                      ERROR ("processes plugin: strdup failed when processing "
 +                                      "`ProcessMatch %s'.", value);
                        return (1);
 +              }
 +
                fields_num = strsplit (new_val, fields,
                                STATIC_ARRAY_SIZE (fields));
                if (fields_num != 2)
                {
 +                      ERROR ("processes plugin: `ProcessMatch' needs exactly "
 +                                      "two string arguments.");
                        sfree (new_val);
                        return (1);
                }
        }
        else
        {
 +              ERROR ("processes plugin: The `%s' configuration option is not "
 +                              "understood and will be ignored.", key);
                return (-1);
        }
  
@@@ -554,6 -531,7 +554,6 @@@ static void ps_submit_state (const cha
  
        vl.values = values;
        vl.values_len = 1;
 -      vl.time = time (NULL);
        sstrncpy (vl.host, hostname_g, sizeof (vl.host));
        sstrncpy (vl.plugin, "processes", sizeof (vl.plugin));
        sstrncpy (vl.plugin_instance, "", sizeof (vl.plugin_instance));
@@@ -571,25 -549,16 +571,25 @@@ static void ps_submit_proc_list (procst
  
        vl.values = values;
        vl.values_len = 2;
 -      vl.time = time (NULL);
        sstrncpy (vl.host, hostname_g, sizeof (vl.host));
        sstrncpy (vl.plugin, "processes", sizeof (vl.plugin));
        sstrncpy (vl.plugin_instance, ps->name, sizeof (vl.plugin_instance));
  
 +      sstrncpy (vl.type, "ps_vm", sizeof (vl.type));
 +      vl.values[0].gauge = ps->vmem_size;
 +      vl.values_len = 1;
 +      plugin_dispatch_values (&vl);
 +
        sstrncpy (vl.type, "ps_rss", sizeof (vl.type));
        vl.values[0].gauge = ps->vmem_rss;
        vl.values_len = 1;
        plugin_dispatch_values (&vl);
  
 +      sstrncpy (vl.type, "ps_stacksize", sizeof (vl.type));
 +      vl.values[0].gauge = ps->stack_size;
 +      vl.values_len = 1;
 +      plugin_dispatch_values (&vl);
 +
        sstrncpy (vl.type, "ps_cputime", sizeof (vl.type));
        vl.values[0].counter = ps->cpu_user_counter;
        vl.values[1].counter = ps->cpu_system_counter;
@@@ -695,9 -664,7 +695,9 @@@ int ps_read_process (int pid, procstat_
  
        long long unsigned cpu_user_counter;
        long long unsigned cpu_system_counter;
 +      long long unsigned vmem_size;
        long long unsigned vmem_rss;
 +      long long unsigned stack_size;
  
        memset (ps, 0, sizeof (procstat_t));
  
  
        cpu_user_counter   = atoll (fields[13]);
        cpu_system_counter = atoll (fields[14]);
 -      vmem_rss = atoll (fields[23]);
 +      vmem_size          = atoll (fields[22]);
 +      vmem_rss           = atoll (fields[23]);
        ps->vmem_minflt_counter = atol (fields[9]);
        ps->vmem_majflt_counter = atol (fields[11]);
 -      
 +
 +      {
 +              unsigned long long stack_start = atoll (fields[27]);
 +              unsigned long long stack_ptr   = atoll (fields[28]);
 +
 +              stack_size = (stack_start > stack_ptr)
 +                      ? stack_start - stack_ptr
 +                      : stack_ptr - stack_start;
 +      }
 +
        /* Convert jiffies to useconds */
        cpu_user_counter   = cpu_user_counter   * 1000000 / CONFIG_HZ;
        cpu_system_counter = cpu_system_counter * 1000000 / CONFIG_HZ;
  
        ps->cpu_user_counter = (unsigned long) cpu_user_counter;
        ps->cpu_system_counter = (unsigned long) cpu_system_counter;
 +      ps->vmem_size = (unsigned long) vmem_size;
        ps->vmem_rss = (unsigned long) vmem_rss;
 +      ps->stack_size = (unsigned long) stack_size;
  
        /* success */
        return (0);
  } /* int ps_read_process (...) */
 +
 +static char *ps_get_cmdline (pid_t pid, char *name, char *buf, size_t buf_len)
 +{
 +      char  *buf_ptr;
 +      size_t len;
 +
 +      char file[PATH_MAX];
 +      int  fd;
 +
 +      size_t n;
 +
 +      if ((pid < 1) || (NULL == buf) || (buf_len < 2))
 +              return NULL;
 +
 +      ssnprintf (file, sizeof (file), "/proc/%u/cmdline", pid);
 +
 +      fd = open (file, O_RDONLY);
 +      if (fd < 0) {
 +              char errbuf[4096];
 +              WARNING ("processes plugin: Failed to open `%s': %s.", file,
 +                              sstrerror (errno, errbuf, sizeof (errbuf)));
 +              return NULL;
 +      }
 +
 +      buf_ptr = buf;
 +      len     = buf_len;
 +
 +      n = 0;
 +
 +      while (42) {
 +              ssize_t status;
 +
 +              status = read (fd, (void *)buf_ptr, len);
 +
 +              if (status < 0) {
 +                      char errbuf[4096];
 +
 +                      if ((EAGAIN == errno) || (EINTR == errno))
 +                              continue;
 +
 +                      WARNING ("processes plugin: Failed to read from `%s': %s.", file,
 +                                      sstrerror (errno, errbuf, sizeof (errbuf)));
 +                      close (fd);
 +                      return NULL;
 +              }
 +
 +              n += status;
 +
 +              if (status == 0)
 +                      break;
 +
 +              buf_ptr += status;
 +              len     -= status;
 +
 +              if (len <= 0)
 +                      break;
 +      }
 +
 +      close (fd);
 +
 +      if (0 == n) {
 +              /* cmdline not available; e.g. kernel thread, zombie */
 +              if (NULL == name)
 +                      return NULL;
 +
 +              ssnprintf (buf, buf_len, "[%s]", name);
 +              return buf;
 +      }
 +
 +      assert (n <= buf_len);
 +
 +      if (n == buf_len)
 +              --n;
 +      buf[n] = '\0';
 +
 +      --n;
 +      /* remove trailing whitespace */
 +      while ((n > 0) && (isspace (buf[n]) || ('\0' == buf[n]))) {
 +              buf[n] = '\0';
 +              --n;
 +      }
 +
 +      /* arguments are separated by '\0' in /proc/<pid>/cmdline */
 +      while (n > 0) {
 +              if ('\0' == buf[n])
 +                      buf[n] = ' ';
 +              --n;
 +      }
 +      return buf;
 +} /* char *ps_get_cmdline (...) */
  #endif /* KERNEL_LINUX */
  
  #if HAVE_THREAD_INFO
@@@ -1197,8 -1062,6 +1197,8 @@@ static int ps_read (void
        DIR           *proc;
        int            pid;
  
 +      char cmdline[ARG_MAX];
 +
        int        status;
        procstat_t ps;
        procstat_entry_t pse;
                pse.id       = pid;
                pse.age      = 0;
  
 -              pse.num_proc = ps.num_proc;
 -              pse.num_lwp  = ps.num_lwp;
 -              pse.vmem_rss = ps.vmem_rss;
 +              pse.num_proc   = ps.num_proc;
 +              pse.num_lwp    = ps.num_lwp;
 +              pse.vmem_size  = ps.vmem_size;
 +              pse.vmem_rss   = ps.vmem_rss;
 +              pse.stack_size = ps.stack_size;
  
                pse.vmem_minflt = 0;
                pse.vmem_minflt_counter = ps.vmem_minflt_counter;
                        case 'W': paging++;   break;
                }
  
 -              /* FIXME: cmdline should be here instead of NULL */
 -              ps_list_add (ps.name, NULL, &pse);
 +              ps_list_add (ps.name,
 +                              ps_get_cmdline (pid, ps.name, cmdline, sizeof (cmdline)),
 +                              &pse);
        }
  
        closedir (proc);
                pse.num_proc = 1;
                pse.num_lwp  = procs[i].ki_numthreads;
  
-               pse.vmem_size = procs[i].ki_size;
+               /* pse.vmem_size = procs[i].ki_size; */
                pse.vmem_rss = procs[i].ki_rssize * getpagesize();
-               pse.stack_size = procs[i].ki_ssize * getpagesize();
+               /* pse.stack_size = procs[i].ki_ssize * getpagesize(); */
                pse.vmem_minflt = 0;
                pse.vmem_minflt_counter = procs[i].ki_rusage.ru_minflt;
                pse.vmem_majflt = 0;