ОтелРезультатыЭкспорта
Модуль-фабрика результатов экспорта и принудительной выгрузки — объектов ОтелРезультатЭкспорта.
Описание
ОтелРезультатЭкспорта возвращают СброситьБуфер процессоров, экспортеров, провайдеров и ОтелSdk. Свой процессор или экспортер создаёт результат функциями Успех(), Ошибка() и Таймаут() этого модуля, а результаты нескольких операций сводит в один функцией ОжидатьВсе(). Аналог Java SDK: CompletableResultCode.ofSuccess, ofFailure, ofAll.
Результат СброситьБуфер процессоров провайдер сводит по правилам ОтелРезультатыЗакрытия: Таймаут() даёт таймаут, Ошибка() — ошибку, Неопределено считается успехом. Так же пакетный процессор читает результат СброситьБуфер экспортера.
Остальные экспортные функции модуля служебные (см. «Внутренние функции»).
Функции
Успех
Создаёт успешный результат: статус 0, Успешно() = Истина.
Возвращает: ОтелРезультатЭкспорта — успех
Ошибка
Создаёт результат с ошибкой: статус 1, Успешно() = Ложь, ИстекТаймаут() = Ложь. Описания ошибки у ОтелРезультатЭкспорта нет, в отличие от ОтелРезультатыЗакрытия.Ошибка(Описание).
Возвращает: ОтелРезультатЭкспорта — ошибка
Таймаут
Создаёт результат истечения таймаута: статус 2, Успешно() = Ложь, ИстекТаймаут() = Истина.
Возвращает: ОтелРезультатЭкспорта — таймаут
ОжидатьВсе
Ожидает завершения каждого результата (ОтелРезультатЭкспорта.Ожидать) и сводит результаты в один. Результаты проверяются по порядку, итог определяет первый неуспешный: таймаут, если у него истёк таймаут, иначе ошибка. Если все результаты успешны или массив пуст — успех. Элементы другого типа (например, Неопределено) пропускаются с предупреждением в логе. Так ОтелSdk.СброситьБуфер() сводит результаты провайдеров.
| Параметр | Тип | По умолчанию | Описание |
|---|---|---|---|
МассивРезультатов | Массив из ОтелРезультатЭкспорта | — | Результаты для сведения |
ТаймаутМс | Число | 0 | Время ожидания каждого результата в миллисекундах (0 — без ограничения); ждать нужно только результату с обещанием, результаты Успех(), Ошибка() и Таймаут() готовы сразу |
Возвращает: ОтелРезультатЭкспорта — успех, ошибка или таймаут
Внутренние функции
Экспортированы для модулей SDK (в OneScript нет внутренней видимости), приложению вызывать их не нужно:
РезультатСбора— результат сбора метрик по списку сбоев: ошибка, таймаут (если все сбои — таймауты) или успех;ИзРезультатаЗакрытия— переводитОтелРезультатЗакрытия(сведённый результат ForceFlush) вОтелРезультатЭкспорта;СброситьБуферПослеЭкспорта— ForceFlush экспортера простого процессора: дожидается экспорта, начатого в другом потоке, и сбрасывает буфер экспортера;СОбещанием— результат «в процессе» (статус-1) с обещанием библиотеки async; модули SDK её сейчас не вызывают. Статус такого результата не меняется и после выполнения обещания, поэтому SDK считает его неуспешным.
Пример
// Фрагмент своего процессора спанов, который отдаёт спаны нескольким экспортерам
// (Экспортеры - массив экспортеров, переменная объекта)
Функция СброситьБуфер(ТаймаутМс = 0) Экспорт
НачалоМс = ТекущаяУниверсальнаяДатаВМиллисекундах();
Результаты = Новый Массив;
Для Каждого Экспортер Из Экспортеры Цикл
ПрошлоМс = ТекущаяУниверсальнаяДатаВМиллисекундах() - НачалоМс;
Если ТаймаутМс > 0 И ПрошлоМс >= ТаймаутМс Тогда
Результаты.Добавить(ОтелРезультатыЭкспорта.Таймаут());
Прервать;
КонецЕсли;
ОстатокМс = ?(ТаймаутМс > 0, ТаймаутМс - ПрошлоМс, 0);
Попытка
Результаты.Добавить(Экспортер.СброситьБуфер(ОстатокМс));
Исключение
Результаты.Добавить(ОтелРезультатыЭкспорта.Ошибка());
КонецПопытки;
КонецЦикла;
// Успех, если все экспортеры сбросили буфер; иначе ошибка или таймаут
Возврат ОтелРезультатыЭкспорта.ОжидатьВсе(Результаты);
КонецФункции