·19 мин·1 просмотров

Мониторинг SIP-транков в реальном времени для Asterisk: полное руководство

Как в реальном времени мониторить SIP-транки на Asterisk PBX.

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

SIP-транки — это артерии вашей АТС на Asterisk. Через них проходит каждый входящий и исходящий звонок. Когда транк падает или начинает деградировать, весь колл-центр встаёт — а вы можете даже не узнать об этом, пока не начнут жаловаться клиенты.

Большинство администраторов Asterisk узнают о проблемах с транками постфактум: пользователь сообщает об одностороннем звуке, звонки на конкретное направление перестают проходить или провайдер присылает гневное письмо про шторм регистраций. К этому моменту вы уже потеряли деньги, доверие клиентов и часы на диагностику вслепую.

В этом руководстве разберём, как мониторить SIP-транки проактивно — в реальном времени — чтобы ловить проблемы до того, как они затронут хотя бы один звонок.

Зачем нужен мониторинг SIP-транков

Через SIP-транки проходит 100% внешнего голосового трафика. В отличие от внутренних номеров, где сбой затрагивает одного пользователя, отказ транка бьёт по всем сразу. Вот что стоит на кону:

РискВлияние на бизнесОбнаружение без мониторинга
Потеря регистрации транкаВсе исходящие звонки не проходятОт минут до часов
Деградация качества (jitter/потери)Рваный звук, обрывы звонковЖалобы клиентов
Исчерпание ёмкостиКороткие гудки, звонки в очередиВсплеск потерянных вызовов
Односторонний звук (проблема NAT)Клиенты не слышат операторовЕдиничные жалобы на звонки
Авария у провайдераПолное отсутствие связиУведомление извне
Телефонное мошенничествоОгромные неожиданные счетаШок от счёта в конце месяца

Простой SIP-транка в колл-центре на 50 рабочих мест обходится в среднем в $5 000–$15 000 в час — это потерянная производительность и упущенная выручка. Мониторинг в реальном времени сокращает среднее время обнаружения (MTTD) с часов до секунд.

Что мониторить: 5 столпов здоровья SIP-транка

Полноценный мониторинг транков закрывает пять критичных направлений.

1. Статус регистрации

Самая базовая проверка: зарегистрирован ли ваш транк у провайдера? В Asterisk статус регистрации показывает, может ли АТС принимать и совершать звонки через конкретный транк.

Ключевые состояния:

  • Registered — транк активен и готов к работе
  • Unregistered — регистрация потеряна (звонки не пройдут)
  • Request Sent — попытка регистрации в процессе
  • Auth Sent — получен запрос аутентификации
  • Rejected — провайдер отклонил регистрацию (неверные учётные данные, блокировка по IP)
  • No Authentication Required — транк по IP, регистрация не нужна

Команды CLI:

Для chan_sip:

asterisk -rx "sip show registry" # Output: # Host Username Refresh State Reg.Time # provider.com mytrunk 105 Registered Thu, 19 Mar 2026 06:00:01

Для chan_pjsip (современный Asterisk 16+):

asterisk -rx "pjsip show registrations" # Output: # <Registration/ServerURI> <Auth> <Status> # trunk-provider/sip:provider.com trunk-auth Registered

На что настраивать алерт: любой переход из состояния «Registered» должен немедленно поднимать тревогу. Сбои регистрации — это, как правило, первый симптом проблем с учётными данными, сетью или аварии у провайдера.

2. Метрики качества связи (RTP)

Статус «OK» у регистрации ещё не значит, что звонки звучат хорошо. Метрики RTP (Real-time Protocol) показывают реальное качество голоса, которое слышат ваши абоненты.

Критичные метрики:

МетрикаНормаДеградацияКритичноВлияние
Задержка (в одну сторону)< 150 мс150–300 мс> 300 мсПаузы в разговоре, перебивание
Jitter< 20 мс20–50 мс> 50 мсРваный звук, «робот» в голосе
Потери пакетов< 0,5%0,5–2%> 2%Пропадают слова, провалы в звуке
MOS (Mean Opinion Score)> 4,03,5–4,0< 3,5Воспринимаемое качество голоса (1–5)
R-Factor> 8070–80< 70Оценка качества по ITU-T G.107

