Skip to content

Наблюдатели сущностей: SPI для трассировки и метрик - #143

Open
nixel2007 wants to merge 14 commits into
masterfrom
claude/entity-opentelemetry-integration-uhz1qn
Open

Наблюдатели сущностей: SPI для трассировки и метрик#143
nixel2007 wants to merge 14 commits into
masterfrom
claude/entity-opentelemetry-integration-uhz1qn

Conversation

@nixel2007

@nixel2007 nixel2007 commented Sep 3, 2026

Copy link
Copy Markdown
Owner

Поверх master с влитым #144 (ИсточникДанных.РазмерПула, 4.4.0.1). Здесь только наблюдатели.

Зачем

Инструментирование в духе Spring Data JPA и Micrometer: приложение должно видеть, что делает ORM, не меняя ни entity, ни коннекторы. Сама entity об OpenTelemetry не знает: она публикует события, а реализацию наблюдателя даёт отдельная библиотека opentelemetry-instrumentation-entity, как io.opentelemetry.contrib.* в Java.

Что добавлено

  • Интерфейс НаблюдательСущностей (ПередСобытием/ПослеСобытия) и класс СобытиеСущностей: один объект на обе фазы, поля читаются функциями, для данных наблюдателя между фазами есть Состояние — у каждого наблюдателя своё, чужого он не видит.
  • Виды событий — модуль-перечисление ВидыСобытийСущностей: Операция (Сохранить, Получить, ПолучитьОдно, Удалить, Инициализировать, ВыполнитьСКоннектором, ВычислитьСКоннектором) с типом сущности, таблицей, вложенностью и числом строк; Запрос к СУБД с операцией, таблицей, текстом с плейсхолдерами и числом строк; Соединение пула (Занять/Освободить) с ожиданием, признаком открытия и снимком пула; Транзакция с исходом commit/rollback/failed/abandoned.
  • Интерфейс НаблюдаемыйКоннектор (УстановитьНаблюдателей, ОписаниеСоединения) — отдельно от АбстрактныйКоннектор, который не меняется. Сторонний коннектор без него работает как раньше, просто не даёт событий уровня запроса. Встроенные коннекторы объявляют оба интерфейса через extends. Описание соединения никогда не содержит пароля.
  • Реестр наблюдателей на пул менеджера: события доходят из хранилищ и Active Record; МенеджерСущностей.ДобавитьНаблюдателя/УдалитьНаблюдателя проверяют реализацию валидатором extends и называют недостающие методы.
  • Без наблюдателей события не создаются. Ошибка наблюдателя пишется предупреждением в лог oscript.lib.entity.observers и операцию не прерывает. Наблюдатели вызываются из разных потоков одновременно, реестр копируется при записи.
  • События, начатые до открытия первого соединения (инициализация и её захват), получают описание соединения к фазе ПослеСобытия.
  • Документация: docs/Наблюдатели.md, страницы классов и перечисления, раздел README, версионирование.

Версия

4.4.1.0: API коннекторов не ломается, новые возможности описаны отдельным интерфейсом. Зависимость extends 0.2.0.

Тесты

Новые наборы НаблюдателиСущностей (в том числе состояние у нескольких наблюдателей), НаблюдателиЗапросов (SQLite и PostgreSQL, описание соединения без пароля, разбор порта), НаблюдателиСоединений (захват, ожидание при пуле размера 1, четыре исхода транзакции), ВидыСобытийСущностей. Всего 193, CI зелёный на 2.2.0 и stable, Quality Gate Sonar пройден.

🤖 Generated with Claude Code

https://claude.ai/code/session_017UYvrFghKi7WmhoF3vvpyp


Generated by Claude Code

Менеджер сущностей получил реестр наблюдателей: ДобавитьНаблюдателя и
УдалитьНаблюдателя. Наблюдатель объявляет интерфейс НаблюдательСущностей
аннотацией &Реализует и реализует ПередСобытием и ПослеСобытия; регистрация
проверяет реализацию и называет недостающие методы.

Событие - класс СобытиеСущностей: один объект в обеих фазах, поля читаются
функциями, для данных наблюдателя между фазами есть Состояние. Реестр живет
в пуле соединений, поэтому события хранилищ и Active Record приходят
наблюдателям менеджера. Вложенность операций считается через данные
потока исполнения: разыменование ссылки дает событие с глубиной 1.

События уровня операции: Сохранить, Получить, ПолучитьОдно, Удалить,
Инициализировать, ВыполнитьСКоннектором, ВычислитьСКоннектором. Чтение
сообщает число строк, ошибка операции попадает в событие и доходит до
вызывающего. Исключение наблюдателя пишется в лог и операцию не ломает.
При пустом реестре событие не создается.

