惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Hugging Face - Blog
Hugging Face - Blog
Microsoft Azure Blog
Microsoft Azure Blog
月光博客
月光博客
S
Securelist
J
Java Code Geeks
Recorded Future
Recorded Future
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
M
MIT News - Artificial intelligence
S
Secure Thoughts
Y
Y Combinator Blog
H
Hackread – Cybersecurity News, Data Breaches, AI and More
D
Docker
Martin Fowler
Martin Fowler
The Last Watchdog
The Last Watchdog
WordPress大学
WordPress大学
The GitHub Blog
The GitHub Blog
Vercel News
Vercel News
O
OpenAI News
www.infosecurity-magazine.com
www.infosecurity-magazine.com
博客园_首页
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
PCI Perspectives
PCI Perspectives
N
News and Events Feed by Topic
H
Heimdal Security Blog
SecWiki News
SecWiki News
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
博客园 - 【当耐特】
T
Troy Hunt's Blog
L
LINUX DO - 最新话题
Hacker News: Ask HN
Hacker News: Ask HN
Hacker News - Newest:
Hacker News - Newest: "LLM"
N
Netflix TechBlog - Medium
A
Arctic Wolf
The Hacker News
The Hacker News
I
Intezer
S
Schneier on Security
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
Apple Machine Learning Research
Apple Machine Learning Research
L
Lohrmann on Cybersecurity
宝玉的分享
宝玉的分享
P
Privacy & Cybersecurity Law Blog
Stack Overflow Blog
Stack Overflow Blog
T
Tor Project blog
小众软件
小众软件
Simon Willison's Weblog
Simon Willison's Weblog
The Cloudflare Blog
Jina AI
Jina AI

Все публикации подряд на Хабре

