Статистика с агрегацией данных
Метрики реального времени с агрегацией данных
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_statistics | 1 неделя |
| 1 час | historical_hour_statistics | 1 месяц |
| 1 день | historical_daily_statistics | 6 месяцев |
| 1 неделя | historical_weekly_statistics | 1 год |
| 1 месяц | historical_monthly_statistics | 10 лет |
В ECSS-10 принят следующий формат описания имени счетчика:
[SystemPrefix, Domain, SubsystemPrefix, MetricName, VariablePart1, VariablePart2, MetricType].
- SystemPrefix — идентифицирует систему генерирующую метрику и может принимать следующие значения:
- 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
| SystemPrefix | Domain | SubsystemPrefix | MetricName / Имя метрики | MetricType | Описание |
|---|---|---|---|---|---|
| ecss10.common | Домен | core | all_callbacks.count | counter | Счетчик запущенных и завершенных callback-ов с WidgetId в домене |
| ecss10.common | Домен | core | success_finished_callbacks.count | counter | Счетчик успешно завершенных callback-ов с WidgetId со статусом Cause(ISUP) в домене |
| ecss10.common | Домен | core | unsuccess_attempts_callback.count | counter | Счетчик не успешных попыток callback-а с WidgetId |
| ecss10.common | Домен | core | unsuccess_finished_callbacks.count | counter | Счетчик не успешно завершенных callback-ов с WidgetId со статусом Cause(ISUP) в домене |
| ecss10.common | Домен | core | unsuccess_finished_callbacks_by_client.count | counter | Счетчик не успешно завершенных из-за оператора callback-ов с WidgetId со статусом Cause(ISUP) в домене |
| ecss10.common | Домен | core | unsuccess_finished_callbacks_by_operator.count | counter | Счетчик не успешно завершенных из-за клиента callback-ов с WidgetId со статусом Cause(ISUP) в домене |
| ecss10.common | Домен | core | aliases.counter | gauge | Количество занятых и доступных алиасов в соответствии с лицензионными ограничениями |
| ecss10.common | Домен | core | cpm_allocated_resources.gauge | gauge | Количество занятых ресурсов в соответствии с лицензионными ограничениями |
| ecss10.common | Домен | core | cpm_allocated_resources_limits | gauge | Лицензионные ограничения на ресурс |
| ecss10.common | Домен | core | cpm_allocated_resources.histo | histogram | Количество занятых ресурсов в соответствии с лицензионными ограничениями |
| ecss10.common | Домен | core | statistics_upload_time.histogram | histogram | Время вставки статистик в MySQL |
Подсистема dialer
| SystemPrefix | Domain | SubsystemPrefix | MetricName / Имя метрики | MetricType | Описание |
|---|---|---|---|---|---|
| ecss10.ssw | Домен | dialer | failed | counter | Неудачные попытки работы системы автообзвона |
| ecss10.ssw | Домен | dialer | success | counter | Удачные попытки работы системы автообзвона |
Подсистема trunk_manager
| SystemPrefix | Domain | SubsystemPrefix | MetricName / Имя метрики | MetricType | Описание |
|---|---|---|---|---|---|
| ecss10.ssw | Домен | trunk_manager | incoming_accepted_seizures.counter | counter | Счетчик принятых занятий на транке |
| ecss10.ssw | Домен | trunk_manager | incoming_rejected_seizures.counter | counter | Счетчик отклоненных по каким-либо причинам занятий на транке |
| ecss10.ssw | Домен | trunk_manager | incoming_seizures.counter | counter | Счетчик входящих занятий на транк |
| ecss10.ssw | Домен | trunk_manager | incoming_active_channels.histogram | histogram | Гистограмма количества входящих активных вызовов на транке |
| ecss10.ssw | Домен | trunk_manager | outgoing_active_channels.histogram | histogram | Гистограмма количества исходящих активных вызовов на транке |
Подсистема direction_manager
| SystemPrefix | Domain | SubsystemPrefix | MetricName / Имя метрики | MetricType | Описание |
|---|---|---|---|---|---|
| ecss10.ssw | Домен | direction_manager | incoming_accepted_seizures.counter | counter | Счетчик принятых занятий на направлении |
| ecss10.ssw | Домен | direction_manager | incoming_rejected_seizures.counter | counter | Счетчик отклоненных по каким-либо причинам занятий на направлении |
| ecss10.ssw | Домен | direction_manager | incoming_active_channels.histogram | counter | Счетчик входящих занятий на направление |
| ecss10.ssw | Домен | direction_manager | outgoing_active_channels.histogram | histogram | Гистограмма количества входящих активных вызовов на направлении |
| ecss10.ssw | Домен | direction_manager | outgoing_active_channels.histogram | histogram | Гистограмма количества исходящих активных вызовов на направлении |
Подсистема ivr
| SystemPrefix | Domain | SubsystemPrefix | MetricName / Имя метрики | MetricType | Описание |
|---|---|---|---|---|---|
| ecss10.ssw | Домен | ivr | ivr_answered_event | counter | Абонент ответил |
| ecss10.ssw | Домен | ivr | ivr_detect_digits_event | counter | Запуск детектирования цифр |
| ecss10.ssw | Домен | ivr | ivr_detected_digits_event | counter | Детектирование цифр завершено |
| ecss10.ssw | Домен | ivr | ivr_enter_block_event | counter | Вход в блок |
| ecss10.ssw | Домен | ivr | ivr_leave_block_event | counter | Выход из блока по ветке или в скрипт |
| ecss10.ssw | Домен | ivr | ivr_play_finished_event | counter | Проигрывание плейлиста завершено |
| ecss10.ssw | Домен | ivr | ivr_play_playlist_event | counter | Запуск проигрывания плейлиста |
| ecss10.ssw | Домен | ivr | ivr_released_event | counter | Абонент или скрипт завершил вызов |
| ecss10.ssw | Домен | ivr | ivr_run_dialing_event | counter | Запуск набора номера |
| ecss10.ssw | Домен | ivr | ivr_unsuccess_call_event | counter | Неуспешный вызов |
Подсистема agent
| SystemPrefix | Domain | SubsystemPrefix | MetricName / Имя метрики | MetricType | Описание |
|---|---|---|---|---|---|
| ecss10.cc | Домен | agent | accepted_acd_c | counter | Количество acd вызовов на которые ответил оператор в одной очереди |
| ecss10.cc | Домен | agent | accepted_direct_in_c | counter | Количество принятых входящих вызовов |
| ecss10.cc | Домен | agent | accepted_direct_out_c | counter | Количество исходящих вызовов, на которые ответила сторона Б |
| ecss10.cc | Домен | agent | acd_alerting_c | counter | Принятые acd вызовы |
| ecss10.cc | Домен | agent | acd_queue_wait_t | counter | Время от постановки вызова в очередь до ответа оператора |
| ecss10.cc | Домен | agent | acd_talk_t | cointer | Время, которое оператор разговаривал с абонентами, позвонившими на очередь |
Вызывные статистики
/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_1 | variable_part_2 | Примечания |
|---|---|---|---|---|
| Количество поступивших в систему вызовов без номера вызывающего абонента | empty_a_number_calls_c | NULL | NULL | |
| Количество успешных вызовов за период времени (вызовов с ответом вызываемого абонента) | success_calls_c | NULL | NULL | |
| Количество вызовов на занятых абонентов за период времени | busy_calls_c | NULL | NULL | |
| Количество вызовов без ответа вызываемого абонента за период времени | no_answer_calls_c | NULL | NULL | |
| Общее кол-во неуспешных исходящих вызовов за период | unsuccess_out_calls_c | NULL | NULL | |
| Отношение неуспешных вызовов ко всему количеству вызовов | - | - | - | Фиктивная метрика. Визуализируется только на grafana |
| Количество попыток внешних входящих вызовов за период времени | total_trunk_in_calls_c | NULL | NULL | |
| Общее количество неуспешных входящих вызовов | total_unsuccess_trunk_in_calls_c | NULL | NULL | |
| Количество раз набора номера вне плана набора | total_invalid_number_calls_c | NULL | NULL |
Команды просмотра вызывных статистических данных доступны из 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 — Команды управления фильтрами произвольной вызывной статистики"