Версия 4.4.1.0, зависимость extends 0.2.0.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017UYvrFghKi7WmhoF3vvpyp
Коннектор, объявивший интерфейс НаблюдаемыйКоннектор, получает от пула
реестр наблюдателей и сообщает о каждом запросе к СУБД: SELECT, INSERT,
DELETE, CREATE TABLE, BEGIN, COMMIT, ROLLBACK. У SQL-коннекторов событие
несет текст запроса с плейсхолдерами параметров и число строк выборки,
у InMemory и JSON - только операцию и таблицу. Ошибка запроса попадает в
событие и поднимается дальше.

Тот же интерфейс дает описание соединения без секретов: система, адрес,
порт, база. Им помечаются все события, включая события операций. Коннектор
без интерфейса работает как раньше: наблюдатели получают только события
операций, а система выводится из имени типа.

АбстрактныйКоннектор помечен как &Интерфейс; встроенные коннекторы
объявляют оба интерфейса аннотацией &Реализует. Проверка объявления
делается один раз на тип коннектора пула, реализация - валидатором extends.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017UYvrFghKi7WmhoF3vvpyp
Пул отдает наблюдателям события вида "Соединение" с операциями "Занять" и
"Освободить": захват сообщает, открыто ли новое соединение, сколько заняло
открытие и ожидание свободного, а оба события несут снимок пула (занято,
свободно, ожидает, предел). Повторный захват тем же потоком событий не
порождает.

Обертка соединения ведет событие "Транзакция" от НачатьТранзакцию до исхода:
commit, rollback, failed (ошибка завершения) или abandoned (транзакция брошена
потоком и откачена при возврате в пул).

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017UYvrFghKi7WmhoF3vvpyp
Руководство docs/Наблюдатели.md: регистрация, виды событий и их поля по фазам,
поведение при ошибках и в нескольких потоках, поддержка наблюдателей в своем
коннекторе, накладные расходы. Справочники интерфейсов НаблюдательСущностей,
НаблюдаемыйКоннектор и класса СобытиеСущностей; методы ДобавитьНаблюдателя и
УдалитьНаблюдателя в справочнике менеджера. Раздел в README и перечень
обязательств совместимости дополнены новыми интерфейсами.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017UYvrFghKi7WmhoF3vvpyp
События, начатые до открытия первого соединения, - инициализация и ее захват
соединения - создавались без описания от коннектора: пустые адрес, порт и база
данных. Теперь реестр повторно проставляет описание при завершении события,
когда оно уже известно, и наблюдатели видят один источник данных во всех
событиях пула.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017UYvrFghKi7WmhoF3vvpyp
ИсточникДанных описывает все параметры конструктора менеджера одним объектом,
но размера пула в нем не было. Пятый параметр конструктора и функция РазмерПула
с тем же значением по умолчанию, что у МенеджерСущностей; класс получил
описание, справочник и запись в перечне документации.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017UYvrFghKi7WmhoF3vvpyp
@coderabbitai

coderabbitai Bot commented Sep 3, 2026

Copy link
Copy Markdown
Contributor

Warning

Review limit reached

Next included review available in 25 minutes.

Check out review usage here.

View limit details

Limit details: You’ve used the included review currently available.

You've used all free OSS reviews for now. Wait for the free limit to reset to keep reviewing this public repository.

Learn how review limits work.

Review configuration:

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Team

Run ID: 3029f2e4-fb7c-4e31-9fc2-4dd0202afea9

📥 Commits

Reviewing files that changed from the base of the PR and between 00af241 and 8b15350.

📒 Files selected for processing (37)
  • .bsl-language-server.json
  • README.md
  • docs/README.md
  • docs/ВидыСобытийСущностей.md
  • docs/ИсточникДанных.md
  • docs/МенеджерСущностей.md
  • docs/НаблюдаемыйКоннектор.md
  • docs/Наблюдатели.md
  • docs/НаблюдательСущностей.md
  • docs/СобытиеСущностей.md
  • lib.config
  • packagedef
  • src/internal/Классы/НаблюдателиСущностей.os
  • src/internal/Классы/ПулСоединенийСБД.os
  • src/internal/Классы/СоединениеСБД.os
  • src/internal/Модули/РаботаСКоннекторами.os
  • src/internal/Модули/СтрокиСоединения.os
  • src/Классы/АбстрактныйКоннектор.os
  • src/Классы/АбстрактныйКоннекторSQL.os
  • src/Классы/КоннекторInMemory.os
  • src/Классы/КоннекторJSON.os
  • src/Классы/КоннекторPostgreSQL.os
  • src/Классы/КоннекторSQLite.os
  • src/Классы/МенеджерСущностей.os
  • src/Классы/НаблюдаемыйКоннектор.os
  • src/Классы/НаблюдательСущностей.os
  • src/Классы/СобытиеСущностей.os
  • src/Модули/ВидыСобытийСущностей.os
  • tests/fixtures/КоннекторБезНаблюдения.os
  • tests/fixtures/КоннекторТранзакцийДляТестов.os
  • tests/fixtures/НаблюдательЗаписывающий.os
  • tests/fixtures/НаблюдательНеполный.os
  • tests/fixtures/НаблюдательСМеткой.os
  • tests/ВидыСобытийСущностей.os
  • tests/НаблюдателиЗапросов.os
  • tests/НаблюдателиСоединений.os
  • tests/НаблюдателиСущностей.os

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

