На Postfix настроена отправка отчетов о работе SpamAssasin при помощи скрипта sa-stats.pl. В какой-то момент я захотел увидеть статистику по входящим сообщениям, так как заподозрил снижение общей массы, а это звоночек руководству о качестве работы менеджеров.
Так как отчет отправляется каждый день, то можно было бы сгребать данные Zabbix`ом, но я этого не делал, и история у меня есть только в виде сообщений на почте. Поэтому я сохранил письма в формате msg и пошел искать решение. В итоге, а точнее изначально, я остановился на Python, так как он уже подготовлен для вывода графиков.
Собственно сам скрипт до банальности простой:
- В цикле перебираем файлы с расширением msg в каталоге ./Messages-all
- Открываем файл msg
- Находим количество писем и помещаем в переменную TotalStr с приведением к типу число
- Находим дату и помещаем в переменную DateStr с приведением к типу дата
- Эти две переменные кортежем добавляем в массив FullListMSG
- Сортируем массив FullListMSG
- Конвертируем массив с кортежем FullListMSG в два отдельных массива X,Y
- Передаем массивы X,Y как параметры для построения графика
Для работы потребуется установить independentsoft и matplotlib через pip.
Сам код получился такой
import os
import re
from independentsoft.msg import Message
import matplotlib.pyplot as plt
from datetime import datetime
path = './Messages-all'
listing = os.listdir(path)
X=[]
Y=[]
FullListMSG = []
date_format = '%Y-%m-%d'
for mailFile in listing:
if str.lower(mailFile[-3:])=="msg":
txtMSG=Message("/".join([path,mailFile])).body
TotalStr = re.findall("^Total\ emails\ processed\ :(.*)\(.*\)",txtMSG, re.MULTILINE)
TotalStr = int(TotalStr[0])
DateStr = re.findall("^Report\ Date.*: (\d{4}\-\d{2}\-\d{2})",txtMSG, re.MULTILINE)
DateStr =datetime.strptime(DateStr[0], date_format)
FullListMSG.append((DateStr,TotalStr))
FullListMSG=sorted(FullListMSG, key=lambda x: x[0])
for strList in FullListMSG:
X.append(strList[0])
Y.append(strList[1])
plt.plot(X,Y)
plt.title('Postfix incoming email graph')
plt.xlabel('Date')
plt.ylabel('Count of emails per date')
plt.show()
Потом я почесал репку и решил, а почему бы не разложить по часам?
Чтобы при увеличении можно было увидеть картину в разрезе часов, слегка подкорректировали код:
import os
import re
from independentsoft.msg import Message
import matplotlib.pyplot as plt
from datetime import datetime
path = './Messages-all'
listing = os.listdir(path)
X=[]
Y=[]
FullListMSG = []
date_format = '%Y-%m-%d %H'
for mailFile in listing:
if str.lower(mailFile[-3:])=="msg":
txtMSG=Message("/".join([path,mailFile])).body
List = re.findall("^(\d{4}\-\d{2}\-\d{2}.{3})(.{15})\(....\)(.{12})\(....\)\r\n", txtMSG, re.MULTILINE)
TotalStr=0
for strList in List:
TotalStr += int(strList[1]) + int(strList[2])
DateStr = datetime.strptime(strList[0], date_format)
FullListMSG.append((DateStr, TotalStr))
FullListMSG=sorted(FullListMSG, key=lambda x: x[0])
for strList in FullListMSG:
X.append(strList[0])
Y.append(strList[1])
plt.plot(X,Y)
plt.title('Postfix incoming email graph')
plt.xlabel('Date')
plt.ylabel('Count of emails per hour')
plt.show()
Комментариев нет:
Отправить комментарий