Метрики реального времени с агрегацией данных

ECSS-10 и сопутствующие сервисы (например, контакт-центр или селекторная связь) формируют различные статистические метрики.

Система работает таким образом, что ПО формирует счетчики используя модуль ecss_statistics, который хранит счетчики в ets таблицах ноды (используется exometer_core).
Модуль ecss_statistics с заданной периодичностью осуществляет выгрузку значений счетчиков в СУБД MySQL в БД ecss_statistics в таблицу realtime_statistics.

Пример — список таблиц БД статистики:

sasha@ecss1:~$ mysql -ustatistics -p -D ecss_statistics -e 'show tables;'
Enter password: 
+---------------------------------+
| Tables_in_ecss_statistics       |
+---------------------------------+
| Host.Resources                  |
| historical_daily_statistics     |
| historical_hour_statistics      |
| historical_intrahour_statistics |
| historical_monthly_statistics   |
| historical_weekly_statistics    |
| realtime_statistics             |
| realtime_statistics_0           |
| realtime_statistics_1           |
| realtime_statistics_10          |
| realtime_statistics_11          |
| realtime_statistics_2           |
| realtime_statistics_3           |
| realtime_statistics_4           |
| realtime_statistics_5           |
| realtime_statistics_6           |
| realtime_statistics_7           |
| realtime_statistics_8           |
| realtime_statistics_9           |
| realtime_statistics_template    |
| stat_details                    |
| version                         |
+---------------------------------+

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

У счетчика есть имя и значение. Значение могут содержать несколько величин (value, avg, min, max, count) и зависит от типа счетчика.
Имя — это список термов, что позволяет формировать иерархическую (древовидную) структуру метрик.

Каждый тип интервалов хранится какое-то время и находится в определенной таблице БД ecss_statistics:

Размерность статистикиИмя таблицыВремя хранения
10 секундrealtime_statistics_X, где X - номер пятиминутки каждого часа от 0 до 11
(0 - период с HH:00:00 до HH:04:59, 11 - с HH:55:00 до HH:59:59)
до окончания X-й пятиминутки
5 минутhistorical_intrahour_statistics1 неделя
1 часhistorical_hour_statistics1 месяц
1 деньhistorical_daily_statistics6 месяцев
1 неделяhistorical_weekly_statistics1 год
1 месяцhistorical_monthly_statistics10 лет


В ECSS-10 принят следующий формат описания имени счетчика:
[SystemPrefix, Domain, SubsystemPrefix, MetricName, VariablePart1, VariablePart2, MetricType].

  • SystemPrefix — идентифицирует систему генерирующую метрику и может принимать следующие значения:
    • ecss10.common — метрики общие для всех систем
    • ecss10.ssw — метрики специфичные для софтсвича
    • ecss10.cc — метрики специфичные для контакт-центра
    • ecss10.tc — метрики специфичные для сервиса селекторной связи (teleconference)
  • Domain — идентификатор домена (виртуальной АТС) в рамках которого генерируется метрика
  • SubsystemPrefix — идентифицирует подсистему в рамках выбранной системы, которая генерирует метрику и может принимать следующие значения:
    • queue — очередь (специфична для контакт-центра)
    • agent — агент (специфична для контакт-центра)
    • group - группа агентов КЦ (специфична для контакт-центра)
    • ivr - меню IVR (специфичная для софтсвича)
    • core — ядро (специфичная для софтсвича)
    • sip — адаптер протокола sip (специфичная для софтсвича)
    • megaco — адаптер протокола megaco (специфичная для софтсвича)
    • sigtran — адаптер протокола sigtran (специфичная для софтсвича)
    • mediator — медиатор (специфичная для софтсвича)
    • mycelium — брокер интеграционной шины (специфичная для софтсвича)
    • trunk_manager — менеджер транков
    • direction_manager — менеджер направлений
    • ds - хранилище конфигурационной информации
    • dialer - сервис автообзвона
  • MetricName — фиксированное имя метрики, должно описывать значение которое содержится в метрике, рекомендуется, чтобы так же был указан тип метрики
  • VariablePart1 — 1я дополнительная переменная часть имени метрики, специфичная для конкретной метрики (может, например, содержать имя транка, имя очереди и т.п.)
  • VariablePart2 — 2я дополнительная переменная часть имени метрики, специфичная для конкретной метрики (может, например, содержать идентификатор агента)
  • MetricType — определяет тип метрики, может принимать следующие значения:
    • counter
    • gauge
    • meter
    • histogram

