Верстакфорум практиков
рекламаiprazon: приватные серверные адреса IPv4 и SOCKS5, безлимитный трафик, бесплатный тест до 2 часов
ФорумСбор данных

Остановка прогона по порогу ошибок

nullbyte
nullbyte
Ветеран
сообщений 2680
с апр
15 марта, 14:02первое сообщение

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

Хочу порог: столько-то ошибок и стоп. Вопрос в том, как порог считать. Абсолютный счётчик на разных объёмах ведёт себя по-разному: сотня ошибок на тысяче запросов это авария, сотня на полумиллионе это обычные будни.

если не воспроизводится, значит не понял
Пётр Мельник
Пётр Мельник
Участник
сообщений 810
с июл
22 августа, 17:19#2

Считайте долю за скользящее окно. Окно по числу последних запросов, скажем двести, порог по доле, скажем треть.

И обязательно нижняя граница выборки: пока в окне меньше полусотни запросов, никаких выводов. Иначе три подряд таймаута на старте уронят вам весь прогон.

сначала замер, потом мнение
Полина Ждан
Полина Ждан
Новичок
сообщений 120
с мая, второй сезон
1 января, 08:36#3

а окно по времени или по числу запросов лучше?

iron_shell
iron_shell
Знаток
сообщений 1050
с июн
8 июня, 11:53#4

По числу запросов проще и врёт меньше. Окно по времени пустеет, когда прогон замедлился, и доля начинает скакать на трёх наблюдениях.

from collections import deque

class Porog: def __init__(self, okno=200, dolya=0.35, minimum=50): self.buf = deque(maxlen=okno) self.dolya, self.minimum = dolya, minimum

def otmetit(self, ploho): self.buf.append(1 if ploho else 0)

def pora_stoyat(self): if len(self.buf) < self.minimum: return False return sum(self.buf) / len(self.buf) >= self.dolya ```

Дальше важное: плохим стоит считать далеко не любой отказ. Четыреста четвёртый это нормальная жизнь каталога, товар сняли с продажи. Пятисотые, таймауты, разрывы соединения и пустое тело при успешном коде это уже сигнал. В буфер кладите только их, остальное пропускайте мимо счётчика.

И третье: после остановки прогон должен выйти с ненулевым кодом. Тогда планировщик увидит провал и не запустит следующий шаг конвейера поверх обрубка.

доля отказов в окне, проценты по минутам
доля отказов в окне, проценты по минутам
nullbyte
nullbyte
Ветеран
сообщений 2680
с апр
15 ноября, 14:10#5
iron_shell: пустое тело при успешном коде

Вот этого мне и не хватало. Сайт лёг не по-честному, он отдавал двухсотый и заглушку на двести байт. Мой счётчик видел успех и радовался жизни.

если не воспроизводится, значит не понял
Пётр Мельник
Пётр Мельник
Участник
сообщений 810
с июл
22 апреля, 17:27#6

Проверка на длину тела спасает чаще, чем кажется. Ставьте нижнюю границу по разметке и считайте отказом всё, что короче.

ОтветСчитать отказом
таймаут, разрыв соединенияда
500, 502, 503, 504да
429да, отдельным счётчиком
404нет
200 с телом короче двух килобайтда
сначала замер, потом мнение
Кирилл Бакин
Кирилл Бакин
Знаток
сообщений 1560
с апр
1 сентября, 08:44#7

Добавлю про то, что делать после остановки. Насмерть глушить прогон обидно, сайт часто оживает через десять минут.

У меня стоит пауза и пробный заход: остановились, ждём пять минут, пускаем двадцать запросов, доля отказов на них ниже порога, продолжаем с того места, где встали. Три неудачных пробы подряд и вот тогда уже стоп совсем, с письмом.

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

iron_shell
iron_shell
Знаток
сообщений 1050
с июн
8 февраля, 11:01#8

Пробный заход обязательно ограничивайте по числу. Иначе на второй попытке вы снова зальёте выгрузку мусором.

nullbyte
nullbyte
Ветеран
сообщений 2680
с апр
15 июля, 14:18#9

Собрал: окно двести, порог тридцать пять процентов, минимум пятьдесят наблюдений, в счётчик идут пятисотые, таймауты и короткие тела. После стопа пауза пять минут и проба на двадцати запросах.

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

Порог по доле оказался главным, абсолютный счётчик я выкинул совсем.

если не воспроизводится, значит не понял