[collectd] cpu plugin on macosx

Robert Viduya robert at oit.gatech.edu
Fri May 29 23:47:21 CEST 2015


I just upgraded from collectd-5.4.2 to 5.5.0 on my mac and the cpu plugin stopped working.  The error in the log was "cpu plugin: processor_info returned only 4 elements..”.

The complaint is correct, osx only reports 4 cpu states: user, nice, system and idle.  Version 5.4.2 correctly handles this, but 5.5.0 is broken.

The code in cpu.c is incorrectly expecting the processor_info system call to return the wrong number of states (COLLECTD_CPU_STATE_MAX vs CPU_STATE_MAX).  It’s also expecting the indexes into the array to match it’s internal indexes (COLLECTD_CPU_STATE_USER vs CPU_STATE_USER, COLLECTD_CPU_STATE_NICE vs CPU_STATE_NICE, etc.).

I’ve made the following changes to make it work on osx, but I’m not sure if this breaks it on any other platform:

*** collectd-5.5.0.orig/src/cpu.c	Tue Mar 10 10:14:45 2015
--- collectd-5.5.0/src/cpu.c	Fri May 29 11:04:56 2015
***************
*** 582,597 ****
  			continue;
  		}
  
! 		if (cpu_info_len < COLLECTD_CPU_STATE_MAX)
  		{
  			ERROR ("cpu plugin: processor_info returned only %i elements..", cpu_info_len);
  			continue;
  		}
  
! 		cpu_stage (cpu, COLLECTD_CPU_STATE_USER,   (derive_t) cpu_info.cpu_ticks[COLLECTD_CPU_STATE_USER],   now);
! 		cpu_stage (cpu, COLLECTD_CPU_STATE_NICE,   (derive_t) cpu_info.cpu_ticks[COLLECTD_CPU_STATE_NICE],   now);
! 		cpu_stage (cpu, COLLECTD_CPU_STATE_SYSTEM, (derive_t) cpu_info.cpu_ticks[COLLECTD_CPU_STATE_SYSTEM], now);
! 		cpu_stage (cpu, COLLECTD_CPU_STATE_IDLE,   (derive_t) cpu_info.cpu_ticks[COLLECTD_CPU_STATE_IDLE],   now);
  	}
  /* }}} #endif PROCESSOR_CPU_LOAD_INFO */
  
--- 582,597 ----
  			continue;
  		}
  
! 		if (cpu_info_len < CPU_STATE_MAX)
  		{
  			ERROR ("cpu plugin: processor_info returned only %i elements..", cpu_info_len);
  			continue;
  		}
  
! 		cpu_stage (cpu, COLLECTD_CPU_STATE_USER,   (derive_t) cpu_info.cpu_ticks[CPU_STATE_USER],   now);
! 		cpu_stage (cpu, COLLECTD_CPU_STATE_NICE,   (derive_t) cpu_info.cpu_ticks[CPU_STATE_NICE],   now);
! 		cpu_stage (cpu, COLLECTD_CPU_STATE_SYSTEM, (derive_t) cpu_info.cpu_ticks[CPU_STATE_SYSTEM], now);
! 		cpu_stage (cpu, COLLECTD_CPU_STATE_IDLE,   (derive_t) cpu_info.cpu_ticks[CPU_STATE_IDLE],   now);
  	}
  /* }}} #endif PROCESSOR_CPU_LOAD_INFO */




More information about the collectd mailing list