MONIT: Мониторинг файла журнала изменений и учета времени отметок

Вопрос или проблема

Я хочу отслеживать файл журнала и меня интересуют только строки “Получен новый блок”. Мне нужны два разных скрипта для мониторинга

  • height, который всегда должен быть на одно число больше, чем высота в предыдущей строке “Получен новый блок”. Если это не +1 И если это не меняется в течение 120 секунд, ТОГДА сигнализировать.
  • timestamp (только для строк “Получен новый блок”), который всегда должен меняться. Если изменений не происходит в течение 120 секунд, ТОГДА сигнализировать.

Все другие строки здесь не интересуют и могут быть проигнорированы. Я пытался найти примеры, чтобы собрать это вместе, но у меня не получилось, так что я надеюсь, вы можете мне помочь.

лог-фрагмент

{"level":"warn","message":"Основная очередь","timestamp":"2016-04-30 19:49:33","data":50}
{"level":"info","message":"Проверка блокчейна на 11.22.33.44:1234","timestamp":"2016-04-30 19:49:33"}
{"level":"warn","message":"Балансная очередь","timestamp":"2016-04-30 19:49:39","data":50}

{"level":"info","message":"Получен новый блок id: 12345678901234567890 height: 8761 round: 87 slot: 3350818 reward: 100000000","timestamp":"2016-04-30 19:49:41"}

{"level":"info","message":"Удаление пира POST http://11.22.33.44:1234/peer/transactions","timestamp":"2016-04-30 19:49:42"}
{"level":"warn","message":"Основная очередь","timestamp":"2016-04-30 19:49:43","data":94}
{"level":"warn","message":"Основная очередь","timestamp":"2016-04-30 19:49:43","data":93}
{"level":"warn","message":"Основная очередь","timestamp":"2016-04-30 19:49:43","data":52}
{"level":"warn","message":"Основная очередь","timestamp":"2016-04-30 19:49:43","data":51}
{"level":"warn","message":"Основная очередь","timestamp":"2016-04-30 19:49:43","data":50}
{"level":"info","message":"Проверка блокчейна на 11.22.33.44:1234","timestamp":"2016-04-30 19:49:44"}
{"level":"info","message":"Удаление пира POST http://11.22.33.44:1234/peer/blocks","timestamp":"2016-04-30 19:49:46"}

{"level":"info","message":"Получен новый блок id: 12345678901234567890 height: 8762 round: 87 slot: 3350819 reward: 100000000","timestamp":"2016-04-30 19:49:50"}

monitrc

set daemon 120            # проверять службы с интервалом 2 минуты
set logfile /var/log/monit.log
set idfile /var/lib/monit/id
set statefile /var/lib/monit/state
set mailserver SMTP.MAILHOSTER.COM port 587         # основной почтовый сервер
     username "LoginUsername" password "LoginPassword"
     using ssl
     with timeout 30 seconds
set eventqueue
      basedir /var/lib/monit/events # установить основную директорию, где будут храниться события
      slots 100                     # опционально ограничить размер очереди
