Skip to content

Conversation

@npatsakula
Copy link
Owner

Описание

Версия 0.1.0-alpha.0 являлась первым грубым приближением того, как должен выглядеть интерфейс клиента, который строился из опыта более сложной реализации gemini-rust.

В этом PR я попробовал развить удачные направления дизайна API и внутреннего устройства, по сравнению с alpha-версией, а также закрыть некоторые утилитарные потребности: конфигурация клиента, трейсинг и типизированную обработку ошибок.

Обработка ошибок

В alpha-версии для обработки ошибок использовался anyhow, который отлично подходил для начального прототипа, т.к. позволил сделать первую реализацию буквально за пару часов.

Для промышленного применения хотелось бы понимать, какой этап выполнения функции завершился ошибкой, а также получить дополнительную информацию. Выбор пал на snafu, потому как он обладает нужной функциональностью (error-chaining, display macros, backtraces etc) и хорошо себя зарекомендовал за многие годы применения в высоконагруженных системах.

Каждый модуль, отвечающий за изолированную функциональность, обладает собственным Error-перечислением, что позволяет сократить область значений ошибки. Также, для удобства пользователя, крейт экспортирует мета-перечисление, которое населяется перечислениями ошибок модулей (см. примеры); также это перечисление населяется универсальной ошибкой, который пользователь может использовать по своему усмотрению.

Трейсинг

Для промышленной эксплуатации библиотеки требовались инструменты интроспекции, которые которые были бы совместимы с широким спектром промышленных решений для логирования и трассировки: Elastic APM, Jaegger, Graylog и т.д.. Для этого использовался крейт tracing, который позволяет гибко настраивать логирование и интегрироваться с внешними решениями.

Подход к логгированию был сделан следующим: вся относящаяся к исполнению функции информация записывалась в контекст (span в терминах OT) и по окончанию вычисления каждого отдельного этапа создавалось отдельное событие (event в терминах OT); логирование происходит на уровнях debug и error.

Блокеры

  1. Для автоматической ротации токенов (OAuth) используется reqwest-middleware, который оборачивает reqwest клиента в допольнительный Hyper Middleware. К сожалению, этот крейт не экспортировал нужную мне для реализацию feature, потому пришлось его форкнуть. Сейчас я жду принятия PR с добавленной функциональностью.
  2. Тестирование сейчас производится в ручном режиме, т.к. развитие данного проекта я произвожу в свободное время, я не готов подключать токен тестирования с планом pay-as-you-go (Автоматическое тестирование. #3).

План

  • Пакетная обработка.
  • Трассировка.
  • Рефакторинг отправки запросов.
  • Типизированная обработка ошибок.

@npatsakula npatsakula self-assigned this Sep 18, 2025
@npatsakula npatsakula added enhancement New feature or request Release Release PR. labels Sep 18, 2025
@npatsakula npatsakula merged commit d83c602 into master Sep 24, 2025
8 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancement New feature or request Release Release PR.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants