·14 мин·2 просмотров

Мониторинг колл-центра на Asterisk: полное руководство 2026

Большинство колл-центров на Asterisk берутся за мониторинг слишком поздно. В руководстве: 7 действительно важных метрик, SQL-запросы для их расчёта, конфиги Asterisk для полного логирования и честное сравнение трёх подходов к мониторингу.

A
Astervis
Команда инженеров и продактов

Большинство колл-центров на Asterisk берутся за мониторинг слишком поздно. Ставят Asterisk, настраивают очереди, нанимают операторов, а через полгода кто-нибудь спрашивает: «Почему 15% звонящих бросают трубку?»

К этому моменту проблема уже несколько месяцев съедает деньги.

Я работал с инсталляциями Asterisk от 5 операторов до 200+. Картина везде одна: команды, которые настроили мониторинг с первого дня, точнее планируют смены, ловят проблемы до того, как о них расскажет клиент, и платят меньше за каждый решённый звонок.

В этом руководстве — что мониторить, как это включить на стороне Asterisk и какие инструменты реально живут в продакшене. Без теории: конкретные конфиги, SQL-запросы и живые цифры.


Что Asterisk отдаёт наружу (а что прячет)

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

Три источника данных, без которых не обойтись

1. AMI (Asterisk Manager Interface) — события в реальном времени

AMI отдаёт события по мере их возникновения: звонок попал в очередь, оператор ответил, абонент бросил трубку, оператор ушёл на паузу. Это несущая конструкция мониторинга в реальном времени.

; /etc/asterisk/manager.conf [monitoring] secret = generate_a_strong_password_here deny = 0.0.0.0/0.0.0.0 permit = 10.0.0.0/255.255.255.0 read = system,call,log,agent,reporting write = system,call,agent,reporting writetimeout = 5000

AMI даёт видимость состояния очередей с задержкой меньше секунды. Любой внешний инструмент мониторинга подключается через AMI за данными реального времени.

2. queue_log — история событий очереди

Этот файл фиксирует каждое взаимодействие с очередью: кто позвонил, какой оператор ответил, сколько человек ждал, почему разговор завершился.

# Проверяем, что queue_log действительно пишется tail -5 /var/log/asterisk/queue_log # Ожидаемый формат: # 1774000000|1774000001|sales|ENTERQUEUE||2125551234|1 # 1774000005|1774000001|sales|CONNECT|5|SIP/200|1774000005.42 # 1774000120|1774000001|sales|COMPLETECALLER|5|115||1

Поля: метка времени, уникальный ID, имя очереди, событие и данные, специфичные для события. Смысл полей data1/data2/data3 меняется в зависимости от типа события — именно на этом спотыкается большинство самописных систем отчётности.

Важно: включите полное логирование в каждой очереди:

; /etc/asterisk/queues.conf (для каждой очереди) [sales] eventwhencalled = yes eventmemberstatus = yes queue-callswaiting = yes

Без eventwhencalled = yes вы теряете детализацию по операторам. Без eventmemberstatus не сможете отслеживать смену состояний оператора.

3. CDR (Call Detail Records) — данные на уровне звонка

CDR фиксирует время начала, время ответа, время завершения, длительность и disposition. Это уровень звонка, а не уровень очереди.

Типичная ошибка: duration в CDR включает время дозвона. billsec ближе к времени разговора, но включает навигацию по IVR. Ни то, ни другое не отражает реальное время разговора оператора с клиентом. Для точного времени разговора берите события CONNECT/COMPLETE из queue_log.


Метрики, которые действительно важны

Я видел дашборды с 40 метриками, из которых никто не смотрит на 35. Начните с этих семи. Добавляйте новые только тогда, когда у вас появится конкретный вопрос, на который они отвечают.

Уровень 1: смотреть каждый час

1. Звонки в ожидании (реальное время)

Сколько абонентов сейчас в очереди. Если это число превышает количество свободных операторов втрое, у вас проблема с укомплектованностью смены — не завтра, а прямо сейчас.

# Быстрая проверка из CLI asterisk -rx "queue show sales" | grep -E "^ [0-9]+ has"

2. Уровень сервиса (SLA)

Доля звонков, отвеченных в пределах вашего целевого времени. Отраслевой дефолт — «80/20» (80% ответов за 20 секунд), но цель должна соответствовать типу очереди:

