» » Мониторинг прогнозированием, оповещения о потенциальном сбое

Мониторинг прогнозированием, оповещения о потенциальном сбое

Мониторинг прогнозированием, оповещения о потенциальном сбоеПредлагаем нашим читателям поговорить в этой статье про мониторинг прогнозированием, оповещения о потенциальном сбое. Отметим, что мониторинг прогнозированием – это не просто один из стандартных методов мониторинга. Исходя из этого необходимо использовать оповещения не совсем стандартного вида.

Предлагаем рассмотреть более подробно то, как именно это делается и почему все должно выполняться именно так, а не иначе. Каким же должно быть оповещение?

Мы думаем, что многим будет интересно узнать то, какие системы мониторинга используют пользователи в своей ежедневной работе. Отметим, что лично мы предпочитаем использовать Чувака. Он обучен тому, как следует выполнять мониторинг практически всей инфраструктуры, за исключением транзитного VoIP (кстати это самое важное для нас). Чувак, когда запускается клиентское приложение, может (по умолчанию) подавать оповещения popup–ом и по почте. Кроме этого он отсылает смс приложениям, которые являются внешними по отношению к нему.

Но речь сейчас идет совсем не об этом. Как известно, оповещение, которое приходит от системы мониторинга, в себе обязательно должно содержать сведения о том, на каком именно из узлов произошел сбой, а также результаты последних измерений величин, находящихся под мониторингом. Например, вы можете получить оповещение, в котором будет сообщаться следующее: процессор на маршрутизаторе Router1 загружен на 96 процентов. Это сообщение, в принципе, носит достаточно информативных характер для того, чтобы пользователь смог понять с какой скоростью нужно отреагировать на него.

Но совсем другая ситуация возникает в случае, если пользователь проводит мониторинг методом прогнозирования и проверяет при этом состояние большого количества параметров. В принципе есть возможность того, что в оповещениях будет сообщаться результат самого последнего измерения, также можно выводить средний результат нескольких самых последних измерений, но всего этого очень часто может оказаться просто недостаточно. В таких случаях самым эффективным будет метод оповещения, при котором в самом оповещении должен быть отображен график измеряемых величин за конкретно определенный промежуток времени.Многим достаточно лишь один раз взглянуть на график, чтобы понять насколько критичным является сбой, был ли вообще этот сбой, или это простое ложное срабатывание.

Предлагаем рассмотреть детали реализации в rrdtool. Чтобы rrdtool выполнял прогнозирование и выявлял потенциальные сбои (аберрации), нужно правильно и грамотно сформировать соответствующую базу данных rrd и выполнить заполнение этой базы текущими значениями. Если использовать такую конфигурацию, то кроме значений измеряемых величин, база будет автоматически заполняться еще одним значением, которое называется простой hash (FAILURES. FAILURES). Индекс этого значения - это время (unixtime), в которое выполнялось измерение. По индексу значения обычно показывают наличие аберраций измеряемых величин. Все довольно просто: если произошла аберрация, то значение FAILURES будет равняться 1, если же аберрация отсутствует, то это значение будет — 0. Отметим, что очень часто недостаточно после последних измерений просто проверить значения FAILURES, так как аберрация иногда может занять достаточно много времени.

Предположим, что система мониторинга на протяжении всего времени, пока существует аберрация, не должна проводить оповещение каждый раз после измерения величин. Хотя иногда так тоже нужно поступать. Заметим, что окончание аберрации вовсе не значит, что проблема была устранена. Система иногда просто подстраивает прогноз под более новые значения. При мониторинге прогнозированием IMHO, самым оптимальным будет отсылка оповещений с графиками, в моменты начала и конца аберрации. Ниже мы приведем вам текст скрипта:


#!/usr/bin/env python

import os
import time
import rrdtool
import tempfile
import smtplib
from email.mime.image import MIMEImage
from email.mime.multipart import MIMEMultipart

COMMASPACE = ', '
# Define params
rrdpath = '/usr/rrdmonit/rrd/'
pngpath = '/usr/local/share/cacti/rrdmonit/
width = '500'
height = '200'
mailsender = "alerter@my-domain.com"
mailreceip = ["admins@my-domain.com", "support@my-domain.com"]
mailserver = 'mx.my-domain.com'

# Generate charts for last 48 hours
enddate = int(time.mktime(time.localtime())) 
begdate = enddate - 172800

def send_alert_attached(subject, flist):
 """ Will send e-mail, attaching png
 files in the flist.
 """
 msg = MIMEMultipart()
 msg['Subject'] = subject
 msg['From'] = mailsender
 msg['To'] = COMMASPACE.join(mailreceip)
 for file in flist:
 png_file = pngpath+file.split('.')[0]+'.png'
 print png_file
 fp = open(png_file, 'rb')
 img = MIMEImage(fp.read())
 fp.close()
 msg.attach(img)
 mserver = smtplib.SMTP(mailserver)
 mserver.sendmail(mailsender, mailreceip, msg.as_string()) 
 mserver.quit()
 