Copy link
Copy Markdown
Owner Author

Статус CI на e38d230. Падают все джобы build (ubuntu/windows × stable/2.0.0) и build (postgres) с одной ошибкой:

{Модуль src/internal/concurrent/Классы/СостояниеБлокировкиЧтенияЗаписи.os / Error in line 64,37 / Symbol not found ТекущийПоток}

Это не код этого PR: файл приходит из базовой ветки claude/issue-107-pul-soedineniy (#141), и там те же джобы красные с той же ошибкой (run 32840893804). Причина: матрица CI гоняет движки stable и 2.0.0, а ТекущийПоток() есть пока только в dev-сборке OneScript.

Готового фикса, который можно перенести сюда, нет: либо матрица в #141 переводится на dev, либо ждём релиза движка с ТекущийПоток(). Перезапуск джобов не делаю: это ошибка компиляции, воспроизводится детерминированно.

Локально на dev night-build все 189 тестов зелёные (SQLite и PostgreSQL).


Generated by Claude Code

Comment thread docs/Наблюдатели.md Outdated
Вид события больше не строковый литерал, разбросанный по библиотеке и
наблюдателям: значения Операция, Запрос, Соединение, Транзакция и список
Виды() живут в модуле ВидыСобытийСущностей, реестр наблюдателей, пул и
соединение создают события через него. Документация и примеры наблюдателя
сравнивают Вид() с перечислением.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017UYvrFghKi7WmhoF3vvpyp
Comment thread docs/Наблюдатели.md
Один слот Состояние на событие затирался при двух наблюдателях: второй
перезаписывал спан первого, и первый в ПослеСобытия получал чужое.
Событие хранит состояния по наблюдателям, реестр перед каждым вызовом
отмечает, кому событие рассылается, и Состояние()/УстановитьСостояние
работают с данными именно этого наблюдателя.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017UYvrFghKi7WmhoF3vvpyp
Comment thread docs/ВидыСобытийСущностей.md Outdated
Экспортные переменные модуля можно переприсвоить снаружи, и перечисление
перестало бы совпадать с тем, что создает библиотека. Значения отдаются
функциями Операция(), Запрос(), Соединение(), Транзакция().

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017UYvrFghKi7WmhoF3vvpyp
Base automatically changed from claude/issue-107-pul-soedineniy to master September 5, 2026 19:08
@nixel2007
nixel2007 changed the base branch from master to claude/entity-4.4.0.1-razmer-pula September 5, 2026 19:21
nixel2007 and others added 3 commits September 5, 2026 19:21
…pentelemetry-integration-uhz1qn

# Conflicts:
#	packagedef
… базы

В CI пароль, пользователь и база PostgreSQL называются одинаково, и проверка
"описание не содержит пароль" падала на имени базы. Теперь описание строится
из строки соединения с заведомо уникальным паролем и проверяется по всем полям.

Формулировка в docs/ИсточникДанных.md по замечанию ревью.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017UYvrFghKi7WmhoF3vvpyp
@nixel2007
nixel2007 changed the base branch from claude/entity-4.4.0.1-razmer-pula to master September 5, 2026 19:40
Quality Gate PR не пропускал 43 замечания bsl-language-server в новом коде:
описания параметров и возвращаемых значений, строки длиннее 120 символов,
приведение порта через исключение, конструктор структуры с четырьмя
значениями, условие без ветви Иначе, магическое число порта, заглушка
интерфейса без Возврат, латиница в именах тестов и экспортные переменные
фикстур. Слова "Фикстуры" и "Валидатор" добавлены в исключения проверки
опечаток.

Описание соединения собирается одним помощником в СтрокиСоединения; порт
проверяется на цифры, а не ловится исключением, с тестом на оба исхода.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017UYvrFghKi7WmhoF3vvpyp
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants