superset 26.500.0 Заметное

Superset 26.500.0: проверка готовности сервера и повтор GET после быстрого 5xx

3 мин чтения
Узнавайте о ломающих изменениях Битрикса раньше, чем они доедут до прода: свежие разборы — в канале @bxmax_updates

Superset 26.500.0 из коробочного Битрикс24 нужен тем, кто обращается из своего кода к собственному (self-hosted) серверу BI Конструктора. У публичных провайдеров два новых метода: ServerProvider::checkReadiness() проверяет, что Superset видит свою базу метаданных, а DatasetProvider::listPhysical() отдаёт только датасеты на таблицах. Коннектор к Superset теперь один раз повторяет GET после быстрого 5xx и умеет писать эти повторы в лог superset.SupersetInstance, а из публичного API ничего не удалено.

Новое

Проверьте, готов ли сервер

ping() спрашивает у Superset /health. Новый checkReadiness(?float $timeBudget = null) запрашивает список дашбордов из одной записи, а за ним Superset идёт в базу метаданных. По докблоку метода запущенный сервер, который ещё не достучался до своей базы, ответит здесь серверной ошибкой.

Статус ответа лежит в getData()['httpStatus'] как есть, включая 555 и 521. Код 555 коннектор подставляет вместо ответов 502 и 503, в модуле он называется DEACTIVATED_INSTANCE, а в докблоках спящим инстансом. Код 521 — это SERVER_DOWN. Если итоговый запрос получил 4xx, а обновление токена упало с 5xx, метод вернёт статус обновления токена, и ошибка авторизации не спрячет серверную причину.

Код 555 при импорте теперь тоже не теряется. Ошибки импорта дашборда, чарта и датасета на инстансе в этом состоянии несут строку '555' в Error::getCode(), и спящий инстанс можно отличить от обычного сбоя.

$timeBudget задаёт секунды на всю проверку вместе с обновлением токена. Таймауты каждого запроса режутся под остаток: половина на соединение, остальное на чтение. Когда до дедлайна меньше 2 с, запрос уже не уходит, и проверка заканчивается кодом 521 с ошибкой «Superset request time limit exceeded». У проверки свой коннектор с таймаутами 5 с на соединение и 10 на чтение, повторов у него нет.

Возьмите только датасеты на таблицах

DatasetProvider::listPhysical() возвращает все физические датасеты инстанса, то есть построенные на таблице, без виртуальных SQL-датасетов. Фильтрует сам Superset оператором dataset_is_null_or_empty по колонке sql, и виртуальные датасеты даже не передаются по сети.

За пределами модуля superset оба метода в коробке пока никто не вызывает. В своём модуле их стоит связать так, чтобы чтение шло только после успешной проверки готовности.

        <?php declare(strict_types=1);

namespace Vendor\Bi\Application;

use Bitrix\Main\Error;
use Bitrix\Main\Loader;
use Bitrix\Main\Result;
use Bitrix\Superset\Public\Providers\DatasetProvider;
use Bitrix\Superset\Public\Providers\SelfHostedServerProvider;
use Bitrix\Superset\Public\Providers\ServerProvider;

final class PhysicalDatasetReader
{
    public function read(float $timeBudget = 8.0): Result
    {
        Loader::requireModule('superset');

        $server = SelfHostedServerProvider::findReference();
        if ($server === null) {
            return (new Result())->addError(new Error('Superset server is not configured'));
        }

        $readiness = (new ServerProvider($server))->checkReadiness($timeBudget);
        $status = (int)($readiness->getData()['httpStatus'] ?? 0);
        if ($status !== 200) {
            // 555 — Superset ответил 502/503 (инстанс спит), 521 — не ответил или не уложился в бюджет
            return (new Result())->addError(new Error('Superset is not ready', $status));
        }

        return (new DatasetProvider($server))->listPhysical();
    }
}

    

Датасеты придут в getData()['datasets'], и карту «ID датасета → таблица» соберёт array_column($result->getData()['datasets'], 'table_name', 'id').

