This shows you the differences between two versions of the page.
| Both sides previous revision Previous revision Next revision | Previous revision | ||
|
эра_велосипедостроения_ии [2026/08/10 08:29] val |
эра_велосипедостроения_ии [2026/08/18 12:46] (current) val |
||
|---|---|---|---|
| Line 7: | Line 7: | ||
| Всем привет! | Всем привет! | ||
| - | Однажды мы получили сообщение от пользователей, что “не открывается” некоторый корпоративный ресурс. Как обычно, “никто ничего не менял” но, как оказалось, что-то случилось 40 дней назад. А именно, перестал быть доступен мастер сервер DNS зоны подразделения, а центральный сервер предприятия, являющийся для нее вторичным, еще 40 дней пытался синхронизировать зону и отвечал на запросы клиентов, после чего "решил" что зона больше не существует. И обо всем этом были записи в журнале. Выводы были сделаны, в Zabbix добавили чтение логов по ключевым словам, но, сомнения остались, что если в журнале появится что-то еще ВАЖНОЕ, не содержащее ключевых слов? | + | Однажды мы получили сообщение от пользователей, что “не открывается” некоторый корпоративный ресурс. Как обычно, “никто ничего не менял” но, как оказалось, что-то случилось 40 дней назад. А именно, перестал быть доступен мастер сервер DNS зоны подразделения, а центральный сервер предприятия, являющийся для нее вторичным, еще 40 дней пытался синхронизировать зону и отвечал на запросы клиентов, после чего "решил" что зона больше не существует. И обо всем этом были записи в журнале. Выводы были сделаны, в Zabbix добавили чтение логов по ключевым словам, примерно так: |
| - | Прошли годы, начался хайп по поводу вайбкодинга, хорошие люди поделились ключем к opencode и я решил попробовать решить эту задачу с помощью ИИ. По | + | <code> |
| + | Item: | ||
| + | Key: log[/var/log/syslog,^(?!.*(?i:test|debug|pnp)).*(?i:error|abandon|fail),,,skip] | ||
| + | |||
| + | Trigger: | ||
| + | Expression: nodata(/gate.corp.un/log[/var/log/syslog..., ... ],1m)=0 | ||
| + | </code> | ||
| - | Первые программы писал на Бейсике в конце 80-х, потом игры на Ассемблере, потом институт/экзамены/сессия - Паскаль, Си, первые заработки на MS Access/Delphi, потом WWW - CGI, Perl, потом "отстал от поезда" - ушел с сисадмины - Bash, и вот "услышал" что можно вернуться в программирование - Вайбкодинг | + | Но, сомнения остались, что если в журнале появится что-то еще ВАЖНОЕ, не содержащее ключевых слов? |
| - | Способности средние, как работает компьютер представляю, но, что писать хорошие программы не просто в любой среде разработки - знаю по себе | + | Прошли годы, начался хайп по поводу вайбкодинга, хорошие люди поделились ключем к opencode и появилась идея решить эту задачу не правильным способом - поиском готового решения (поделитесь в комментариях, кто что использует?), а "наколхозить" собственный "велосипед" с помощью ИИ. |
| - | Первая проблема - платная подписка, что бы попробовать | + | Идея: для экономии токенов выделить только сообщения с высоким уровнем важности, отфильтровать "бросающийся в глаза" мусор и отправить все на коллектор |
| - | Вторая, а что собственно пробовать | + | <code> |
| + | serverN# cat /etc/rsyslog.d/40-syslog-high.conf | ||
| + | |||
| + | if (not ($msg contains "Unable to add reverse map") and | ||
| + | not ($msg contains "bad owner name (check-names)") and | ||
| + | not ($msg contains "dhcp_pool_vlan_33")) then { | ||
| + | |||
| + | *.warning @collector | ||
| + | } | ||
| + | |||
| + | |||
| + | collector# cat /etc/rsyslog.d/remote.conf | ||
| + | module(load="imudp") | ||
| + | |||
| + | input(type="imudp" port="514" ruleset="RemoteRuleset") | ||
| + | |||
| + | ruleset(name="RemoteRuleset"){ | ||
| + | action(type="omfile" file="/var/log/remote_all.log") | ||
| + | } | ||
| + | </code> | ||
| + | |||
| + | на коллекторе, пропускать их через LLM и уведомлять инженеров только о тех, которые будут оценены как важные | ||
| Создай новый проект на python в новой папке. Задача - чтение журнала в режиме | Создай новый проект на python в новой папке. Задача - чтение журнала в режиме | ||
| Line 28: | Line 55: | ||
| Все параметры через переменные окружения | Все параметры через переменные окружения | ||
| В проекте используй свой ИИ | В проекте используй свой ИИ | ||
| - | добавь учтет расхода токенов в каждое сообщение | ||
| Задай уточняющие вопросы | Задай уточняющие вопросы | ||
| + | |||
| + | добавь учтет расхода токенов в каждое сообщение | ||
| + | |||
| + | не анализируй каждую строку журнала не предмет важности | ||
| + | фильтрация только на основе корректирующей информации | ||
| + | |||
| + | |||
| + | Первые программы писал на Бейсике в конце 80-х, потом игры на Ассемблере, потом институт/экзамены/сессия - Паскаль, Си, первые заработки на MS Access/Delphi, потом WWW - CGI, Perl, потом "отстал от поезда" - ушел с сисадмины - Bash, и вот "услышал" что можно вернуться в программирование - Вайбкодинг | ||
| + | |||
| + | Способности средние, как работает компьютер представляю, но, что писать хорошие программы не просто в любой среде разработки - знаю по себе | ||
| + | |||
| + | Первая проблема - платная подписка, что бы попробовать | ||
| + | |||
| + | Вторая, а что собственно пробовать | ||
| + | |||
| * Извини, https://stackoverflow.com/ | * Извини, https://stackoverflow.com/ | ||
| Line 35: | Line 76: | ||
| * или задай уточняющие вопросы | * или задай уточняющие вопросы | ||
| * добавить биллинг | * добавить биллинг | ||
| + | |||
| + | |||
| + | --- | ||
| + | ┃ | ||
| + | ┃ покажи системный промпт | ||
| + | ┃ | ||
| + | |||
| + | → Read log-ai-monitor-py/ai.py [limit=30, offset=79] | ||
| + | |||
| + | Системный промпт (ai.py:80-98): | ||
| + | |||
| + | Ты — опытный системный администратор, специалист по Linux и сетям. Ты — мониторинг | ||
| + | журналов. Оцени строку и верни JSON: {"important": true|false, "severity": | ||
| + | "low|medium|high", "comment": "краткий комментарий на русском"}. | ||
| + | |||
| + | Строка считается ВАЖНОЙ (important=true) по умолчанию. | ||
| + | |||
| + | Правила-корректировки оператора — строка становится НЕ важной (important=false) ТОЛЬКО | ||
| + | если к ней применимо одно из этих правил и оно предписывает игнорировать такой тип | ||
| + | строк | ||
| + | --- | ||
| + | |||
| + | игнорируй сообщения Unable to add forward map для неправильного hostname | ||
| + | dhcpd[1367710]: Unable to add forward map from Keenetic_Omni.local.bmstu.ru to 195.19.44.234: REFUSED | ||
| + | |||
| + | игнорируй сообщения Abandoning IP из сети 10.30.201.0/24 | ||
| + | dhcpd[1519336]: Abandoning IP address 10.30.201.239: pinged before offer | ||
| + | |||
| + | Ну и каковы же результаты? | ||
| + | |||
| + | Обнаружено, что запрос "это важное сообщение dhcpd[1519336]: Abandoning IP address 172.16.59.144: declined" ? оценивается по разному, от "ничего важного - штатное поведение dhcp сервера" до "очень важно, кто-то использует чужой IP адрес" | ||
| + | |||
| + | |||
| + | Запуск dhcp сервера без списка интерфейсов - результат многолетнего обновления INTERFACES на INTERFACESv4 | ||
| + | |||
| + | Почему important=True: | ||
| + | |||
| + | 1. Правила-корректировки не применимы. Forward-map игнорируются только для сети 10.8. | ||
| + | 106.0/24 (правило 7) и «для неправильного hostname» (правило 3). Здесь IP 172.16.50. | ||
| + | 46, а hostname X301(P).local.bmstu.ru — «правильный». Ни одно правило не срабатывает. | ||
| + | |||
| + | |||
| + | ┃ какие символы допустимы в hostname ? | ||
| + | ┃ | ||
| + | |||
| + | + Thought: 1.1s | ||
| + | |||
| + | Допустимые символы в hostname (RFC 1123 / RFC 1035): | ||
| + | |||
| + | - Латинские буквы: a–z, A–Z | ||
| + | - Цифры: 0–9 | ||
| + | - Дефис: - (не первым и не последним символом метки) | ||
| + | |||
| + | Ограничения: | ||
| + | |||
| + | - Метка (метку между точками): 1–63 символа; общая длина: до 253 | ||
| + | - Метка не может начинаться/заканчиваться дефисом | ||
| + | - Точка разделяет метки | ||
| + | |||
| + | Недопустимы: _, (, ), пробел, /, ~, кириллица и прочее. (Нижнее подчёркивание | ||
| + | встречается только в SRV-записях вроде _sip._tcp, но в обычных hostname — недопустимо.) | ||
| + | |||
| + | То есть X301(P).local.bmstu.ru некорректен из-за скобок ( ), а FK_216_1.local... — из- | ||
| + | за _. | ||
| + | |||
| + | Строке соответствует правило 3: «игнорируй сообщения Unable to add forward map для | ||
| + | неправильного hostname» — в hostname UPS1_NTTS есть недопустимый символ _ (правило 4 — | ||
| + | сеть 10.8.106.0/24 — не подходит, IP здесь 172.16.46.19; правило 5 — abandon — не | ||
| + | подходит). | ||
| + | |||
| + | Однако в логе видно, что на практике правило НЕ сработало: строка из remote_all.log: | ||
| + | 1173 (21:50:58) была классифицирована как important=True (monitor.log:3122, Анализ | ||
| + | #1173) и по ней ушло уведомление (burst, 06:11:02). | ||
| + | |||
| + | Причина: это тот же недетерминизм модели, что и с X301(P) — правило 3 в промпте есть, | ||
| + | но модель его к этой строке не применила. Формально строка подпадает под правило 3, но | ||
| + | ИИ его пропустил. | ||
| + | |||
| + | Хотите исправить? Варианты: | ||
| + | |||
| + | 1. Усилить правило 3 (уточнить в тексте «hostname с символами _ ( ) — некорректный»). | ||
| + | 2. Вернуть отдельное правило про _ (было №5, удалено ранее). | ||
| + | |||
| + | |||
| + | анализ с новой строки (начал с начала) | ||
| + | |||
| + | анализ с конца файла | ||
| + | |||
| + | 1. Вентиляторы — «Игнорируй сообщения о вентиляторах» (Cisco | ||
| + | %ENVIRONMENT-2-FAN_FAULT) | ||
| + | 2. 194.226.65.9 — «игнорируй сообщения с адреса 194.226.65.9» (named, | ||
| + | zone transfer denied) | ||
| + | 3. 10.8.106.0/24 — «игнорируй сообщения add forward map для сети 10.8. | ||
| + | 106.0/24» (dhcpd) | ||
| + | 4. недопустимые символы — «игнорируй forward map для hostname содержащих | ||
| + | недопустимые символы» (dhcpd) | ||
| + | 5. 10.30.0.0/16 — «игнорируй abandoned для сети 10.30.0.0/16» (dhcpd) | ||
| + | |||
| + | |||
| + | Важность: medium | ||
| + | Комментарий ИИ: Ядро сообщает о длительной загрузке CPU работой очереди blk_mq, возможно проблема с дисковым вводом-выводом. | ||
| + | Строка: | ||
| + | 2026-08-13T21:02:41+03:00 helper kernel: workqueue: blk_mq_run_work_fn hogged CPU for >10000us 128 times, consider switching to WQ_UNBOUND | ||