Тип очередиЦель по SLAПочему
Продажи / входящие80% за 15 сЗвонящий с намерением купить уходит быстро
Техподдержка80% за 30 сУ человека проблема — он готов ждать дольше
VIP / корпоративные клиенты90% за 10 сПремиальные клиенты, премиальный SLA
Общие вопросы70% за 45 сНиже срочность, выше терпение
-- Скользящий SLA по очередям (за последние 24 часа) SELECT queuename, COUNT(CASE WHEN event = 'CONNECT' AND CAST(data1 AS UNSIGNED) <= 20 THEN 1 END) AS within_sla, COUNT(CASE WHEN event = 'CONNECT' THEN 1 END) AS total_answered, ROUND(100.0 * COUNT(CASE WHEN event = 'CONNECT' AND CAST(data1 AS UNSIGNED) <= 20 THEN 1 END) / NULLIF(COUNT(CASE WHEN event = 'CONNECT' THEN 1 END), 0), 1) AS sla_pct FROM queue_log WHERE time > UNIX_TIMESTAMP(NOW() - INTERVAL 24 HOUR) GROUP BY queuename ORDER BY sla_pct ASC;

3. Процент потерянных звонков (abandon rate)

Доля абонентов, которые бросили трубку, не дождавшись оператора. Ниже 5% — норма. Выше 10% — это уже потеря выручки.

-- Процент потерянных звонков по часам (ищем проблемные часы) SELECT HOUR(FROM_UNIXTIME(time)) AS hour_of_day, COUNT(CASE WHEN event = 'ABANDON' THEN 1 END) AS abandoned, COUNT(CASE WHEN event IN ('CONNECT','ABANDON') THEN 1 END) AS total_attempts, ROUND(100.0 * COUNT(CASE WHEN event = 'ABANDON' THEN 1 END) / NULLIF(COUNT(CASE WHEN event IN ('CONNECT','ABANDON') THEN 1 END), 0), 1) AS abandon_pct FROM queue_log WHERE time > UNIX_TIMESTAMP(NOW() - INTERVAL 7 DAY) GROUP BY HOUR(FROM_UNIXTIME(time)) ORDER BY abandon_pct DESC;

Достаточно выполнить этот запрос один раз. Вы найдёте 2-3 часа, в которые процент потерь резко подскакивает. Это и есть ваши недоукомплектованные окна.

Уровень 2: смотреть ежедневно

4. Среднее время обработки (AHT) по операторам

AHT сильно различается от оператора к оператору. Вопрос в том, говорит ли этот разброс о проблеме или просто о разной сложности звонков.

-- AHT по операторам с количеством звонков (за 7 дней) SELECT agent, COUNT(*) AS calls, ROUND(AVG(CAST(data2 AS UNSIGNED))) AS avg_talk_sec, ROUND(AVG(CAST(data1 AS UNSIGNED))) AS avg_hold_sec, ROUND(AVG(CAST(data2 AS UNSIGNED) + CAST(data1 AS UNSIGNED))) AS avg_total_sec FROM queue_log WHERE event IN ('COMPLETECALLER', 'COMPLETEAGENT') AND time > UNIX_TIMESTAMP(NOW() - INTERVAL 7 DAY) AND agent != 'NONE' GROUP BY agent HAVING calls >= 10 ORDER BY avg_total_sec DESC;

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

5. Загрузка операторов (occupancy)

Время на обработке звонков как доля от времени в системе. Здоровый диапазон — 70-85%.

Ниже 70%: перебор с людьми в смене или операторы уклоняются от очереди. Выше 85%: вы движетесь к выгоранию операторов. Качество постобработки падает, количество ошибок растёт, следом идёт текучка.

6. Распределение времени ожидания (а не среднее)

Среднее время ожидания вводит в заблуждение. В очереди со средним ожиданием 15 секунд 80% звонков могут отвечаться за 5 секунд, а 20% — ждать больше 3 минут. Для этих 20% опыт отвратительный.

-- Распределение времени ожидания (перцентили) SELECT queuename, COUNT(*) AS total_calls, ROUND(AVG(CAST(data1 AS UNSIGNED))) AS avg_wait, -- Приблизительные перцентили через условную агрегацию MAX(CASE WHEN rn <= total * 0.50 THEN wait_sec END) AS p50_wait, MAX(CASE WHEN rn <= total * 0.90 THEN wait_sec END) AS p90_wait, MAX(CASE WHEN rn <= total * 0.95 THEN wait_sec END) AS p95_wait FROM ( SELECT queuename, CAST(data1 AS UNSIGNED) AS wait_sec, ROW_NUMBER() OVER (PARTITION BY queuename ORDER BY CAST(data1 AS UNSIGNED)) AS rn, COUNT(*) OVER (PARTITION BY queuename) AS total FROM queue_log WHERE event = 'CONNECT' AND time > UNIX_TIMESTAMP(NOW() - INTERVAL 7 DAY) ) sub GROUP BY queuename;