Вычисляемые метрики

Помимо реальных, считываемых, метрик, хранящихся в базе данных, в системе существуют также вычисляемые метрики, которые с помощью математических операций формируются из реальных и других вычисляемых. В файле statistics.ods , они описаны с параметром "Доступны из БД"=false. Их описание:

{MetricName, Statement}, где Statement - математическое описание вычисляемой метрики (в математической форме ниже используется термин "выражение").

В текущий момент, вычислимые метрики поддерживаются только в статистике КЦ.

Формат математического описания в РБНФ

выражение = унарное выражение | бинарное выражение | переменная | константа ;
унарное выражение = "{", унарная операция, ",", выражение, "}" ;
унарная операция = "sum" | "trunc";
бинарное выражение = "{", бинарная операция, ",", выражение, ",", выражение, "}" ;
бинарная операция = "sum" | "sub" | "mul" | "div" ;
переменная = имя (* во время описания метрики *) | метрика (* во время вычисления вычислимой метрики *) ;
имя = ? имя метрики (реальной или вычислимой) ? ;
метрика = "{", идентификатор, ",", данные, "}" ;
идентификатор = ? описательные параметры метрики (имя, размерность, префиксы и т.д.) ? ;
данные = ? ряд значений интервальной статистики ? ;
константа = число | гистограмма ;
число = ? число с плавающей запятой ? ;
гистограмма = "{", количество, ",", минимум, ",", максимум, ",", среднее, "}" ;
количество = число ;
минимум = число ;
максимум = число ;
среднее = число ;

Математический движок поддерживает как скалярные операции, так и операции между рядами данных.


Ниже приведен пример нескольких таблица метрик реального времени, генерируемых ecss_statistics, которые полностью описаны в файле statistics.ods:

Подсистема core

SystemPrefixDomainSubsystemPrefixMetricName / Имя метрикиMetricTypeОписание
ecss10.commonДоменcoreall_callbacks.countcounterСчетчик запущенных и завершенных callback-ов с WidgetId в домене
ecss10.commonДоменcoresuccess_finished_callbacks.countcounterСчетчик успешно завершенных callback-ов с WidgetId со статусом Cause(ISUP) в домене
ecss10.commonДоменcoreunsuccess_attempts_callback.countcounterСчетчик не успешных попыток callback-а с WidgetId
ecss10.commonДоменcoreunsuccess_finished_callbacks.countcounterСчетчик не успешно завершенных callback-ов с WidgetId со статусом Cause(ISUP) в домене
ecss10.commonДоменcoreunsuccess_finished_callbacks_by_client.countcounterСчетчик не успешно завершенных из-за оператора callback-ов с WidgetId со статусом Cause(ISUP) в домене
ecss10.commonДоменcoreunsuccess_finished_callbacks_by_operator.countcounterСчетчик не успешно завершенных из-за клиента callback-ов с WidgetId со статусом Cause(ISUP) в домене
ecss10.commonДоменcorealiases.countergaugeКоличество занятых и доступных алиасов в соответствии с лицензионными ограничениями
ecss10.commonДоменcorecpm_allocated_resources.gaugegaugeКоличество занятых ресурсов в соответствии с лицензионными ограничениями
ecss10.commonДоменcorecpm_allocated_resources_limitsgaugeЛицензионные ограничения на ресурс
ecss10.commonДоменcorecpm_allocated_resources.histohistogramКоличество занятых ресурсов в соответствии с лицензионными ограничениями
ecss10.commonДоменcorestatistics_upload_time.histogramhistogramВремя вставки статистик в MySQL

Подсистема dialer

SystemPrefixDomainSubsystemPrefixMetricName / Имя метрикиMetricTypeОписание
ecss10.sswДоменdialerfailedcounterНеудачные попытки работы системы автообзвона
ecss10.sswДоменdialersuccesscounterУдачные попытки работы системы автообзвона

Подсистема trunk_manager

SystemPrefixDomainSubsystemPrefixMetricName / Имя метрикиMetricTypeОписание
ecss10.sswДоменtrunk_managerincoming_accepted_seizures.countercounterСчетчик принятых занятий на транке
ecss10.sswДоменtrunk_managerincoming_rejected_seizures.countercounterСчетчик отклоненных по каким-либо причинам занятий на транке
ecss10.sswДоменtrunk_managerincoming_seizures.countercounterСчетчик входящих занятий на транк
ecss10.sswДоменtrunk_managerincoming_active_channels.histogramhistogramГистограмма количества входящих активных вызовов на транке
ecss10.sswДоменtrunk_manageroutgoing_active_channels.histogramhistogramГистограмма количества исходящих активных вызовов на транке

Подсистема direction_manager

SystemPrefixDomainSubsystemPrefixMetricName / Имя метрикиMetricTypeОписание
ecss10.sswДоменdirection_managerincoming_accepted_seizures.countercounterСчетчик принятых занятий на направлении
ecss10.sswДоменdirection_managerincoming_rejected_seizures.countercounterСчетчик отклоненных по каким-либо причинам занятий на направлении
ecss10.sswДоменdirection_managerincoming_active_channels.histogramcounterСчетчик входящих занятий на направление
ecss10.sswДоменdirection_manageroutgoing_active_channels.histogramhistogramГистограмма количества входящих активных вызовов на направлении
ecss10.sswДоменdirection_manageroutgoing_active_channels.histogramhistogramГистограмма количества исходящих активных вызовов на направлении

Подсистема ivr

SystemPrefixDomainSubsystemPrefixMetricName / Имя метрикиMetricTypeОписание
ecss10.sswДоменivrivr_answered_eventcounterАбонент ответил
ecss10.sswДоменivrivr_detect_digits_eventcounterЗапуск детектирования цифр
ecss10.sswДоменivrivr_detected_digits_eventcounterДетектирование цифр завершено
ecss10.sswДоменivrivr_enter_block_eventcounterВход в блок
ecss10.sswДоменivrivr_leave_block_eventcounterВыход из блока по ветке или в скрипт
ecss10.sswДоменivrivr_play_finished_eventcounterПроигрывание плейлиста завершено
ecss10.sswДоменivrivr_play_playlist_eventcounterЗапуск проигрывания плейлиста
ecss10.sswДоменivrivr_released_eventcounterАбонент или скрипт завершил вызов
ecss10.sswДоменivrivr_run_dialing_eventcounterЗапуск набора номера
ecss10.sswДоменivrivr_unsuccess_call_eventcounterНеуспешный вызов

Подсистема agent

SystemPrefixDomainSubsystemPrefixMetricName / Имя метрикиMetricTypeОписание
ecss10.ccДоменagentaccepted_acd_ccounterКоличество acd вызовов на которые ответил оператор в одной очереди
ecss10.ccДоменagentaccepted_direct_in_ccounterКоличество принятых входящих вызовов
ecss10.ccДоменagentaccepted_direct_out_ccounterКоличество исходящих вызовов, на которые ответила сторона Б
ecss10.ccДоменagentacd_alerting_ccounterПринятые acd вызовы
ecss10.ccДоменagentacd_queue_wait_tcounterВремя от постановки вызова в очередь до ответа оператора
ecss10.ccДоменagentacd_talk_tcointerВремя, которое оператор разговаривал с абонентами, позвонившими на очередь

Вызывные статистики


