Skip to content

ОтелИнструментированиеХранилищаСущностей

Инструментирование слоя хранилищ сущностей: оборачивает хранилище сущностей в декоратор, который пишет длительность каждого вызова метода в гистограмму. Аналог spring.data.repository.invocations в Spring Data.

Спанов обертка не создает. Операции менеджера и запросы к СУБД, которые выполняет метод хранилища сущностей, становятся спанами сами — при условии, что на источнике данных зарегистрирован ОтелНаблюдательИсточникаДанных.

Создание

bsl
Инструментирование = Новый ОтелИнструментированиеХранилищаСущностей(Метр);
ПараметрТипНазначение
ОтелМетрОтелМетрМетр для гистограммы вызовов. Неопределено выключает инструментирование: Обернуть возвращает исходный объект

Обернуть

bsl
ХранилищеСущностей = Инструментирование.Обернуть(ХранилищеСущностей, "ХранилищеФизическиеЛица");
ПараметрТипНазначение
ХранилищеСущностейПроизвольныйТипизированное хранилище сущностей entity либо собственное
ИмяХранилищаСущностейСтрокаИмя в атрибуте entity.repository

Возвращает обертку с перехватчиками. Если оборачивать нечего, возвращается исходный объект — подменять его пустой оберткой незачем.

Оборачиваются экспортные методы фактического объекта, кроме тех, что не ходят в базу данных: ПолучитьОбъектМодели, ПолучитьПулСущностей, СоздатьЭлемент, Закрыть. Методы берутся с самого объекта, а не из его типа: у собственного хранилища сущностей не видно методов, унаследованных от ХранилищеСущностей, а у типизированного хранилища entity в типе нет ни одного.

Если собственное хранилище сущностей делегирует вызов родителю и родитель обернут тоже, у делегированного вызова получаются две точки гистограммы — своя и родительская.

Сигналы

СигналИмяАтрибуты
Гистограмма, сentity.repository.invocation.durationentity.repository, code.function.name, entity.repository.state (success или error), error.type

Исключение метода доходит до вызывающего кода как обычно, а точка гистограммы получает entity.repository.state со значением error и error.type — имя модуля, в котором исключение возникло, либо RuntimeError, если модуль неизвестен.

Границы бакетов гистограммы берутся из семантических соглашений для клиентов баз данных, длительность — в секундах.

Пример

bsl
#Использовать entity
#Использовать opentelemetry
#Использовать opentelemetry-instrumentation-entity

Сдк = ОтелАвтоконфигурация.Инициализировать();

Источник = Новый ИсточникДанных("Основной", Тип("КоннекторPostgreSQL"), СтрокаСоединения);
Источник.ДобавитьНаблюдателя(Новый ОтелНаблюдательИсточникаДанных(
    Сдк.ПолучитьТрассировщик("entity"),
    Сдк.ПолучитьМетр("entity")
));

МенеджерСущностей = Новый МенеджерСущностей(Источник);
МенеджерСущностей.ДобавитьКлассВМодель(Тип("ФизическоеЛицо"));
МенеджерСущностей.Инициализировать();

Инструментирование = Новый ОтелИнструментированиеХранилищаСущностей(Сдк.ПолучитьМетр("entity"));

ХранилищеСущностей = Инструментирование.Обернуть(
    МенеджерСущностей.ПолучитьХранилищеСущностей(Тип("ФизическоеЛицо")),
    "ХранилищеФизическиеЛица"
);

// Точка гистограммы с entity.repository = ХранилищеФизическиеЛица и code.function.name = Получить,
// в трейсе - спаны операции и запроса от наблюдателя источника данных
Лица = ХранилищеСущностей.Получить();

См. также