diff options
Diffstat (limited to 'collectors/python.d.plugin/mdstat')
-rw-r--r-- | collectors/python.d.plugin/mdstat/Makefile.inc | 13 | ||||
-rw-r--r-- | collectors/python.d.plugin/mdstat/README.md | 33 | ||||
-rw-r--r-- | collectors/python.d.plugin/mdstat/mdstat.chart.py | 205 | ||||
-rw-r--r-- | collectors/python.d.plugin/mdstat/mdstat.conf | 30 |
4 files changed, 0 insertions, 281 deletions
diff --git a/collectors/python.d.plugin/mdstat/Makefile.inc b/collectors/python.d.plugin/mdstat/Makefile.inc deleted file mode 100644 index 5125a271b..000000000 --- a/collectors/python.d.plugin/mdstat/Makefile.inc +++ /dev/null @@ -1,13 +0,0 @@ -# SPDX-License-Identifier: GPL-3.0-or-later - -# THIS IS NOT A COMPLETE Makefile -# IT IS INCLUDED BY ITS PARENT'S Makefile.am -# IT IS REQUIRED TO REFERENCE ALL FILES RELATIVE TO THE PARENT - -# install these files -dist_python_DATA += mdstat/mdstat.chart.py -dist_pythonconfig_DATA += mdstat/mdstat.conf - -# do not install these files, but include them in the distribution -dist_noinst_DATA += mdstat/README.md mdstat/Makefile.inc - diff --git a/collectors/python.d.plugin/mdstat/README.md b/collectors/python.d.plugin/mdstat/README.md deleted file mode 100644 index f88346eec..000000000 --- a/collectors/python.d.plugin/mdstat/README.md +++ /dev/null @@ -1,33 +0,0 @@ -# mdstat - -> THIS MODULE IS OBSOLETE. -> USE THE [PROC PLUGIN](../../proc.plugin) - IT IS MORE EFFICIENT - ---- - -Module monitor /proc/mdstat - -It produces: - -1. **Health** Number of failed disks in every array (aggregate chart). - -2. **Disks stats** - * total (number of devices array ideally would have) - * inuse (number of devices currently are in use) - -3. **Current status** - * resync in percent - * recovery in percent - * reshape in percent - * check in percent - -4. **Operation status** (if resync/recovery/reshape/check is active) - * finish in minutes - * speed in megabytes/s - -### configuration -No configuration is needed. - ---- - -[![analytics](https://www.google-analytics.com/collect?v=1&aip=1&t=pageview&_s=1&ds=github&dr=https%3A%2F%2Fgithub.com%2Fnetdata%2Fnetdata&dl=https%3A%2F%2Fmy-netdata.io%2Fgithub%2Fcollectors%2Fpython.d.plugin%2Fmdstat%2FREADME&_u=MAC~&cid=5792dfd7-8dc4-476b-af31-da2fdb9f93d2&tid=UA-64295674-3)]() diff --git a/collectors/python.d.plugin/mdstat/mdstat.chart.py b/collectors/python.d.plugin/mdstat/mdstat.chart.py deleted file mode 100644 index b7306b6a7..000000000 --- a/collectors/python.d.plugin/mdstat/mdstat.chart.py +++ /dev/null @@ -1,205 +0,0 @@ -# -*- coding: utf-8 -*- -# Description: mdstat netdata python.d module -# Author: Ilya Mashchenko (l2isbad) -# SPDX-License-Identifier: GPL-3.0-or-later - -import re - -from collections import defaultdict - -from bases.FrameworkServices.SimpleService import SimpleService - -MDSTAT = '/proc/mdstat' -MISMATCH_CNT = '/sys/block/{0}/md/mismatch_cnt' - -ORDER = ['mdstat_health'] - -CHARTS = { - 'mdstat_health': { - 'options': [None, 'Faulty Devices In MD', 'failed disks', 'health', 'md.health', 'line'], - 'lines': [] - } -} - -RE_DISKS = re.compile(r' (?P<array>[a-zA-Z_0-9]+) : active .+\[' - r'(?P<total_disks>[0-9]+)/' - r'(?P<inuse_disks>[0-9]+)\]') - -RE_STATUS = re.compile(r' (?P<array>[a-zA-Z_0-9]+) : active .+ ' - r'(?P<operation>[a-z]+) =[ ]{1,2}' - r'(?P<operation_status>[0-9.]+).+finish=' - r'(?P<finish_in>([0-9.]+))min speed=' - r'(?P<speed>[0-9]+)') - - -def md_charts(name): - order = [ - '{0}_disks'.format(name), - '{0}_operation'.format(name), - '{0}_mismatch_cnt'.format(name), - '{0}_finish'.format(name), - '{0}_speed'.format(name) - ] - - charts = dict() - charts[order[0]] = { - 'options': [None, 'Disks Stats', 'disks', name, 'md.disks', 'stacked'], - 'lines': [ - ['{0}_total_disks'.format(name), 'total', 'absolute'], - ['{0}_inuse_disks'.format(name), 'inuse', 'absolute'] - ] - } - - charts[order[1]] = { - 'options': [None, 'Current Status', 'percent', name, 'md.status', 'line'], - 'lines': [ - ['{0}_resync'.format(name), 'resync', 'absolute', 1, 100], - ['{0}_recovery'.format(name), 'recovery', 'absolute', 1, 100], - ['{0}_reshape'.format(name), 'reshape', 'absolute', 1, 100], - ['{0}_check'.format(name), 'check', 'absolute', 1, 100], - ] - } - - charts[order[2]] = { - 'options': [None, 'Mismatch Count', 'unsynchronized blocks', name, 'md.mismatch_cnt', 'line'], - 'lines': [ - ['{0}_mismatch_cnt'.format(name), 'count', 'absolute'] - ] - } - - charts[order[3]] = { - 'options': [None, 'Approximate Time Until Finish', 'seconds', name, 'md.rate', 'line'], - 'lines': [ - ['{0}_finish_in'.format(name), 'finish in', 'absolute', 1, 1000] - ] - } - - charts[order[4]] = { - 'options': [None, 'Operation Speed', 'KB/s', name, 'md.rate', 'line'], - 'lines': [ - ['{0}_speed'.format(name), 'speed', 'absolute', 1, 1000] - ] - } - - return order, charts - - -class MD: - def __init__(self, raw_data): - self.name = raw_data['array'] - self.d = raw_data - - def data(self): - rv = { - 'total_disks': self.d['total_disks'], - 'inuse_disks': self.d['inuse_disks'], - 'health': int(self.d['total_disks']) - int(self.d['inuse_disks']), - 'resync': 0, - 'recovery': 0, - 'reshape': 0, - 'check': 0, - 'finish_in': 0, - 'speed': 0, - } - - v = read_lines(MISMATCH_CNT.format(self.name)) - if v: - rv['mismatch_cnt'] = v - - if self.d.get('operation'): - rv[self.d['operation']] = float(self.d['operation_status']) * 100 - rv['finish_in'] = float(self.d['finish_in']) * 1000 * 60 - rv['speed'] = float(self.d['speed']) * 1000 - - return dict(('{0}_{1}'.format(self.name, k), v) for k, v in rv.items()) - - -class Service(SimpleService): - def __init__(self, configuration=None, name=None): - SimpleService.__init__(self, configuration=configuration, name=name) - self.order = ORDER - self.definitions = CHARTS - self.mds = list() - - @staticmethod - def get_mds(): - raw = read_lines(MDSTAT) - - if not raw: - return None - - return find_mds(raw) - - def get_data(self): - """ - Parse data from _get_raw_data() - :return: dict - """ - mds = self.get_mds() - - if not mds: - return None - - data = dict() - for md in mds: - if md.name not in self.mds: - self.mds.append(md.name) - self.add_new_md_charts(md.name) - data.update(md.data()) - return data - - def check(self): - if not self.get_mds(): - self.error('Failed to read data from {0} or there is no active arrays'.format(MDSTAT)) - return False - return True - - def add_new_md_charts(self, name): - order, charts = md_charts(name) - - self.charts['mdstat_health'].add_dimension(['{0}_health'.format(name), name]) - - for chart_name in order: - params = [chart_name] + charts[chart_name]['options'] - dims = charts[chart_name]['lines'] - - chart = self.charts.add_chart(params) - for dim in dims: - chart.add_dimension(dim) - - -def find_mds(raw_data): - data = defaultdict(str) - counter = 1 - - for row in (elem.strip() for elem in raw_data): - if not row: - counter += 1 - continue - data[counter] = ' '.join([data[counter], row]) - - mds = list() - - for v in data.values(): - m = RE_DISKS.search(v) - - if not m: - continue - - d = m.groupdict() - - m = RE_STATUS.search(v) - if m: - d.update(m.groupdict()) - - mds.append(MD(d)) - - return sorted(mds, key=lambda md: md.name) - - -def read_lines(path): - try: - with open(path) as f: - return f.readlines() - except (IOError, OSError): - return None diff --git a/collectors/python.d.plugin/mdstat/mdstat.conf b/collectors/python.d.plugin/mdstat/mdstat.conf deleted file mode 100644 index c72b63835..000000000 --- a/collectors/python.d.plugin/mdstat/mdstat.conf +++ /dev/null @@ -1,30 +0,0 @@ -# netdata python.d.plugin configuration for mdstat -# -# This file is in YaML format. Generally the format is: -# -# name: value -# - -# ---------------------------------------------------------------------- -# Global Variables -# These variables set the defaults for all JOBs, however each JOB -# may define its own, overriding the defaults. - -# update_every sets the default data collection frequency. -# If unset, the python.d.plugin default is used. -# update_every: 1 - -# priority controls the order of charts at the netdata dashboard. -# Lower numbers move the charts towards the top of the page. -# If unset, the default for python.d.plugin is used. -# priority: 60000 - -# penalty indicates whether to apply penalty to update_every in case of failures. -# Penalty will increase every 5 failed updates in a row. Maximum penalty is 10 minutes. -# penalty: yes - -# autodetection_retry sets the job re-check interval in seconds. -# The job is not deleted if check fails. -# Attempts to start the job are made once every autodetection_retry. -# This feature is disabled by default. -# autodetection_retry: 0 |