пример команды просмотра
/domain/test_domain/core/statistics/show last 8 hour  ecss10.ssw _ _ success_calls_c
┌───────────┬──────────┬─────────┬───────────────┬───────┬────┬────┬───────┬───────────────────┬─────┬─────┬───┬───┬───┐
│  Domain   │  System  │Subsystem│  Statistics   │ Type  │Var1│Var2│Measure│       Time        │Value│Count│Min│Max│AVG│
│           │          │         │     Name      │       │    │    │       │                   │     │     │   │   │   │
├───────────┼──────────┼─────────┼───────────────┼───────┼────┼────┼───────┼───────────────────┼─────┼─────┼───┼───┼───┤
│test_domain│ecss10.ssw│core     │success_calls_c│counter│    │    │hour   │2025/02/19 06:59:59│1    │     │   │   │   │
│           │          │         │               │       │    │    │       │2025/02/19 07:59:59│4    │     │   │   │   │
│           │          │         │               │       │    │    │       │2025/02/19 08:59:59│143  │     │   │   │   │
│           │          │         │               │       │    │    │       │2025/02/19 09:59:59│2    │     │   │   │   │
│           │          │         │               │       │    │    │       │2025/02/19 10:59:59│57   │     │   │   │   │
│           │          │         │               │       │    │    │       │2025/02/19 11:59:59│3    │     │   │   │   │
│           │          │         │               │       │    │    │       │2025/02/19 12:59:59│35   │     │   │   │   │
│           │          │         │               │       │    │    │       │2025/02/19 13:59:59│25   │     │   │   │   │
└───────────┴──────────┴─────────┴───────────────┴───────┴────┴────┴───────┴───────────────────┴─────┴─────┴───┴───┴───┘

В системе ECSS-10 реализована запись в БД вызывной статистики. Описание метрик приведено ниже.

У всех этих метрик система — ecss10.ssw и подсистема core. Доменные метрики имеют в поле БД имя своего домена, у системных домен — .system.

Если не написано обратного, у всех метрик значащим полем является value.

МетрикаMetricName / Имя метрикиvariable_part_1variable_part_2Примечания
Количество поступивших в систему вызовов без номера вызывающего абонентаempty_a_number_calls_cNULLNULL
Количество успешных вызовов за период времени (вызовов с ответом вызываемого абонента)success_calls_cNULLNULL
Количество вызовов на занятых абонентов за период времениbusy_calls_cNULLNULL
Количество вызовов без ответа вызываемого абонента за период времениno_answer_calls_cNULLNULL
Общее кол-во неуспешных исходящих вызовов за периодunsuccess_out_calls_cNULLNULL
Отношение неуспешных вызовов ко всему количеству вызовов---Фиктивная метрика. Визуализируется только на grafana
Количество попыток внешних входящих вызовов за период времениtotal_trunk_in_calls_cNULLNULL
Общее количество неуспешных входящих вызововtotal_unsuccess_trunk_in_calls_cNULLNULL
Количество раз набора номера вне плана набораtotal_invalid_number_calls_cNULLNULL

Команды просмотра вызывных статистических данных доступны из CLI и приведены в разделе "/domain/<DOMAIN>/core/statistics/ - команда просмотра статистик ядра системы".

Также есть возможность визуализировать данные с помощью отдельной системы Grafana.

Фильтры произвольной вызывной статистики

В системе ECSS-10 разработан механизм для создания пользователем произвольных метрик/статистик на основе вызывных данных (данных, на основе которых генерируются CDR, а именно mysql таблицы ecss_calls_db.tolltickets).

Каждый фильтр проверяет, если данный вызов соответствует заданным правилам rules (критериям, условиям), то в метрику с именем metric_name, переменными частями variable_part_1, variable_part_2 записывается +1 вызов. Т.е. метрика metric_name показывает сколько было вызовов, удовлетворяющих условиям описанным в правиле rules.

Список правил в фильтре работает по принципу "И", т.е. чтобы фильтр сработал все правила должны вернуть true.
Если же нам надо, чтобы в одну метрику попадали вызовы по разными критериям (по принципу "ИЛИ"), то необходимо сознать несколько фильтров, у которых параметр metric_name совпадает.

