Превью дашбордов
- Олег Иванов (Unlicensed)
- Юсеф Бенариеб (Unlicensed)
Тип статьи | Познавательная |
---|---|
Компетенции | Администратор |
Необходимые права | Администратор платформы и root на сервере |
Версия платформы | 2.23 |
Статус | БЕТА |
Сложность | легко |
Полезные ссылки | https://www.hangfire.io/ |
Дополнительные сведения | Ubuntu 20.04, включен SEQ |
Введение
Под превью (превьюшки, эскизы, thumbnails) подразумеваются небольшие картинки-снимки внутри разделов на портале платформы. С ними временами могут происходит непонятные вещи. Превью может вовсе не создаться, либо создаться, но виджеты на нём будут с ошибками. Чтобы понять с какой стороны подойти к этой проблеме и была написана эта небольшая статья.
1. Триггеры, вызывающие создание превью.
Существует несколько тригеров, которые приводят к созданию и обновлению превьюшек. Они показаны на схеме ниже.
- Сохранение в DD. Нажимаем кнопку "Сохранить" в Дэшборд Дизайнере.
- Обновление по расписанию. Существует регулярная задача в контейнере schedule (внутри используется Hangfire для управления запланированными задачами), которая запускается раз в 10 минут.
- Постановка флажка в настройках дашбордов (в веб администрировании) - "Создавать превью автоматически". Т.е., если мы её отключим, а затем включим (по умолчанию она включена), то превью создастся.
2. Где хранятся картинки и настройки.
- Сами превью хранятся в компоненте mongodb - DashboardScreenshots. Также в этой коллекции хранятся такие параметры как дата последнего обновления и флаг "Создавать превью автоматически".
- Также в Монге в коллекции GeneralSettings хранится информация о расписании обновлении превьюшек, создании новых и удалении неактуальных.
- Заглушка для случаев неуспешного создания превью хранится внутри компонента экспорт-сервис. Во время неудачной попытки создания превью картинка записывается в соответствующий дашборд в mongodb - DashboardScreenshots.
3. Описание работы и имеющиеся логи.
Центральный компонент работы этого механизма - Dashboard-service. Пайплайн следующий:
- Dashboard-service говорит компоненту export-service, что надо создать превью. Делает он это через прокси, используя внешний адрес платформы.
Внутри export-service работает puppeteer, который открывает дашборд от системного юзера PreviewMaker, ждет 30 сек, делает скрин и отправляет обратно на Dashboard-service (тоже все через прокси). Если скрин сделать не удалось, то отправляет заглушку.
Есть фича, реализованная для очень длинных по высоте дашбордов с фиксированной шириной (с версии 2.24). Если высота дашборда больше ширины, то ширина умножается на 9/16 и присваивается высоте. Далее pupeteer открывает дашборд с этими размерами и делает скриншот, соотношение которого получается 16:9. Нужно это для заполнения всей области с превью дашборда в разделах на веб портале платформы.
Пример: дашборд 2000 х 5000. Размер скриншота: 2000 x 1125.
- Dashboard-service сохраняет скриншот в Монгу уже напрямую внутри докер подсети без использования прокси.
Случай 1.
Давайте рассмотрим случай, когда мы сохраняем дашборд в ДД или включаем флажок в настройке дашборда.
После любого из этих действий на адрес "/corelogic/api/command" посылается запрос:
{ DashboardGuid: "...", CommandType: "MakeDashboardPreview+Command" }
Если для "Dashboard service" уровень логирования установить Full, то в событие Seq выглядит следующим образом:
Случай 2.
По расписанию задача на обновление превью выполняется каждые 10 мин (это видно и по логам и по записи в Монге). Логика работы следующая: у каждого превью есть дата создания, поэтому выбирается ОДНО самое старое превью и для него одного обновляется картинка.
Отсюда вытекает, например, такой кейс: есть 1000 дашбордов уже готовых, и мы за сутки обновляем превьюшки только 144 из них (1 даш за 10 мин, 6 дашей за час). Значит, если где-то данные обновились (и это супер заметно в превьюшке) или роли превью понизили права, то ждать актуальной превьюшки для самого старого из 1000 дашбордов придется около недели.
Выполняются следующие 2 запроса от компонента schedule на dashboard-service, адрес "/corelogic/api/command":
{ CommandType: "RefreshOutdatedDashboardPreviews+Command" }
Данный запрос (картинка выше) обновляет устаревшие превью.
{ CommandType: "MakeBrandNewDashboardPreviews+Command" }
А этот запрос (картинка выше) создаёт превью для дашбордов, у которых его еще нет. Это в первую очередь нужно для дашбордов по внешней ссылке, добавленных внутри настроек портала.
Запросы посылаются на внешний адрес платформы.
4. Известные проблемы.
Симптом | Причина | Версия платформы | Действия |
---|---|---|---|
Превью не создается, видим серую заглушку или белый снимок или не все виджеты. | Ошибки в виджетах препятствуют созданию превью. | 2.19 и ранее | Устранить ошибки в виджетах на проблемном дашборде. |
Аналогично предыдущему. | Дашборд грузится слишком долго (более 30 сек). | Предположительно любая | Оптимизировать дашборд. Проверить загрузку сервера (возможно стоит добавить мощностей). Увеличить 30 сек на данный момент 21.09.2021 нельзя. |
Превью создаётся, но у виджетов ошибки или не все/не те данные. | У системной роли для превью недостаточно прав. | Предположительно любая | Проверить права этой роли на просмотр дашбордов и на доступ к данным на ViQube. |
Аналогично предыдущему. | Синдром Пьера Ришара из фильма "Невезучие". Создание превью попало на работу загрузчиков для данных на дашборде, поэтому данных на дашборде временно не было. | Предположительно любая | Быстрое решение: вызвать создание превью руками: сохранением даш-да в ДД или флажком в веб администрировании в свойствах дашборда. Как избегать в будущем: Смириться и ждать реализации реквеста на "доступность данных на дашбордов во время работы загрузчиков". Реализовывать свою инкрементную загрузку на ViQube API. |
В разделе на портале наблюдаем серую заглушку у дашборда. | Аналогично предыдущему, но создание превью попало на работу аналитика с Дашбордом. То есть аналитик, работая, временно сломал дашборд путем подкладывания кастомных скриптов в customjs. Далее проблемный скрипт убрал, но ведь дашборд не сохранялся вручную, а следующее регулярное обновление превью может быть нескоро. В итоге ошибка. | Предположительно любая | Быстрое решение: вызвать создание превью руками: сохранением даш-да в ДД или флажком в веб администрировании в свойствах дашборда. Как избегать в будущем: Обкатывать скрипты и доводить до ума дашборды на дев сервере, а не на проде. |
В целом диагностику проблем после исключения всего, что выше, стоит начинать с логов, вот по этим событиям:
- MakeBrandNewDashboardPreviews;
- MakeDashboardPreview;
- RefreshOutdatedDashboradPreviews.
От этих ошибок можно отталкиваться куда копать далее, если они конечно будут.
5. Созданные реквесты на доработку.
На дополнительные логи для диагностики - #43194