Повтор GET после быстрого 5xx

GET-запросы к Superset идут через коннектор SupersetInstance, в том числе запросы публичных провайдеров. Если Superset ответил 5xx быстрее, чем за 5 с, коннектор выждет секунду и повторит запрос с таймаутами не больше 5 с на соединение и 10 на чтение. Это не касается ответов 502 и 503: коннектор заменяет их на 555. Ответы 555, 521 и медленные ошибки не повторяются. Если повтор вернул 521, наружу уходит первый ответ. Пользователь BI Конструктора увидит меньше случайных ошибок, а сбойный запрос станет дольше на секунду паузы плюс время второй попытки.

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

Включите лог повторов

Каждый повтор пишется с уровнем warning в именованный логгер superset.SupersetInstance. В запись попадают путь без query-строки, оба статуса и время первой попытки. Пока логгер не описан в секции loggers файла .settings.php, записей нет. Добавьте его:

        'loggers' => [
    'value' => [
        'superset.SupersetInstance' => [
            'constructor' => static fn () => new \Bitrix\Main\Diag\FileLogger(
                '/var/log/bitrix/superset-retry.log',
                10 * 1024 * 1024,
            ),
            'level' => \Psr\Log\LogLevel::WARNING,
        ],
    ],
    'readonly' => true,
],

    

Новая версия вышла — разбор уже в Telegram

В канале @bxmax_updates публикуем каждый свежий разбор: что сломается, что устарело и что появилось в API. Узнаете до того, как обновите прод.

Подписаться

Читайте дальше

vote 26.300.0 Безопасность Свежее

Vote 26.300.0: список проголосовавших отдаётся только по подписи

В Vote 26.300.0 закрыли утечку списка проголосовавших через попап «Кто проголосовал», в том числе в анонимных опросах, и ужесточили права на удаление и сброс опросов в админском списке. Обновиться стоит всем, у кого на портале есть опросы. Если вы копировали к себе шаблон `.userfield` компонента `vo…

4 мин
translate 26.100.0 Безопасность Свежее

Translate 26.100.0: импорт CSV и редактор переводов больше не пишут за пределы разрешённых папок

В Translate 26.100.0 закрыли выход за пределы разрешённых папок при записи языковых файлов через редактор и CSV-импорт модуля «Перевод». Обновиться стоит всем, у кого модуль установлен. Публичный API не ломается, но CSV-импорт теперь пропускает файлы с путями вне разрешённых папок.

2 мин
timeman 26.300.0 Ломающее Свежее

Timeman 26.200.0–26.300.0: выключенный «Учёт рабочего времени» отключает REST timeman.*, перерывы за период отдаёт RecordProvider

Timeman 26.200.0 и 26.300.0 пришли в коробочный Битрикс24 в один прогон. В 26.200.0 модуль начал слушаться настройки портала: если инструмент «Учёт рабочего времени» выключен, перестают работать REST `timeman.*`, контроллеры и компоненты модуля, а уведомления не уходят. В 26.300.0 появился публичный…

2 мин
tasks 26.350.0 Рутинное Свежее

Tasks 26.350.0: NEW_COMMENTS_COUNT читается точечно

В tasks 26.350.0 модуль иначе читает `NEW_COMMENTS_COUNT`, значения при этом прежние. Это касается `CTaskItem::fetchList()` и `fetchListArray()` с этим полем в select, а значит и `Manager\Task::getList()` с REST-методом `tasks.task.list`, и REST-метода `tasks.task.get`. Раньше ради этого поля `Count…

1 мин
Мы используем файлы cookie для улучшения работы сайта. Продолжая использовать сайт, вы соглашаетесь с нашей политикой конфиденциальности.
AI Домовой

AI Домовой История

на связи

пишет…
Нет истории чатов
AI Домовой

Нужна авторизация

Войдите, чтобы задавать вопросы AI Домовому.

Войти