В качестве переменных частей (variable_part_1, variable_part_2), а также сравниваемого значения, можно использовать как фиксированные названия, так и макро-переменные. В этом случае вместо макро-переменной подставится значение из CDR записи вызова. Возможные значения макро-переменных:

  • $OADDR_A — номер абонента А до маршрутизации
  • $OADDR_B — номер абонента Б до маршрутизации
  • $ADDR_A — номер абонента А после маршрутизации
  • $ADDR_B — номер абонента Б после маршрутизации
  • $RELEASE_CAUSE_A — Причина завершения вызова для абонента А
  • $RELEASE_CAUSE_B — Причина завершения вызова для абонента B
  • $RELEASE_CAUSE — Причина завершения вызова (зависит от release_initiator: 0/1 — для абонента А, 2 — для абонента B)
  • $RELEASE_CAUSE_ISUP_A — ISUP причина завершения вызова для абонента А
  • $RELEASE_CAUSE_ISUP_B — ISUP причина завершения вызова для абонента B
  • $RELEASE_CAUSE_ISUP — ISUP причина завершения вызова (зависит от release_initiator: 0/1 — для абонента А, 2 — для абонента B)
  • $RELEASE_INITIATOR — Сторона-инициатор релиза: 0 — system, 1 — calling, 2 — called
  • $IFACE_A — Интерфейс абонента А
  • $IFACE_B — Интерфейс абонента B
  • $CATEGORY_A — Категория абонента А
  • $CATEGORY_B — Категория абонента B
  • $ENDPOINT_A_HOST — IP абонента А
  • $ENDPOINT_A_PORT — Port абонента А
  • $ENDPOINT_B_HOST — IP абонента B
  • $ENDPOINT_B_PORT — Port абонента B
  • $ISUP_SPC_A — SPC код абонента А
  • $ISUP_SPC_B — SPC код абонента B
  • $ISUP_DPC_A — DPC код абонента А
  • $ISUP_DPC_B — DPC код абонента B
  • $ISUP_NI_A — Тип сети абонента А
  • $ISUP_NI_B — Тип сети абонента B
  • $CIC_A — Номер CIC абонента А
  • $CIC_B — Номер CIC абонента B
  • $MODE — тип вызова(acd | callback | internal | message | mgm | normal | refer | supervise)
    • normal — обычный вызов. Вызовы, не относящиеся ни к одной из категорий, упомянутых ниже в этом списке, являются обычными и обладают mode = normal.
    • acd (automatic call distribution) — вызов, который инициирует очередь для соединения с оператором.
    • callback — обратный вызов, инициируемый одним из сервисов ДВО. Например Alarm, Callback, Custom Callback, Autoredial With Callback.
    • internal — служебный вызов, используемый некоторыми сервисами ДВО для внутренних нужд. Данные вызовы не попадают в CDR.
    • message — вызов, инициируемый сервисом CSTA SendMessage (ECMA-269 17.1.24 Send Message).
    • mgm — управление ДВО, выполняемое с телефонного аппарата.
    • refer — вызов, инициируемый SSW, в ответ на сообщение Refer (IETF draft-mahy-sip-remote-cc-05 Remote Call Control in SIP using the REFER method and the session-oriented dialog package).
    • supervise — вызов, инициируемый для присоединения к разговору супервизора КЦ.
  • $OCDPN — оригинальный номер Б
  • $RGN — redirecting number
  • $RN — redirection number
  • $TG_A — Транк-группа интерфейса абонента А
  • $TG_B — Транк-группа интерфейса абонента B
  • $CDR_GROUP — Имя CDR группы
  • $IVR_WIDGET_ID — Идентификатор widget-а, для вызовов с IVR
  • $CC_AGENT_A_ID — Идентификатор агента КЦ для абонента А
  • $CC_AGENT_B_ID — Идентификатор агента КЦ для абонента B
  • $CC_AGENT_A_GROUP — Имя группы, которой принадлежит агент КЦ для абонента А
  • $CC_AGENT_B_GROUP — Имя группы, которой принадлежит агент КЦ для абонента B
  • $CC_QUEUE — Имя очереди КЦ из которой пришел вызов
  • $RATING — Значение из IVR блока "Оценка"