Ловим музу за клавиатуру: как айтишнику стать автором Что умеет Midjourney в 2026? Мой немного грустный разбор этого шикарного инструмента Никто не любит писать тесты, но ИИ может исправить это IPv8 выглядит как мечта. Поэтому почти наверняка не взлетит Производители вернули в продажу материнки с DDR3. Что происходит? Управление агентом с телефона через Telegram теперь в KodaCode От координации к лидерству: как меняется роль руководителя разработки Я сделала родителям бизнес вместо пенсии: зарабатываем 70 тысяч, мама не даёт продать В три раза быстрее приемка товара и оптимизация трудозатрат на 73%: как «РСТ-Инвент» помог Gulliver Group ИИ-шечный мир победил? О влиянии искусственного интеллекта на игропром Кремль снижает давление на Телеграмм пока Европа строит интернет по паспорту Как CEO, CTO и CIO за 8 часов собрали ИИ-директора, который умеет держать позицию под давлением Как (не) потерять домен за выходные Вместо 8 разных VPS: как я организовал практику студентам на одном сервере Почему твой Open Source проект не замечают? R&D: искусство управления неопределенностью в разработке AI-дефляция: вакансий для разработчиков больше, а рост зарплат — худший за 15 лет Мы отдали управление роботами OpenClaw. Что из этого вышло Галактический ID: система идентификации для всех форм разумной жизни Шесть основ бизнес-анализа: начинаем с вопроса «Кто в игре?» Код-ревью, в котором дело не в коде Данные переехали. Команда — нет Системной подход к сдаче OSWE в 2025 Почему комната управления реактором покрашена в цвет морской пены 4 YAML-файла вместо PySpark: как аналитикам строить пайплайны без разработчиков LLM-агент для поиска свободных доменов: автоматизируем подбор Когда, зачем и как правильно начинать новую сессию в Claude Code? Как я заставил нейросеть писать макросы для FreeCAD Анатомия ИИ‑агента для подбора персонала. От тысячи резюме к топ‑10 за минуты Опыт разработчика как экономика внимания Автономность как точка невозврата: кто будет субъектом в цифровом будущем Обучение ИИ в «диких» условиях: как рутинные действия превращаются в датасеты Как измерить LLM для задач кибербеза: обзор открытых бенчмарков Где хранить код? Сравнение GitHub, GitLab и Bitbucket Математика объясняет, почему нормальное распределение встречается повсюду Почему ваш FinOps не работает: 12 тезисов от практиков Как подписать проектную документацию УКЭП с использованием бесплатных лицензий Pilot Адаптивное администрирование Sigla Vision Я грузил уран в бочки, а потом 20 лет строил ИТ в атомной отрасли Чем позвонить с Эвереста? История и обзор спутниковой связи. Часть 2 Как языковая модель помогает контролировать качество инструктажей по охране труда в металлургии Как не передать на desktop свой IP в РКН Анатомия SAP Privileges: как устроено управление правами в macOS MoneyDev: Сказка про три главных слова Обновлённый токенизатор видео K-VAE 2.0 от Сбера Как сделать диспетчеризацию дома на 1284 квартиры почти бесплатно Как мы разогнали железную дорогу Мы дали агентам рутину. Теперь надо решить — что делать с освободившимся временем Токсичный контент, промпт-хакинг и защита ИИ — всё о Guardrails для LLM Умный город начинается с точного взгляда: как «Фалькон Тех» меняет пространство к лучшему Навайбкодил приложение для анализа графов Почему Дюну так интересно читать? Упрощаем работу с рутиной или как стать Гендальфом Белым Деконструкция Go: CPU, RAM и что там происходит. Go Assembler база. Часть 1.1 Какие профессии исчезнут из-за ИИ, а какие появятся? И что с этим делать Как мы построили IT-отдел, где хочется расти: архитектурные встречи, прозрачные метрики и книжные подарки Rufler: Делаем из Claude Code автономный рой через один YAML-конфиг Sing-box и белый список приложений Как построить надёжный обмен сообщениями в микросервисах: лучшие практики для enterprise OpenAI строит MLM-пирамиду, а McKinsey и Accenture помогают ей в этом Дом, который не построил Фишер (Часть 2) «Сверхзвуковой математик» против «Вдумчивого логиста»: битва алгоритмов 3D-упаковки Мультимодальные модели – грубый и дорогой инструмент Разговоры ничего не стоят. Код тоже Проверки физических лиц: с кого начнет ФНС Топ-10 бесплатных нейросетей для создания видео в 2026 году Первые слои кода: как наши решения сегодня определяют архитектуру ИИ на десятилетия Разработка нового статического анализатора: PVS-Studio JavaScript Поиск уязвимостей ПО: базовый минимум или роскошный максимум Почему оценка персонала не работает как инструмент управления Как мы разработали ИИ-ассистента и сократили рутину продуктовой команды на 50% Как я ушел из найма, нажарил косточек и продал на маркетплейсах на 168 млн в год Когда 1С:ERP уже внедрена, а нормального производственного плана всё ещё нет Как я сделал Claude мультимодальным, подключив к нему Qwen Omni Как приглашение на вакансию мечты превращается в атаку Infrastructure as Code: философия и лучшие практики IaC Тестируем Yandex Code Assistant на задаче, в которой нужно хранить секреты nxs-universal-chart v3.0: новое поколение универсального Helm-чарта Callback Injection: Техника, которая отправила Microsoft Defender в глухой нокаут «Все идеи на стол»: митап как способ вывести проект из тупика Сегодня я узнал нечто новое о GPU благодаря багу в своей игре Как заставить LLM ̶ ̶г̶а̶л̶л̶ю̶ ̶ эволюционировать Карта событий как фундамент аналитики: практический кейс для E-commerce Что выбрать для AI: x86, ARM или RISC-V? Дайджест железа за март Роль соматических мутаций в развитии аутоиммунных заболеваний: путь к избирательной терапии Mythos от Anthropic — тревожный сигнал для всех, а не только для банков Guardrails для LLM на Java: как приручить промпт‑инъекции и токсичные ответы Green-VLA: как мы собрали VLA-модель для реального антропоморфного робота и не потеряли обобщение Финансовая гонка вооружений: почему умные люди добровольно в ней участвуют Эра ИИ-агентов наступила: выбираем лучшего цифрового сотрудника # Практический опыт внедрения WinCC Redundancy на производственном предприятии Сделал MVP за 3 дня, а потом неделю прикручивал оплату. Оно того стоило? Физика против Маска: почему Starship V3 может оказаться ещё одной катастрофой Нефть Венесуэлы: крупнейшие запасы в мире, но не крупнейшая нефтяная держава JPA 4. Переосмысление Hibernate Почему зеркальная фотокамера Nikon D5 десятилетней давности идеально подошла для миссии «Артемида-2» Проект «Уровень-Спутник» или как мы сделали платформу для гидрологов «Замедлиться, чтобы ускориться»: почему ИИ повышает цену ошибок в требованиях и архитектуре Как с нуля поднять трафик IT-компании на 1657% при бюджете 55 тыс. и выжить Pixel-perfect Downsampling — идеальная отрисовка 50 миллионов точек без потерь
Как мы автоматизировали разбор ошибок Sentry через Google Apps Script и YandexGPT
Василь · 2026-06-26 · via Все публикации подряд на Хабре

6 мин

2

Привет, коллеги! Меня зовут Василь Хамидуллин, и я тестировщик в компании fuse8.

В этой статье расскажу, как мы решили проблему Alert Fatigue в Sentry и превратили десятки ежедневных писем с ошибками в один понятный утренний дайджест. Покажу, почему для MVP выбрали Google Apps Script вместо полноценного сервиса, с какими ограничениями столкнулись при работе с Gemini, почему в итоге остановились на YandexGPT и как всего за один вечер собрали полностью бессерверную автоматизацию.

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

