Перейти к содержанию

Диагностика и логирование

SDK предоставляет безопасный диагностический снимок через debug_info() и типизированные исключения с полной информацией об операции. Это упрощает отладку без риска утечки секретов в логи.

Диагностический снимок

debug_info() возвращает TransportDebugInfo — снимок transport-настроек без OAuth-секретов. Его безопасно печатать в логи и передавать в отчёты об ошибках.

from avito import AvitoClient

with AvitoClient.from_env() as avito:
    info = avito.debug_info()

print(info.base_url)
print(info.retry_max_attempts)
print(info.timeout_read)
print(info.requires_auth)

Поля исключений

Каждое исключение SDK содержит поля для диагностики:

  • operation — имя SDK-операции (например, ads.get_item);
  • status_code — HTTP-статус ответа;
  • error_code — код ошибки из тела ответа API;
  • message — читаемое описание ошибки;
  • metadata — дополнительные поля с редактированными секретами.
from avito import AvitoClient
from avito.core.exceptions import AvitoError

with AvitoClient.from_env() as avito:
    try:
        item = avito.ad(item_id=999, user_id=7).get()
    except AvitoError as exc:
        print(exc.operation)
        print(exc.status_code)
        print(exc.error_code)
        print(str(exc))

Обработка специфичных ошибок

SDK предоставляет иерархию исключений. Ловите конкретные типы для разной обработки:

from avito.core.exceptions import (
    AuthenticationError,
    AuthorizationError,
    RateLimitError,
    NotFoundError,
    AvitoError,
)

try:
    result = avito.account().get_self()
except AuthenticationError:
    # 401 — протух токен, нужно обновить credentials
    ...
except RateLimitError as exc:
    # 429 — слишком частые запросы
    print(exc.status_code)
except AuthorizationError:
    # 403 — нет доступа к ресурсу
    ...
except AvitoError as exc:
    # любая другая ошибка SDK
    print(str(exc))

Безопасное логирование

debug_info() — единственный публичный способ получить диагностику без секретов. Не логируйте to_dict() / model_dump() моделей, которые могут содержать чувствительные данные пользователя.

from avito import AvitoClient

import logging
logger = logging.getLogger(__name__)

with AvitoClient.from_env() as avito:
    info = avito.debug_info()
    logger.info("SDK инициализирован: base_url=%s, retry=%s", info.base_url, info.retry_max_attempts)

После close()

После close() или выхода из контекстного менеджера любой SDK-вызов поднимает ConfigurationError. Проверяйте это в долгоживущих сервисах.

from avito import AvitoClient
from avito.core.exceptions import ConfigurationError

avito = AvitoClient.from_env()
avito.close()

try:
    avito.account().get_self()
except ConfigurationError as exc:
    print(str(exc))

Полный контракт исключений описан в reference по исключениям. Security-модель SDK разобрана в explanations.