Кому это нужно?
Привет performance lovers! Как perf инженер я перфекционист, и перевел этот свой недостаток в преимущество. И главный вызов для меня в 2026-м не ИИ, а продуктовый подход, который идет в сторону от технической работы
То, что от ожидается от старшего инженера можно попробовать описать вопросом — Кому это нужно?
Хоть вопрос и звучит просто, он означает, что нужно проделывать довольно большую и важную работу, снова и снова
было:
стало: и еще …
В индустрии, сосредоточенные на этом вопросе роли называются Product engineer
Я пока на пути к этому уровню, и не могу сказать, как оно. Но знаю, что именно это от меня сейчас ждут
Please open Telegram to view this post
VIEW IN TELEGRAM
❤14🔥1
Сегодня интерны вышли на работу, ко мне тоже
Будем вместе делать мониторинг для YouTrack. Продукт сразу будет идти с мониторингом и алертами
Пусть получится и коллегу себе подготовить и продукт
А через два дня открывается подача заявок на новый набор интернов в JetBrains. Там есть проект по предсказанию метрик в облаке. Менторы будут в Амстердаме
Будем вместе делать мониторинг для YouTrack. Продукт сразу будет идти с мониторингом и алертами
Пусть получится и коллегу себе подготовить и продукт
А через два дня открывается подача заявок на новый набор интернов в JetBrains. Там есть проект по предсказанию метрик в облаке. Менторы будут в Амстердаме
🔥3
Сделал Drill Down по логам сегодня в Grafana. За счет
🤩 трёх разных dashboards в которые можно переходить с передачей в них переменных типа
🤩
🤩 И поверх этого
Вот представьте что у вас есть в логах строки, которые на поля не парсятся, а там в теле сообщения есть и имя потока и метод и имя сервера. Вот
А когда это станет полями, то Table panel активирует
TextTable panel, которая хорошо показывает логи (лучше чем панель Logs), но надо применить трансформацию Extract fields / _source / key+valueExtract Fields с RegExpВот представьте что у вас есть в логах строки, которые на поля не парсятся, а там в теле сообщения есть и имя потока и метод и имя сервера. Вот
Extract Fields с RegExp может разобрать такие строки на поля уже в браузере А когда это станет полями, то Table panel активирует
Data Links и эти поля становятся кликабельными фильтрами для других досокPlease open Telegram to view this post
VIEW IN TELEGRAM
Hello performance lovers!
Я большой любитель тетрадей и блокнотов. В Ижевске в шкафу лежит сумка с записями. В Москве еще одна. В Мюнхене стопка. А в рюкзаке всегда со мной пара блокнотов
Это была заметка про
🤩 ручки 0.5
🤩 бумагу 90
🤩 и спирали
Я большой любитель тетрадей и блокнотов. В Ижевске в шкафу лежит сумка с записями. В Москве еще одна. В Мюнхене стопка. А в рюкзаке всегда со мной пара блокнотов
Некоторые тетради и блокноты очень старые. Больше всего мне пригодились блокноты с контактами и паролями, начал вести их осознанно и регулярно, где-то в 2007-м🤩 записи с контактами были очень актуальны, когда на SIM-карту помещалось несколько десятков контактов, а телефоны менялись/ломались раз в год без возможности переноса контактов между устройствами🤩 записи с паролями стали актуальны, когда погрузился в безопасность и стал делать сложные уникальные пароли на каждый случай, а случаев было много, сотни
Блокноты переживают переезды, повреждения жестких дисков, смену сервисов — бумага очень надежный носитель информации, который устойчив к нагрузкам
Тут стоит сказать и что можно записать, и куда, и чем. И поделиться хочу находками:🤩 Ручки Pilot, конкретно FriXion, 0.5 — шариковые роллеры с тонкой и легкой линией, и со стирающимися быстросохнущими чернилами. Писать ими легко, чернила негустые🤩 Еще не видел плохих ручек с шариком 0.5 и не видел плохих ручек от Pilot🤩 Часто можно найти в магазинах ручки 0.7 — больший шарик, чуть больший расход чернил, и они более густые, поэтому нужно больше сил прилагать. Но тоже хорошо🤩 Гелевые пишут легко, но расход большой и они сохнут дольше или даже мажут — нужна плотная бумага (90 g/m2) и нужно ждать пока все высохнет перед закрытием🤩 А в школе у меня, думаю, были ручки 1.0, с большим шариком, и там усилий надо было много — часто их расписывал, ведь большой шарик засыхал, а то что колпачок надо закрывать я не думал
Хорошую бумагу я открыл для себя в 2018-м. Это был блокнот 📓 70 g/m2, который я забыл где-то в переговорке Райффайзен банка и так и не нашел. И бумага такой плотности была просто шелковой по сравнению с тетрадками, которые использовал ранее
Да есть у блокнотов минус — их можно забыть. Поэтому удобно хранить важную бумагу в рюкзаках, а не в руках
Большая удача найти тетрадь на спирали с плотностью 90. Почему удача — с такой плотностью часто продают более дорогие красивые блокноты в толстой обложке, обложка изумительная, бумага тоже, но часто они сделаны как книга, и их сложно разложить на столе не помяв. А вот спиральки раскладываются без помятия. Слышал и про японские блокноты, которые раскладываются без помятия, хоть и не используют спирали, но не пока не было опыта, не видел их
Это была заметка про
Please open Telegram to view this post
VIEW IN TELEGRAM
❤10
Hello performance lovers!
Как посчитать минимально необходимое время прогрева перед тестом производительности? На примере Gatling
💡 Самый интересный момент тут в том, что надо сложить и первое время отклика и длительность нестабильности
1️⃣ Была у меня проблема в тесте
В самом начале теста
🤩 нагрузка была не самой ровной и
🤩 время отклика подскакивало до 10 секунд
2️⃣ Нужен прогрев. Но как долго прогревать?
Можно заметить, что
🤩 первые ответы имеют длительность 10 секунд
🤩 значит, запросы были отправлены за 10 секунд до отображения этих результатов
🤩 и еще 12 секунд после этого время отклика и RPS были нестабильны
Значит прогрев нужен на 22 секунды. А лучше на 30, с небольшим запасом
3️⃣ Для Gatling и Junit (BeforeAll) нужен статический метод запуска
🤩 можно передать в параметры запуска
🤩 🤩
🤩 🤩
🤩 🤩
🤩 указать что метод запуска
🤩 и запускать его как
4️⃣ Прогрев дал результат
🤩 Нагрузка стала ровнее
Как посчитать минимально необходимое время прогрева перед тестом производительности? На примере Gatling
1️⃣ Была у меня проблема в тесте
В самом начале теста
2️⃣ Нужен прогрев. Но как долго прогревать?
Можно заметить, что
Значит прогрев нужен на 22 секунды. А лучше на 30, с небольшим запасом
3️⃣ Для Gatling и Junit (BeforeAll) нужен статический метод запуска
GatlingCliOptions.NoReportsGatlingCliOptions.SimulationGatlingCliOptions.ResultsFolderstaticstep_7_warmUp() в @BeforeAll4️⃣ Прогрев дал результат
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥2
Сам себя обманул 🤦♂️ с профилированием
Настроил на тестовом стенде YourKit profiler с опцией
Смотрю на результаты тестов, и раз в 300 секунд скачки на графиках. Мой коллега называет их "вздрыжнями"
🤩 Сборка мусора на приложении подумал я, проверил — все хорошо
🤩 Сборка мусора на gatling подумал я, проверил — все хорошо
🤩 Снизил нагрузку — все равно раз в 300 секунд
🤩 И тут я понял, что все дело в профилировании, оно при сохранении блокирует работу потоков ненадолго, на 5-10 секунд, но на графиках это заметно
✅ Отключил
https://www.yourkit.com/docs/java-profiler/2025.9/help/agent-startup-options.jsp#trigger
Вот такая получилась строка:
И стало ровнее
Настроил на тестовом стенде YourKit profiler с опцией
periodic_perf=300 (сохранять снимок на диск раз в 300 секунд). Настроил и забылСмотрю на результаты тестов, и раз в 300 секунд скачки на графиках. Мой коллега называет их "вздрыжнями"
periodic_perf=300, убрав этот параметр из строки запуска агента профилированияhttps://www.yourkit.com/docs/java-profiler/2025.9/help/agent-startup-options.jsp#trigger
Вот такая получилась строка:
-agentpath:/tools/libyjpagent.so=port=10001,listen=all,probe_table_length_limit=100000,sessionname=youtrack-perf-test,dir=/opt/youtrack/logs,logdir=/opt/youtrack/logs,tmp_dir=/opt/youtrack/temp,triggers_out_dir=/opt/youtrack/logs,cpu=sampling,deadlocks_check_period=10,monitors=on,on_exit=snapshot,snapshot_name_format={app_name}-{datetime},app_name=youtrack_standaloneИ стало ровнее
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
Hello performance lovers!
Настроил IntelliJ IDEA Plugin — Pretty JSON Log
https://plugins.jetbrains.com/plugin/24693-pretty-json-log
для Gatling
В файле log4j2-test.xml достаточно написать, что будет использоваться JsonTemplateLayout для консоли
И добавить зависимости в проект:
И получаются отличные разноцветные логи в консоли. Статистика Gatling отображается просто серым, а сообщения
🟡 INFO
🟠 WARN
🔴 ERROR
отображаются нужными цветами
Началось все с того, что стал настраивать сохранение логов Gatling-теста в ELK, прочитав что Павел Байров подготовил
🖇 https://github.com/Amerousful/gatling-elasticsearch-logs
У нас на проекте используется log4j2, поэтому настройку стал делать под этот формат:
https://logging.apache.org/log4j/2.x/manual/json-template-layout.html
И тут выяснилось, что если JSON логи писать сразу в консоль, то они еще становятся с подсветкой
Настроил IntelliJ IDEA Plugin — Pretty JSON Log
https://plugins.jetbrains.com/plugin/24693-pretty-json-log
для Gatling
В файле log4j2-test.xml достаточно написать, что будет использоваться JsonTemplateLayout для консоли
<Appenders>
<Console name="CONSOLE">
<JsonTemplateLayout/>
</Console>
</Appenders>
И добавить зависимости в проект:
implementation platform('org.apache.logging.log4j:log4j-bom:2.25.3')
runtimeOnly 'org.apache.logging.log4j:log4j-layout-template-json'И получаются отличные разноцветные логи в консоли. Статистика Gatling отображается просто серым, а сообщения
🟡 INFO
🟠 WARN
🔴 ERROR
отображаются нужными цветами
Началось все с того, что стал настраивать сохранение логов Gatling-теста в ELK, прочитав что Павел Байров подготовил
У нас на проекте используется log4j2, поэтому настройку стал делать под этот формат:
https://logging.apache.org/log4j/2.x/manual/json-template-layout.html
И тут выяснилось, что если JSON логи писать сразу в консоль, то они еще становятся с подсветкой
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
Hello git lovers!
Неделю выбирал
🤩 rebase или
🤩 merge
Я работаю в своей ветке, и иногда мне нужно подмержить в свою ветку основной develop, и продолжить работу, подмерживать буду несколько раз. Для такого сценария ничего проще
Но я попробовал делать rebase основной ветки в свою
Один раз можно сделать
с указанием базы, тут легко ошибиться. И вот этот второй
экономит время и мыслетопливо — предсказуемый результат, просто указываешь основную ветку и все хорошо, конфликты только там где они были, а не во всех перемещенных коммитах
Неделю выбирал
Я работаю в своей ветке, и иногда мне нужно подмержить в свою ветку основной develop, и продолжить работу, подмерживать буду несколько раз. Для такого сценария ничего проще
merge не придумалиНо я попробовал делать rebase основной ветки в свою
Один раз можно сделать
rebase, а вот если два, то нужно rebase —-onto …
с указанием базы, тут легко ошибиться. И вот этот второй
rebase превращается в сложную задачу. Где ради ровного лога надо сидеть и высчитывать коммиты merge
экономит время и мыслетопливо — предсказуемый результат, просто указываешь основную ветку и все хорошо, конфликты только там где они были, а не во всех перемещенных коммитах
Please open Telegram to view this post
VIEW IN TELEGRAM
Hello performance lovers!
Мне понадобилось написать тесты на десятки методов (HTTP API, SSE, WebSocket) и для каждого метода есть еще по несколько вариантов Query String или тел запросов
Также мне хотелось использовать Gatling throttle, для ровной нагрузки по RPS. А для этого надо было сделать сценарии длиной в один запрос — только так работает throttle
Сделал каждый запрос реализацией интерфейса IEndpointChainBuilder
🤩 это позволило работать с каждым из них в едином виде
🤩 например, добавлять такие методы в Registry методов где будет указан вес метода (влияет на вероятность вызова) и Lambda которая вызывает
За основу профиля нагрузки взял randomSwitch().on(...)
🤩 это позволяет запускать все методы с весами
🤩 подметоды методов можно тоже запускать с весами (randomswitch может быть вложенным)
🤩 веса вычисляет класс-утилита Registry, который на вход принимает количества и сам вычисляет проценты в этой группе
Так как часть методов связаны — некоторые ответы являются основной для других запросов, — то добавил механизм Adapter-ов которые добавляют общие классы-хранилища (потокобезопасные Queue или Map) в связанные запросы
🤩 атомарные запросы связаны не через Gatling Session, а через общие Queue и Map, заданные через Adapter-ы
Получился расширяемый проект
🤩 легко добавить новый метод
🤩 легко скорректировать актуальное количество (вес) каждого метода
Чтобы было проще отлаживать добавил к заголовкам каждого запроса X-TEST-NAME, где содержится имя теста:
🤩 по заголовкам запроса легко отследить запрос на прокси-сервере как ProxyMan.io
Концепт написал и отладил руками, опираясь на знание Gatling DSL. И когда первые тесты были готовы и отлажены, то за работу по добавлению новых методов и вариаций тел и параметров запросов взялся AI агент Junie, который встроен в💻 ItelliJ IDEA
Закодировать методы и добавить адаптеры по спецификации агент может с помощью как Gemini так и Opus, выбор модели не так важен
Отладка пока осталась на мне. Но процесс понятный
Мне понадобилось написать тесты на десятки методов (HTTP API, SSE, WebSocket) и для каждого метода есть еще по несколько вариантов Query String или тел запросов
Также мне хотелось использовать Gatling throttle, для ровной нагрузки по RPS. А для этого надо было сделать сценарии длиной в один запрос — только так работает throttle
Сделал каждый запрос реализацией интерфейса IEndpointChainBuilder
IEndpointChainBuilder.build()За основу профиля нагрузки взял randomSwitch().on(...)
Так как часть методов связаны — некоторые ответы являются основной для других запросов, — то добавил механизм Adapter-ов которые добавляют общие классы-хранилища (потокобезопасные Queue или Map) в связанные запросы
Получился расширяемый проект
Чтобы было проще отлаживать добавил к заголовкам каждого запроса X-TEST-NAME, где содержится имя теста:
Концепт написал и отладил руками, опираясь на знание Gatling DSL. И когда первые тесты были готовы и отлажены, то за работу по добавлению новых методов и вариаций тел и параметров запросов взялся AI агент Junie, который встроен в
Закодировать методы и добавить адаптеры по спецификации агент может с помощью как Gemini так и Opus, выбор модели не так важен
Отладка пока осталась на мне. Но процесс понятный
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1