Если P50 равен 8 секундам, а P95 — 180, у вас бимодальное распределение. Лечится это обычно усилением смены в пиковые часы, а не добавлением операторов во все смены подряд.

Уровень 3: смотреть еженедельно

7. Утилизация транков

Насколько ваши SIP-транки близки к пределу ёмкости? Держитесь ниже 80% в пике. Выше — и во время всплесков абоненты начнут получать сигнал «занято».

-- Пик одновременных звонков по транкам (за 7 дней) SELECT DATE(calldate) AS day, HOUR(calldate) AS peak_hour, SUBSTRING_INDEX(channel, '/', 2) AS trunk, COUNT(*) AS concurrent_calls FROM cdr WHERE calldate > DATE_SUB(NOW(), INTERVAL 7 DAY) AND disposition = 'ANSWERED' GROUP BY DATE(calldate), HOUR(calldate), SUBSTRING_INDEX(channel, '/', 2) ORDER BY concurrent_calls DESC LIMIT 10;

Как поднять мониторинг: три подхода

Подход 1: CLI-скрипты (бесплатно, ограниченно)

Годится для разовых проверок. Полноценным решением для мониторинга это не является.

#!/bin/bash # quick-queue-status.sh - запускать через cron каждые 5 минут QUEUES=$(asterisk -rx "queue show" | grep "^[a-zA-Z]" | awk '{print $1}') for Q in $QUEUES; do WAITING=$(asterisk -rx "queue show $Q" | grep "has [0-9]* calls" | awk '{print $3}') AGENTS=$(asterisk -rx "queue show $Q" | grep -c "SIP/") if [ "$WAITING" -gt 5 ] && [ "$AGENTS" -gt 0 ]; then RATIO=$((WAITING / AGENTS)) if [ "$RATIO" -gt 3 ]; then echo "ALERT: Queue $Q has $WAITING calls waiting with $AGENTS agents (ratio: $RATIO:1)" # Отправить оповещение на почту, в Slack и т.д. fi fi done

Базовые оповещения вы получите. Но проверка идёт раз в 5 минут, а за 5 минут может произойти многое. И ничего о трендах, паттернах и работе конкретных операторов такой скрипт вам не расскажет.

Подход 2: Grafana + собственный пайплайн (бесплатно, 40-80 часов)

Для команд, у которых есть DevOps-компетенция и время:

  1. Установить Grafana + PostgreSQL (или TimescaleDB для оптимизации временных рядов)
  2. Написать парсер queue_log, который заливает события в базу
  3. Сделать слушатель AMI для событий реального времени
  4. Собрать дашборды под каждую метрику выше
  5. Настроить правила оповещений

Трезвая оценка: первоначальная сборка занимает 40-80 часов в зависимости от вашего опыта с SQL и Grafana. Дашборд получается красивым. А дальше:

  • Приход, уход и паузы операторов требуют правок дашбордов
  • Изменения в конфигурации очередей ломают запросы
  • Кто-то должен поддерживать слушатель AMI (он отваливается, Asterisk перезапускается, сеть моргает)
  • Хранением исторических данных надо управлять

Большинство проектов «Grafana поверх Asterisk», которые я видел, забрасывают в течение 6-12 месяцев — когда уходит инженер, который их собрал. Ломается не дашборд: ломается сопровождение пайплайна данных.

Подробный разбор — в нашем полном сравнении Grafana и Astervis.

Подход 3: Astervis (специализированное решение, 10 минут)

Astervis сделан именно под мониторинг колл-центров на Asterisk. Подключение к AMI, разбор queue_log, дашборды реального времени, управление операторами и оповещения работают из коробки.

# Установка на сервер с Asterisk или на отдельную машину curl -fsSL https://api.astervis.io/api/releases/install.sh | bash

Дальше в дашборде:

  1. Добавляете свой сервер Asterisk (учётные данные AMI)
  2. Очереди подхватываются автоматически
  3. Начинаете мониторить

Что вы получаете:

  • 30+ графиков, включая тепловые карты, сравнение трендов и аналитику по очередям
  • Дашборды реального времени (обработка событий AMI быстрее секунды)
  • Отслеживание работы операторов с KPI и рейтингами
  • Мониторинг SLA с настраиваемыми порогами для каждой очереди
  • Планирование смен и управление операторами
  • Прослушивание записей разговоров прямо из дашборда
  • Интеграция с CRM (Bitrix24, AmoCRM)
  • Self-hosted — данные остаются в вашей сети