Если вы когда-нибудь открывали утром почту и видели несколько десятков писем от Sentry с одинаковыми stack trace, то наверняка сталкивались с классическим Alert Fatigue — усталостью от алертов.

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

У нас ситуация выглядела примерно так:

  • 10–20 писем от Sentry ежедневно;

  • 15–20 минут ручного просмотра каждое утро;

  • дублирующиеся ошибки, разбросанные по разным проектам.

Хотелось получать не поток уведомлений, а короткую человеческую сводку:

  • что сломалось;

  • насколько это критично;

  • сколько раз повторилось;

  • где смотреть подробнее.

В итоге за один вечер появился небольшой сервис на Google Apps Script и YandexGPT, который каждое утро присылает единый дайджест по всем ошибкам за последние сутки.

Сейчас чтение такого отчета занимает около двух минут.

Архитектура решения

Схема получилась максимально простой и полностью бессерверной:

Google Apps Script по расписанию собирает письма от Sentry за последние 24 часа, извлекает из них полезную информацию, отправляет её в YandexGPT и формирует итоговый отчет.

Никаких серверов, Docker, Kubernetes и отдельных баз данных.

Почему не Sentry API?

Это первый вопрос, который возникает при взгляде на архитектуру.

Конечно, у Sentry есть API, и через него можно получать гораздо больше информации.

Но для MVP почта оказалась самым быстрым вариантом:

  • алерты уже приходили в Gmail;

  • фильтры были настроены;

  • не требовалось отдельно хранить токены Sentry;

  • интеграцию удалось собрать буквально за вечер.

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

Почему вообще LLM?

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

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

  • Java stack trace;

  • Node.js исключения;

  • SQL ошибки;

  • сетевые таймауты;

  • ошибки сторонних API.

Чтобы привести всё это к единому формату, пришлось бы писать множество отдельных правил обработки для каждого типа ошибок и постоянно поддерживать их в актуальном состоянии. 

LLM помогает привести все к общему  знаменателю:

  • читает сырой лог;

  • выделяет суть проблемы;

  • группирует похожие ошибки;

  • формирует единый формат отчета.

Фактически нейросеть превращает технический шум в читаемый утренний обзор.

Попытка №1: Gemini

Поскольку код запускался внутри Google Apps Script, логичным выбором выглядел Gemini. В ней можно было использовать бесплатный тариф, быстро настроить интеграцию и нет необходимости поднимать дополнительную инфраструктуру.

Но на практике появились проблемы:

  • Сначала API начал возвращать 404 для моделей, которые фигурировали в документации. Оказалось, что привычные модели вроде gemini-1.5-flash в нашем регионе недоступны или переименованы. Пришлось писать отдельный скрипт-чекер, который вытащил список реально доступных моделей (в нашем случае сработала gemini-2.0-flash).

  • Затем начали появляться ошибки 503 в периоды высокой нагрузки. Только мы обрадовались, как Google ответил: «This model is currently experiencing high demand». Бесплатный тариф означает, что ваши запросы обрабатываются по остаточному принципу. Для ежедневного дайджеста, который должен работать как часы, это не годится.

  • А финальным аргументом стали ошибки 429 и фактически недоступные квоты для нашего аккаунта. Как выяснилось, для многих аккаунтов (особенно без привязанной иностранной карты и в определенных гео) Google просто обнуляет бесплатные квоты.

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

Переезд на YandexGPT

В итоге выбор пал на YandexGPT через Yandex Cloud. Тут и оплата российскими картами, и стартовый грант на 4000₽, и понятный API.

Настройка сводится к трём шагам:

  1. Создаем сервисный аккаунт.

  2. Выдаем ему роль ai.languageModels.user.

  3. Генерируем API-ключ.

После этого можно вызывать модель напрямую из Google Apps Script через UrlFetchApp.

Инженерия: как мы формируем контекст

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

Поэтому для каждого письма мы извлекаем только полезную информацию:

  • тему письма;

  • ссылку на Issue в Sentry;

  • текст ошибки;

  • время получения.

Логи дополнительно обрезаются до 4000 символов.

Фрагмент сбора данных выглядит так:

function collectEmailTexts_(threads) {
  const emails = [];

  threads.forEach(thread => {
    thread.getMessages().forEach(message => {
      const rawHtml = message.getBody();

      emails.push({
        subject: message.getSubject(),
        link: extractSentryLink_(rawHtml),
        body: truncate_(message.getPlainBody(), 4000),
      });
    });
  });

  return emails;
}

После этого все письма агрегируются в единый пакет и отправляются в модель одним запросом.

