ОтелИнструментированиеХранилищаСущностей
Инструментирование слоя хранилищ сущностей: оборачивает хранилище сущностей в декоратор, который пишет длительность каждого вызова метода в гистограмму. Аналог spring.data.repository.invocations в Spring Data.
Спанов обертка не создает. Операции менеджера и запросы к СУБД, которые выполняет метод хранилища сущностей, становятся спанами сами — при условии, что на источнике данных зарегистрирован ОтелНаблюдательИсточникаДанных.
Создание
Инструментирование = Новый ОтелИнструментированиеХранилищаСущностей(Метр);| Параметр | Тип | Назначение |
|---|---|---|
ОтелМетр | ОтелМетр | Метр для гистограммы вызовов. Неопределено выключает инструментирование: Обернуть возвращает исходный объект |
Обернуть
ХранилищеСущностей = Инструментирование.Обернуть(ХранилищеСущностей, "ХранилищеФизическиеЛица");| Параметр | Тип | Назначение |
|---|---|---|
ХранилищеСущностей | Произвольный | Типизированное хранилище сущностей entity либо собственное |
ИмяХранилищаСущностей | Строка | Имя в атрибуте entity.repository |
Возвращает обертку с перехватчиками. Если оборачивать нечего, возвращается исходный объект — подменять его пустой оберткой незачем.
Оборачиваются экспортные методы фактического объекта, кроме тех, что не ходят в базу данных: ПолучитьОбъектМодели, ПолучитьПулСущностей, СоздатьЭлемент, Закрыть. Методы берутся с самого объекта, а не из его типа: у собственного хранилища сущностей не видно методов, унаследованных от ХранилищеСущностей, а у типизированного хранилища entity в типе нет ни одного.
Если собственное хранилище сущностей делегирует вызов родителю и родитель обернут тоже, у делегированного вызова получаются две точки гистограммы — своя и родительская.
Сигналы
| Сигнал | Имя | Атрибуты |
|---|---|---|
| Гистограмма, с | entity.repository.invocation.duration | entity.repository, code.function.name, entity.repository.state (success или error), error.type |
Исключение метода доходит до вызывающего кода как обычно, а точка гистограммы получает entity.repository.state со значением error и error.type — имя модуля, в котором исключение возникло, либо RuntimeError, если модуль неизвестен.
Границы бакетов гистограммы берутся из семантических соглашений для клиентов баз данных, длительность — в секундах.
Пример
#Использовать entity
#Использовать opentelemetry
#Использовать opentelemetry-instrumentation-entity
Сдк = ОтелАвтоконфигурация.Инициализировать();
Источник = Новый ИсточникДанных("Основной", Тип("КоннекторPostgreSQL"), СтрокаСоединения);
Источник.ДобавитьНаблюдателя(Новый ОтелНаблюдательИсточникаДанных(
Сдк.ПолучитьТрассировщик("entity"),
Сдк.ПолучитьМетр("entity")
));
МенеджерСущностей = Новый МенеджерСущностей(Источник);
МенеджерСущностей.ДобавитьКлассВМодель(Тип("ФизическоеЛицо"));
МенеджерСущностей.Инициализировать();
Инструментирование = Новый ОтелИнструментированиеХранилищаСущностей(Сдк.ПолучитьМетр("entity"));
ХранилищеСущностей = Инструментирование.Обернуть(
МенеджерСущностей.ПолучитьХранилищеСущностей(Тип("ФизическоеЛицо")),
"ХранилищеФизическиеЛица"
);
// Точка гистограммы с entity.repository = ХранилищеФизическиеЛица и code.function.name = Получить,
// в трейсе - спаны операции и запроса от наблюдателя источника данных
Лица = ХранилищеСущностей.Получить();