Common.Observability.* — Инструменты наблюдаемости

Observability — пакет системных инструментов для наблюдаемости, диагностики и эскалации событий в Metabot. Предназначен для фиксации, анализа и понимания поведения системы без влияния на бизнес-логику.

Common.Observability.Tracer — Универсальный трассировщик событий

Автор: Art Yg

Tracer предназначен для записи любых диагностических событий в таблицы базы данных:

Tracer не знает:

Он записывает ровно те данные, которые ему передали.


Основные принципы

Tracer можно удалить из проекта — бизнес-логика продолжит работать.


Минимальные требования

Для начала работы достаточно:

  1. Создать любую таблицу в БД (даже без полей, кроме id)
  2. Добавить атрибут бота TRACER_CONFIG
  3. Вызвать trace()

Рекомендуемое, но не обязательное поле таблицы:

Tracer не управляет временем. Если поле есть — БД заполнит его автоматически. Если нет — запись всё равно создаётся.


Конфигурация

Tracer настраивается через один JSON в атрибутах бота: TRACER_CONFIG.

{
  "navigation": {
    "enabled": true,
    "table": "nav_trace"
  },
  "ai": {
    "enabled": false,
    "table": "ai_trace"
  }
}

Использование

const Tracer = require("Common.Observability.Tracer");

Tracer.trace("navigation", {
  category: "NAVIGATION",
  component: "Actor",
  action: "hasAchievement",
  level: "OK",
  payload: {
    actor_id: 42,
    achievement: "first_step",
    result: true
  }
});

Если tracer выключен — метод молча завершится.


Методы Tracer

Tracer предоставляет несколько эквивалентных методов:

Все методы:


Данные события

Tracer принимает любой объект.

Все поля:

Рекомендуемые (но не обязательные):

Если таблица не содержит поле — БД вернёт ошибку. В таком случае используйте payload.


Работа со временем

Tracer:

{
  event_time: "2026-01-16T12:00:00Z"
}

или

{
  created_at: "2026-01-16T12:00:00Z"
}

Когда использовать


Когда не использовать


Итог

Common.Observability.Tracer — простой и ненавязчивый способ видеть, что происходит внутри системы.

Никакой магии. Никаких обязательств. Никакой боли.


Версия 1.1 — Интеграция с Incident

В версии 1.1 Tracer получил опциональную интеграцию с системой инцидентов.

Tracer по-прежнему:

Интеграция включается исключительно через конфигурацию.


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

Tracer теперь может:

Если интеграция не настроена — Tracer ведёт себя точно так же, как в версии 1.0.


Расширенная конфигурация

В TRACER_CONFIG можно указать блок incident для любого tracera:

{
  "navigation": {
    "enabled": true,
    "table": "nav_trace",
    "incident": {
      "enabled": true,
      "type": "navigation_failed",
      "severity": "error"
    }
  }
}

Поведение:

Инцидент инициируется только если:


Архитектурные гарантии

Интеграция с Incident:

Tracer остаётся:


Использование (без изменений)

Tracer.error("navigation", {
  component: "Reflection",
  action: "build",
  payload: {
    reason: "profile_missing"
  }
});

Если Incident включён — будет создан инцидент. Если нет — только запись в таблицу.


Итог версии 1.1

Версия 1.1 добавляет Tracer’у способность сигналить о сбоях, не превращая его в логгер, нотификатор или бизнес-модуль.

Tracer по-прежнему ничего не «решает». Он просто сообщает — системе, а не человеку.


Common.Observability.Incident — Централизованный обработчик инцидентов

Common.Observability.Incident

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

Класс не содержит бизнес-логики и не влияет на выполнение сценариев. Он используется как реакция на события (например, из Tracer) или вызывается напрямую из сценариев.


Назначение

Incident решает одну задачу: превратить техническое событие в уведомление для команды.

Типичные случаи:


Уведомления

В текущей реализации Incident использует Telegram через плагин:

Common.Notifications.Telegram

Для работы требуются два атрибута бота:

Incident сам не хранит токены и не управляет доступами.


Шаблоны сообщений

Тексты уведомлений настраиваются через атрибут бота INCIDENT_TEMPLATES (JSON).

Пример:

{
  "profiling_failed": {
    "ru": {
      "title": "🧭 ORION · Сбой профилирования",
      "body": [
        "Профиль не был корректно сформирован.",
        "",
        "Lead ID: {{lead_id}}",
        "{{error}}"
      ]
    }
  }
}

Поддерживаются:


Использование

Incident может вызываться:

Это позволяет централизовать обработку ошибок без дублирования кода уведомлений.


Incident — это точка ответственности за инциденты, а не ещё один логгер или бизнес-модуль.