Некоторые картинки не загружаются из РФ и РК, используйте VPN.

среда, 18 октября 2023 г.

Выводим график входящих писем python sa-stats.pl

На Postfix настроена отправка отчетов о работе SpamAssasin при помощи скрипта sa-stats.pl. В какой-то момент я захотел увидеть статистику по входящим сообщениям, так как заподозрил снижение общей массы, а это звоночек руководству о качестве работы менеджеров. 

Так как отчет отправляется каждый день, то можно было бы сгребать данные Zabbix`ом, но я этого не делал, и история у меня есть только в виде сообщений на почте. Поэтому я сохранил письма в формате msg и пошел искать решение. В итоге, а точнее изначально, я остановился на Python, так как он уже подготовлен для вывода графиков.

Собственно сам скрипт до банальности простой:

  1. В цикле перебираем файлы с расширением msg в каталоге ./Messages-all
  2. Открываем файл msg
  3. Находим количество писем и помещаем в переменную TotalStr с приведением к типу число
  4. Находим дату и помещаем в переменную DateStr с приведением к типу дата
  5. Эти две переменные кортежем добавляем в массив FullListMSG
  6. Сортируем массив FullListMSG
  7. Конвертируем массив с кортежем FullListMSG в два отдельных массива X,Y
  8. Передаем массивы 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()

Комментариев нет:

Отправить комментарий