Как заставить Munin собирать данные каждую минуту
Feb 8, 2016 21:28 · 554 words · 3 minute read
По умолчанию 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