Как измерять в Asterisk:

# Статистика RTP по активному звонку asterisk -rx "rtp show stats" # Для каналов PJSIP — качество по каждому каналу asterisk -rx "pjsip show channels" # Затем по конкретному каналу: asterisk -rx "core show channel PJSIP/trunk-provider-00000042"

RTCP (Real-Time Control Protocol) отдаёт обратную связь по качеству прямо во время разговора. Включите его в конфигурации PJSIP:

; pjsip.conf [transport-udp] type = transport protocol = udp bind = 0.0.0.0:5060 [trunk-provider] type = endpoint transport = transport-udp ; Включаем RTCP для метрик качества rtcp_mux = no

3. Загрузка и ёмкость транка

У каждого SIP-транка есть лимит каналов — максимум одновременных разговоров. Упёрлись в лимит — новые звонки получают короткие гудки или молча срываются.

Что отслеживать:

  • Активные каналы — сколько разговоров идёт через транк прямо сейчас
  • Пиковые каналы — максимум одновременных звонков за период
  • Лимит каналов — ваш контрактный или настроенный максимум
  • Процент загрузки — активные / лимит × 100

Мониторинг через AMI (Asterisk Manager Interface):

#!/usr/bin/env python3 """Мониторинг загрузки SIP-транков в реальном времени через AMI""" import socket import re import time AMI_HOST = "127.0.0.1" AMI_PORT = 5038 AMI_USER = "monitor" AMI_SECRET = "your_ami_password" def ami_command(sock, action, **params): """Отправить действие AMI и прочитать ответ""" cmd = f"Action: {action}\r\n" for k, v in params.items(): cmd += f"{k}: {v}\r\n" cmd += "\r\n" sock.send(cmd.encode()) time.sleep(0.5) return sock.recv(65536).decode() def get_trunk_channels(sock, trunk_name): """Посчитать активные каналы конкретного транка""" response = ami_command(sock, "Command", Command=f"core show channels concise") channels = [l for l in response.split('\n') if trunk_name in l and '!' in l] return len(channels) def monitor_trunks(): """Основной цикл мониторинга""" sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.connect((AMI_HOST, AMI_PORT)) sock.recv(1024) # Приветственное сообщение # Авторизация ami_command(sock, "Login", Username=AMI_USER, Secret=AMI_SECRET) trunks = { "provider-a": {"limit": 30, "warn": 0.8}, "provider-b": {"limit": 60, "warn": 0.75}, } while True: for name, config in trunks.items(): active = get_trunk_channels(sock, name) util = active / config["limit"] * 100 status = "OK" if util >= 95: status = "CRITICAL" elif util >= config["warn"] * 100: status = "WARNING" print(f"[{time.strftime('%H:%M:%S')}] {name}: " f"{active}/{config['limit']} ({util:.0f}%) [{status}]") time.sleep(10) # Опрос каждые 10 секунд if __name__ == "__main__": monitor_trunks()

Практическое правило по планированию ёмкости: если в часы пик транк регулярно уходит выше 70% загрузки, пора добавлять каналы. Транк, работающий на 90%+, гарантированно даст заметные сбои звонков.

4. Доля успешных вызовов (ASR и NER)

Голый объём звонков ничего не значит, пока вы не понимаете, сколько из них реально соединилось.

Ключевые коэффициенты:

  • ASR (Answer Seizure Ratio) = отвеченные звонки / все попытки × 100

    • Норма: > 50% (зависит от типа трафика)
    • Исходящие продажи: 20–40% — это нормально
    • Входящая поддержка: ожидается > 95%
  • NER (Network Effectiveness Ratio) = (отвеченные + занято + без ответа) / всего × 100

    • Норма: > 95%
    • Ниже 90% — признак проблем с сетью или транком
  • SER (SIP Error Rate) = ответы 4xx/5xx/6xx / всего × 100

    • Норма: < 2%
    • Выше 5% — нужно разбираться

SQL-запросы для анализа по CDR:

