Skip to content

Instantly share code, notes, and snippets.

@kawashirov
Last active November 15, 2015 17:52
Show Gist options
  • Save kawashirov/85cd2e144b4e5150f76c to your computer and use it in GitHub Desktop.
Save kawashirov/85cd2e144b4e5150f76c to your computer and use it in GitHub Desktop.
#!/usr/bin/python3
# encoding=utf8
from .abstract_stats_page import AbstractStatsPage
from ..utils import mu
class Iface_StatsPage(AbstractStatsPage):
def __init__(self, **kwargs):
kwargs.setdefault('type', 'Интерфейсы')
super(Iface_StatsPage, self).__init__(**kwargs)
def generate(self, vgdoc):
srcs = self.rrd_provider.get_srcs({r'^interface-([a-zA-Z0-9_-]+)/if_octets.rrd$': 1})
self.log.info('Все источники: {!s}'.format(srcs))
doc, tag, text = vgdoc.tagtext()
for src in srcs:
self.log.info('Обрабатываю источник: {:s}'.format(src))
with vgdoc.page_title():
text('Использование сети на интерфейсе ')
with tag('code'): text(src)
for modgen in (_model_octets, _model_packets):
try:
self.full_model(vgdoc, modgen(src, vgdoc))
except Exception:
self.log.exception('Не могу нарисвать octets для {:s}.'.format(src))
def _model_octets(src, vgdoc):
n_ds = lambda n: 'ds_{:s}'.format(n)
n_calc = lambda n: 'ca_{:s}'.format(n)
n_area = lambda n: 'ar_{:s}'.format(n)
n_trend = lambda n: 'tr_{:s}'.format(n)
n_rule = lambda n: 'hr_{:s}'.format(n)
return {
'title': 'Трафик на интерфейсе <code>{:s}</code>'.format(src),
'title_mode': 'asis',
'rrd_files': {'octets': 'interface-{:s}/if_octets.rrd'.format(src), },
'graphs': [{
'name': 'octets',
'rrd_defines': mu.join(
mu.ddef(n_ds('rx'), 'octets', rrd_name='rx'),
mu.ddef(n_ds('tx'), 'octets', rrd_name='tx'),
mu.cdefr(n_calc('rx'), '{:s},8,*'.format(n_ds('rx'))),
mu.cdefr(n_calc('tx'), '{:s},8,*'.format(n_ds('tx'))),
mu.cdefr(n_area('rx'), n_calc('rx')),
mu.cdefr(n_area('tx'), '0,{:s},-'.format(n_calc('tx'))),
mu.cdefb_trend(n_trend('rx'), n_area('rx')),
mu.cdefb_trend(n_trend('tx'), n_area('tx')),
mu.vdefb(n_rule('rx'), n_area('rx'), 'avg'),
mu.vdefb(n_rule('tx'), n_area('tx'), 'avg'),
mu.vdefs_naxl(n_calc('rx'), fmt='%4.1lf %s'),
mu.vdefs_naxl(n_calc('tx'), fmt='%4.1lf %s'),
),
'areas': [
{'ref_name': n_area('rx'), 'color': (0, 191, 0, 127)},
{'ref_name': n_area('tx'), 'color': (0, 0, 191, 127)},
],
'hrules': [
{'ref_name': n_rule('rx'), 'color': (0, 191, 0)},
{'ref_name': n_rule('tx'), 'color': (0, 0, 191)},
],
'lines': [
{'ref_name': n_trend('rx'), 'color': (0, 127, 0)},
{'ref_name': n_trend('tx'), 'color': (0, 0, 127)},
],
}],
'legends': [{
'cols': mu.cols_naxl(),
'rows': [{
'type': 'reference',
'legend_name': 'Принято',
'ref_graph': 'octets',
'ref_name': mu.row_ref_naxl(n_calc('rx')),
'box': {'color_bg': (0, 191, 0, 127), 'color_fg': (0, 127, 0)},
'unit': 'бит/cек.',
}, {
'type': 'reference',
'legend_name': 'Отправлено',
'ref_graph': 'octets',
'ref_name': mu.row_ref_naxl(n_calc('tx')),
'box': {'color_bg': (0, 0, 191, 127), 'color_fg': (0, 0, 127)},
'unit': 'бит/cек.',
}],
}],
'cols': mu.cols_naxl(),
}
def _model_packets(src, vgdoc):
n_calc = lambda n: 'ca_{:s}'.format(n)
n_area = lambda n: 'ar_{:s}'.format(n)
n_trend = lambda n: 'tr_{:s}'.format(n)
n_rule = lambda n: 'hr_{:s}'.format(n)
return {
'title': 'Пакетов на интерфейсе <code>{:s}</code>'.format(src),
'title_mode': 'asis',
'rrd_files': {
'packets': 'interface-{:s}/if_packets.rrd'.format(src),
'errors': 'interface-{:s}/if_errors.rrd'.format(src),
},
'graphs': [{
'name': 'packets',
'rrd_defines': mu.join(
mu.ddef(n_calc('prx'), 'packets', rrd_name='rx'),
mu.ddef(n_calc('ptx'), 'packets', rrd_name='tx'),
mu.ddef(n_calc('erx'), 'errors', rrd_name='rx'),
mu.ddef(n_calc('etx'), 'errors', rrd_name='tx'),
mu.cdefr(n_area('prx'), n_calc('prx')),
mu.cdefr(n_area('ptx'), '0,{:s},-'.format(n_calc('ptx'))),
mu.cdefr(n_area('erx'), n_calc('erx')),
mu.cdefr(n_area('etx'), '0,{:s},-'.format(n_calc('etx'))),
mu.cdefb_trend(n_trend('prx'), n_area('prx')),
mu.cdefb_trend(n_trend('ptx'), n_area('ptx')),
mu.vdefb(n_rule('prx'), n_area('prx'), 'avg'),
mu.vdefb(n_rule('ptx'), n_area('ptx'), 'avg'),
mu.vdefs_naxl(n_calc('prx'), fmt='%4.1lf%s'),
mu.vdefs_naxl(n_calc('ptx'), fmt='%4.1lf%s'),
mu.vdefs_naxl(n_calc('erx'), fmt='%4.1lf%s'),
mu.vdefs_naxl(n_calc('etx'), fmt='%4.1lf%s'),
),
'areas': [
{'ref_name': n_area('prx'), 'color': (0, 191, 0, 127)},
{'ref_name': n_area('ptx'), 'color': (0, 0, 191, 127)},
],
'hrules': [
{'ref_name': n_rule('prx'), 'color': (0, 191, 0), 'dashes': (5, 5)},
{'ref_name': n_rule('ptx'), 'color': (0, 0, 191), 'dashes': (5, 5)},
],
'lines': [
{'ref_name': n_area('erx'), 'color': (191, 127, 0)},
{'ref_name': n_area('etx'), 'color': (191, 0, 127)},
{'ref_name': n_trend('prx'), 'color': (0, 127, 0)},
{'ref_name': n_trend('ptx'), 'color': (0, 0, 127)},
],
}],
'legends': [{
'cols': mu.cols_naxl(),
'rows': [{
'type': 'reference',
'legend_name': 'Принято пакетов',
'ref_graph': 'packets',
'ref_name': mu.row_ref_naxl(n_calc('prx')),
'box': {'color_bg': (0, 191, 0, 127), 'color_fg': (0, 127, 0)},
'unit': '/cек.',
}, {
'type': 'reference',
'legend_name': 'Отправлено пакетов',
'ref_graph': 'packets',
'ref_name': mu.row_ref_naxl(n_calc('ptx')),
'box': {'color_bg': (0, 0, 191, 127), 'color_fg': (0, 0, 127)},
'unit': '/cек.',
}, {
'type': 'reference',
'legend_name': 'Ошибок принятия',
'ref_graph': 'packets',
'ref_name': mu.row_ref_naxl(n_calc('erx')),
'box': {'color_fg': (191, 127, 0)},
'unit': '/cек.',
}, {
'type': 'reference',
'legend_name': 'Ошибок отправки',
'ref_graph': 'packets',
'ref_name': mu.row_ref_naxl(n_calc('etx')),
'box': {'color_fg': (191, 0, 127)},
'unit': '/cек.',
}],
}],
'cols': mu.cols_naxl(),
}
#!/usr/bin/python
# encoding=utf8
from .abstract_stats_page import AbstractStatsPage
from ..utils import cu, mu
class Weather_StatsPage(AbstractStatsPage):
def __init__(self, **kwargs):
kwargs.setdefault('type', 'Погода')
super(Weather_StatsPage, self).__init__(**kwargs)
self.__srcs_good = set(kwargs.get('srcs_good', set()))
def generate(self, vgdoc):
srcs_all = self.rrd_provider.get_srcs({r'^weather/temperature-([a-zA-Z0-9_-]+).rrd$': 1})
srcs_good = srcs_all & self.__srcs_good
srcs_bad = srcs_all - self.__srcs_good
self.log.info('Все источники: {0!s}'.format(srcs_all))
self.log.info('Хорошие источники: {0!s}'.format(srcs_good))
self.log.info('Плохие источники: {0!s}'.format(srcs_bad))
n_data_src = lambda s: 'd_{:s}'.format(s)
n_row_ref = lambda v, s: '{:s}_{:s}'.format(v, n_data_src(s))
# Сборка и запуск модели
self.full_model(vgdoc, {
'title': 'Температура в Красноярске',
'rrd_files': {src: 'weather/temperature-{0!s}.rrd'.format(src) for src in srcs_all},
'graphs': [{
'name': 'temp',
'rrd_defines': mu.join(
[mu.ddef(n_data_src(src), src) for src in srcs_all],
mu.cdefb_cc('cc_vn__good', 'min', [n_data_src(src) for src in srcs_good]),
mu.cdefb_cc('cc_va__good', 'avg', [n_data_src(src) for src in srcs_good]),
mu.cdefb_cc('cc_vx__good', 'max', [n_data_src(src) for src in srcs_good]),
mu.cdefb_trend('trend__good', 'cc_va__good'),
[mu.vdefs_naxl(n_data_src(src), fmt='%3.1lf') for src in srcs_all],
mu.vdefb('vn__good', 'cc_vn__good', 'min', fmt='%3.1lf'),
mu.vdefb('va__good', 'cc_va__good', 'avg', fmt='%3.1lf'),
mu.vdefb('vx__good', 'cc_vx__good', 'max', fmt='%3.1lf'),
mu.vdefb('vl__good', 'cc_va__good', 'last', fmt='%3.1lf'),
),
'hrules': [
{'ref_name': 'vn__good', 'color': (0, 0, 255), 'dashes': (5, 5)},
{'ref_name': 'va__good', 'color': (0, 0, 0), 'dashes': (5, 5)},
{'ref_name': 'vx__good', 'color': (255, 0, 0), 'dashes': (5, 5)},
],
'lines': mu.join([{
'ref_name': n_data_src(src),
'color': cu.color_rnd(src),
'width': 1,
'dashes': (10, 5),
} for src in srcs_bad], [{
'ref_name': n_data_src(src),
'color': cu.color_rnd(src),
'width': 1,
} for src in srcs_good], {
'ref_name': 'trend__good',
'width': 2}
),
}],
'legends': [{
'cols': mu.cols_naxl(),
'rows': mu.join({
'type': 'header',
'title': 'Не точные источники <small>(не учитываются в общем среднем)</small>',
}, [{
'type': 'reference',
'ref_graph': 'temp',
'ref_name': lambda x, s=src: n_row_ref(x, s),
'box': {'color_fg': cu.color_rnd(src), 'style': 'dashed'},
'legend_name': src,
'unit': '°C',
} for src in srcs_bad], {
'type': 'header',
'title': 'Точные источники <small>(учитываются в общем среднем)</small>',
}, [{
'type': 'reference',
'ref_graph': 'temp',
'ref_name': lambda x, s=src: n_row_ref(x, s),
'box': {'color_fg': cu.color_rnd(src)},
'legend_name': src,
'unit': '°C',
} for src in srcs_good], {
'type': 'reference',
'ref_graph': 'temp',
'ref_name': lambda v: '{:s}__good'.format(v),
'box': {'color_fg': (0,), },
'legend_strong': True,
'legend_name': 'В общем',
'unit': '°C',
}),
}]
})
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment