def parse_df_output(self, df_output, platform_name, inodes=False, use_mount=False, blacklist_re=None): """ Parse the output of the df command. If use_volume is true the volume is used to anchor the metric, otherwise false the mount point is used. Returns a tuple of (disk, inode). """ usage_data = [] # Transform the raw output into tuples of the df data. devices = self._transform_df_output(df_output, blacklist_re) # If we want to use the mount point, replace the volume name on each # line. for parts in devices: try: if use_mount: parts[0] = parts[-1] if inodes: if Platform.is_darwin(platform_name): # Filesystem 512-blocks Used Available Capacity iused ifree %iused Mounted # Inodes are in position 5, 6 and we need to compute the total # Total parts[1] = int(parts[5]) + int(parts[6]) # Total parts[2] = int(parts[5]) # Used parts[3] = int(parts[6]) # Available elif Platform.is_freebsd(platform_name): # Filesystem 1K-blocks Used Avail Capacity iused ifree %iused Mounted # Inodes are in position 5, 6 and we need to compute the total parts[1] = int(parts[5]) + int(parts[6]) # Total parts[2] = int(parts[5]) # Used parts[3] = int(parts[6]) # Available else: parts[1] = int(parts[1]) # Total parts[2] = int(parts[2]) # Used parts[3] = int(parts[3]) # Available else: parts[1] = int(parts[1]) # Total parts[2] = int(parts[2]) # Used parts[3] = int(parts[3]) # Available except IndexError: self.logger.exception("Cannot parse %s" % (parts, )) usage_data.append(parts) return usage_data
def parse_df_output(self, df_output, platform_name, inodes=False, use_mount=False, blacklist_re=None): """ Parse the output of the df command. If use_volume is true the volume is used to anchor the metric, otherwise false the mount point is used. Returns a tuple of (disk, inode). """ usage_data = [] # Transform the raw output into tuples of the df data. devices = self._transform_df_output(df_output, blacklist_re) # If we want to use the mount point, replace the volume name on each # line. for parts in devices: try: if use_mount: parts[0] = parts[-1] if inodes: if Platform.is_darwin(platform_name): # Filesystem 512-blocks Used Available Capacity iused ifree %iused Mounted # Inodes are in position 5, 6 and we need to compute the total # Total parts[1] = int(parts[5]) + int(parts[6]) # Total parts[2] = int(parts[5]) # Used parts[3] = int(parts[6]) # Available elif Platform.is_freebsd(platform_name): # Filesystem 1K-blocks Used Avail Capacity iused ifree %iused Mounted # Inodes are in position 5, 6 and we need to compute the total parts[1] = int(parts[5]) + int(parts[6]) # Total parts[2] = int(parts[5]) # Used parts[3] = int(parts[6]) # Available else: parts[1] = int(parts[1]) # Total parts[2] = int(parts[2]) # Used parts[3] = int(parts[3]) # Available else: parts[1] = int(parts[1]) # Total parts[2] = int(parts[2]) # Used parts[3] = int(parts[3]) # Available except IndexError: self.logger.exception("Cannot parse %s" % (parts,)) usage_data.append(parts) return usage_data
def test_collecting_disk_metrics(self): """Testing disk stats gathering""" if Platform.is_unix(): disk = Disk(logger) res = disk.check({}) # Assert we have disk & inode stats assert len(res) == 2 assert res[0] assert res[1]
def check(self, instance): if instance is None: instance = {} self._excluded_ifaces = instance.get('excluded_interfaces', []) self._collect_cx_state = instance.get('collect_connection_state', False) self._exclude_iface_re = None exclude_re = instance.get('excluded_interface_re', None) if exclude_re: self.log.debug("Excluding network devices matching: %s" % exclude_re) self._exclude_iface_re = re.compile(exclude_re) if Platform.is_linux(): self._check_linux(instance) elif Platform.is_bsd(): self._check_bsd(instance) elif Platform.is_solaris(): self._check_solaris(instance)
def check(self, instance): if instance is None: instance = {} self._excluded_ifaces = instance.get('excluded_interfaces', []) self._collect_cx_state = instance.get('collect_connection_state', False) self._exclude_iface_re = None exclude_re = instance.get('excluded_interface_re', None) if exclude_re: self.log.debug("Excluding network devices matching: %s" % exclude_re) self._exclude_iface_re = re.compile(exclude_re) if Platform.is_linux(): self._check_linux(instance) elif Platform.is_bsd(): self._check_bsd(instance) elif Plaform.is_solaris(): self._check_solaris(instance)
def testLoad(self): global logger load = Load(logger) res = load.check({'system_stats': get_system_stats()}) assert 'system.load.1' in res if Platform.is_linux(): cores = int(get_system_stats().get('cpuCores')) assert 'system.load.norm.1' in res assert abs(res['system.load.1'] - cores * res['system.load.norm.1']) <= 0.1, (res['system.load.1'], cores * res['system.load.norm.1']) # same test but without cpu count, no normalized load sent. res = load.check({}) assert 'system.load.1' in res assert 'system.load.norm.1' not in res
def testLoad(self): global logger load = Load(logger) res = load.check({'system_stats': get_system_stats()}) assert 'system.load.1' in res if Platform.is_linux(): cores = int(get_system_stats().get('cpuCores')) assert 'system.load.norm.1' in res assert abs(res['system.load.1'] - cores * res['system.load.norm.1']) <= 0.1, ( res['system.load.1'], cores * res['system.load.norm.1']) # same test but without cpu count, no normalized load sent. res = load.check({}) assert 'system.load.1' in res assert 'system.load.norm.1' not in res
def get_process_metrics(self, pids, psutil, cpu_check_interval): # initialize process metrics # process metrics available for all versions of psutil rss = 0 vms = 0 cpu = 0 thr = 0 # process metrics available for psutil versions 0.6.0 and later extended_metrics_0_6_0 = self.is_psutil_version_later_than((0, 6, 0)) if extended_metrics_0_6_0: real = 0 ctx_switches = 0 else: real = None ctx_switches = None # process metrics available for psutil versions 0.5.0 and later on UNIX extended_metrics_0_5_0_unix = self.is_psutil_version_later_than((0, 5, 0)) and \ Platform.is_unix() if extended_metrics_0_5_0_unix: open_file_descriptors = 0 else: open_file_descriptors = None # process I/O counters (agent might not have permission to access) read_count = 0 write_count = 0 read_bytes = 0 write_bytes = 0 for pid in set(pids): try: p = psutil.Process(pid) if extended_metrics_0_6_0: mem = p.get_ext_memory_info() real += mem.rss - mem.shared ctx_switches += p.get_num_ctx_switches() else: mem = p.get_memory_info() if extended_metrics_0_5_0_unix: open_file_descriptors += p.get_num_fds() rss += mem.rss vms += mem.vms thr += p.get_num_threads() cpu += p.get_cpu_percent(cpu_check_interval) # user agent might not have permission to call get_io_counters() # user agent might have access to io counters for some processes and not others if read_count is not None: try: io_counters = p.get_io_counters() read_count += io_counters.read_count write_count += io_counters.write_count read_bytes += io_counters.read_bytes write_bytes += io_counters.write_bytes except psutil.AccessDenied: self.log.info('DD user agent does not have access \ to I/O counters for process %d: %s' % (pid, p.name)) read_count = None write_count = None read_bytes = None write_bytes = None # Skip processes dead in the meantime except psutil.NoSuchProcess: self.warning('Process %s disappeared while scanning' % pid) pass #Memory values are in Byte return (thr, cpu, rss, vms, real, open_file_descriptors, read_count, write_count, read_bytes, write_bytes, ctx_switches)