-- ASR и NER по транкам (за последние 24 часа) SELECT dstchannel AS trunk, COUNT(*) AS total_calls, COUNT(*) FILTER (WHERE disposition = 'ANSWERED') AS answered, ROUND( COUNT(*) FILTER (WHERE disposition = 'ANSWERED')::numeric / NULLIF(COUNT(*), 0) * 100, 1 ) AS asr_pct, ROUND( COUNT(*) FILTER (WHERE disposition IN ('ANSWERED', 'BUSY', 'NO ANSWER'))::numeric / NULLIF(COUNT(*), 0) * 100, 1 ) AS ner_pct, ROUND( COUNT(*) FILTER (WHERE disposition = 'FAILED')::numeric / NULLIF(COUNT(*), 0) * 100, 1 ) AS fail_pct FROM cdr WHERE calldate >= NOW() - INTERVAL '24 hours' AND dstchannel LIKE 'PJSIP/trunk%' GROUP BY dstchannel ORDER BY total_calls DESC; -- Почасовая динамика ASR по конкретному транку SELECT DATE_TRUNC('hour', calldate) AS hour, COUNT(*) AS attempts, COUNT(*) FILTER (WHERE disposition = 'ANSWERED') AS answered, ROUND( COUNT(*) FILTER (WHERE disposition = 'ANSWERED')::numeric / NULLIF(COUNT(*), 0) * 100, 1 ) AS asr_pct FROM cdr WHERE calldate >= NOW() - INTERVAL '7 days' AND dstchannel LIKE 'PJSIP/trunk-provider%' GROUP BY DATE_TRUNC('hour', calldate) ORDER BY hour DESC LIMIT 168; -- 7 дней почасовых данных -- Разбивка по кодам ответа SIP (нужен расширенный CDR или CEL) SELECT hangupcause AS sip_code, COUNT(*) AS occurrences, ROUND(COUNT(*)::numeric / SUM(COUNT(*)) OVER () * 100, 1) AS pct FROM cdr WHERE calldate >= NOW() - INTERVAL '24 hours' AND dstchannel LIKE 'PJSIP/trunk%' AND disposition = 'FAILED' GROUP BY hangupcause ORDER BY occurrences DESC;

5. Безопасность и выявление аномалий

SIP-транки — излюбленная мишень телефонных мошенников. Взломав ваш транк, злоумышленники за считаные минуты накручивают тысячи долларов международных звонков.

За чем следить:

  • Звонки на премиум-номера (900, международный премиум)
  • Аномальные всплески трафика (в 10 раз выше обычного)
  • Звонки в нерабочее время на неожиданные направления
  • Попытки регистрации с незнакомых IP
  • Шквал INVITE подряд (DoS-атаки)

Запрос для выявления фрода:

-- Подозрительные паттерны международных звонков (за последние 6 часов) SELECT src, dst, COUNT(*) AS call_count, SUM(billsec) AS total_seconds, ROUND(SUM(billsec) / 60.0, 1) AS total_minutes FROM cdr WHERE calldate >= NOW() - INTERVAL '6 hours' AND dstchannel LIKE 'PJSIP/trunk%' AND LENGTH(dst) > 10 -- Международный формат AND dst NOT LIKE '1%' -- Исключаем локальные (подстройте под свою страну) GROUP BY src, dst HAVING COUNT(*) > 5 ORDER BY total_seconds DESC;

Способы мониторинга в реальном времени

Способ 1: Asterisk CLI (вручную)

Годится для быстрых точечных проверок. Для постоянного мониторинга не подходит.

# Все регистрации транков одним взглядом asterisk -rx "pjsip show registrations" # Текущие звонки через конкретный транк asterisk -rx "core show channels" | grep "trunk-provider" # Состояние эндпоинта транка asterisk -rx "pjsip show endpoint trunk-provider" # Количество активных каналов asterisk -rx "core show channels count"

Способ 2: подписка на события AMI (программно)

Asterisk Manager Interface отдаёт события в реальном времени по каждому звонку, изменению регистрации и смене состояния канала. На этом построено большинство систем мониторинга.

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

Событие AMIЧто оно сообщает
RegistryИзменился статус регистрации транка
NewchannelНа транке начался новый звонок
HangupЗвонок завершён (с кодом причины)
PeerStatusИзменилась доступность SIP-пира
RTCPReceivedОбновились метрики качества связи
ChanDestroyedКанал уничтожен (ресурс освобождён)
ChallengeSentОтправлен запрос аутентификации (безопасность)

