У нас в команде результаты тестов производительности сохраняются в Allure. В yaml-файле заданы лимиты. И после теста отельная утилита проверяет соответствие результатов теста лимитам из yaml-файла. Статусы сохраняется в Allure TestOps, как тесты
Такие тесты (yaml-файл с лимитами) заданы в декларативном виде
Сегодня обсуждали фичу, что надо заводить баги по части таких тестов и делать тестам Mute, пока баг не исправлен. Звучало так, что нужно усложнить интеграцию
Сделал такое с JUnit5 и Allure библиотеками. Как эксперимент. В этом случае тест производительности уже задан не в декларативном виде, а кодом. В нем есть механизм Mute, ссылки на Issue. Коллеги имеют опыт работы с такими тестами. Их понятно как отлаживать и писать. Мне кажется, что сложнее не стало
В таким подходе тест на k6 не является тестом — это пререквизит, в ходе которого формируется файл с метриками. А потом уже тест-тест загружает этот файл и применяет Assertion-ы к значениям метрик
Использовал: k6, gson, assertj, junit5, Allure TestOps
Такие тесты (yaml-файл с лимитами) заданы в декларативном виде
Сегодня обсуждали фичу, что надо заводить баги по части таких тестов и делать тестам Mute, пока баг не исправлен. Звучало так, что нужно усложнить интеграцию
Сделал такое с JUnit5 и Allure библиотеками. Как эксперимент. В этом случае тест производительности уже задан не в декларативном виде, а кодом. В нем есть механизм Mute, ссылки на Issue. Коллеги имеют опыт работы с такими тестами. Их понятно как отлаживать и писать. Мне кажется, что сложнее не стало
В таким подходе тест на k6 не является тестом — это пререквизит, в ходе которого формируется файл с метриками. А потом уже тест-тест загружает этот файл и применяет Assertion-ы к значениям метрик
Использовал: k6, gson, assertj, junit5, Allure TestOps
Всем привет! После активации функции подчатов в чатике по нагрузке, данный канал был автоматически отвязан от него. И тепепрь он сам по себе. Подумал, что можно его оживить. В канале все еще есть 8 администраторов, 8 людей, которые могут писать что-то интересное
Был в субботу 27 мая на IT-квартирнике в Ереване, вышел на замену человеку, который заболел перед мероприятием. Здоровья этому человеку
Квартирник это такой формат, где может быть несколько ведущих и не очень большая аудитория. Ведущий более подходящее слово, чем спикер. Так как все общаются, аудитория активно участвует и развивает дискуссию на заданную тему.
У меня был день на подготовку, поэтому выбрал тему "Стихийное тестирование производительности", сделал в miro.com один слайд в формате квартирника, сайт unsplash.com помог с подборкой фонов, добавил на слайд заметок с историями под разную аудиторию. Добавил пару ссылок и QR-кодов на форму обратной связи да слайды через qrcoder.ru и пошел
Ссылка на слайд вот тут
Был в субботу 27 мая на IT-квартирнике в Ереване, вышел на замену человеку, который заболел перед мероприятием. Здоровья этому человеку
Квартирник это такой формат, где может быть несколько ведущих и не очень большая аудитория. Ведущий более подходящее слово, чем спикер. Так как все общаются, аудитория активно участвует и развивает дискуссию на заданную тему.
У меня был день на подготовку, поэтому выбрал тему "Стихийное тестирование производительности", сделал в miro.com один слайд в формате квартирника, сайт unsplash.com помог с подборкой фонов, добавил на слайд заметок с историями под разную аудиторию. Добавил пару ссылок и QR-кодов на форму обратной связи да слайды через qrcoder.ru и пошел
Ссылка на слайд вот тут
👍3
Аудитория была доброжелательная. Я волновался, так как мало готовился. А меня подбадривали - ты что как Гарольд, расслабься, это квартирник. Среди присутствующих не было нагрузочников или они не дали о себе знать при знакомстве, поэтому выбрал желтые стикеры для рассказа, они больше про общие истории
Тестирование, когда на рабочем месте нет интернета, тонкости работы с вложениями почты и флешками.
Работа на субподряде, сочинение отчетов и сделки с совестью
Работа в одиночку и важность поддержки
Нужны ли нагрузочные тесты вообще, и если ли они у кого-то
Что ждет команда от нагрузочника, когда все тормозит, а чего точно не ждет
Что имеет в виду пользователь, когда пишет, что у него что-то тормозит, и как важно уточнить все детали, позвонить, написать, прийти или приехать в гости
Рассказал про необычное тестирование очень асинхронного процесса банковских переводов со счета на счет в другом банке, важность трассировки запросов в таких системах
И что не получал выигрыша, если отдавал приоритет работе и проекту, а не здоровью, семье и делам дома
И послушал истории аудитории, про работу на заводах, согласование 800-т страничных распечаток кода программ и что происходит, когда система держит 50 rps, а должна держать 1000:
Если забыть о проблеме, то ее не существует (с)
Аудитории понравилось, мне тоже. Такой вот был доклад, без единой строчки кода на JMeter, k6, Java, но про нагрузку
Тестирование, когда на рабочем месте нет интернета, тонкости работы с вложениями почты и флешками.
Работа на субподряде, сочинение отчетов и сделки с совестью
Работа в одиночку и важность поддержки
Нужны ли нагрузочные тесты вообще, и если ли они у кого-то
Что ждет команда от нагрузочника, когда все тормозит, а чего точно не ждет
Что имеет в виду пользователь, когда пишет, что у него что-то тормозит, и как важно уточнить все детали, позвонить, написать, прийти или приехать в гости
Рассказал про необычное тестирование очень асинхронного процесса банковских переводов со счета на счет в другом банке, важность трассировки запросов в таких системах
И что не получал выигрыша, если отдавал приоритет работе и проекту, а не здоровью, семье и делам дома
И послушал истории аудитории, про работу на заводах, согласование 800-т страничных распечаток кода программ и что происходит, когда система держит 50 rps, а должна держать 1000:
Если забыть о проблеме, то ее не существует (с)
Аудитории понравилось, мне тоже. Такой вот был доклад, без единой строчки кода на JMeter, k6, Java, но про нагрузку
👍12🔥6
https://freelance.habr.com/tasks/514195
Необходимо протестировать веб-портал интернет-магазина.
Нагрузочное тестирование сценария заказа для 10 000 пользователей. Нужен опыт проведения такого тестирования.
Будет нужно распределение нагрузки, разные точки нагрузки (сервера).
Сценарий будет предоставлен, нужно будет записать скрипт, параметризировать, заполнить шаблон отчета который дадим. Тестовые данные мы подготовим, счетчики производительности с серверов тоже дадим в формате csv
———
Зашел как-то разговор, можно ли заниматься нагрузкой, не на основной работе? Мне было сложно оценить, я бы сам не смог спланировать такой график. Половина времени в нагрузке занимает общение. Это очень общительная работа, потому что она нетиповая, нешаблонная. А делать нетиповую работу на условном фрилансе очень сложно
Нашел для примера задачу на тестирование производительности (такая была только одна). На ее примере попробую представить, возможно ли ее сделать.
Необходимо протестировать веб-портал интернет-магазина.
С одной стороны, веб-портал это контентная часть проекта. И в качестве результатов тестирования может понадобится анализ с помощью webpagetest.org, pagespeed, ... И рекомендации, касательно кеширования, оптимизации на стороне верстки или касательно размеров изображений. Без работы с которыми можно и не начинать нагрузку на API-часть. Но может иметься в виду тестирование и API и отдачи статики и самой статики, всего.
Нагрузочное тестирование сценария заказа для 10 000 пользователей.
Если речь про скорость выполнения 10 000 итераций сценария заказа, то задача одна.
Если в сценарии подразумевается и вход, поиск, просмотр каждого товара, работа с корзиной, выход, задача другая. Более сложные сценарии, более сложны в отладке, это как с атомарностью тестов. В плохих случаях, до самого заказа можно не дойти из-за нестабильности предыдущих шагов.
Если тут имеется в виду 10 000 одновременных подключений, и разные другие технические а не бизнесовые характеристики, то задача третья. После такой задачи будет, возможно, обсуждение в чате qa_load, что инструмент {название} не тянет нагрузку, что делать, помогите. И будут ответы, что тут имелось в виду, не 10к подключений, а 10к итераций. 10к итераций за время, которое нужно установить или за определенное время.
Нужен опыт проведения такого тестирования.
Значит, как первый проект такое взять не получится. Это задача для человека с опытом, портфолио.
Будет нужно распределение нагрузки, разные точки нагрузки (сервера).
Если тут емеется в виду, что нагрузка будет подаваться из разных точек, то сделать такой тест будет дорого; если речь про сотни адресов.
Если имеется в виду, что будут нагружены все серверы магазина, а не только какой-то один IP-адрес, то надо будет разобраться с тем, как устроена балансировка нагрузки.
Сценарий будет предоставлен, нужно будет записать скрипт, параметризировать
Это, понятная часть работы. Но она зависит от того, что имеется в виду под
Нагрузочное тестирование сценария заказа для 10 000 пользователей.
и
Тестовые данные мы подготовим
Если имеется в виду, что будут даны 10 000 токенов пользователей, а также будет дана выгрузка названий и идентификаторов товаров, чтобы было проще делать эмуляцию наполнения корзины, то у задачи сложность на меньшее количество времени.
Если будут не токены, а логины и пароли в количестве 10 000 штук, то сложность выше.
Если будут даны, не идентификаторы и названия товаров, а только названия, то еще выше.
Вариантов много
заполнить шаблон отчета который дадим
Лично для меня этот этап всегда долгий. В простом случае - система нагрузку держит, вот ссылки на детали. Но если система нагрузку не держит, то анализ почему, результаты 5-ти, 10-ти итераций, фиксация сделанных оптимизаций, фиксация результатов оптимизаций.
Необходимо протестировать веб-портал интернет-магазина.
Нагрузочное тестирование сценария заказа для 10 000 пользователей. Нужен опыт проведения такого тестирования.
Будет нужно распределение нагрузки, разные точки нагрузки (сервера).
Сценарий будет предоставлен, нужно будет записать скрипт, параметризировать, заполнить шаблон отчета который дадим. Тестовые данные мы подготовим, счетчики производительности с серверов тоже дадим в формате csv
———
Зашел как-то разговор, можно ли заниматься нагрузкой, не на основной работе? Мне было сложно оценить, я бы сам не смог спланировать такой график. Половина времени в нагрузке занимает общение. Это очень общительная работа, потому что она нетиповая, нешаблонная. А делать нетиповую работу на условном фрилансе очень сложно
Нашел для примера задачу на тестирование производительности (такая была только одна). На ее примере попробую представить, возможно ли ее сделать.
Необходимо протестировать веб-портал интернет-магазина.
С одной стороны, веб-портал это контентная часть проекта. И в качестве результатов тестирования может понадобится анализ с помощью webpagetest.org, pagespeed, ... И рекомендации, касательно кеширования, оптимизации на стороне верстки или касательно размеров изображений. Без работы с которыми можно и не начинать нагрузку на API-часть. Но может иметься в виду тестирование и API и отдачи статики и самой статики, всего.
Нагрузочное тестирование сценария заказа для 10 000 пользователей.
Если речь про скорость выполнения 10 000 итераций сценария заказа, то задача одна.
Если в сценарии подразумевается и вход, поиск, просмотр каждого товара, работа с корзиной, выход, задача другая. Более сложные сценарии, более сложны в отладке, это как с атомарностью тестов. В плохих случаях, до самого заказа можно не дойти из-за нестабильности предыдущих шагов.
Если тут имеется в виду 10 000 одновременных подключений, и разные другие технические а не бизнесовые характеристики, то задача третья. После такой задачи будет, возможно, обсуждение в чате qa_load, что инструмент {название} не тянет нагрузку, что делать, помогите. И будут ответы, что тут имелось в виду, не 10к подключений, а 10к итераций. 10к итераций за время, которое нужно установить или за определенное время.
Нужен опыт проведения такого тестирования.
Значит, как первый проект такое взять не получится. Это задача для человека с опытом, портфолио.
Будет нужно распределение нагрузки, разные точки нагрузки (сервера).
Если тут емеется в виду, что нагрузка будет подаваться из разных точек, то сделать такой тест будет дорого; если речь про сотни адресов.
Если имеется в виду, что будут нагружены все серверы магазина, а не только какой-то один IP-адрес, то надо будет разобраться с тем, как устроена балансировка нагрузки.
Сценарий будет предоставлен, нужно будет записать скрипт, параметризировать
Это, понятная часть работы. Но она зависит от того, что имеется в виду под
Нагрузочное тестирование сценария заказа для 10 000 пользователей.
и
Тестовые данные мы подготовим
Если имеется в виду, что будут даны 10 000 токенов пользователей, а также будет дана выгрузка названий и идентификаторов товаров, чтобы было проще делать эмуляцию наполнения корзины, то у задачи сложность на меньшее количество времени.
Если будут не токены, а логины и пароли в количестве 10 000 штук, то сложность выше.
Если будут даны, не идентификаторы и названия товаров, а только названия, то еще выше.
Вариантов много
заполнить шаблон отчета который дадим
Лично для меня этот этап всегда долгий. В простом случае - система нагрузку держит, вот ссылки на детали. Но если система нагрузку не держит, то анализ почему, результаты 5-ти, 10-ти итераций, фиксация сделанных оптимизаций, фиксация результатов оптимизаций.
счетчики производительности с серверов тоже дадим в формате csv
И если после этого предполагается активная работа с Pandas, и метрик много, то это один сценарий.
Если с Excel, Google Tables, чтобы графики построить, а метрик мало, это второй сценарий.
Если с Excel, Google Tables, чтобы таблички отсортировать просто, то третий.
По каждому пункту можно или потратить N времени на обсуждение и потом M времени на реализацию. Или 0 времени на обсуждение, а потом 10xM на реализацию. И так и так получается не мало.
Стоимость работ я тут опущу, как ведутся переговоры по стоимости на фрилансе, мне просто неведомо. N времени на обсуждение уйдет не просто так, чтобы и стоимость согласовать
И если после этого предполагается активная работа с Pandas, и метрик много, то это один сценарий.
Если с Excel, Google Tables, чтобы графики построить, а метрик мало, это второй сценарий.
Если с Excel, Google Tables, чтобы таблички отсортировать просто, то третий.
По каждому пункту можно или потратить N времени на обсуждение и потом M времени на реализацию. Или 0 времени на обсуждение, а потом 10xM на реализацию. И так и так получается не мало.
Стоимость работ я тут опущу, как ведутся переговоры по стоимости на фрилансе, мне просто неведомо. N времени на обсуждение уйдет не просто так, чтобы и стоимость согласовать
👍12
Оживлю немного канал заметкой о том, как можно сымитировать подачу нагрузки с разных IP-адресов для JMeter и не только. Тут речь про HTTP
Далее копия сообщения https://www.tgoop.com/qa_load/96296/125780
А есть ли в системе балансировщик нагрузки или proxy, который и принимает подключения от клиентов? Nginx, haproxy, ...
Если балансировщик/прокси есть, то за ним один backend-сервер или несколько?
Если несколько серверов на стороне сервера приложений, то балансировщик как выполняет балансировку - по ip-address (реальному адресу или заголовку X-Forwarded-For и/или X-Real-IP), по sticky session (cookie), просто рандомом (round robin)
Если выполняет по ip-address (или по X-Forwarded-For заголовку от клиента с адресом), то есть ли ограничения на подключения от балансировщика до одного сервера приложений? Они меньше чем 5000 подключений?
Если ограничения меньше 5000 подключений, то будет возможность просто их увеличить, не навредив серверу?
Если простые правки настроек не подходят, то будет ли возможность добавить в конфигурацию балансировщика адреса нагрузочной станции (одной), как proxy-сервер верхнего уровня, чтобы эта нагрузочная станция (Apache.JMeter) сама присылала в заголовках запроса заголовки X-Forwarded-For и X-Real-IP с разными ip-адресами (один адрес на каждый сценарий, не на каждый отдельный запрос), а балансировщик доверял этим заголовкам?
Вот так выполняется настройка для nginx
http://nginx.org/en/docs/http/ngx_http_realip_module.html
https://www.nginx.com/resources/wiki/start/topics/examples/forwarded/
в настройку
Для haProxy
https://www.haproxy.com/documentation/haproxy-configuration-tutorials/client-ip-preservation/add-x-forward-for-header/
Также настройки для работы с внешними прокси есть и в самих серверах приложений. Но такие настройки нужны для других security-фильтров. Если бы такие настройки срабатывали, то был бы ответ не Connection Timeout, а HTTP Code 429. Добавлю их, так как немного связано с этой же темой
Для Python и Symfony
https://symfony.com/doc/2.2/components/http_foundation/trusting_proxies.html
В Scala/Java и Play Framework
https://www.playframework.com/documentation/2.7.x/HTTPServer
В Java Spring Boot + Tomcat
https://docs.spring.io/spring-boot/docs/2.0.0.RELEASE/reference/html/howto-security.html#howto-enable-https
https://tomcat.apache.org/tomcat-8.5-doc/api/org/apache/catalina/valves/RemoteIpValve.html
https://github.com/apache/tomcat/blob/10.0.x/java/org/apache/catalina/filters/RemoteIpFilter.java#L800-L832
Надо разбираться, как работает только internalProxies, без trustedProxies и их комбинация
А заголовки
можно добавить через HTTP Header Manager в JMeter
значения можно делать, например, такие
Далее копия сообщения https://www.tgoop.com/qa_load/96296/125780
А есть ли в системе балансировщик нагрузки или proxy, который и принимает подключения от клиентов? Nginx, haproxy, ...
Если балансировщик/прокси есть, то за ним один backend-сервер или несколько?
Если несколько серверов на стороне сервера приложений, то балансировщик как выполняет балансировку - по ip-address (реальному адресу или заголовку X-Forwarded-For и/или X-Real-IP), по sticky session (cookie), просто рандомом (round robin)
Если выполняет по ip-address (или по X-Forwarded-For заголовку от клиента с адресом), то есть ли ограничения на подключения от балансировщика до одного сервера приложений? Они меньше чем 5000 подключений?
Если ограничения меньше 5000 подключений, то будет возможность просто их увеличить, не навредив серверу?
Было 50 подключений к серверу, а все остальные ждали в очереди в течение 60 секунд, а теперь будет 5000.Или увеличить таймаут, что может навредить самому тесту (тест будет не тестировать, а ждать)
Было 50 подключений к серверу, а все остальные ждали в очереди в течение 60 секунд, а теперь будут ждать 600 секунд.
Если простые правки настроек не подходят, то будет ли возможность добавить в конфигурацию балансировщика адреса нагрузочной станции (одной), как proxy-сервер верхнего уровня, чтобы эта нагрузочная станция (Apache.JMeter) сама присылала в заголовках запроса заголовки X-Forwarded-For и X-Real-IP с разными ip-адресами (один адрес на каждый сценарий, не на каждый отдельный запрос), а балансировщик доверял этим заголовкам?
Вот так выполняется настройка для nginx
http://nginx.org/en/docs/http/ngx_http_realip_module.html
https://www.nginx.com/resources/wiki/start/topics/examples/forwarded/
в настройку
set_real_ip_fromсервера nginx добавляется ip-адрес нагрузочной станции с Apache.JMeter и nginx начинает думать, что Apache.JMeter это не клиент, а тоже балансировщик, вышестоящий балансировщик, через который приходят запросы реальных клиентов
set_real_ip_from 192.168.0.100;
set_real_ip_from 192.168.0.0/24;
set_real_ip_from ::1;
set_real_ip_from 127.0.0.1;
Для haProxy
https://www.haproxy.com/documentation/haproxy-configuration-tutorials/client-ip-preservation/add-x-forward-for-header/
option forwardfor
Также настройки для работы с внешними прокси есть и в самих серверах приложений. Но такие настройки нужны для других security-фильтров. Если бы такие настройки срабатывали, то был бы ответ не Connection Timeout, а HTTP Code 429. Добавлю их, так как немного связано с этой же темой
Для Python и Symfony
https://symfony.com/doc/2.2/components/http_foundation/trusting_proxies.html
Request::setTrustedProxies(array('192.168.0.100', '192.168.0.0/24', '::1', '127.0.0.1'));
В Scala/Java и Play Framework
https://www.playframework.com/documentation/2.7.x/HTTPServer
play.http.forwarded.trustedProxies=["192.168.0.100", "192.168.0.0/24", "::1", "127.0.0.1"]
В Java Spring Boot + Tomcat
https://docs.spring.io/spring-boot/docs/2.0.0.RELEASE/reference/html/howto-security.html#howto-enable-https
https://tomcat.apache.org/tomcat-8.5-doc/api/org/apache/catalina/valves/RemoteIpValve.html
server.tomcat.remote-ip-header=x-forwarded-for
server.tomcat.protocol-header=x-forwarded-proto
server.tomcat.internalProxies="192\.168\.0\.100"
By default, 10/8, 192.168/16, 169.254/16, 127/8, 100.64/10, 172.16/12, and ::1 are allowed.У параметра internalProxies приоритет выше, чем у trustedProxies:
https://github.com/apache/tomcat/blob/10.0.x/java/org/apache/catalina/filters/RemoteIpFilter.java#L800-L832
Надо разбираться, как работает только internalProxies, без trustedProxies и их комбинация
А заголовки
X-Forwarded-For
X-Real-IP
можно добавить через HTTP Header Manager в JMeter
значения можно делать, например, такие
44.77.111.${__jexl3( ${__threadNum} % 200 )}
Nginx
NGINX Product Documentation
Learn how to deliver, manage, and protect your applications using F5 NGINX products.
👍11❤1
Hello performance lovers!
Увидел эту фразу в LinkedIn у Clément Boudereau в формате
Hello Grafana Lovers!
И дальше короткий пост про что-то связанное с мониторингом
Применяю ее уже месяца три регулярно в работе, в рабочих чатах. Начиная с нее связанные с производительностью анонсы или обсуждения
Очень рекомендую ❤️ использовать что-то такое в продвижении производительности в вашей команде
👍12❤8
Hello performance lovers!
Поделюсь некоторыми мыслями про задачи. Опишу в обратном порядке — как ставлю галочки на задачах, как задачи появились, ... потом через год посмотрю на это и подумаю, что тут было не так
Нашел для себя неплохое сочетание таких вкладок браузера:
📱 https://www.youtube.com/@abaointokyo — чтобы была фоновая музыка
🍅 https://pomofocus.io/app — чтобы учитывать, примерно, что сделано
📱 это можно заменить на другую фоновую музыку, например, https://www.youtube.com/@QuietQuest
🍅 это можно заменить на блоклот, если где-то еще есть отметки по 25 минут
🖥 если у вас есть второй монитор и не придумали, для чего его использовать — можно что-то из списка выше поместить туда, например 🍅
🗓 если совещаний много, то можно попробовать до их начала поработать так или в календаре выделить два слота — будет на час
Работаю так две недели только, подход нравится ❤️
📊 поменьше инцидентов всем, а помидорок побольше и повкуснее
Поделюсь некоторыми мыслями про задачи. Опишу в обратном порядке — как ставлю галочки на задачах, как задачи появились, ... потом через год посмотрю на это и подумаю, что тут было не так
Нашел для себя неплохое сочетание таких вкладок браузера:
🍅 https://pomofocus.io/app — чтобы учитывать, примерно, что сделано
🍅 это можно заменить на блоклот, если где-то еще есть отметки по 25 минут
🖥 если у вас есть второй монитор и не придумали, для чего его использовать — можно что-то из списка выше поместить туда, например 🍅
🗓 если совещаний много, то можно попробовать до их начала поработать так или в календаре выделить два слота — будет на час
Работаю так две недели только, подход нравится ❤️
📊 поменьше инцидентов всем, а помидорок побольше и повкуснее
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6👎1
Viacheslav Smirnov
как задачи появились
Перед этим день потратил на планирование и уточнения у 📱 — как это обычно делается, можно ли что-то сделать. Если задавать по 5-7 уточняющих вопросов про что-то новое, то получается осмыслить рекомендации
💬 https://chatgpt.com/share/67af1746-48c8-8000-a3dd-54c6634a6e72 — тут вот спрашивал, что можно сделать с access.log-ом сервера nginx, получилось, что работы на месяц, но стало понятнее, что можно будет сделать
При описании задач понравился подход — сначала описать в документе, а уже потом добавить задачи.
Документом может быть markdown/wiki/любой другой документ — это как план. А задачи — то, что решено сделать.
Использую markdown-документы, и понравилось использовать HTML-теги внутри
Чтобы в документе хорошо читалась структура, а детали были доступны по клику.
Задачи у нас в команде ведутся в YouTrack-е, пока их не очень ответственно заполняю — заголовки пишу, а теле только ссылка на документ. Так как задачи пока для самого себя, то работает.
Делаю фокус на документе, а не задаче. Так принято делать для уровней Senior и Staff по рекомендациям инженеров, которые успешно работают именно на таких уровнях и выше
Всем высоких нагрузочных уровней
💬 https://chatgpt.com/share/67af1746-48c8-8000-a3dd-54c6634a6e72 — тут вот спрашивал, что можно сделать с access.log-ом сервера nginx, получилось, что работы на месяц, но стало понятнее, что можно будет сделать
При описании задач понравился подход — сначала описать в документе, а уже потом добавить задачи.
Документом может быть markdown/wiki/любой другой документ — это как план. А задачи — то, что решено сделать.
Использую markdown-документы, и понравилось использовать HTML-теги внутри
## Title
<details>
<summary>Sub title</summary>
Content
</details>
Чтобы в документе хорошо читалась структура, а детали были доступны по клику.
Задачи у нас в команде ведутся в YouTrack-е, пока их не очень ответственно заполняю — заголовки пишу, а теле только ссылка на документ. Так как задачи пока для самого себя, то работает.
Делаю фокус на документе, а не задаче. Так принято делать для уровней Senior и Staff по рекомендациям инженеров, которые успешно работают именно на таких уровнях и выше
Всем высоких нагрузочных уровней
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9
Hello performance lovers!
Давайте делать небольшие доски Grafana с выровненными друг к другу панелями
1️⃣ На снимке выше заснял одну мелочь — три панели друг под другом, у панелей разные размерности (целые числа 0-1, проценты и дробные числа), поэтому разная базовая ширина оси, но они выровнены по ширине
Сделано это через задание
⭐️ Axis / Width = 65 для каждой панели — это ширина левой оси
⭐️ Axis / Width = 1 для правой оси, если она есть (почти 0)
Так получается добиться почти идеального визуального наложения каждой панели друг на друга
2️⃣ Иногда бывает так, как на втором снимке экрана — у осей разная ширина, иногда есть правые оси, и панели раcходятся по времени визуально. Белые вертикальные линии показывают как соотносятся одинаковые моменты времени на разных панелях, если у панелей с одинаковым размеров не выровнены оси по ширине
На коротких интервалах ничего страшного не происходит, расрождение в секунды. А на больших мастабах в 5 пикселях может быть один день — и визуально выгдяит что что-то не то, а это отображаются разные дни друг под другом.
3️⃣ На всякий случай сделал и фото номер три, где у панелей разная ширина — совсем сложно увидеть зависимости метрик
И мозг напрягается, читать становится сложнее
Пока что OpenTelemetry с автоматическими корреляцими метрик с метриками, логов с трейсами, трейсов с профилированием. Или системы AI — не пришли в каждый проект по производительности. И люди смотрят на метрики глазами, думают о них, находят зависимости
Этот процесс можно упрошять таким вот простым шагом
⭐️ задать панелям одинаковую ширину и высоту
⭐️ задать осям одинаковую ширину (тут 65 слева и 1 справа)
✔️ Так голова меньше напрягается, когда на каждой доске одинаковые размеры панелей. Не нужно наводить курсор на график, чтобы понять, где эта же точка на другой панели — могз достроит вертикальную линию — не нужно будет специально двигать курсор
❓ Минусы тоже есть — широкие одинаковые панели занимают много места. Доска теряет компактность. И выравнивание может быть трудоемким. Уже не хочется помещать на доску сто метрик, хочется поместить небольшую группу метрик, чтобы сравнивать их друг с другом. И получается несколько досок, вместо одной предыдущей компактной
⭐️ И если есть задача сделать в таком виде не одну доску, а несколько, то проекты генерации досок из кода, как jsonnet помогут сгенерировать доски в одном стиле
@qaload
Давайте делать небольшие доски Grafana с выровненными друг к другу панелями
Сделано это через задание
Так получается добиться почти идеального визуального наложения каждой панели друг на друга
На коротких интервалах ничего страшного не происходит, расрождение в секунды. А на больших мастабах в 5 пикселях может быть один день — и визуально выгдяит что что-то не то, а это отображаются разные дни друг под другом.
И мозг напрягается, читать становится сложнее
Пока что OpenTelemetry с автоматическими корреляцими метрик с метриками, логов с трейсами, трейсов с профилированием. Или системы AI — не пришли в каждый проект по производительности. И люди смотрят на метрики глазами, думают о них, находят зависимости
Этот процесс можно упрошять таким вот простым шагом
@qaload
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥13👍2
Hello performance lovers!
🇩🇪 Wie geht es dir heute?
Планирую сходить на митап в Берлине
🔗 https://bit.ly/4hh8xcv
и рассказать про
⭐️ Grafana dashboards as code
⭐️ Стильные и быстрые генерируемые доски
На примете вот такие инструменты:
jsonnet -> grafonnet -> jsonnet-libs (signal) -> Grafana Foundation SDK
🔗 https://jsonnet.org/
🔗 https://grafana.github.io/grafonnet/index.html
🔗 https://github.com/grafana/grafonnet-lib
🔗 https://github.com/grafana/jsonnet-libs/tree/master/common-lib/common/signal
🔗 https://grafana.github.io/grafana-foundation-sdk/
Если вы планируете попробовать генерацию, то обратите внимание на них.
Освоил первые два и очень доволен. Думаю об идеях проекта signal, и как его применить.
И может быть к апрелю перепишу мониторинг youtrack на Grafana Foundation SDK
Приходите в конце марта - начале апреля на встречу Grafana & Friends Berlin.
🔗 https://www.meetup.com/de-de/grafana-and-friends-berlin/
Задавайте вопросы тут или разделе чата @qa_load про мониторинг
PS. Это сообщение элемент Conference Driven Development-а, это когда хочется сделать что-то полезное для людей, которые приходят на митапы и конференции. То можно начать с того, что рассказать об этом, получить первые отклики и обратную связь, а потом сделать.
Буду рад вашим откликам 🤗
@qaload
🇩🇪 Wie geht es dir heute?
Планирую сходить на митап в Берлине
🔗 https://bit.ly/4hh8xcv
и рассказать про
⭐️ Grafana dashboards as code
⭐️ Стильные и быстрые генерируемые доски
На примете вот такие инструменты:
jsonnet -> grafonnet -> jsonnet-libs (signal) -> Grafana Foundation SDK
🔗 https://jsonnet.org/
🔗 https://grafana.github.io/grafonnet/index.html
🔗 https://github.com/grafana/grafonnet-lib
🔗 https://github.com/grafana/jsonnet-libs/tree/master/common-lib/common/signal
🔗 https://grafana.github.io/grafana-foundation-sdk/
Если вы планируете попробовать генерацию, то обратите внимание на них.
Освоил первые два и очень доволен. Думаю об идеях проекта signal, и как его применить.
И может быть к апрелю перепишу мониторинг youtrack на Grafana Foundation SDK
Приходите в конце марта - начале апреля на встречу Grafana & Friends Berlin.
🔗 https://www.meetup.com/de-de/grafana-and-friends-berlin/
Задавайте вопросы тут или разделе чата @qa_load про мониторинг
PS. Это сообщение элемент Conference Driven Development-а, это когда хочется сделать что-то полезное для людей, которые приходят на митапы и конференции. То можно начать с того, что рассказать об этом, получить первые отклики и обратную связь, а потом сделать.
Буду рад вашим откликам 🤗
@qaload
🔥10❤1
Hello prometheus lovers!
В новой версии prometheus/jmx_exporter можно сохранять текстовые поля как labels.
Называется такая функциональность attributesAsLabels.
Например, есть у нас MBean в котором есть текстовые поля Build и Version. Так как у них тип String и так как это Attributes в MBean, а не часть имени, их ранее нельзя было удобно обработать через jmx-exporter
Но в разрабатываемой сейчас версии jmx-exporter появился механизм сохранения полей как меток
Например, можно написать так как описано в issue
🔗 https://github.com/prometheus/jmx_exporter/issues/1147
Текущий релиз jmx-exporter 1.1.0, в нем пока нет этих возможностей
Можно из главной ветки собирать версию и использовать ее в своих контейнерах
Стал это использовать — все работает, есть и некоторые особенности. Если нужна будет помощь, напишите в чате https://www.tgoop.com/qa_load/96303/153200
@qaload
В новой версии prometheus/jmx_exporter можно сохранять текстовые поля как labels.
Называется такая функциональность attributesAsLabels.
Например, есть у нас MBean в котором есть текстовые поля Build и Version. Так как у них тип String и так как это Attributes в MBean, а не часть имени, их ранее нельзя было удобно обработать через jmx-exporter
Но в разрабатываемой сейчас версии jmx-exporter появился механизм сохранения полей как меток
Например, можно написать так как описано в issue
🔗 https://github.com/prometheus/jmx_exporter/issues/1147
includeObjectNames: ["jetbrains.youtrack:type=Maintenance,name=Global"]
metricCustomizers:
- mbeanFilter:
domain: jetbrains.youtrack
properties:
type: Maintenance
name: Global
attributesAsLabels:
- Build
- Version
extraMetrics:
- name: isActive
value: true
Текущий релиз jmx-exporter 1.1.0, в нем пока нет этих возможностей
Можно из главной ветки собирать версию и использовать ее в своих контейнерах
FROM maven:3.9.9-eclipse-temurin-21-jammy
# поставить git
RUN apt-get update && apt-get install -y git
# склонировать репу
RUN git clone https://github.com/prometheus/jmx_exporter.git /tmp/jmx_exporter
# собрать
WORKDIR /tmp/jmx_exporter
RUN mvn -DskipTests=true package
# подготовить каталог
RUN mkdir /opt/app/
# сохранить результат сборки
RUN cp /tmp/jmx_exporter/jmx_prometheus_javaagent/target/jmx_prometheus_javaagent-*-post.jar /opt/app/jmx_prometheus_javaagent.jar
# ——————
FROM jetbrains/youtrack:2025.1.62967
USER root
# подготовить каталог
RUN mkdir /opt/app/
# скопировать файл из стадии № 0
COPY --from=0 /opt/app/jmx_prometheus_javaagent.jar /opt/app/jmx_prometheus_javaagent.jar
RUN chown -R jetbrains:jetbrains /opt/app/
USER jetbrains
Стал это использовать — все работает, есть и некоторые особенности. Если нужна будет помощь, напишите в чате https://www.tgoop.com/qa_load/96303/153200
@qaload
🔥5
Hello performance lovers!
Добавим в CI тесты производительности
⭐️ Запуск тестов на каждую сборку
Про такой опыт можно прочитать в книге Профессиональный бенчмарк, которую написал Андрей Акиньшин.
🔗 https://habr.com/ru/companies/piter/articles/598175/
В этом подходе речь идет о бенчмарках, не об e2e тестах. Бенчмарки быстрее и стабильнее e2e тестов, их можно запускать часто, на каждую сборку
Пример такого фреймворка для JVM - JMH
🔗 https://github.com/openjdk/jmh
Скорость выполнения тестов важна, и чем быстрее тем лучше. Чем меньше в тестах зависимостей, тем меньший объект тестируется, и тем быстрее получаются тесты
⭐️ Тесты на низкоуровневые события
Многие системы используют языки программирования, выполняемые в виртуальной машине, например, JVM. Где есть внутренний механизм записи событий, таких как аллокация нового участка памяти или отправка сетевого пакета или какие-то кастомные. Такой проект как
🔗 https://github.com/moditect/jfrunit
позволяет проверять что во время теста какие-то события были, также можно сделать проверки на количество событий. Например
Это позволяет сделать тесты не на время выполнения. Которое может значительно меняться от разных внешних параметров; и нужна статистическая база, чтобы отделить статистически значимые деградации производительности от мнимых - об этом частично книга Профессиональный бенчмарк. А на события. Тут нужно хорошо знать свое приложение, хорошо знать как оно работает внутри. И тогда можно сделать тест на то, что во время теста сборка мусора не была вызвана ни разу и что потоки не были в состоянии блокировки ни разу.
⭐️ Тесты на прикладные метрики
Иногда сложно сказать сколько низко уровневых событий сделает приложение. Для проекта jfrunit можно сделать привязку к кастомным JFR-событиям, как количество чтений какого-то объекта или количество транзакций. Но тогда эти JFR-события надо будет в коде задать.
⭐️ Тесты на количество SQL-запросов
А есть высокоуровневые метрики популярных фреймворков, которые с высокой вероятностью влияют на производительность. Например, есть ORM-фреймворки, которые генерируют SQL-запросы, и они могут сгенерировать N+1 запрос. Например, если есть объект "команда" а в ней есть список людей, то может получиться так, для для получения одной сущности "команда" будет 1 запрос на команду и еще N запросов для получения участников команды.
Тут могут помочь такие проекты как
🔗 https://github.com/quick-perf/quickperf
🔗 https://youtu.be/xxEr8K4hJYQ?si=u7z0rJzVWvTvy1Hs
где через аннотации подобные такой
можно задать ожидаемое количество SQL-запросов, что их тут будет 1, а не N+1.
⭐️ Умный выбор запускаемых тестов
Если добавить к процессу выбора тестов инструменты code-coverage, то можно автоматизировать запуск тестов только на измененные объекты. Тестов получится меньше, они выполнятся быстрее, чем полный набор тестов. А скорость выпуска сборки важна для более быстрых итераций
Пример такого решения от Gradle
🔗 https://docs.gradle.com/develocity/predictive-test-selection/
также есть решения на базе популярного инструмена JoCoCo
🔗 https://docs.gradle.org/current/userguide/jacoco_plugin.html
но два известных мне решения являются внутренеей разработкой, возможно и в моей компании есть такое решение в том числе и в вашей тоже
И есть варианты реализации, когда для тестов есть pipeline, есть автоматизация, но выполнение теста происходит реже, тогда тесты могут быть более длительными. И быть интеграционным тестами на базе таких инструментов как Apache JMeter, K6, Gatling и так далее
⭐️ Тесты до релиза
Также можно запускать тесты на не каждую сборку, а на каждый релиз, на каждый merge в главную ветку
⭐️ Тесты после релиза
Также можно запускать тесты не перед релизом, а после установки релиза на пред-продуктив. Запускать эти тесты на этом же окружении в ходе автоматических проверок после установки новой версии.
⭐️ Тесты по расписанию
Также можно не блокировать сборки, релизы и деплои, а запускать тесты по своему расписанию
Добавим в CI тесты производительности
Про такой опыт можно прочитать в книге Профессиональный бенчмарк, которую написал Андрей Акиньшин.
🔗 https://habr.com/ru/companies/piter/articles/598175/
В этом подходе речь идет о бенчмарках, не об e2e тестах. Бенчмарки быстрее и стабильнее e2e тестов, их можно запускать часто, на каждую сборку
Пример такого фреймворка для JVM - JMH
🔗 https://github.com/openjdk/jmh
Скорость выполнения тестов важна, и чем быстрее тем лучше. Чем меньше в тестах зависимостей, тем меньший объект тестируется, и тем быстрее получаются тесты
Многие системы используют языки программирования, выполняемые в виртуальной машине, например, JVM. Где есть внутренний механизм записи событий, таких как аллокация нового участка памяти или отправка сетевого пакета или какие-то кастомные. Такой проект как
🔗 https://github.com/moditect/jfrunit
позволяет проверять что во время теста какие-то события были, также можно сделать проверки на количество событий. Например
assertThat(jfrEvents).
contains(JfrEventTypes.GARBAGE_COLLECTION);
Это позволяет сделать тесты не на время выполнения. Которое может значительно меняться от разных внешних параметров; и нужна статистическая база, чтобы отделить статистически значимые деградации производительности от мнимых - об этом частично книга Профессиональный бенчмарк. А на события. Тут нужно хорошо знать свое приложение, хорошо знать как оно работает внутри. И тогда можно сделать тест на то, что во время теста сборка мусора не была вызвана ни разу и что потоки не были в состоянии блокировки ни разу.
Иногда сложно сказать сколько низко уровневых событий сделает приложение. Для проекта jfrunit можно сделать привязку к кастомным JFR-событиям, как количество чтений какого-то объекта или количество транзакций. Но тогда эти JFR-события надо будет в коде задать.
А есть высокоуровневые метрики популярных фреймворков, которые с высокой вероятностью влияют на производительность. Например, есть ORM-фреймворки, которые генерируют SQL-запросы, и они могут сгенерировать N+1 запрос. Например, если есть объект "команда" а в ней есть список людей, то может получиться так, для для получения одной сущности "команда" будет 1 запрос на команду и еще N запросов для получения участников команды.
Тут могут помочь такие проекты как
🔗 https://github.com/quick-perf/quickperf
🔗 https://youtu.be/xxEr8K4hJYQ?si=u7z0rJzVWvTvy1Hs
где через аннотации подобные такой
@ExpectSelect(1)
можно задать ожидаемое количество SQL-запросов, что их тут будет 1, а не N+1.
Если добавить к процессу выбора тестов инструменты code-coverage, то можно автоматизировать запуск тестов только на измененные объекты. Тестов получится меньше, они выполнятся быстрее, чем полный набор тестов. А скорость выпуска сборки важна для более быстрых итераций
Пример такого решения от Gradle
🔗 https://docs.gradle.com/develocity/predictive-test-selection/
также есть решения на базе популярного инструмена JoCoCo
🔗 https://docs.gradle.org/current/userguide/jacoco_plugin.html
но два известных мне решения являются внутренеей разработкой, возможно и в моей компании есть такое решение в том числе и в вашей тоже
И есть варианты реализации, когда для тестов есть pipeline, есть автоматизация, но выполнение теста происходит реже, тогда тесты могут быть более длительными. И быть интеграционным тестами на базе таких инструментов как Apache JMeter, K6, Gatling и так далее
Также можно запускать тесты на не каждую сборку, а на каждый релиз, на каждый merge в главную ветку
Также можно запускать тесты не перед релизом, а после установки релиза на пред-продуктив. Запускать эти тесты на этом же окружении в ходе автоматических проверок после установки новой версии.
Также можно не блокировать сборки, релизы и деплои, а запускать тесты по своему расписанию
Please open Telegram to view this post
VIEW IN TELEGRAM
Хабр
Книга «Профессиональный бенчмарк: искусство измерения производительности»
Привет, Хаброжители! Это исчерпывающее руководство поможет вам правильно разрабатывать бенчмарки, измерять ключевые метрики производительности приложений .NET и анализировать результаты. В книге...
👍2
Одна из популярных стратегий, это выполнение тестов по запросу. Реализация варируется от очень автоматизированной (в рамках ограничений)
🔗 https://youtu.be/lVUGf40RYfk?si=47vQWgUEc5hJam4o
Тут рассказывается про запись трафика с продуктива и его воспроизведении, взгляд со стороны пользователей системы
🔗 https://youtu.be/DKR6o6nEVLY?si=btAv4YPcJz2cbfaX
Тут рассказывается про запись трафика с продуктива и его воспроизведении для микросервисов, взгляд со стороны разработчика системы тестирования производительности
🔗 https://youtu.be/Cn-52dCBm_M?si=Ttp73WWgKMl6P4Gu
🔗 https://youtu.be/Ij7DjFKAfUo?si=sfAh8GziqSSURX4a
Тут рассказывается про генерацию профиля нагрузки на основе трафика продуктив
🔗 https://youtu.be/ADUNuVtX3cs?si=Nm-viDIHDysgspBD
🔗 https://goreplay.org/
🔗 https://github.com/buger/goreplay
Тут рассказывается про запись трафика с продуктива и его воспроизведении в другой реализации
До подходов с большим вовлечением специалистов по тестированию производительности, где специлисты могут реализовать любой сценарий, но автоматизируется запуск, построение отчетов, сравнение результатов, поддержка какого-то протокола или способа корреляции
🔗 https://youtu.be/3u6_FDhKk5s?si=Nk7Z50-VnqY1Hs2z
Тут автоматизирован запуск и хранение результатов
🔗 https://youtu.be/Wu4XKenv0MU?si=t63GKdvHC8y6yJNT
Автоматизирована корреляция при работе с брокерами сообщений
🔗 https://youtu.be/BVfao3wi54k?si=T1NZJ2lpndAgtU2x
Автоматизирована работа с протоколом видео связи
Вариантов реализации много. Сейчас думаю над вариантом реализации для youtrack (сервис управления проектами), где уже есть тесты производительности и есть свои ограничения и возможности. Хочется эффективных и быстрых тестов. Если есть желание обсудить, то удобно это сделать в чате @qa_load в разделе Общий чат про НТ https://www.tgoop.com/qa_load/96294
@qaload
Please open Telegram to view this post
VIEW IN TELEGRAM
Хабр
Книга «Профессиональный бенчмарк: искусство измерения производительности»
Привет, Хаброжители! Это исчерпывающее руководство поможет вам правильно разрабатывать бенчмарки, измерять ключевые метрики производительности приложений .NET и анализировать результаты. В книге...
🔥12👍4
Привет, любители производительности!
В 2024-м году оплатил лицензию Proxyman.io, это была благодарность за проведение одного теста. После оплаты, и после этого теста не пользовался инструментом, но тест был хороший, поэтому отблагодарить разработчиков стоило
Это будет история про miro.com, proxyman.io, artillery.io, Google Chrome, Mozilla Firefox, картинки, кеширование и производительность
В 2024-м году гуляя по Еревану послушал выпуск подкаста PurePerformance: Persona Driven Engineering – The magic of knowing your end users with Barbara Ogris
🔗 https://www.spreaker.com/episode/persona-driven-engineering-the-magic-of-knowing-your-end-users-with-barbara-ogris--50890444
Не смогу пересказать подкаст кратко, но выхватил для себя, что можно попробовать применить это в тестировании производительности, а именно
🟣 поговорить с конкретным пользователем
🟣 понять конкретную проблему производительности
🟣 решить эту проблему и сообщить пользователю, что все готово
И в тоже время был куратором доклада на конференцию heisenbug.ru, готовили с Раисой Липатовой доклад про техники тест-дизайна. И в разговоре с ней узнал, что она проводит курсы обучения, для проведения курсов использует miro.com как основную платформу для слайдов, что она платный пользователь, что слайдов у нее много, на слайдах много картинок, что она открывает их из Израиля, и что все загружается очень медленно. Но дефект она не заводила
Этот доклад Раиса подготовила —Техники тест-дизайна на примере гипотетической системы выдачи Covid QR кодов
🔗 https://www.youtube.com/watch?v=bRGs5ma-8EY
А я взял себе задачу
🟣 исследовать скорость работы пользователей не из Европы
🟣 ускорить скорость открытия досок с большим количеством слайдов
🟣 ускорить скорость открытия досок с большим количеством картинок
✅ а когда все получится, рассказать Раисе, что вот теперь работает быстро
Исследования выявили, что основной браузер клиентов — Google Chrome. И что на досках с большим количеством ресурсов достаточно долго ожидается загрузка ресурсов. В 2024-м году была версия системы, которая подгружала все ресурсы доски сразу, даже если они не были в фокусе, получалось долго. В 2025-м году используется новая версия, где загружаются только ресурсы, видимые сейчас.
Но также, для ресурсов не использовались заголовки кеширования. Таким образом, при перезагрузке страницы, браузер мог посылать запросы на загрузку ресурсов снова, и снова надо было долго ждать.
⚫️ запросы на ресурсы в miro были запросами на адрес https://miro.com/api/v1/user-pictures с параметрами
⚫️ а заголовки ответа о которых пишу это Cache-Control и Expires
Также исследования выявили, что браузер📱 Mozilla Firefox отправляет примерно в 2,5 раза меньше запросов api/v1/user-pictures, чем браузер 📱 Google Chrome. Как оказалось, браузер 📱 Mozilla Firefox игнорирует отсутствие заголовков Cache-Control и Expires для ответов с типом image. 📱 Mozilla всегда кеширует картинки, даже если сервер сказал, что кешировать их не надо, что Expires = времени ответа.
⚫️ интересный момент, что📱 Mozilla всегда кеширует картинки при любых заголовках про кеширование, а 📱 Google Chrome работает согласно заголовкам
И визуальные тесты показали, что действительно — доски с большим количеством картинок загружались в📱 Mozilla Firefox при перезагрузке страницы гораздо быстрее. То есть, можно было написать пользователю — попробуй использовать Mozilla, и сначала открывать доску со слайдами, ждать пока все прогрузится, а потом обновлять страницу. Но этого было мало, надо было сказать разработчикам поменять заголовки
В 2024-м году оплатил лицензию Proxyman.io, это была благодарность за проведение одного теста. После оплаты, и после этого теста не пользовался инструментом, но тест был хороший, поэтому отблагодарить разработчиков стоило
Это будет история про miro.com, proxyman.io, artillery.io, Google Chrome, Mozilla Firefox, картинки, кеширование и производительность
В 2024-м году гуляя по Еревану послушал выпуск подкаста PurePerformance: Persona Driven Engineering – The magic of knowing your end users with Barbara Ogris
🔗 https://www.spreaker.com/episode/persona-driven-engineering-the-magic-of-knowing-your-end-users-with-barbara-ogris--50890444
Не смогу пересказать подкаст кратко, но выхватил для себя, что можно попробовать применить это в тестировании производительности, а именно
🟣 поговорить с конкретным пользователем
🟣 понять конкретную проблему производительности
🟣 решить эту проблему и сообщить пользователю, что все готово
И в тоже время был куратором доклада на конференцию heisenbug.ru, готовили с Раисой Липатовой доклад про техники тест-дизайна. И в разговоре с ней узнал, что она проводит курсы обучения, для проведения курсов использует miro.com как основную платформу для слайдов, что она платный пользователь, что слайдов у нее много, на слайдах много картинок, что она открывает их из Израиля, и что все загружается очень медленно. Но дефект она не заводила
Этот доклад Раиса подготовила —Техники тест-дизайна на примере гипотетической системы выдачи Covid QR кодов
🔗 https://www.youtube.com/watch?v=bRGs5ma-8EY
А я взял себе задачу
🟣 исследовать скорость работы пользователей не из Европы
🟣 ускорить скорость открытия досок с большим количеством слайдов
🟣 ускорить скорость открытия досок с большим количеством картинок
✅ а когда все получится, рассказать Раисе, что вот теперь работает быстро
Исследования выявили, что основной браузер клиентов — Google Chrome. И что на досках с большим количеством ресурсов достаточно долго ожидается загрузка ресурсов. В 2024-м году была версия системы, которая подгружала все ресурсы доски сразу, даже если они не были в фокусе, получалось долго. В 2025-м году используется новая версия, где загружаются только ресурсы, видимые сейчас.
Но также, для ресурсов не использовались заголовки кеширования. Таким образом, при перезагрузке страницы, браузер мог посылать запросы на загрузку ресурсов снова, и снова надо было долго ждать.
⚫️ запросы на ресурсы в miro были запросами на адрес https://miro.com/api/v1/user-pictures с параметрами
⚫️ а заголовки ответа о которых пишу это Cache-Control и Expires
Также исследования выявили, что браузер
⚫️ интересный момент, что
И визуальные тесты показали, что действительно — доски с большим количеством картинок загружались в
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
Я нашел место в коде, где заголовки должны ставиться, нашел аннотацию на метод, которая включит кеширование, начал общение. Также узнал, что кеширование было когда-то сознательно отключено из-за возможного security сценария, при котором CDN-сервер кешировал на своей стороне ресурс-картинку, а потом неавторизованный пользователь мог перебором начинать обращаться к картинкам и скачивать их, ведь на CDN-сервере нет авторизации.
⚫️ Тут имею в виду такую архитектуру📱 => CDN без проверки прав доступа => серверы с проверкой прав доступа
И поэтому в каждой картинке добавлен уникальный секретный ключ, одноразовый в рамках сессии, и кеширование выключено
Интересный момент, почему кеширование может быть выключено даже при наличии секретного одноразового ключа в адресе картинки, который злоумышленник уже точно не сможет подобрать? Потому что у CDN есть лимит того, что он будет хранить на своих серверах в кеше, если ему надо хранить 1000 уникальных ресурсов, то это стоит 1000 условных монет, а если при каждом открытии доски добавляется уникальный access token, то надо хранить уже 1 миллион миллионов ресурсов, и это стоит кратно больше
Хорошо, что CDN-сервер может не кешировать на своей стороне ресурсы вообще, если указать заголовок, что кешировать надо только на клиенте, но не на промежуточных серверах. Для этого кеш должен быть private
https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/Cache-Control
⚫️ если вы не знали про
Но чтобы продемонстрировать эффект от такой правки, нужен был тест. И для теста использовал связку📱 => Proxyman со скриптом => miro.com, тест наглядно показывал, как включение кеширования ускоряет работу. В proxyman скрипты активириются через меню Scripting, для своего скрипта задал такие параметры
🟣 Name:
🟣 URL:
🟣 Method:
🟣 Use Wildcard
И в функции onResponse написал две строки на JavaScript (дата 01 May 2024 на тот момент была датой в будущем)
Демонстрация была проведена. Совещания были назначены, созвоны созвонены, задачи поставлены, ... код написан, версия выпущена. Не за день, но все получилось. Получилась такая версия, которая при перезагрузке страницы загружала картинки из локального кеша, и это было на столько быстро, что они отображались почти мгновенно
⚫️ Тут надо помнить, что локальный кеш браузера тоже ограничен
📱 https://chromeenterprise.google/policies/#DiskCacheSize можно групповыми политиками увеличить этот параметр вот так
📱 или через ключ
📱 А в FireFox это 1 ГБайт https://support.mozilla.org/en-US/questions/1272857#:%7E:text=Now%20look%20for%20%27%27%27browser,KB%2C%20before%20restarting%20Firefox%20again
📱 Для Edge тоже можно настроить https://www.thewindowsclub.com/change-microsoft-edge-cache-size-in-windows-10
Сообщил пользователю какую версию использовать, и что этот апдейт сделан специально, поблагодарил за обратную связь. Мне это так понравилось, что решил потом и разработчиков proxyman отблагодарить, оплатив лицензию на Pro версию. Фичи этой Pro версии не использовал, это было просто так. Всем рекомендую попробовать сделать customer based тест, это супер приятно и есть сильная мотивация сделать так, чтобы все получилось
⚫️ Тут имею в виду такую архитектуру
И поэтому в каждой картинке добавлен уникальный секретный ключ, одноразовый в рамках сессии, и кеширование выключено
Интересный момент, почему кеширование может быть выключено даже при наличии секретного одноразового ключа в адресе картинки, который злоумышленник уже точно не сможет подобрать? Потому что у CDN есть лимит того, что он будет хранить на своих серверах в кеше, если ему надо хранить 1000 уникальных ресурсов, то это стоит 1000 условных монет, а если при каждом открытии доски добавляется уникальный access token, то надо хранить уже 1 миллион миллионов ресурсов, и это стоит кратно больше
Хорошо, что CDN-сервер может не кешировать на своей стороне ресурсы вообще, если указать заголовок, что кешировать надо только на клиенте, но не на промежуточных серверах. Для этого кеш должен быть private
https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/Cache-Control
Private cache
Cache that exists in the client. It is also called local cache or browser cache. It can store and reuse personalized content for a single user.
private
The private response directive indicates that the response can be stored only in a private cache (e.g. local caches in browsers).
Cache-Control: private
⚫️ если вы не знали про
Cache-Control: private
, то эта директива может сэкономить на счетах за CDNНо чтобы продемонстрировать эффект от такой правки, нужен был тест. И для теста использовал связку
🟣 Name:
/api/v1/user-pictures
🟣 URL:
https://miro.com/api/v1/user-pictures?*
🟣 Method:
GET
🟣 Use Wildcard
И в функции onResponse написал две строки на JavaScript (дата 01 May 2024 на тот момент была датой в будущем)
// Update or Add new headers
// response.headers["Content-Type"] = "application/json";
response.headers["Cache-Control"] = "private, max-age=31536000";
response.headers["Expires"] = "Wed, 01 May 2024 16:15:02 GMT";
Демонстрация была проведена. Совещания были назначены, созвоны созвонены, задачи поставлены, ... код написан, версия выпущена. Не за день, но все получилось. Получилась такая версия, которая при перезагрузке страницы загружала картинки из локального кеша, и это было на столько быстро, что они отображались почти мгновенно
⚫️ Тут надо помнить, что локальный кеш браузера тоже ограничен
--disk-cache-size=524000000
(по умолчанию 320 МБайт)Сообщил пользователю какую версию использовать, и что этот апдейт сделан специально, поблагодарил за обратную связь. Мне это так понравилось, что решил потом и разработчиков proxyman отблагодарить, оплатив лицензию на Pro версию. Фичи этой Pro версии не использовал, это было просто так. Всем рекомендую попробовать сделать customer based тест, это супер приятно и есть сильная мотивация сделать так, чтобы все получилось
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥6
Если так случилось, что в текущей версии вашего любимого сайта для презентаций отпало кеширование статики и картинок в частности, то можете попробовать Mozilla, где есть баг игнорирования Expires и Cache-Control для картинок, этот баг становится фичей-ускорителем. Или можете попробовать свой прокси-сервер для активации кеширования. Или можете рассказать историю кому-то из команды разработки системы. Для этого возможно надо будет подать доклад на конференцию 🤗
Про artillery не рассказал еще. Чтобы измерить на сколько отличается скорость работы сайта для пользователей из разных стран можно использовать данные Chrome User Experience report, который удобно визуализировать на карте через treo.sh
🔗 https://treo.sh/sitespeed/miro.com?mapMetric=fcp
но Google собирает данные по домену в целом, не по страницам
И в какой-то момент мы решили собирать данные по конкретным доскам (пустая, не пустая), по тестовым доскам. И инструмент artillery.io тут подошел хорошо. Было с ним тоже не все так просто, опишу потом.
Про artillery не рассказал еще. Чтобы измерить на сколько отличается скорость работы сайта для пользователей из разных стран можно использовать данные Chrome User Experience report, который удобно визуализировать на карте через treo.sh
🔗 https://treo.sh/sitespeed/miro.com?mapMetric=fcp
но Google собирает данные по домену в целом, не по страницам
И в какой-то момент мы решили собирать данные по конкретным доскам (пустая, не пустая), по тестовым доскам. И инструмент artillery.io тут подошел хорошо. Было с ним тоже не все так просто, опишу потом.
👏6