def check_aberration(rrdpath,fname):
 """ This will check for begin and end of aberration
 in file. Will return:
 0 if aberration not found. 
 1 if aberration begins
 2 if aberration ends
 """
 ab_status = 0
 rrdfilename = rrdpath+fname
 info = rrdtool.info(rrdfilename)
 rrdstep = int(info['step'])
 lastupdate = info['last_update']
 previosupdate = str(lastupdate - rrdstep - 1)
 graphtmpfile = tempfile.NamedTemporaryFile()
 # Ready to get FAILURES from rrdfile
 # will process failures array values for time of 2 last updates
 values = rrdtool.graph(graphtmpfile.name,
 'DEF:f0='+rrdfilename+':val:FAILURES:start='+previosupdate+':end='+str(lastupdate),
 'PRINT:f0:MIN:%1.0lf',
 'PRINT:f0:MAX:%1.0lf',
 'PRINT:f0:LAST:%1.0lf')
 fmin = int(values[2][0])
 fmax = int(values[2][1])
 flast = int(values[2][2])
 # check if failure value had changed.
 if (fmin != fmax):
 if (flast == 1):
 ab_status = 1
 else:
 ab_status = 2
 return ab_status 
 
def gen_image(rrdpath, pngpath, fname, width, height, begdate, enddate):
 """
 Generates png file from rrd database:
 rrdpath - the path where rrd is located
 pngpath - the path png file should be created in
 fname - rrd file name, png file will have the same name .png extention
 width - chart area width
 height - chart area height
 begdate - unixtime
 enddate - unixtime 
 """
 # 24 hours before current time, will show on chart using SHIFT option 
 ldaybeg = str(begdate - 86400)
 ldayend = str(enddate - 86400)
 # Will show some additional info on chart 
 endd_str = time.strftime("%d/%m/%Y %H:%M:%S",(time.localtime(int(enddate)))).replace(':',':')
 begd_str = time.strftime("%d/%m/%Y %H:%M:%S",(time.localtime(int(begdate)))).replace(':',':')
 title = 'Chart for: '+fname.split('.')[0]
 # Files names 
 pngfname = pngpath+fname.split('.')[0]+'.png'
 rrdfname = rrdpath+fname
 # Get iformation from rrd file
 info = rrdtool.info(rrdfname)
 rrdtype = info['ds[val].type']
 # Will use multip variable for calculation of totals,
 # should be usefull for internet traffic accounting,
 # or call/minutes count from CDR's. 
 # Do not need logic for DERIVE and ABSOLUTE
 if rrdtype == 'COUNTER':
 multip = str(int(enddate) - int(begdate))
 else:
 # if value type is GAUGE should divide time to step value
 rrdstep = info['step']
 multip = str(round((int(enddate) - int(begdate))/int(rrdstep)))
 # Make png image
 rrdtool.graph(pngfname,
 '--width',width,'--height',height,
 '--start',str(begdate),'--end',str(enddate),'--title='+title,
 '--lower-limit','0',
 '--slope-mode',
 'COMMENT:From:'+begd_str+' To:'+endd_str+'c',
 'DEF:value='+rrdfname+':val:AVERAGE',
 'DEF:pred='+rrdfname+':val:HWPREDICT',
 'DEF:dev='+rrdfname+':val:DEVPREDICT',
 'DEF:fail='+rrdfname+':val:FAILURES',
 'DEF:yvalue='+rrdfname+':val:AVERAGE:start='+ldaybeg+':end='+ldayend,
 'SHIFT:yvalue:86400',
 'CDEF:upper=pred,dev,2,*,+',
 'CDEF:lower=pred,dev,2,*,-',
 'CDEF:ndev=dev,-1,*',
 'CDEF:tot=value,'+multip+',*',
 'CDEF:ytot=yvalue,'+multip+',*',
 'TICK:fail#FDD017:1.0:"Failures"n',
 'AREA:yvalue#C0C0C0:"Yesterday:"',
 'GPRINT:ytot:AVERAGE:"Total:%8.0lf"',
 'GPRINT:yvalue:MAX:"Max:%8.0lf"',
 'GPRINT:yvalue:AVERAGE:"Average:%8.0lf" n',
 'LINE3:value#0000ff:"Value :"',
 'GPRINT:tot:AVERAGE:"Total:%8.0lf"',
 'GPRINT:value:MAX:"Max:%8.0lf"',
 'GPRINT:value:AVERAGE:"Average:%8.0lf" n',
 'LINE1:upper#ff0000:"Upper Bound "',
 'LINE1:pred#ff00FF:"Forecast "',
 'LINE1:ndev#000000:"Deviation "',
 'LINE1:lower#00FF00:"Lower Bound "')

# List of new aberrations
begin_ab = []
# List of gone aberrations
end_ab = []
# List files and generate charts
for fname in os.listdir(rrdpath):
 gen_image(rrdpath, pngpath, fname, width, height, begdate, enddate)
# Now check files for beiaberrations
for fname in os.listdir(rrdpath):
 ab_status = check_aberration(rrdpath,fname)
 if ab_status == 1:
 begin_ab.append(fname)
 if ab_status == 2:
 end_ab.append(fname)
if len(begin_ab) > 0:
 send_alert_attached('New aberrations detected',begin_ab)
if len(end_ab) > 0:
 send_alert_attached('Abberations gone',end_ab)
Уважаемый посетитель, Вы зашли на сайт как незарегистрированный пользователь. Мы рекомендуем Вам зарегистрироваться либо зайти на сайт под своим именем.

комментариев

Информация

Комментировать статьи на сайте возможно только в течении 15 дней со дня публикации.