Вопрос или проблема
Я хочу отслеживать файл журнала и меня интересуют только строки “Получен новый блок”. Мне нужны два разных скрипта для мониторинга
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". Мы разработаем два различных скрипта для отслеживания изменений высоты блоков и временных меток, и настроим систему оповещения на основе полученных данных.
Задачи мониторинга
-
Контроль высоты блоков:
- Высота (height) должна увеличиваться на единицу для каждой новой строки "Received new block".
- Если высота не увеличивается или не изменяется в течение 120 секунд, необходимо отправить сигнал тревоги.
-
Контроль временной метки:
- Временная метка (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 вы получите систему, способную оперативно реагировать на изменения высоты блоков и временные метки, что критически важно для обеспечения надежности ваших процессов.
Для дальнейших вопросов или консультаций не стесняйтесь обращаться.