Конфигурация AMI (manager.conf):

[general] enabled = yes port = 5038 bindaddr = 127.0.0.1 ; Только локальный доступ [monitor] secret = your_strong_password deny = 0.0.0.0/0.0.0.0 permit = 127.0.0.1/255.255.255.0 read = system,call,reporting write = command

Скрипт мониторинга на событиях:

#!/usr/bin/env python3 """ Событийный мониторинг SIP-транков через AMI. Подписывается на события в реальном времени и следит за здоровьем транков. """ import socket import re from collections import defaultdict from datetime import datetime class TrunkMonitor: def __init__(self, host="127.0.0.1", port=5038): self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) self.sock.connect((host, port)) self.sock.recv(1024) self.trunk_channels = defaultdict(int) self.trunk_calls_total = defaultdict(int) self.trunk_calls_failed = defaultdict(int) self.registration_status = {} def login(self, user, secret): self._send(f"Action: Login\r\nUsername: {user}\r\n" f"Secret: {secret}\r\nEvents: on\r\n\r\n") return self._read() def _send(self, msg): self.sock.send(msg.encode()) def _read(self): data = b"" while True: chunk = self.sock.recv(4096) data += chunk if b"\r\n\r\n" in data: break return data.decode() def process_events(self): """Главный цикл — обработка событий AMI в реальном времени""" buffer = "" while True: data = self.sock.recv(4096).decode() buffer += data while "\r\n\r\n" in buffer: event_text, buffer = buffer.split("\r\n\r\n", 1) event = self._parse_event(event_text) if event.get("Event") == "Registry": self._handle_registry(event) elif event.get("Event") == "Newchannel": self._handle_new_channel(event) elif event.get("Event") == "Hangup": self._handle_hangup(event) elif event.get("Event") == "PeerStatus": self._handle_peer_status(event) def _parse_event(self, text): event = {} for line in text.strip().split("\r\n"): if ": " in line: key, val = line.split(": ", 1) event[key] = val return event def _handle_registry(self, event): trunk = event.get("Username", "unknown") status = event.get("Status", "unknown") old_status = self.registration_status.get(trunk) self.registration_status[trunk] = status if old_status and old_status != status: ts = datetime.now().strftime("%H:%M:%S") print(f"[{ts}] REGISTRATION CHANGE: {trunk} " f"{old_status} -> {status}") if status != "Registered": print(f" *** ALERT: Trunk {trunk} lost registration!") def _handle_new_channel(self, event): channel = event.get("Channel", "") for trunk in self.trunk_channels: if trunk in channel: self.trunk_channels[trunk] += 1 self.trunk_calls_total[trunk] += 1 def _handle_hangup(self, event): channel = event.get("Channel", "") cause = event.get("Cause", "0") for trunk in self.trunk_channels: if trunk in channel: self.trunk_channels[trunk] = max(0, self.trunk_channels[trunk] - 1) if cause not in ("16", "17", "18", "19"): self.trunk_calls_failed[trunk] += 1 def _handle_peer_status(self, event): peer = event.get("Peer", "") status = event.get("PeerStatus", "") ts = datetime.now().strftime("%H:%M:%S") print(f"[{ts}] PEER STATUS: {peer} -> {status}") if __name__ == "__main__": monitor = TrunkMonitor() monitor.login("monitor", "your_strong_password") monitor.trunk_channels["trunk-provider-a"] = 0 monitor.trunk_channels["trunk-provider-b"] = 0 print("Monitoring SIP trunks... Press Ctrl+C to stop.") monitor.process_events()

Способ 3: SNMP + внешний мониторинг (Nagios/Zabbix)

Вариант для компаний, у которых уже развёрнута система мониторинга. Модуль Asterisk res_snmp отдаёт метрики транков по SNMP.

Включаем SNMP в Asterisk:

; res_snmp.conf [general] subagent = yes enabled = yes
# Загружаем модуль SNMP asterisk -rx "module load res_snmp" # Проверяем SNMP-запрос snmpwalk -v2c -c public localhost .1.3.6.1.4.1.22736

Скрипт проверки для Nagios:

#!/bin/bash # check_asterisk_trunk.sh - плагин Nagios для мониторинга транков # Использование: check_asterisk_trunk.sh <trunk_name> <warn_channels> <crit_channels> TRUNK=$1 WARN=${2:-20} CRIT=${3:-28} # Получаем количество активных каналов транка CHANNELS=$(asterisk -rx "core show channels concise" 2>/dev/null | grep -c "$TRUNK") REGISTERED=$(asterisk -rx "pjsip show registrations" 2>/dev/null | grep "$TRUNK" | grep -c "Registered") if [ "$REGISTERED" -eq 0 ]; then echo "CRITICAL - Trunk $TRUNK not registered | channels=$CHANNELS" exit 2 fi if [ "$CHANNELS" -ge "$CRIT" ]; then echo "CRITICAL - Trunk $TRUNK: $CHANNELS active channels (>=$CRIT) | channels=$CHANNELS" exit 2 elif [ "$CHANNELS" -ge "$WARN" ]; then echo "WARNING - Trunk $TRUNK: $CHANNELS active channels (>=$WARN) | channels=$CHANNELS" exit 1 else echo "OK - Trunk $TRUNK: Registered, $CHANNELS active channels | channels=$CHANNELS" exit 0 fi

Способ 4: Prometheus + Grafana (современный стек)

Выгружаем метрики Asterisk в Prometheus и визуализируем в Grafana. Готовое решение даёт проект asterisk_exporter.

# docker-compose.yml для стека мониторинга транков Asterisk version: '3.8' services: asterisk-exporter: image: ghcr.io/cswiger/asterisk_exporter:latest environment: AMI_HOST: host.docker.internal AMI_PORT: 5038 AMI_USER: monitor AMI_SECRET: your_password ports: - "9200:9200" prometheus: image: prom/prometheus:latest volumes: - ./prometheus.yml:/etc/prometheus/prometheus.yml ports: - "9090:9090" grafana: image: grafana/grafana:latest environment: GF_SECURITY_ADMIN_PASSWORD: admin ports: - "3000:3000"
# prometheus.yml scrape_configs: - job_name: 'asterisk' scrape_interval: 15s static_configs: - targets: ['asterisk-exporter:9200']

Такой подход требует серьёзной настройки и постоянного сопровождения: поднять экспортеры, написать запросы PromQL, собрать дашборды, настроить правила алертинга. Небольшой команде специализированное решение вроде Astervis снимает эту сложность целиком.

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

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

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

Способ 5: Astervis — аналитика, созданная под Asterisk

Astervis даёт мониторинг SIP-транков в реальном времени из коробки, без настройки:

Что вы получаете сразу после установки:

  • Живой дашборд состояния транков — статус регистрации, активные каналы и загрузка по каждому транку, обновление в реальном времени
  • Тепловые карты качества связи — видно, в какие часы и дни качество проседает
  • Отслеживание ASR/NER — автоматический расчёт с графиками динамики и оповещениями
  • Алерты по ёмкости транков — предупреждение до того, как вы упрётесь в лимит каналов
  • Аналитика CDR по каждому транку — детализация по паттернам звонков, часам пик и доле сбоев
  • 30+ готовых графиков — без PromQL, без сборки дашбордов, без написания запросов
  • Эффективность операторов в связке с маршрутизацией по транкам — видно, какими транками пользуются ваши лучшие операторы
  • Интеграция с CRM — сопоставляйте работу транков с удовлетворённостью клиентов (Bitrix24, AmoCRM)

Установка:

curl -fsSL https://api.astervis.io/api/releases/install.sh | bash

Одна команда. Пять минут. Полноценный мониторинг транков. Начать бесплатный 14-дневный период →

Как собрать дашборд мониторинга транков

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

Wallboard (реальное время)

ВиджетЧастота обновленияНазначение
Статус регистрации (все транки)10 секундМгновенное обнаружение аварии
Активные каналы по транкам5 секундКонтроль ёмкости
Шкала загрузки (%)5 секундПредупреждение о нехватке каналов
Качество связи вживую (MOS/jitter)По каждому звонкуДеградация качества
Неуспешные звонки (за 15 минут)30 секундОтслеживание тренда

Операционный дашборд (почасовой)

