Что такое :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-приложениями в реальном времени. Он обеспечивает визуальный доступ к состоянию всей системы, процессам, памяти, дереву супервизоров и позволяет отслеживать ошибки, узкие места и взаимосвязи между компонентами.