Стоимость: от $119 в месяц, число операторов не ограничено. 14-дневный бесплатный триал, без привязки карты.

Работает с FreePBX, Sangoma, Issabel, VitalPBX — со всем, у чего под капотом Asterisk.


Настройка Asterisk под мониторинг

Устали угадывать, что происходит в очередях?

Astervis даёт 30+ реалтайм-графиков, KPI операторов и CRM-интеграцию для вашего Asterisk PBX. On-premise. Установка за 5 минут. От $119/мес flat без ограничения на операторов.

Попробовать бесплатно

Включаем полное логирование событий

В большинстве инсталляций Asterisk логирование неполное. Начните с этого:

; /etc/asterisk/queues.conf - добавить в КАЖДУЮ секцию очереди [sales] ; ... ваш текущий конфиг ... eventwhencalled = yes ; Логировать, какому оператору предложен звонок eventmemberstatus = yes ; Логировать смену состояний оператора (пауза, снятие паузы, вход) monitor-type = MixMonitor ; Включить запись разговоров queue-callswaiting = yes ; Объявлять абоненту его позицию queue-thankyou = beep ; Звук подтверждения при соединении ; Тонкая настройка производительности wrapuptime = 30 ; 30 с между звонками (защищает от выгорания, улучшает учёт постобработки) timeout = 15 ; Звонить оператору 15 с, потом пробовать следующего retry = 5 ; Пауза 5 с между попытками

Моё мнение про wrapuptime: по умолчанию это 0, то есть следующий звонок прилетает оператору сразу после того, как он положил трубку. Плохо это по трём причинам: (1) оператор не успевает завершить постобработку и делает её уже во время следующего звонка, раздувая AHT; (2) это приводит к выгоранию — см. наше руководство по профилактике выгорания; (3) ваши цифры AHT теряют смысл, потому что время постобработки прячется внутри времени разговора.

Ставьте wrapuptime минимум на 15-30 секунд. Сначала AHT визуально вырастет, но реальная производительность станет выше.

Настраиваем AMI для внешних инструментов

; /etc/asterisk/manager.conf [general] enabled = yes port = 5038 bindaddr = 0.0.0.0 [monitoring] secret = use_a_strong_32_char_password deny = 0.0.0.0/0.0.0.0 permit = 10.0.0.100/255.255.255.255 ; Только IP вашего сервера мониторинга read = system,call,log,agent,reporting write = system,call,agent,reporting writetimeout = 5000

Безопасность: никогда не используйте permit = 0.0.0.0/0.0.0.0 в продакшене. AMI даёт полный контроль над вашей АТС. Ограничивайте доступ конкретными IP.

После изменений:

asterisk -rx "manager reload" # Проверка: telnet your-asterisk-server 5038

Выбор стратегии очереди

Данные мониторинга хороши ровно настолько, насколько продумана стратегия очереди. Разные стратегии дают разные картины:

СтратегияПоведениеКому подходитЧто видно в мониторинге
ringallЗвонит всем операторам сразуНебольшие команды (<5)Равномерное распределение, высокий процент ответов
leastrecentЗвонит тому, кто дольше всех простаивалСбалансированная нагрузкаОднородные метрики по операторам
fewestcallsЗвонит тому, у кого меньше всего звонковЧестное распределениеСхожее количество звонков
rrmemoryRound-robin с запоминаниемПредсказуемостьПоследовательные паттерны по операторам
randomСлучайный операторБольшие командыСтатистическое распределение
linearФиксированный порядок приоритетаРаспределение по навыкамЛучшие операторы перегружены

linear даёт самое предсказуемое качество, но выжигает ваших лучших операторов. leastrecent — лучшая универсальная стратегия: она естественным образом выравнивает нагрузку, а значит, ваши данные мониторинга становятся осмысленнее.


Типичные ошибки в мониторинге

Ошибка 1: смотреть на средние вместо распределений

Среднее время ожидания 25 секунд звучит приемлемо. Но распределение может быть таким:

  • 60% звонков: ответ быстрее 10 секунд
  • 25% звонков: ответ за 30-60 секунд
  • 15% звонков: ожидание 2-5 минут

Эти 15% — ваш риск оттока. Используйте перцентили P90 и P95 вместо средних. SQL-запросы выше считают и то, и другое.