ВиджетСодержание
Динамика ASR (24 ч)Линейный график по транкам
Тепловая карта загрузки каналовМатрица «транк × час»
Топ направлений со сбоямиСтолбчатая диаграмма проблемных номеров
Распределение оценок качестваГистограмма значений MOS
Сравнение провайдеровМетрики транков бок о бок

Стратегический дашборд (неделя/месяц)

ВиджетСодержание
Стоимость по транкамЗатраты против объёма звонков
Рейтинг надёжностиУ какого провайдера лучший uptime
Прогноз по ёмкостиКогда понадобятся дополнительные каналы
Динамика качестваТренд MOS по месяцам
Расчёт ROIЭкономия за счёт мониторинга

Типичные проблемы SIP-транков и как их обнаружить

Проблема 1: тихие сбои регистрации

Симптомы: исходящие звонки не проходят, но в консоли Asterisk никаких ошибок.

Как обнаружить:

# Проверяем, действительно ли регистрация актуальна asterisk -rx "pjsip show registrations" | grep -v "Registered" # Ищем ошибки регистрации в логах grep "Registration .* failed" /var/log/asterisk/messages | tail -20

Первопричины:

  • Провайдер сменил учётные данные без предупреждения
  • Изменился IP-адрес (динамический IP без DynDNS)
  • Файрвол провайдера блокирует ваш новый IP
  • Истёк срок действия TLS-сертификата

Проблема 2: постепенная деградация качества

Симптомы: пользователи говорят, что «звонки стали хуже звучать», но когда это началось — сказать не могут.

Как обнаружить:

-- Динамика MOS по неделям SELECT DATE_TRUNC('week', calldate) AS week, ROUND(AVG( CASE WHEN billsec > 0 THEN 4.5 - (0.01 * EXTRACT(EPOCH FROM (end_time - answer_time) - billsec)) ELSE NULL END ), 2) AS avg_estimated_mos, COUNT(*) AS calls FROM cdr WHERE calldate >= NOW() - INTERVAL '90 days' AND dstchannel LIKE 'PJSIP/trunk%' AND disposition = 'ANSWERED' GROUP BY DATE_TRUNC('week', calldate) ORDER BY week;

Первопричины:

  • Интернет-провайдер изменил маршруты
  • Провайдер связи перепродал ёмкость
  • Деградация сетевого оборудования
  • Согласование кодеков откатывается на менее качественный

Проблема 3: исчерпание ёмкости транка

Симптомы: в часы пик часть звонков срывается, но далеко не все.

Как обнаружить:

-- Находим пик одновременных звонков по часам SELECT DATE_TRUNC('hour', calldate) AS hour, MAX(concurrent) AS peak_concurrent FROM ( SELECT calldate, COUNT(*) OVER ( ORDER BY calldate RANGE BETWEEN INTERVAL '0 seconds' PRECEDING AND INTERVAL '0 seconds' FOLLOWING ) AS concurrent FROM cdr WHERE calldate >= NOW() - INTERVAL '7 days' AND dstchannel LIKE 'PJSIP/trunk%' ) sub GROUP BY DATE_TRUNC('hour', calldate) ORDER BY peak_concurrent DESC LIMIT 24;

Решение: настройте алерты по загрузке на порогах 70% и 90%. Если 70% в часы пик срабатывает регулярно — пора заниматься планированием ёмкости.

Проблема 4: телефонное мошенничество прямо сейчас

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

Как обнаружить:

# В реальном времени: ловим международные звонки вне рабочих часов asterisk -rx "core show channels concise" | \ awk -F'!' '{print $1, $7}' | \ grep -E '\+?(9[0-9]{2}|00[0-9]{3})'

Немедленная реакция:

# Мгновенно блокируем транк asterisk -rx "pjsip set endpoint trunk-name max_channels 0" # Или разрываем все каналы транка asterisk -rx "channel request hangup all"

Чек-лист: настраиваем мониторинг с нуля

Пройдите по шагам, чтобы внедрить мониторинг транков.

Шаг 1. Проведите инвентаризацию транков

# Выводим все настроенные транки asterisk -rx "pjsip show endpoints" | grep -E "Endpoint:|Contact:" # Или для chan_sip: asterisk -rx "sip show peers" | grep -v "^Name\|--\|^$"

Шаг 2. Включите сбор метрик качества