Отдельная категория макропеременных — динамически формируемые списки.

  • $INVALID_NUMBER_RELEASE_CAUSES — список причин завершения вызова, отмеченных как "набор номера вне плана набора"
  • $UNSUCCESSFUL_RELEASE_CAUSES — список причин завершения вызова, отмеченных как "неуспешные" (управляется с помощью команд /domain/<DOMAIN>/tts/statistics/<CMD> unsuccessful_release_causes)

Макропеременные на основе этих динамически формируемых списков работают только с оператором "in", и логически оправданное применение — только с фильтрами на основе release_cause_a(b), например:

release_cause_b in $UNSUCCESSFUL_RELEASE_CAUSE
release_cause_a in $INVALID_NUMBER_RELEASE_CAUSES

Использовать эти макропеременные в качестве variable_part_1(2) нельзя.

Каждое из правил в рамках фильтра представляет собой набор из трех полей:

1. Имя поля, на которое действует данное правило.

Возможные имена полей:

  • oaddr_a — номер абонента А до маршрутизации
  • oaddr_b — номер абонента B до маршрутизации
  • addr_a — номер абонента А после маршрутизации
  • addr_b — номер абонента B после маршрутизации
  • dialed_digits — набранные цифры
  • release_cause_a — причина завершения вызова для стороны А
  • release_cause_isup_a — ISUP причина завершения вызова для стороны А
  • release_description_a — текстовое описание причины релиза для стороны А
  • release_cause_b — причина завершения вызова для стороны B
  • release_cause_isup_b — ISUP причина завершения вызова для стороны B
  • release_description_b — текстовое описание причины релиза для стороны B
  • release_initiator — сторона-инициатор релиза: 0 — system, 1 — calling, 2 — called
  • iface_a — интерфейс абонента А
  • iface_b — интерфейс абонента B
  • display_name_a — displayName абонента А после маршрутизации
  • display_name_b — displayName абонента B после маршрутизации
  • category_a — категория абонента А
  • category_b — категория абонента B
  • endpoint_a_host — IP сигнализации абонента А
  • endpoint_a_port — порт сигнализации абонента А
  • endpoint_b_host — IP сигнализации абонента Б
  • endpoint_b_port — порт сигнализации абонента Б
  • original_called_num — оригинальный номера абонента Б в случае переадресаций
  • redirecting_num — redirecting номер
  • redirection_num — redirection номер
  • trunk_group_id_a — ID транка для стороны А
  • trunk_group_id_b — ID транка для стороны B
  • ivr_widget_id — идентификатор widget-а, для вызовов с IVR (сервиса CallBack).
  • cdr_group — имя CDR группы
  • cc_agent_a_id — Идентификатор агента КЦ для абонента А
  • cc_agent_b_id — Идентификатор агента КЦ для абонента B
  • cc_agent_a_group — Имя группы, которой принадлежит агент КЦ для абонента А
  • cc_agent_b_group — Имя группы, которой принадлежит агент КЦ для абонента B
  • cc_queue — Имя очереди КЦ из которой пришел вызов
  • rating — Значение из IVR блока "Оценка"
  • dpc — параметр DPC для вызовов через SIGTRAN
  • is_answered — флаг, отвечен ли вызов

2. Оператор, который применяется к полю из п.1

Возможные операторы:

  • = — сравнение поля с введенным значением
  • in — проверяется, что поле соответствует одному из значений в списке в п.3
  • like — проверяет, что значение из п.3 является подстрокой поля из п.1 (доступно только для текстовых полей)
  • digitmap — проверяется, что поле удовлетворяет digitmap-у, записанному в значение из п.3 (доступно только для полей, в которых содержатся номера телефонов).
    А так же можно указать признак not, который означает что результат применения оператора будет инвертирован

3. Значение — значение для правила.

Возможные значения:

  • фиксированное значение
  • логически оправданная макропеременная

Описание команд для работы с фильтрами произвольной вызывной статистике приведено в разделе "/domain/<DOMAIN>/core/statistics/calls/filter — Команды управления фильтрами произвольной вызывной статистики"