в bash, debian, monitoring, scripts

Как заставить Munin собирать данные каждую минуту?

munin
По умолчанию Munin собирает данные (и строит по ним графики) каждые 5 минут. Такие графики получаются мягко говоря неточными.

Для детализации можно (и нужно) собирать данные чаще — например, каждую минуту. Давайте разберемся, как это сделать в ОС Debian Wheezy!

Для того, чтобы заставить Munin собирать данные каждую минуту, нужно выполнить несколько простых шагов. Сначала в файле /etc/cron.d/munin необходимо изменить */5 на *, чтобы munin-update запускался каждую минуту.

В конфигурационном файле /etc/munin/munin.conf необходимо добавить следующие строки:

...
graph_data_size custom 1d, 1m for 1w, 5m for 1t, 15m for 1y
update_rate 60
...

Примечание. Не забываем перезапустить Munin для применения изменений в конфигурационном файле.

После внесенных изменений существующие .rrd-файлы больше не смогут накапливать данные. Если все собранные ранее данные не нужны, то можно удалить .rrd-файлы в каталоге /var/lib/munin/<имя_домена> и начать все с чистого листа графика.

Если же нужно хранить и выводить все, что собиралось ранее — Justin Silver предлагает конвертировать .rrd-файлы так:

rrdtool dump file.rrd > file.5.xml
./rrd_step_reduce.py file.5.xml 5 > file1.xml
rrdtool restore file1.xml file.rrd

Скрипт rrd_step_reduce.py выглядит так:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see .

import sys
from copy import deepcopy
from StringIO import StringIO

try:
    from lxml import etree
except ImportError:
    try:
        import xml.etree.cElementTree as etree
    except ImportError:
        try:
            import xml.etree.ElementTree as etree
        except ImportError:
            try:
                import cElementTree as etree
            except ImportError:
                try:
                    import elementtree.ElementTree as etree
                except ImportError:
                    raise

def main(dumpfile, factor):

    xmldoc = etree.parse(dumpfile)
    root = xmldoc.getroot()

    # change step, reducing it by a factor of "factor"
    step = root.find("step")
    assert(step!=None)
    old_step = int(step.text)
    new_step = old_step/factor
    step.text = str(new_step) 

    database = root.findall("rra/database")
    for d in database:
        index = 0
        count = len(d)
        while count > 0:
            for i in range(0, factor-1):
                d.insert(index+1, deepcopy(d[index]))
            index = index + factor
            count = count - 1

    print etree.tostring(root)

if __name__ == "__main__":
    # arguments
    if len(sys.argv) != 3:
        print "rrd_step_reduce.py rrddump.xml factor"
        sys.exit(-1)

    # call main
    main(sys.argv[1], int(sys.argv[2]))

Это работает, единственный минус этого решения — приходится запускать скрипт для каждого .rrd-файла. Простенький bash-скрипт, который переконвертирует все .rrd-файлы в каталоге /var/lib/munin выглядит следующим образом:

find /var/lib/munin -type f -iname "*.rrd" -print0 | while IFS= read -r -d $'\0' filename; do
  echo $filename
  rrdtool dump $filename > temp.5.xml
  ./rrd_step_reduce.py temp.5.xml 5 > temp.1.xml
  rm $filename
  rrdtool restore temp.1.xml $filename
done

Примечание. Перед тем как запускать данный скрипт убедитесь, что вы сделали резервные копии .rrd-файлов и Munin остановлен (не собирает данные). Для этого достаточно закомментировать задачу в /etc/cron.d/munin.

После проделанных действий измените владельца .rrd-файлов командой:

chown -R munin:munin /var/lib/munin/example.com/

иначе в логе /var/log/munin/munin-update.log будут ошибки вида:

2016/01/27 15:20:09 [ERROR] In RRD: Error updating /var/lib/munin/example.com/web1-exim_mailstats-completed-d.rrd: rrdcached: Cannot read/write /var/lib/munin/example.com/web1-exim_mailstats-completed-d.rrd: Permission denied
2016/01/27 15:20:09 [ERROR] In RRD: Error updating /var/lib/munin/example.com/db1-fw_packets-forwarded-d.rrd: rrdcached: Cannot read/write /var/lib/munin/example.com/db1-fw_packets-forwarded-d.rrd: Permission denied

Добавить комментарий