Что такое :observer и зачем он нужен?

:observer — это встроенный графический инструмент в экосистеме Erlang/Elixir, предназначенный для мониторинга, анализа и отладки состояния виртуальной машины BEAM (на которой работают приложения Elixir и Erlang). Он предоставляет визуальный интерфейс ко внутренним процессам, памяти, нагрузке, дереву супервизоров, распределённой системе и другим метрикам, которые сложно отследить только логами.

Как запустить :observer в Elixir

Чтобы использовать :observer, необходимо убедиться, что установлен пакет :wx (графическая библиотека wxWidgets, через которую работает :observer):

:observer.start()

Эта команда откроет отдельное графическое окно, отображающее текущую информацию о системе.

Важно: :observer работает только в GUI-среде, его невозможно запустить в headless-сервере без X11.

Основные вкладки и функции :observer

1. System Overview

Показывает общее состояние виртуальной машины BEAM:

  • Использование памяти (Heap, Code, ETS, Atom и др.).

  • Количество активных процессов.

  • Загрузка CPU.

  • Информация о версии Erlang/OTP и архитектуре.

Это первая вкладка, с которой обычно начинают диагностику.

2. Processes

Позволяет наблюдать список всех процессов в системе:

  • PID процесса.

  • Имя (если зарегистрировано).

  • Состояние (running, waiting, garbage_collecting и т.д.).

  • Используемая память.

  • Количество reductions (счётчик "работы", выполненной процессом).

  • Ссылки и мониторы.

Можно выбрать конкретный процесс и получить:

  • стек вызовов (Stack Trace),

  • список сообщений в почтовом ящике (Mailbox),

  • текущую функцию,

  • ссылки на другие процессы.

3. Applications

Показывает список запущенных OTP-приложений:

  • Название приложения.

  • Версия.

  • Состояние (started, loaded, undefined).

  • Callback-модуль.

Полезно для понимания, какие приложения активны, особенно в сложной системе с зависимостями.

4. Supervision Trees

Отображает дерево супервизоров в виде схемы:

  • Корневой супервизор,

  • его дочерние процессы (GenServer, Agent, Task),

  • вложенные супервизоры.

Можно видеть, какие процессы входят в состав приложения, кто кого перезапускает, и визуально оценить структуру.

5. Tables (ETS)

Позволяет наблюдать за ETS-таблицами (Erlang Term Storage):

  • Название таблицы.

  • Тип (set, bag, ordered_set).

  • Владелец (PID).

  • Размер и память.

  • Данные внутри таблицы.

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

6. Memory Allocators

Отображает информацию об аллокаторах памяти:

  • Пулы памяти,

  • аллокаторы (например, temp_alloc, sl_alloc),

  • распределение по процессам,

  • используемый heap.

Эта вкладка используется при сложной оптимизации производительности и выявлении утечек памяти.

7. Load Charts

Позволяет наблюдать загрузку системы в реальном времени:

  • Количество процессов.

  • Потребление памяти.

  • Активность по редукциям.

  • Время отклика.

Можно выбрать интервал времени и масштаб.

8. Tracing

Инструменты трассировки:

  • Трассировка сообщений между процессами.

  • Трассировка вызовов функций (через dbg, trace/3 и пр.).

  • Ловушка на определённые модули или процессы.

Нужен для анализа поведения во время выполнения, особенно в системах с асинхронным взаимодействием.

Примеры использования

  • Поиск процессов с переполненным mailbox — по количеству сообщений или памяти.

  • Поиск утечек памяти — аномально большие heap или ETS-таблицы.

  • Диагностика медленной работы — процессы с высоким количеством reductions.

  • Отладка супервизора — кто кого перезапускает и как часто.

  • Работа с распределённой системой — :observer можно подключать к удалённому ноду.

Работа с удалёнными нодами

Если запущено распределённое приложение, можно подключить :observer к удалённой ноде:

Node.connect(:"remote@host")
:observer.start()

И в интерфейсе выбрать нужную ноду. Это позволяет удалённо следить за продакшн-системой (если разрешено и безопасно).

Зависимости и требования

Для запуска:

  • Установлен Erlang с модулем :wx (обычно входит в дистрибутив, но иногда его нужно явно включить при сборке),

  • рабочая X-среда (для запуска GUI),

  • права на запуск :observer (например, если сессия запущена в iex --remsh, нужно разрешить доступ).

Если :observer.start() не работает — стоит проверить, установлен ли wxWidgets и доступен ли дисплей (DISPLAY на Linux).

:observer — один из самых мощных инструментов наблюдения за Elixir-приложениями в реальном времени. Он обеспечивает визуальный доступ к состоянию всей системы, процессам, памяти, дереву супервизоров и позволяет отслеживать ошибки, узкие места и взаимосвязи между компонентами.