set   mail-format {
        from: [email protected]
        subject: АЛАРМ на Тестовом сервере -- $EVENT $SERVICE
        message: $EVENT Служба $SERVICE
        Date:        $DATE
        Action:      $ACTION
        Host:        $HOST
        Description: $DESCRIPTION

        Пока,
        Monit
}
set alert [email protected]       # получать все оповещения
include /etc/monit/conf.d/*

Если изменений не происходит в течение 30 секунд, ТОГДА сигнализировать

Вы настроили monit на выполнение каждые 30 секунд? Monit не предназначен для такой метрики, поскольку по умолчанию проверка происходит каждые (2) минуты. Также обнаружить, что временная метка не изменилась каждые 30 секунд, не то же самое, что проверять каждую секунду, если не старше 30 секунд

Также для такого конкретного случая используйте пользовательский скрипт со всей вашей логикой, а затем действуйте в соответствии с кодом выхода.
см. https://mmonit.com/monit/documentation/monit.html#PROGRAM-STATUS-TESTING

Ответ или решение

Мониторинг лог-файла: Счетчик высоты и изменения времени метки

В данном руководстве рассматривается задача мониторинга лог-файла, сосредоточенная на строках с сообщениями "Received new block". Мы разработаем два различных скрипта для отслеживания изменений высоты блоков и временных меток, и настроим систему оповещения на основе полученных данных.

Задачи мониторинга

  1. Контроль высоты блоков:

    • Высота (height) должна увеличиваться на единицу для каждой новой строки "Received new block".
    • Если высота не увеличивается или не изменяется в течение 120 секунд, необходимо отправить сигнал тревоги.
  2. Контроль временной метки:

    • Временная метка (timestamp) для строк "Received new block" должна постоянно изменяться.
    • Если временная метка остается неизменной в течение 120 секунд, система должна отправить сигнал тревоги.

Пример лог-файла

Для демонстрации анализа приведен следующий фрагмент лог-файла:

{"level":"info","message":"Received new block id: 12345678901234567890 height: 8761 ...","timestamp":"2016-04-30 19:49:41"}
{"level":"info","message":"Received new block id: 12345678901234567890 height: 8762 ...","timestamp":"2016-04-30 19:49:50"}

Разработка скриптов

Теперь мы создадим два скрипта на Python для мониторинга описанных условий.

Скрипт 1: Мониторинг высоты
import time
import re
import sys

def monitor_height(log_file):
    last_height = -1
    last_time = time.time()

    while True:
        with open(log_file, 'r') as file:
            lines = file.readlines()

            for line in lines:
                if "Received new block" in line:
                    timestamp_match = re.search(r'timestamp":"(.*?)"', line)
                    height_match = re.search(r'height: (\d+)', line)

                    if timestamp_match and height_match:
                        current_height = int(height_match.group(1))
                        current_time = time.mktime(time.strptime(timestamp_match.group(1), '%Y-%m-%d %H:%M:%S'))

                        if last_height == -1:
                            last_height = current_height
                            last_time = current_time
                            continue

                        if current_height != last_height + 1:
                            print("Alarm: Height is not increasing by 1")
                            sys.exit(1)

                        if current_time - last_time > 120:
                            print("Alarm: No height change in 120 seconds")
                            sys.exit(1)

                        last_height = current_height
                        last_time = current_time

        time.sleep(2)

if __name__ == "__main__":
    monitor_height('/path/to/your/logfile.log')
Скрипт 2: Мониторинг временной метки
import time
import re
import sys

def monitor_timestamp(log_file):
    last_timestamp = None
    last_time = time.time()

    while True:
        with open(log_file, 'r') as file:
            lines = file.readlines()

            for line in lines:
                if "Received new block" in line:
                    timestamp_match = re.search(r'timestamp":"(.*?)"', line)

                    if timestamp_match:
                        current_timestamp = timestamp_match.group(1)
                        current_time = time.mktime(time.strptime(current_timestamp, '%Y-%m-%d %H:%M:%S'))

                        if last_timestamp is None:
                            last_timestamp = current_timestamp
                            last_time = current_time
                            continue

                        if current_timestamp == last_timestamp:
                            if current_time - last_time > 120:
                                print("Alarm: No timestamp change in 120 seconds")
                                sys.exit(1)

                        last_timestamp = current_timestamp
                        last_time = current_time

        time.sleep(2)

if __name__ == "__main__":
    monitor_timestamp('/path/to/your/logfile.log')

Настройка Monit

Перейдем к конфигурации Monit для запуска указанных скриптов. Добавьте следующий код в файл конфигурации Monit (monitrc):

check program height_monitor with path "/usr/bin/python3 /path/to/height_monitor.py"
   if status != 0 then alert

check program timestamp_monitor with path "/usr/bin/python3 /path/to/timestamp_monitor.py"
   if status != 0 then alert

Заключение

Данное руководство предлагает эффективный подход для мониторинга лог-файлов с использованием Python и Monit. С помощью описанных выше скриптов и конфигурации Monit вы получите систему, способную оперативно реагировать на изменения высоты блоков и временные метки, что критически важно для обеспечения надежности ваших процессов.

Для дальнейших вопросов или консультаций не стесняйтесь обращаться.

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

Капча загружается...