Устранение неполадок
Идентификаторы ошибок, с которыми вы можете столкнуться, что они означают и что с ними делать.
График остаётся пустым или сообщает о проблемах с WebGL
Графики рисуются средствами WebGL. Если браузер вообще не может создать контекст WebGL, график сообщает, что не смог инициализироваться, и просит обновить браузер или включить аппаратное ускорение — эти два шага и являются решением. Если графический контекст теряется позже, например после сброса GPU, выгруженной вкладки или выхода мобильного устройства из сна, график сообщает, что отрисовка приостановлена и возобновится, когда GPU восстановится. Восстановление автоматическое: когда браузер восстанавливает контекст, график пересобирает ресурсы GPU и заново загружает текущие свечи, поэтому перезагрузка страницы не нужна. Если сама пересборка не удаётся, график остаётся на паузе, а сбой записывается в консоль браузера.
Что должен обеспечивать ваш браузер
Свечные графики и тепловые карты рисуются в контексте WebGL2. Рендерер запрашивает у canvas именно webgl2 и выбрасывает ошибку, когда браузер ничего не возвращает — именно в этот момент график сообщает о сбое инициализации WebGL и предлагает обновить браузер или включить аппаратное ускорение. Программного пути отрисовки для самих свечей нет: слой аннотаций использует обычный 2D-canvas, но без WebGL2 ценовой ряд не отрисовывается вовсе. Поэтому браузер, поддерживающий только первое поколение WebGL, или запущенный с отключённым ускорением, даёт пустой график ровно с этим сообщением.
Когда контекст создан и позже теряется — сброс драйвера GPU, выгруженная фоновая вкладка, пробуждение мобильного устройства, — график отменяет стандартную обработку потери браузером, что и делает автоматическое восстановление возможным в принципе, и переходит в состояние паузы. При восстановлении он пересобирает ресурсы GPU, инвалидирует версию своего буфера, чтобы каждая свеча была загружена заново, и возвращается к отрисовке. Каждый шаг оставляет в консоли браузера строку с префиксом [WebGLChart]: одну на потерю, одну на успешную пересборку и строку ошибки, если пересборка не удалась. Эти три строки — самое быстрое свидетельство, которое стоит приложить к сообщению о пустом графике.
Перенаправления на вход, предложения перейти на платный тариф и отключённые возможности
Открытие защищённой страницы без входа отправляет вас на страницу входа с сохранением назначения и возвращает туда после входа; та же ситуация для запроса API отвечает 401 с UNAUTHORIZED. Если вы вошли, но ваш тариф не покрывает страницу, вы перенаправляетесь на страницу Upgrade с требуемым уровнем в строке запроса, а эквивалентный запрос API отвечает 402 с PAYMENT_REQUIRED плюс ключ возможности. Живой чат ограничен так же — на уровне preview страница Support показывает призыв перейти на платный тариф вместо чата. Возможность, отключённая оператором, отвечает 503 с KILL_SWITCH и заголовком Retry-After.
Заблокировано, урезано и задержано — что не является сбоем
Два визуальных сигнала означают «ваш тариф этого не включает», и ни один из них не является ошибкой. Ограниченная поверхность закрыта наложением с замком, которое перехватывает и клики мыши, и активацию с клавиатуры и открывает диалог перехода на платный тариф вместо ссылки под ним. Частично видимый виджет данных вместо этого получает встроенную золотую плашку — она используется там, где данные есть, но урезаны, например при задержанном тике или ограниченной глубине истории. Если график показывает меньше баров, чем вы ожидаете, и несёт такую плашку, история была сокращена намеренно, а не потеряна.
Третье наблюдение объясняется временем. Шлюз намеренно остаётся неопределённым, пока не загрузятся ваши права доступа: до этого он скрыт и неактивен, поэтому платящие пользователи никогда не видят мигания заблокированного состояния перед разблокировкой. Видимое следствие в том, что ограниченная плитка может быть пустой мгновение сразу после загрузки страницы. На сервере та же политика отвечает на запросы API кодом 402 и полезной нагрузкой с ключом возможности и требуемым уровнем, тогда как навигация браузера перенаправляется на страницу Upgrade с источником, исходным путём и требуемым уровнем в строке запроса — именно поэтому страница Upgrade может точно сказать, что вы пытались открыть.
Коды ошибок, которые несёт ответ API
У каждого ответа собственного API приложения фиксированная структура. Успех несёт success: true, полезную нагрузку data и метку времени. Сбой несёт success: false и объект error с машиночитаемым code, человекочитаемым message и, возможно, target с именем проблемного поля, объектом details с дополнительным контекстом и doc_url. Приводите code, когда сообщаете о проблеме: код стабилен, а формулировка сообщения — нет. Существует двенадцать кодов, и каждый привязан к одному HTTP-статусу.
Две структуры ответа находятся вне этого набора. Более старые эндпоинты отвечают устаревшей оболочкой с code, msg, data и success, где code — это числовая строка, сгруппированная по классам: 10xxx для проблем со входными данными, 20xxx для аутентификации, 30xxx для авторизации, 40xxx для отсутствующих или конфликтующих ресурсов, 50xxx для серверных сбоев и 60xxx для вышестоящих сервисов. Проблемы базы данных транслируются, прежде чем дойти до вас: потерянное соединение становится 503 с «Database temporarily unavailable», запрос, превысивший лимит времени, становится 504 с «Request timed out», дубликат становится 409, а нарушение ограничения становится 400. Первые два стоит повторить; последние два будут повторяться, пока не изменятся входные данные.
- BAD_REQUEST — 400. Запрос сформирован неверно. Проверьте отправленные параметры.
- VALIDATION_ERROR — 400. Одно из входных значений не прошло проверку; ответ называет его в target.
- UNAUTHORIZED — 401. Действительной сессии нет. Войдите и повторите запрос.
- PAYMENT_REQUIRED — 402. Вход выполнен, но тариф этого не покрывает. details несёт featureKey, requiredTier и, для доменных ограничений, requiredDomain.
- FORBIDDEN — 403. Аутентификация пройдена, но действие не разрешено. Точная причина намеренно остаётся на сервере.
- NOT_FOUND — 404. По этому адресу такого ресурса нет.
- CONFLICT — 409. Ресурс изменился у вас под руками или уже существует. Перезагрузите и повторите.
- PAYLOAD_TOO_LARGE — 413. Тело запроса превышает допустимый размер.
- RATE_LIMITED — 429. Слишком много запросов. Ответ несёт Retry-After, X-RateLimit-Limit и X-RateLimit-Remaining; у эндпоинтов ИИ собственный отдельный лимит, и они отвечают отдельным кодом AI_RATE_LIMITED.
- INTERNAL_ERROR — 500. Непредвиденный серверный сбой. Сообщите о нём, указав ваш Error ID.
- UPSTREAM_ERROR — 502. Сервис, от которого зависит эндпоинт, дал сбой. Повторите позже.
- SERVICE_UNAVAILABLE — 503. Временно недоступно. Обратите внимание, что намеренно отключённая возможность использует другое тело ответа 503, описанное ниже.
Kill switch: кто отключает возможность и насколько
Kill switch — это выключатель одной названной возможности, которым управляет команда Athenum, а не вы, и именно из-за него страница может быть недоступна, пока остальное приложение исправно. Один и тот же 503 порождают две разные ситуации. Если возможность отключена, потому что её бэкенд ещё не выпущен, страница ошибки читается как «Coming Soon» и поясняет, что возможность находится в разработке. Если оператор отключил работающую возможность, страница читается как «Temporarily Unavailable». Оба ответа идентифицируют себя кодом KILL_SWITCH и стабильным публичным именем возможности, таким как funding-heatmap или cme-detector.
Ответ подсказывает, сколько ждать. Каждый выключатель несёт собственное значение Retry-After: 60 секунд для Funding Heatmap, 1800 секунд для CME Detector и 300 секунд для всего, где явная настройка не задана. Вызывающие API получают ту же информацию как application/problem+json, включая флаг defaultKilled, который отличает случай «ещё не построено» от случая «отключено оператором». Сам ответ 503 никогда не кешируется, а успешные ответы на переключаемых эндпоинтах кешируются не более десяти секунд, поэтому переключение доходит до вас быстро; общий кеш всё же может отдавать предыдущий ответ примерно пятнадцать секунд после переключения.
Отключённый маршрут обычно недостижим кликом. Маршруты, которые выключатель блокирует полностью, отфильтровываются из карточек главной страницы и скрываются из командной палитры, поэтому 503 видят в основном те, кто пользуется закладкой, прямой ссылкой или API. Не всякий выключатель блокирует маршрут: некоторые вместо этого меняют поведение на месте — поэтому возможность может быть затронута, хотя ни одна страница не отдаёт 503. Страницы kill switch не несут Error ID, потому что такой ответ является намеренным решением, а не инцидентом, и идентификатор не выдумывается ради заполнения поля.
Общесайтовое обслуживание против сбоя одной возможности
Запланированное окно обслуживания выглядит не так, как любой другой сбой. Вместо обычной страницы ошибки вы получаете самостоятельный документ с заголовком «We'll be back soon», без навигации, без Error ID и без ссылки на поддержку. Он отдаётся с HTTP 503 и Retry-After в один час. Страница полностью самодостаточна — её стили и логотип встроены, и она не делает сетевых запросов, — поэтому она отображается даже тогда, когда бэкенд, база данных и аналитика недоступны. Она также помечена как неиндексируемая, чтобы поисковые системы восприняли сбой как временный.
Шлюз намеренно узок. Он подменяет только браузерные запросы страниц: запросы GET или HEAD, которые просят HTML. Вызовы API под /api/ проходят насквозь, как и эндпоинты проверки здоровья контейнера и любой запрос скриптов, стилей или шрифтов. Стоит знать о следствии: во время обслуживания клиент API или встроенная интеграция могут продолжать работать как обычно, пока браузер показывает страницу обслуживания. Если вы видите «We'll be back soon», затронут весь сайт; если вы видите страницу ошибки 503 с названием одной возможности, затронута только она.
Как читать пустую панель: значок называет сбой
Панели на страницах Macro несут в углу небольшой значок, и этот значок — самый быстрый способ отличить сбой от тихого источника данных. Пять состояний значка описывают реальные данные, а два описывают саму панель. Поскольку значок выводится из тех же правил свежести, по которым панель рисует, он не может заявить состояние, которое данные не подтверждают: панель, которой нечего показать, никогда не помечается STALE, а отсутствующее значение никогда не заменяется подставным числом.
Оболочки уровня панели добавляют второй слой информации. Первая загрузка в процессе отображается скелетом без вердикта и без текста. Чтение, сорвавшееся на транспорте, отображается карточкой ошибки с формулировкой «Fleet read failed — the source may still be live. Retry to reload.» и кнопкой повтора — источник вполне может быть исправен, и повтор является правильной реакцией. Чтение, которое прошло успешно, но не вернуло строк, отображается как «Awaiting Fleet-Bridge» со значком UNAVAILABLE. Эти два выглядят похоже, но означают противоположное: первое — проблема соединения, которую можно повторить, второе означает, что ряд ещё не начал поступать.
Панели TradeFI сообщают причину словами, а не значком. Когда поставщик данных дал сбой, панель сообщает, что данные временно недоступны. Когда поставщик ответил пустотой, она сообщает, что данных по этому символу нет. Институциональное владение добавляет третий случай: примечание о том, что представление является официальным отслеживаемым подмножеством институтов и репрезентативно, а не исчерпывающе, — это заявление об охвате, а не сбой. Списки сопоставимых компаний ведут себя так же и называют нестандартный источник в примечании над панелью, если такой использовался.
- LIVE — внутридневное наблюдение или наблюдение в реальном времени в рамках ожидаемой частоты.
- EOD — честное закрытие периода для дневного, недельного, месячного или квартального ряда.
- STALE — реальное значение, но старше ожидаемой частоты обновления ряда.
- FALLBACK — последние заведомо корректные кешированные данные, заведомо не текущее значение.
- MODEL — расчётная эвристика или построение Athenum, а не прямое наблюдение.
- UNAVAILABLE — панель находится в состоянии ошибки, и ничего не отрисовано.
- LOADING — первая загрузка ещё идёт, и свежесть пока не определена.
Как сообщить о проблеме: ваш Error ID
Когда запрос не проходит, страница ошибки показывает HTTP-статус, короткий заголовок и — если он был сгенерирован — Error ID. Этот идентификатор создаётся именно для вашего инцидента и прикрепляется к записанному отчёту об ошибке, поэтому поддержка может найти именно ваш случай. Нажмите кнопку копирования рядом с ним, затем выберите «Chat with support»: ссылка переносит Error ID на страницу поддержки. При обращении укажите Error ID, адрес страницы и то, что вы делали. Error ID есть не у каждой ошибки — для намеренно отключённой возможности заглушка не выдумывается, поэтому поле просто отсутствует.
Куда попадает ваш Error ID после копирования
Идентификатор на странице ошибки создаётся на сервере, по одному на инцидент, в момент перехвата сбоя. Сервер пишет запись в лог, содержащую этот идентификатор вместе с HTTP-статусом, именем ошибки, путём запроса, методом запроса и меткой времени; в продакшне запись намеренно опускает стеки вызовов и внутренние детали. Тот же идентификатор прикрепляется к инциденту, отправляемому в систему отслеживания ошибок, поэтому поддержка может сопоставить вашу копию идентификатора с записанным сбоем. Исключение — запросы, которые просто попали на несуществующую страницу: они всё равно получают идентификатор, но не пересылаются в систему отслеживания ошибок.
То, что получает браузер, намеренно скудно — общее сообщение плюс идентификатор, — чтобы через страницу не утекли внутренние детали. Нажатие «Chat with support» переносит идентификатор дальше: ссылка открывает страницу поддержки с темой инцидента, Error ID и просьбой открыть чат, а не запускает виджет чата на сбойной странице. Если кнопка копирования будто бы ничего не делает, значит, запись в буфер обмена была отклонена — так бывает на небезопасных источниках или когда доступ к буферу обмена запрещён, — и сбой записывается в консоль браузера; в этом случае выделите идентификатор вручную.
Доступен ли живой чат на странице поддержки на самом деле, зависит от трёх проверок, выполняемых до отрисовки страницы. Чат требует платного тарифа: на уровне preview страница показывает вместо него предложение перейти на платный тариф. Чат также не выдаётся, пока выключен переключатель мессенджера поддержки и пока запросу требуется согласие, которое не было зафиксировано — а это случай запросов, которые выглядят европейскими, британскими или швейцарскими, и запросов, вообще не несущих признака страны, поскольку проверка отказывает в безопасную сторону. В каждом из этих случаев страница всё равно предлагает почту и сообщество в Discord, и эти два канала присутствуют всегда, независимо от тарифа.
Что проверить, прежде чем сообщать о проблеме
Большая часть того, о чём спросит поддержка, уже видна на экране. Проверки ниже занимают меньше минуты и превращают «оно сломалось» в сообщение, с которым можно работать. Двигайтесь снаружи внутрь — весь сайт, затем страница, затем панель, — потому что у каждого слоя свой владелец и своё решение. Ничего здесь не требует инструментов разработчика, кроме двух пунктов, где они упомянуты явно.
- Определите масштаб. Затронуты все страницы, одна страница или одна панель внутри в остальном работающей страницы? «We'll be back soon» означает весь сайт; страница 503 с названием возможности означает только эту возможность.
- Прочитайте формулировку дословно. «Coming Soon» и «Temporarily Unavailable» — разные ситуации, хотя оба являются 503, а тексты панелей «Fleet read failed» и «Awaiting Fleet-Bridge» означают противоположное.
- Поищите значок. LOADING, STALE, FALLBACK и UNAVAILABLE описывают разные состояния, а замок или золотая плашка означают ограничение тарифа, а не сбой.
- Повторите один раз после ожидания. Временные ответы сами указывают своё окно повтора в заголовке Retry-After, видимом на панели сети браузера; более ранний повтор обычно вернёт тот же ответ.
- При пустом графике откройте консоль браузера и поищите строки с префиксом [WebGLChart], затем убедитесь, что браузер актуален и аппаратное ускорение включено.
- Скопируйте Error ID, если он показан. Если кнопка копирования ничего не делает, выделите его вручную — браузер может отклонить запись в буфер обмена.
- Запишите адрес страницы, время и то, что вы делали непосредственно перед сбоем. Error ID определяет инцидент; эти три вещи определяют, чего вы пытались добиться.
Коды ошибок сборщика
Сборщик данных по фьючерсам помечает каждый сбой стабильным кодом, и этот код появляется в квадратных скобках везде, где текст ошибки показывается или пишется в лог. Это внутренние идентификаторы бэкенда: увидев такой в ответе поддержки или в заметке о состоянии, вы понимаете, какой этап дал сбой и повторил ли сборщик попытку, переключился ли на другой источник или сдался.
| Код | Значение | Восстановление |
|---|---|---|
FUT-1001HttpFailed | Запрос к бирже так и не завершился.HTTP request failed for {exchange}: {message} | Повторяется |
FUT-1002ExchangeError | Биржа ответила, но собственной ошибкой.Exchange error for {exchange}: {message} | Переключается на другой источник |
FUT-1003RateLimitExceeded | Биржа отклонила вызов из-за превышения её лимита частоты запросов.API rate limit hit for {exchange} | Повторяется |
FUT-1004ParseFailed | Ответ пришёл, но не читается в ожидаемой структуре.Parse error for {exchange}: {message} | Переключается на другой источник |
FUT-1005DatabaseError | Запись или чтение собранных данных не удались.Database error: {source} | Повторяется |
FUT-1006SerializationError | Полезную нагрузку не удалось закодировать или декодировать, поэтому повтор не поможет.Serialization error: {source} | Фатальная |
FUT-1007RequestError | Сбой самого HTTP-клиента до или во время вызова.Request error: {source} | Повторяется |
FUT-1008ConfigError | Неверная конфигурация или окружение — это не проблема рыночных данных.Config error: {message} | Фатальная |
FUT-1009RateLimiterInternal | Собственный ограничитель частоты запросов сборщика дал сбой.Rate limiter error: {message} | Повторяется |
FUT-1010Unknown | Сбой, не подпадающий ни под одну из категорий выше. Фиксированного действия по восстановлению для него не определено.{message} | Не классифицирована |
Коды ошибок Volume Delta
Эндпоинт Volume Delta возвращает код с префиксом VDLT_ и подсказку. Ошибки, которые можно повторить, являются временными — тот же запрос может пройти успешно чуть позже; остальные требуют изменить сам запрос.
| Код | Можно повторить | Подсказка, возвращаемая API |
|---|---|---|
VDLT_EXCHANGE_TIMEOUT | Да | Retry after a few seconds. The exchange may be experiencing high load. |
VDLT_EXCHANGE_RATE_LIMITED | Да | Retry after 30s. Reduce request frequency. |
VDLT_EXCHANGE_BAD_RESPONSE | Нет | The exchange returned malformed data. Try a different exchange filter. |
VDLT_EXCHANGE_UNAVAILABLE | Да | The exchange API is down. Data from other exchanges is still available. |
VDLT_OHLC_SOURCE_FAILED | Да | Binance is the primary price source. Retry in a few seconds. |
VDLT_NO_DATA | Нет | All configured exchanges failed. Check the exchanges parameter or try again later. |
VDLT_INVALID_INTERVAL | Нет | Valid intervals: 1m, 3m, 5m, 15m, 30m, 1h, 4h, 8h, 12h, 1d |
VDLT_INVALID_ASSET | Нет | Valid assets: BTC, ETH, SOL |
VDLT_PARAM_TOO_LONG | Нет | Reduce the number of exchange IDs. Maximum 2000 characters. |
Столбец с подсказкой воспроизводит английскую строку, которую возвращает API; она не локализуется.
Всё ещё не решается
Обратитесь в поддержку из приложения. Опубликованных целевых уровней обслуживания, показателей доступности или гарантированного времени ответа нет, поэтому эта страница их не заявляет.