; pjsip.conf - добавьте к каждому эндпоинту транка [trunk-provider] type = endpoint ; ... существующая конфигурация ... allow = !all,opus,g722,ulaw,alaw ; Приоритет качественным кодекам trust_id_inbound = yes send_rpid = yes

Шаг 3. Настройте доступ AMI для мониторинга

; manager.conf [monitor] secret = strong_random_password_here deny = 0.0.0.0/0.0.0.0 permit = 127.0.0.1/255.255.255.0 read = system,call,reporting write = command

Шаг 4. Настройте запись CDR в базу

; cdr.conf [general] enable = yes unanswered = yes ; Пишем и неотвеченные звонки congestion = yes ; cdr_adaptive_odbc.conf или cdr_pgsql.conf [global] connection = asterisk table = cdr

Шаг 5. Внедрите мониторинг (выберите путь)

  • Быстро и просто: Asterviscurl -fsSL https://api.astervis.io/api/releases/install.sh | bash (5 минут)
  • Своими руками + Grafana: экспортер Prometheus + собственные дашборды (2–3 дня)
  • Enterprise: интеграция SNMP + Nagios/Zabbix (1–2 дня при наличии опыта)

Шаг 6. Настройте оповещения

Задайте пороги для следующих событий:

  • Изменение статуса регистрации → немедленный алерт
  • Загрузка > 70% → предупреждение
  • Загрузка > 90% → критично
  • Падение ASR более чем на 10% от базового уровня → предупреждение
  • MOS < 3,5 → алерт по качеству
  • Международные звонки вне рабочих часов → алерт о фроде

Шаг 7. Проверьте, что мониторинг работает

# Имитируем сбой регистрации (осторожно — транк отключится!) # Делайте это только в технологическое окно asterisk -rx "pjsip send unregister trunk-provider" # Убеждаемся, что алерт сработал, и регистрируемся заново asterisk -rx "pjsip send register trunk-provider"

Сравнение подходов к мониторингу SIP-транков

ВозможностьCLI/скриптыGrafana+PrometheusNagios/ZabbixAstervis
Время внедренияМинуты2–3 дня1–2 дня5 минут
Обновление в реальном времениРучное обновлениеИнтервал 15 сОпрос раз в 1–5 минЖивое (WebSocket)
Алерты по регистрацииСвой скриптСвои правилаНужен плагинИз коробки
Метрики качества связиОграниченноС экспортером RTPТолько SNMPПолный анализ RTP
Контроль ёмкостиgrep + подсчётСвой PromQLСвоя проверкаАвтоматически
Расчёт ASR/NERSQL-запросыСвои дашбордыНет из коробкиГотовые графики
Выявление фродаВручнуюСвои правилаСвои правилаДетекция аномалий
Связка с операторамиНевозможноСложные JOINНет из коробкиНативная интеграция
Интеграция с CRMНевозможноНевозможноНет из коробкиBitrix24, AmoCRM
СопровождениеВысокоеСреднееСреднееНулевое (как SaaS)
СтоимостьБесплатно (+ время)Бесплатно (+ время)Зависит от лицензииОт $119/мес

Главное

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

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

  3. Сначала снимите базовые показатели: соберите неделю данных в нормальном режиме, прежде чем выставлять пороги алертов. Каждая инсталляция уникальна.

  4. Автоматизируйте реакцию: не ограничивайтесь оповещением — держите runbook на каждый сценарий. А лучше автоматизируйте переключение на резервные транки.

  5. Связывайте с бизнес-метриками: «авария транка» — это просто цифра. «47 клиентов не смогли дозвониться в поддержку из-за сбоя транка» — это бизнес-эффект, под который выделяют бюджет.

  6. Начинайте с простого и наращивайте: стартуйте с проверок регистрации и базовой загрузки. Метрики качества и детекцию фрода добавите по мере зрелости.

Соберёте ли вы свой стек мониторинга или возьмёте специализированный инструмент вроде Astervis — главное начать мониторить уже сегодня. Каждый день без видимости по транкам — это день, когда вы играете в рулетку с надёжностью своего колл-центра.

Хотите видеть свои SIP-транки в реальном времени? Попробуйте Astervis бесплатно 14 дней →

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

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

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

Поделиться