Интеграция в Google Apps Script сводится к одному UrlFetchApp.fetch. Самое важное здесь — правильный системный промпт. Чтобы ИИ не лил воду, а давал четкую структуру, мы использовали такой шаблон:

const systemPrompt = [
    'Ты опытный техлид. Проанализируй письма об ошибках из Sentry и составь структурированную сводку на русском языке.',
    'ВАЖНО: Пиши обычным текстом, строго без использования Markdown-разметки (не используй символы ** для выделения жирным).',
    'Для каждой уникальной ошибки выведи только следующие пункты в формате "Ключ: Значение":',
    'Название: (ОБЯЗАТЕЛЬНО скопируй оригинальный заголовок из темы письма)',
    'Ссылка: (ОБЯЗАТЕЛЬНО выведи URL из поля Link)',
    'Источник: (Определи сервис и окружение на основе названия проекта, например: Бэкенд Прод, Фронтенд Стейдж)',
    'Суть: (краткое описание проблемы простыми словами, 1-2 предложения)',
    'Критичность: CRITICAL / HIGH / MEDIUM / LOW с кратким обоснованием',
    'Опирайся только на предоставленные тексты писем. Никаких выводов и рекомендаций в конце писать не нужно.'
  ].join('\n');

Теперь каждое утро в 09:00 Google Apps Script по триггеру идет в Gmail, собирает все письма от getsentry.com за последние 24 часа, упаковывает их в один JSON и отправляет в YandexGPT.

Почему один запрос лучше пятидесяти

Когда проектируешь подобную автоматизацию, велик соблазн сделать архитектуру «в лоб»: пришло письмо ➔ триггернулся скрипт ➔ отправили запрос в LLM. Это инженерное преступление по трем причинам:

1. Экономия токенов

Системный промпт занимает определенное количество токенов. Если отправить 50 писем отдельно, мы оплатим этот промпт 50 раз. При пакетной обработке — только один.

2. Борьба с дубликатами

Очень часто одна и та же ошибка повторяется десятки раз. Когда модель видит весь массив целиком, она может написать: «Ошибка SequelizeUniqueConstraintError повторилась 5 раз». А не будет генерировать 5 одинаковых отчетов.

3. Меньше запросов

Меньше вероятность столкнуться с лимитами API и таймаутами выполнения Google Apps Script.

Экономика и производительность: реальные цифры

Заглянем в реальный биллинг Yandex AI Studio нашей работающей системы и в логи выполнения Apps Script.

Скорость работы. Судя по логам выполнения Google Apps Script, полный цикл (парсинг писем, отправка запроса в YandexGPT, получение ответа и отправка финального email) занимает от 1 до 13 секунд. Это значит, что у нас колоссальный запас до 6-минутного хард-лимита Google Apps Script.

Стоимость. В день тестирования (15 июня) скрипт обработал пакет из 8 писем. Весь этот объем обошелся суммарно в 8,51 ₽. Из них 6,80 ₽ ушло на огромный входящий контекст, а 1,71 ₽ — на генерацию ответа. В спокойные дни, когда прилетает 1–2 варнинга, цена падает до 1,5–2 ₽ за сутки.

Итоговый прогноз на месяц: Реальный месяц ежедневного мониторинга бэкенда, фронтенда и других сервисов будет обходиться всего в 150–240 рублей.

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

Результат

Раньше утро выглядело примерно так:

Теперь приходит одно письмо.

Чтобы запустить процесс, достаточно настроить ежедневный триггер:

function setupDailyTrigger() {
  ScriptApp.newTrigger('runSentryDigest')
    .timeBased()
    .everyDays(1)
    .atHour(9)
    .create();
}

После этого система работает полностью автономно.

Что осталось нерешенным

Конечно, решение не идеальное. Во-первых, лимиты контекста все еще ограничены: очень длинные stack trace при массовом падении (например, 200 уникальных писем за ночь) могут съесть все окно контекста LLM. Во-вторых, модель нет-нет, да и галлюцинирует: иногда ИИ может выдать неверную оценку критичности, если текст ошибки звучит страшно, но по факту в вашей бизнес-логике это обычный warning.

Дальнейшее развитие

Следующими шагами могут стать:

  • переход с почты на Sentry API;

  • автоматическая группировка по проектам;

  • публикация дайджеста в Telegram или Slack;

  • автоматическое создание задач в Jira.

Итоги

Получилось решение, которое:

  • уменьшило количество уведомлений с десятков до одного письма;

  • экономит время на ежедневном просмотре алертов;

  • работает полностью без серверов;

  • обходится в считанные рубли в день.

Самое приятное, что для запуска не понадобилась сложная инфраструктура: хватило Gmail, Google Apps Script и нескольких вызовов YandexGPT.

Если у вас есть свои способы борьбы с Alert Fatigue или опыт автоматизации Sentry, будет интересно обсудить их в комментариях.