820
Избранные материалы о тестировании производительности. Чат и источник тем: @qa_load
Оказалось, что больше всего в этом году смотрел Heisenbug на YouTube
Иногда это были доклады, на которых был, но хотелось вспомнить детали
Иногда это были просто интересные материалы
Буду очень рад новым мастер-классам и докладам по мониторингу и производительности весной. Да и не я один. Отправляете свои материалы ☺️. Просто идеи бывает сложно конвертировать в отличный материал, а MVP довести до прода — одно удовольствие
Весной будет юбилей конференции. Будет здорово!
Вчера был международный день гор — 11 декабря ⛰🏔🌋
Почему это важно для меня? Мои путешествия начались с горного туризма.Читать полностью…
И там я впервые понял, что я не нагрузочник и не сотрудник компании, я был просто собой и людям вокруг было важно чтобы был верный маршрут, починенные вещи, приятная компания. А до походов я почти всегда был инженером, кроме тех дней когда я был дома
Заниматься инженерией и производительностью круто. Но если сложно ответить на вопрос, а кто же я, без использования названия компаний, то можно сходить в поход или домой поехать. А почему стоит посмотреть на горы? В горном походе хорошо то, что комаров мало и красиво как нигде.
Поставил себе openjdk 25 через
brew install openjdk@25
openjdk@21, выдал права приложению Terminal на доступ к каталогу /Application в Privacy & Security / App Management / TerminalTerminal:echo visualvm_jdkhome="/opt/homebrew/Cellar/openjdk@21/21.0.9/libexec/openjdk.jdk/Contents/Home" >> /Applications/VisualVM.app/Contents/Resources/visualvm/etc/visualvm.conf
Docker desktop обновился до последней версии. Но я в файле libraries.gradle не обновил версию библиотеки-клиента org.testcontainers:testcontainers . И Java Test Containers версии 1.21.1 (последняя версия из ветки 1) перестала подключаться к Docker. Так как нет ни одного дефекта про это, то я думал что у меня что-то не так. А причина была в том, что надо обновлять и бибилиотеку тоже до 2.0.2
Спонсор потерянного дня — старая версия библиотеки 🤦♂️Читать полностью…
Ошибки были вот такие
[Test worker] ERROR org.testcontainers.dockerclient.DockerClientProviderStrategy - Could not find a valid Docker environment. Please check configuration.
🔴 И любые настройки не помогали для Docker Desktop 4.53.0, пока не обновился до testcontainers-java 2.0.2
🟠 Для предыдущей версии 4.52.0 помогало переключиться с docker context docker-linux на docker context default командой
docker cotext use default
🟢 А для версии Docker Desktop 4.51.0 просто работала библиотека testcontainers-java 1.21.1
Версии testcontainers: https://github.com/testcontainers/testcontainers-java/releases
Версии docker-desktop: https://docs.docker.com/desktop/release-notes/
Три доклада и десять разговоров за конференцию
Если вы посещаете конференции и думаете, какой доклад или мастер-класс посетить, то мой опыт с фокусом на несколько докладов, вопросами и беседами может пригодиться
Я интроверт и начал активно ходить и выступать на конференциях с 2018 года. За семь лет прошёл путь от 🪫стресса до 🔋заряжения от митапов и конференцийЧитать полностью…
Если коротко, то стал ставить себе цель посетить лишь два-три доклада даже на двухдневной конференции с программой на несколько десятков событий, но зато поговорить с большим количеством людей, послушать, обсудить, познакомиться, позавтракать, поужинать, покодить
А когда-то пробовал посетить максимум событий программы и мало общался. Думал не упустил ли что-то, а еще слушал комментарии других посетителей, они почти всегда были критическими. Это было время стресса
🔔Первый прилив энергии ощутил от вопросов. Я задавал вопросы, даже старался к каждому выступлению, все больше и больше и чувствовал что так мне нравится все больше и больше. Вопросы становились поводами для общения между докладами
🔋И так постепенно пришел к балансу того, чтобы посетить несколько докладов, постараться заранее найти интересных мне людей и поговорить с ними во время конференции. Это давало большой прилив энергии и идей. С фокусом и общением
Вот так программировали французские короли. У окна. Удобное кресло. Подставка под монитор и видвижная платформа с удобным наклоном для набора кода
А как выглядит ваше рабочее место?
Grafana / Inspect / Query / Refresh позволяет перезагрузить одну панель на доске Grafana
Привет всем! Бывало такое, что у вас не загружается доска Grafana и показывает пустую панель со значком предупреждения вверху ⚠️? А минуту назад все работало. Или бывало что часть панелей загрузилась, а часть показывают предупреждение?
Чаще всего хочется просто перезагрузить доску. Но если это проблема производительности хранилища метрик, то перезагрузка просто повторяет ситуацию множесвенной отправки запросов. И хотелось бы перезагрузить только сбойные панели
💡 В контекстном меню каждой панели можно найти пункт Inspect / Query, где будет кнопка Refresh, для перезагрузки только текущей панели. Это можно делать несколько раз, пока панель не загрузится успешно
А кеширующий прокси-сервер между Grafana и хранилищем метрик позволяет решить проблему для более общего случая, в котором и обновление страницы дозагружает только сбойные панелиЧитать полностью…
Большинство хранилищ метрик и логов доступны по HTTP и подключаются к Grafana по HTTP. Поэтому можно выставить вместо цепочки:
⏺ Grafana => Хранилище
Цепочку:
⏺ Grafana => Nginx => Хранилище
Так для InfluxDB использовал Nginx вот с такой конфигурацией:
⏺ https://gist.github.com/polarnik/cb6f22751e8d1590342198609243c529
Тут ключевые настройки были такие
Кеш на 20 минут в секции http { ... } :
⏺ proxy_cache_path /data/nginx/cache keys_zone=mycache:20m max_size=1g inactive=60m;
Указание этого кеша в http { server { location /query { ... } } } :
⏺ proxy_cache mycache;
⏺ proxy_cache_key "$host-$request_method-$request_uri";
⏺ proxy_cache_min_uses 1;
⏺ proxy_cache_methods GET;
⏺ proxy_ignore_headers Cache-Control;
игнорирование настроек кеширования от самого хранилища метрик тут обязательно, хранилище метрик будет говорить, что кешировать ответ не надо. Но если выбрать статический интервал времени:
⏺ 00:00:00 ... 12:00:00
но не динамический:
⏺ now-12h ... now
то кеширование будет успешно работать, потому что request_uri не изменится
Если хранилище метрик подключено к Grafana через POST-метод, то тогда в настройках кеширования можно указать:
⏺ proxy_cache_key "$host-$request_method-$request_uri-$request_body";
⏺ client_body_in_single_buffer on;
⏺ client_body_buffer_size 64k;
⏺ proxy_cache_methods GET POST;
Так как Nginx не будет выполнять авторизацию доступа к данным из кеша, то надо будет настроить Firewall так чтобы только IP-адрес Grafana Server имел доступ до Nginx Proxy. В этом случае авторизацию выполняет Grafana, и пользователи имеющие доступ до хранилища метрик там будут иметь доступ и кешу
Знаете ли вы, что некоторые инструменты профилирования сделаны почти в одиночку или очень малой командой?
Привет всем! Часто использую инструменты профилирования JVM, иногда завожу дефекты или разбираюсь в исходном коде инструментов, и так ближе знакомлюсь с создателями, и заметил вот такую особенность — команды проектов небольшие
💡 Если есть мысли сделать инструмент для себя, то можно начать в одиночку и даже развить проект до коммерческого продукта
Некоторые оценки размеров команд:
⏺YourKit Java Profiler поддерживается примерно тремя людьми, но это не точно
⏺ JProfiler поддерживался одним человеком (я пока только один контакт нашел)
⏺ jvm-tools/sjk активно поддерживается одним человеком, на github есть 26 участников проекта
⏺ AsyncProfiler судя по коммитам создавался двумя инженерами, потом долго-долго поддерживался одним инженером, и теперь в разработке участвуют 4 человека
⏺ VisualVM активно разрабатывается тремя инженерами, но всего 7 участников на github
⏺ Java Mission Control, где JFR используется как бекенд, активно разрабатывали около 20 человек, и 49 участников проекта есть на github
⏺ Grafana Pyroscope или Pyroscope, где AsyncProfiler используется как бекенд, имеет более 10 активных разработчиков и 221 участников на github
⏺YourKit Java Profiler: https://www.yourkit.com/forum/ — посмотрел на тех, кто отвечает на вопросы, заглянул в контакты на сайте и на linkedinЧитать полностью…
⏺ JProfiler: https://www.ej-technologies.com/company — посмотрел на контакты и на linkedin
⏺ jvm-tools/sjk: https://github.com/aragozin/jvm-tools/graphs/contributors оценил по github
⏺ AsyncProfiler: https://github.com/async-profiler/async-profiler/graphs/contributors
⏺ VisualVM: https://github.com/oracle/visualvm/graphs/contributors
⏺ Java Mission Control: https://github.com/openjdk/jmc/graphs/contributors
⏺ Grafana Pyroscope: https://github.com/grafana/pyroscope/graphs/contributors
Привет всем!
Встречался вчера с любителями Grafana на митапе Grafana & Friends Berlin
Рассказывал и показывал разные способы автоматизации анализа досок с метриками
Демонстрация на слайдах не очень отражена, но основные идеи тут изложил
https://polarnik.github.io/grafana-analysis-automation/
Буду рад вопросам
Привет любители производительности!
Этот канал был задуман, как канал со ссылками на обсуждения в чате qa_load. Это было важно, когда в Telegram не было подчатов, был только один чат General и надо было как-то группировать сообщения из General. Потом в Telegram появились подчаты и текущий канал qaload был отвязан от qa_load
И вот сегодня @qa_load дорос до четырех девяток ⭐️⭐️⭐️⭐️ или четырех нулей *️⃣*️⃣*️⃣*️⃣
Случилось это 18 апреля 2025-го года, спустя 2354 дня после старта
qa_load был стартован Сашей, как отдельный раздел про нагрузку, отдельный от @qa_automation
Рос qa_load со средней скоростью ~ 4.25 новых участников в день. И этот график роста линейный, идеально прямая линия. С первого дня до текущего момента (на таком масштабе в 2354 дня) линия прямая.
Долгое время в чате не было статистики и в Telegram ее не было. И появилась традиция дарить машину или мотоцикл или самолет или поезд на круглое число, например, подарить автомобиль у которого двигатель крутится со скоростью 8000 оборотов в минуту 8000-му человеку. А потом эти посты собирались в эту прямую линию, в них была дата и количество. И, конечно же, людям приятно 💛
Еженедельно его просматривает 215-230 любителей производительности
Постоянно команда ботов и админов следят за качеством дискуссий. Самый главный бот самописный, его Саша написал и поддерживает
Иногда бывает реклама. Я как-то вел учет, и пока его вел было заработано 1700 рублей (кажется) или $20. И это было каждый раз сложно. А вот делать бартер было несложно, бартер на билеты или еще на что-то, что можно бы было сразу потратить. И в какой-то момент все перешло на бартер
В чате можно найти около 6 розыгрышей билетов на разные конференции (я столько вспомнил, может неточное число)
Затрудняюсь сказать сколько стоит инфраструктура вокруг чата. Думаю около $250 в год и еще время 200+ человек каждую неделю
У меня профессиональная деформация, люблю числа и графики. Спасибо за Ваш вклад в числа и графики описанные выше 🤗
А вот так выглядел скрипт кеширования в UI
Читать полностью…
Я нашел место в коде, где заголовки должны ставиться, нашел аннотацию на метод, которая включит кеширование, начал общение. Также узнал, что кеширование было когда-то сознательно отключено из-за возможного 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
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/api/v1/user-pictureshttps://miro.com/api/v1/user-pictures?*GET// 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 МБайт)
⭐️ Тесты по запросу
Одна из популярных стратегий, это выполнение тестов по запросу. Реализация варируется от очень автоматизированной (в рамках ограничений)
💡 Анатолий Пласковский — Jirabased генератор трафика в автоматической системе сервисов стрельб в проде
🔗 https://youtu.be/lVUGf40RYfk?si=47vQWgUEc5hJam4o
Тут рассказывается про запись трафика с продуктива и его воспроизведении, взгляд со стороны пользователей системы
💡 Дмитрий Кузнецов — Подготовка тестовых данных для нагрузочного тестирования протокола gRPC
🔗 https://youtu.be/DKR6o6nEVLY?si=btAv4YPcJz2cbfaX
Тут рассказывается про запись трафика с продуктива и его воспроизведении для микросервисов, взгляд со стороны разработчика системы тестирования производительности
💡 Иван Приходько — Нагрузочное тестирование для котиков. Scenario- vs Hit-Based-подходы
🔗 https://youtu.be/Cn-52dCBm_M?si=Ttp73WWgKMl6P4Gu
💡 Иван Приходько — Как проводить 19 000 нагрузочных тестов в месяц и не умереть под нагрузкой
🔗 https://youtu.be/Ij7DjFKAfUo?si=sfAh8GziqSSURX4a
Тут рассказывается про генерацию профиля нагрузки на основе трафика продуктив
💡 Виктория Дежкина — GoReplay в обеспечении качества высоконагруженных систем
🔗 https://youtu.be/ADUNuVtX3cs?si=Nm-viDIHDysgspBD
🔗 https://goreplay.org/
🔗 https://github.com/buger/goreplay
Тут рассказывается про запись трафика с продуктива и его воспроизведении в другой реализации
До подходов с большим вовлечением специалистов по тестированию производительности, где специлисты могут реализовать любой сценарий, но автоматизируется запуск, построение отчетов, сравнение результатов, поддержка какого-то протокола или способа корреляции
💡 Александр Иванов — Yandex Load Testing: что облачные инструменты дают нагрузочному тестировщику
🔗 https://youtu.be/3u6_FDhKk5s?si=Nk7Z50-VnqY1Hs2z
Тут автоматизирован запуск и хранение результатов
💡 Максим Ажгирей — SyTester. Когда нагружать удобно
🔗 https://youtu.be/Wu4XKenv0MU?si=t63GKdvHC8y6yJNT
Автоматизирована корреляция при работе с брокерами сообщений
💡 Иван Смирнов — Зомби-апокалипсис в Телемосте: нагрузочное тестирование видеоконференцсвязи
🔗 https://youtu.be/BVfao3wi54k?si=T1NZJ2lpndAgtU2x
Автоматизирована работа с протоколом видео связи
Вариантов реализации много. Сейчас думаю над вариантом реализации для youtrack (сервис управления проектами), где уже есть тесты производительности и есть свои ограничения и возможности. Хочется эффективных и быстрых тестов. Если есть желание обсудить, то удобно это сделать в чате @qa_load в разделе Общий чат про НТ /channel/qa_load/96294
@qaload
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
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
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
Ускоряем Allure.TestOps
Год назад работал над ускорением вот этой инсталляцииЧитать полностью…
🕚https://qameta.io/our-customers/miro/
▶️3000 tests for each of the 400 pull requests being run every day
которая давала более 1млн новых launch за день
И делал доклад потом
🕚https://polarnik.github.io/Allure.TestOps.SpeedUp/slides.html
🕚https://www.youtube.com/watch?v=Bzs7cAweTLY
По результатам также появился вот этот раздел инструкции
🕚https://docs.qameta.io/allure-testops/install/database/#separating-connection-pools
▶️The analytics pool, if enabled, will be used for some of the read-only aggregated data queries. It is a common practice to use a separate database for analytics, with replication configured between the two databases.
Но честно говоря, именно для той инсталляции, нагрузка от аналитики не была такой огромной, что это требовало отдельной реплики.
Там нагрузка создавалась вставками и обновлениями в огромном количестве (1+ млн в день). А также запросами по API разных данных — интеграциями. И там хорошо помогло
🕚удалить некоторое количество индексов
🕚создавать partial-индексы только на новые данные, где launch >= ..., test_id >= ... — раз в неделю
Индексы все же были нужны, потому что свежие данные по API и через UI использовались. Но именно свежие
При этом удалять старые данные из системы было непроизводительно. Вот этот скрипт
🕚https://github.com/eroshenkoam/allure-testops-utils?tab=readme-ov-file#delete-launches-in-allure-testops
ставит много задач на удаление в очередь задач, а они тяжелые, тяжелее задач на выборку и вставку, поэтому если его запустить, то производительности конец. Его можно запускать по выходным. Если такие дни бывают у вашей системы. Но partial-индексы с фильтром по свежим id будут игнорировать все архивные записи, поэтому их наличие не будет сказываться на скорости
/channel/dive_memo
Рекомендую уютный канал Михаила с ценными заметками про производительность. Он сейчас делает перфоманс аналитику по облаку для анализа данных
Читает и делает заметки в канал выше
Познакомились мы с ним недавно. А вы, может, с ним знакомы уже и работали вместе в ПерфЛабе, Яндексе или еще где
Интересное наблюдение про файловую систему APFS, которая по умолчанию используется в MacOS
Если скопировать файл в пределах одного диска, то копия не занимает места, это ссылка с другим именем. Если удалить копию, то место также не освобождается
Возможно, это может нарушить логику некоторых инструментов, которые считают место на диске. Представьте, что есть диск на 100 Гбайт, но на нем 100 файлов по 90 ГБайт
Все это требует дополнительной проверки. Я проверял так
Запустил
iostat -w 2 disk0
disk0 cpu load average
KB/t tps MB/s us sy id 1m 5m 15m
4.84 9658 45.69 14 17 69 17.06 15.92 12.23
11.66 2606 29.67 15 16 69 16.01 15.72 12.18
132.30 2220 286.83 10 16 74 16.01 15.72 12.18
226.11 1058 233.61 13 14 73 14.89 15.49 12.12
78.92 443 34.14 12 14 74 14.89 15.49 12.12
33.20 1178 38.20 12 16 73 13.94 15.28 12.07
42.61 1060 44.12 17 16 67 12.90 15.05 12.01
233-286 MB/s, но ничего не увидел. Таким образом заподозрил, что копии 2 и больше были "бесплатные"df -h. Удалил копии 2 и больше и посчитал снова df -h — ничего не изменилось. Тогда удалил все файлы (тестовый файл был архив на 20 ГиБ) — вот тогда место освободилось
Читать полностью…
Неочевидная оптимизация Grafana досок для Thanos — добавить фильтр по label prometheus
Thanos это один из вариантов долговременного хранилища метрик Prometheus. И типичная архитектура такая, что Thanos один, а Prometheus-ов много. И я наивно полагал, что если выбрать один точный фильтр, то запрос будет быстрым. Оказалось, что если отфильтровать данные сначала по prometheus, а потом по имени сервера instance, то запрос получается быстрее, чем когда фильтрация происходит только по имени сервераЧитать полностью…
Примеры:
metric{instance="$instance"}
и
metric{prometheus="$prometheus", instance="$instance"}
Эффект небольшой, но заметен. На первом запросе. Со второго начинается кеширование и данные уже не такие разные
Также довольно простое ускорение — увеличить $__interval для графиков. Например у вас отображается 2600 точек на графике, можно в свойствах панели (Query options) указать "Max data points" = 300 — это не очень мало, но довольно быстро
BSOD на Mac розовый 🩷
Отлаживаю тесты производительности локально, и так как на ноутбуке 64 гигабайта памяти, думал что смогу запустить и браузеры и среду разработки и контейнеры с системой и все все
Если запустить все все и запустить еще и нагрузку, так что и сервисы и тест начнут логи писать с огромной скоростью в консоль, то можно получить розовый экран и перезагрузку
Получил 🔤🔤🔤🔤 уже трижды, поэтому выключил все 🥰😌💻, оставил только Terminal — так работает отлично
Думаю что самой странной идеей было выставить лимит в 💻 на 500k строк в консоли с подсветкой, и запустить в трёх вкладках разные процессы, которые пишут логи неистово. И одновременно открыть дамп памяти на анализ
Интересно, что памяти хватало и процессора тоже. Запас был. Может быть дескрипторы файлов заканчивались или еще что-то
Сегодня собрал нагрузочный pipeline, где объект тестирования готовится с помощью Java Test Containers (Docker)
https://java.testcontainers.org/
TL;DR; Простые варианты использования в Java Test Containers работают — монтирование файлов, переменные окружения, запуск, остановка
Для всего остального есть Java. Если что-то не описано в документации библиотеки и не работает, то оно не заработает, скорее всего
Мне надо было обложить приложение разными агентами мониторинга. Агенты бывают для x64, arm64, musl, windows, … Я думал, что напишу в коде Dockerfile RUN IF … проверю переменные окружения и настрою то, что нужно. Это не работаем если контейнер собирает библиотека testcontainer, а не команда docker build
Если сделать слои и в каждом слое подготовить нужный агент, то команда копирования из слоя не работает для testcontainer
Но простая команда монтирования внешнего файла работает отлично. Поэтому всю сложную логику (какой агент выбрать, для какой архитектуры, …) делает Java, и потом монтирует нужный файл в оригинальный контейнер с приложением
⏺ в BeforeAll запустить небольшую систему и мониторинг к нейЧитать полностью…
⏺ в другом BeforeAll дождаться старта
⏺ нагрузить систему
⏺ проверить assertion-ы
⏺ в AfterAll все остановить и удалить
OnePager — стартовая точка для мониторинга, как продукта
Привет всем! Создаю, внедряю, применяю мониторинг производительности. И замечал, что мониторингом активно не пользовались
💡 Если подходить к мониторингу как к продукту, то такой продукт может начинаться с одной основной страницы, с которой пользователь может по ссылкам перейти на более детальные страницы
Создать такой one pager и провести онбординг пользователей для такой страницы — важная и не самая очевидная задачаЧитать полностью…
Где-то такую страницу называют Иконостас. Это страница Grafana с отражением статусов и основными графиками:
🟦🟦🟥🟦
🟦🟥📉📈
📊📈🟦🟦
🟦🟦🟥🟦
Я пробовал создавать много досок с большим количеством графиков и таблиц:
📊📈📉📈
🗂📊📊📊
🗂📈🗓📉
Это сложно читать и она может медленно грузиться
Пробовал доски с интерактивными диаграммами:
🖼🖼🖼🖼
📊📈📉📈
🗓📉🗓📉
Это круто, но почти никто не кликает по частям диаграмм — это неочевидно, что они интерактивные и по ним можно кликать.
Пробовал создавать страницу только со статусами:
🟦🟦🟥🟦
🟦🟥🟥🟦
и ссылками на детали при клике по статусам. Но видимо не хватило разнообразия статусов на такой доске. На моей версии пока только статусы по загрузке страниц, и нет запросов или подсистем или системных метрик или транзакций или чего-то ниже уровнем, чем страницы. Такой высокий уровень, возможно, слишком высокий. И не хватает деталей
А самую популярную доску мониторинга в мире — Node Exporter Full
https://grafana.com/grafana/dashboards/1860-node-exporter-full/
не считаю удачным примером one pager-а. Она конечно умещается в одну страницу, но она довольно большая и сложная. Она изначально компактная за счет строк (row). Но если строки раскрыть, то там много деталей. Безусловно, такой формат распространения очень удачный — достаточно установить одну доску, и все сразу видно. Но добавляется сложность
⏺ Буду пробовать делать что-то между просто статусами со ссылками и большим количеством графиков
⏺ И попробую посмотреть, что пользователи делают на доске и что ждут от мониторинга. Пользователи — коллеги
Заметил что у YouTube канала появились подписчики, хотя там нет никаких обновлений. Вот авторы, подходы которых посмотрел, тут есть обновления:
AntonPutra">Anton Putra ⏺ 106 тыс. подписчиков ⏺ 274 видео
⏺ готовит в каждому видео тестовые стенды в AWS
⏺ бенчмарки на Go и Python к каждому видео https://github.com/antonputra/tutorials/tree/main/lessons
⏺ демонстрирует графики Grafana
⏺ использует анимированные слайды с темным фоном, на слайдах оставляет место в правом нижнем углу, чтобы потом вставить туда круг с видео
⏺ если показывает рабочий стол или среду разработки или браузер, то не накладывает кружок с видео на демо
⏺ делает много экспериментов
⏺ использует профессиональный звук и свет, так как занимался музыкой отдельно, использует профессиональное оборудование
⏺ использует полноразмерные слайды или слайды на половину экрана, использует разделение экрана на две равные части
⏺ использует сложный монтаж, где включает стоковое видео в ролик, собирает историю из кусочков стокового видео
⏺ возможно использует услуги специалиста по монтажу
"ретроспективный" канал от создателя лучших курсов по Gatling:
⏺ можно видеть как 5 лет назад он использовал простой монтаж и только демонстрацию экрана
⏺ как два года назад он использовал маркерную доску и несколько камер с несложным монтажом
⏺ как он начал использовать screen.studio год назад
⏺ использует много анимации и демонстрацию экрана
⏺ не использует видео с рассказчиком, использует только голос, демонстрацию экрана и анимацию
⏺ иногда использует видео с собой но с разных локаций, которые склеивает в один рассказ
⏺ чаще использует видео из одной локации и позции
⏺ снимает на камеру
⏺ добавляет небольшие вставки с кодом или сайтами
⏺ не использует сложные анимации и эффекты
⏺ использует какое-то популярное решение для записи demo, может быть camtasia или prezi для наложения слайдов на видео
⏺ использует хромокей и анимированный фон, анимированный фон его фишка
⏺ снимает на GoPro и не использует сложное оборудование и свет
⏺ использует несложный монтаж с borumiЧитать полностью…
Привет всем!
Готовлюсь записывать короткие видео и демо, связанные с производительностью. Раньше уже брался, но бросал. Поэтому сейчас нужен public commitment, надо пообещать что сделаю. Это обещания-пост. А начал с того, что пересмотрел набор инструментов для видео
Утилиты которые сейчас выбрал и проверил:
🎚 https://borumi.com/ — тут довольно просто разбить все на части и записать демо по частям, это 99% работы
🎚 https://www.capcut.com/ — чтобы добавить еще 1% в виде пары эффектов и акцентов, как 🔥⚡️💡❗️
Есть план укладываться в 4-5 часов при подготовке видео на 10 минут
Ранее использовал более профессиональные и сложные инструменты и тихонько отказываюсь от них:
🎚 https://obsproject.com/
🎚 https://www.blackmagicdesign.com/products/davinciresolve
Они мощные, но регулярную работу с ними я не освоил, дальше экспериментов не ушел
iMovie не очень мощный, чтобы записать и склеить видео можно
🎚 https://apps.apple.com/de/app/imovie/id377298193
🎚 screenshot + quicktime для видео
но потом внутренний перфекционист не дает покоя
Супер простой и популярный инструмент
🎚 https://screen.studio/
выбирать не стал, так как он очень популярный и узнаваемый, то что видео сделано в нем видно сразу, и это как-то лишало такое видео хардкорности
К ноябрю тут появится что-то новое:
📱 qaload" rel="nofollow">https://www.youtube.com/@qaload
А может не тут, но где-то рядом
Для удобства разработки тестов производительности настроил локальный тестовый стенд. Который может работать без сети. И в том числе pipeline настроил локально TeamCity Server + Agent, так вся разработка получилась в IDEA и как код
⭐️ Но получил ошибку в Idea с текстом, которая не позволяет работать с git
Error updating changes: [4804c71824c21b5c] unable to normalize alternate object path: /opt/buildagent/system/git/git-FFDF2529.git/objects
/opt/buildagent/system/, а текущий проект находится в каталоге разработки, в home (~), но не в opt. Почему Idea смотрит на каталог opt?.idea/vcs.xmlhost.docker.internal, который недоступен локально, и там работа идет с веткой otel, которая есть не во всех внешних git-репозиториях, подключенных к проекту
Привет любители производительности!
Подумал что напишу, как банить, отписываться, удалять, закрывать, ... для производительности, конечно. И вы, возможно, отпишитесь от этого канала, а может быть и нет 😄
Я использую youtube, telegram, linkedin и много разных программ и вкладок браузера. И за неделю накапливается много всего лишнего, а потом еще youtube и linkedin начинают рекомендовать много всего лишнего
Поэтому выбираю один вечер и просматриваю всю ленту рекомендаций и если это рекомендовано зря, то прошу не рекомендовать это больше. Но это не срабатывает 🤦♂️
Что можно сделать дополнительно
Для YouTube можно
*️⃣ открыть страницу истории и просто удалить оттуда лишние записи, но оставить похожие на интересные. И тогда в рекомендациях будет появляться что-то похожее. Это страница https://www.youtube.com/feed/history
*️⃣ одновременно с этим подписываться или добавлять в playlist то, что понравилось
*️⃣ и просить не рекомендовать видео по какой-то теме или с какого-то канала
Для Linkedin можно
*️⃣ открыть страницу профиля (кликнуть на свой аватар) / ⚙️ Settings (внизу) / 🔔 Notifications (внизу) / там будет 13 разделов по которым приходят подписки - можно отписаться от большинства из них
*️⃣ одновременно с этим подписываться или добавлять в 🚩 Saved то, что понравилось из рекомендаций или оставлять реакции с комментариями
*️⃣ и просить не рекомендовать лишние записи и авторов
В Telegram ленты, как таковой, нет. Тут настроил разные каталоги
*️⃣ Отключил уведомление почти у всего, настраивается в каждом чате/канале/контакте отдельно
*️⃣ А что-то поместил в Архив, чтобы поиском найти можно было, но не было видно
Для MacOS можно настроить две кнопки из раздела Apps / Other / Shortcuts
*️⃣ Stop Distructions и добавить там правила 🌜 Turn : Do not Disturb : On + ❎ Quit : App : Telegram + ❎ Quit : App : Slack + ...
*️⃣ Start Pomodoro - тоже полезная
*️⃣ Закрепить кнопки Stop Distructions и Start Pomodoro в панели задач
Использую их в паре, нажимаю обе, стартует таймер на 25 минут, а через 25 минут можно открыть снова Slack и Telegram и проверить нет ли там каких-то нужных сообщений, прочитать их. Потом снова нажать обе кнопки, снова 25 минут работы
Если коротко, то иногда вдумчиво читаю ленту, что-то с ней делаю, и так лента становится интересной и про нагрузку
Если так случилось, что в текущей версии вашего любимого сайта для презентаций отпало кеширование статики и картинок в частности, то можете попробовать Mozilla, где есть баг игнорирования Expires и Cache-Control для картинок, этот баг становится фичей-ускорителем. Или можете попробовать свой прокси-сервер для активации кеширования. Или можете рассказать историю кому-то из команды разработки системы. Для этого возможно надо будет подать доклад на конференцию 🤗
Про artillery не рассказал еще. Чтобы измерить на сколько отличается скорость работы сайта для пользователей из разных стран можно использовать данные Chrome User Experience report, который удобно визуализировать на карте через treo.sh
🔗 https://treo.sh/sitespeed/miro.com?mapMetric=fcp
но Google собирает данные по домену в целом, не по страницам
И в какой-то момент мы решили собирать данные по конкретным доскам (пустая, не пустая), по тестовым доскам. И инструмент artillery.io тут подошел хорошо. Было с ним тоже не все так просто, опишу потом.
Привет, любители производительности!
В 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, и сначала открывать доску со слайдами, ждать пока все прогрузится, а потом обновлять страницу. Но этого было мало, надо было сказать разработчикам поменять заголовки
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
позволяет проверять что во время теста какие-то события были, также можно сделать проверки на количество событий. Например
assertThat(jfrEvents).
contains(JfrEventTypes.GARBAGE_COLLECTION);
@ExpectSelect(1)
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