Ошибка 2: не разделять типы очередей

Смешивая метрики очереди продаж с метриками поддержки, вы обесцениваете и те, и другие. 30 секунд ожидания в очереди продаж стоят выручки. 30 секунд ожидания в очереди обратного звонка — это норма. Настройте отдельные цели по SLA для каждой очереди.

Ошибка 3: считать CDR аналитикой очередей

CDR фиксирует звонки. queue_log фиксирует взаимодействия с очередью. Это разные источники данных, отвечающие на разные вопросы.

CDR говорит: «Этот звонок длился 3 минуты». queue_log говорит: «Абонент ждал 45 секунд, ответил оператор SIP/200, разговор длился 2 минуты 15 секунд, абонент положил трубку первым».

Если вы строите отчёты только на данных CDR, вы теряете контекст очереди. О том, как эффективно совместить оба источника, читайте в нашем руководстве по отчётности CDR.

Ошибка 4: усталость от оповещений

Оповещения на каждый мелкий порог создают шум. Люди привыкают игнорировать все алерты, включая критические.

Начните всего с трёх:

  1. Переполнение очереди: больше 10 абонентов ждут дольше 2 минут
  2. Нарушение SLA: уровень сервиса ниже 60% на протяжении 15+ минут
  3. Ёмкость транков: одновременные звонки превышают 80% ёмкости транка

Добавляйте новые оповещения только после того, как докажете, что стабильно реагируете на эти три.

Ошибка 5: нет исторической базы для сравнения

Дашборды реального времени бесполезны без контекста. «47 звонков в очереди» ничего не значит, если вы не знаете, что во вторник в 14:00 их обычно 50. Прежде чем дашборд реального времени начнёт приносить пользу, нужно накопить минимум 30 дней истории.


Чек-лист мониторинга

Пройдитесь по списку, чтобы убедиться, что мониторинг Asterisk настроен полностью:

Сбор данных:

  • AMI включён, заведён пользователь для мониторинга
  • queue_log пишет все события (eventwhencalled, eventmemberstatus)
  • CDR пишется в базу данных (а не только в плоский файл)
  • wrapuptime задан для каждой очереди (не 0)
  • Запись разговоров включена (MixMonitor)

Дашборды:

  • Состояние очередей в реальном времени (звонки в ожидании, свободные операторы)
  • Индикатор SLA по каждой очереди (с корректным порогом)
  • Процент потерянных звонков по часам (тепловая карта)
  • Таблица показателей операторов (AHT, звонки, FCR)
  • График утилизации транков

Оповещения:

  • Настроено оповещение о переполнении очереди
  • Настроено оповещение о нарушении SLA
  • Настроено оповещение о ёмкости транков
  • Доставка оповещений протестирована (почта, Slack, webhook)

Отчётность:

  • Ежедневная сводка автоматизирована
  • Настроен еженедельный отчёт по трендам
  • Запланирован ежемесячный отчёт по ёмкости

Что меняется с мониторингом в реальном времени

Команды, которые выстроили мониторинг правильно, стабильно получают улучшения:

  • Процент потерянных звонков падает на 30-50% уже в первый месяц (потому что вы видите проблемы в момент их возникновения, а не через неделю)
  • Простой операторов сокращается на 15-20% (более точные решения по смене в реальном времени)
  • Соблюдение SLA улучшается на 10-25% (пороговые оповещения не дают нарушениям затягиваться)
  • Затраты на персонал снижаются на 5-10% за 3 месяца (тепловые карты показывают окна с избытком людей)

Это не гипотезы. Это картина, которую я вижу раз за разом, когда команды переходят от «иногда заглянуть в CLI» к непрерывному мониторингу.

Разрыв между колл-центром на Asterisk с хорошим мониторингом и колл-центром без него — это не разница в технической изощрённости. Это разница в видимости. Нельзя починить то, чего не видишь.


Держите колл-центр на Asterisk без мониторинга в реальном времени? Запустите бесплатный 14-дневный триал Astervis и получите 30+ дашбордов за 10 минут.

Уже мониторите через Grafana или скрипты? Посмотрите, как Astervis выглядит на их фоне, в нашем сравнении инструментов мониторинга.

Хватит гадать. Начни видеть.

Реальная картина вашего Asterisk колл-центра: время ожидания, активность операторов, нагрузка на транки и 30+ графиков. On-premise на вашем сервере. Установка за 5 минут. Без карты.

От $119/мес flat. Без ограничения на операторов. Триал 14 дней.

Поделиться