Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Описание
Версия
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
.Блокеры
reqwest
клиента в допольнительный Hyper Middleware. К сожалению, этот крейт не экспортировал нужную мне для реализацию feature, потому пришлось его форкнуть. Сейчас я жду принятия PR с добавленной функциональностью.План