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

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).

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

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

  • - intrahour (5ти минутки) - 62 дня
  • - hour (1 час) - 62 дня
  • - daily (1 день) - 5 лет
  • - weekly (недельные) - 10 лет
  • - monthly (за месяц) - 10 лет

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

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

Ниже приведена таблица метрик реального времени генерируемых системой:

Модуль ecss_statistics

SystemPrefixDomainSubsystemPrefixMetricNameVar1Var2MetricTypeOptionsОписание
ecss10.common.system | Доменcorestatistics_upload_time.histogramundefinedundefinedhistogram
Содержит гистограмму времени вставки статистик в MySQL
ecss10.common.system | Доменcorecpm_resource_allocation_attemptscpNULLcounter
Количество попыток вызовов за период времени
ecss10.common.system | Доменcorecpm_allocated_resources.histocpNULLhistogram
Пиковое количество одновременных вызовов за период времени, значащее поле - max
ecss10.common.system | Доменcorecpm_allocated_resources.histocpNULLhistogram
Минимальное количество одновременных вызовов за период времени, значащее поле - min

Модуль cc_active_queue

SystemPrefixDomainSubsystemPrefixMetricNameVar1Var2MetricTypeOptionsОписание
ecss10.ссДоменqueueincoming_seizures.counterQueueIDundefinedcounterautoresetСчетчик входящих занятий распределенных на очередь
ecss10.ссДоменqueueincoming_accepted_seizures.counterQueueIDundefinedcounterautoresetСчетчик принятых занятий распределенных на очередь (занятие поставлено в очередь или сразу распределено на агента)
ecss10.ссДоменqueueincoming_rejected_seizures.counterQueueIDundefinedcounterautoresetСчетчик занятий распределенных на очередь, но отклоненных по каким-либо причинам
ecss10.ссДоменqueuewaiting_calls.histogramQueueIDundefinedhistogramautoresetГистограмма количества вызовов ожидающих в очереди
ecss10.ссДоменqueuewaiting_time.histogramQueueIDundefinedhistogram
Гистограмма времени ожидания вызовов в очереди

Модуль core_trike_tm

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

Модуль core_trike_dm

SystemPrefixDomainSubsystemPrefixMetricNameVar1Var2MetricTypeOptionsОписание
ecss10.sswДоменdirection_managerincoming_seizures.counterDirectionIDundefinedcounterautoresetСчетчик входящих занятий на направление
ecss10.sswДоменdirection_managerincoming_accepted_seizures.counterDirectionIDundefinedcounterautoresetСчетчик принятых занятий на направление
ecss10.sswДоменdirection_managerincoming_rejected_seizures.counterDirectionIDundefinedcounterautoresetСчетчик отклоненных по каким-либо причинам занятий на направлении
ecss10.sswДоменdirection_manageroutgoing_active_channels.histogramDirectionIDundefinedhistogram
Гистограмма количества исходящих активных вызовов на направлении

Модуль core_trike_cmp

SystemPrefixDomainSubsystemPrefixMetricNameVar1Var2MetricTypeOptionsОписание
ecss10.sswДоменdirection_managerincoming_seizures.counterCPM-DialogIDundefinedcounterautoresetСчетчик входящих занятий на cpm-dialog в домене
ecss10.sswДоменdirection_managerincoming_accepted_seizures.counterCPM-DialogIDundefinedcounterautoresetСчетчик принятых занятий на cpm-dialog в домене
ecss10.sswДоменdirection_managerincoming_rejected_seizures.counterCPM-DialogIDundefinedcounterautoresetСчетчик отклоненных по каким-либо причинам занятий на cpm-dialog в домене
ecss10.sswДоменdirection_manageractive_calls.histogramCPM-DialogIDundefinedhistogram
Гистограмма количества активных вызовов на cpm-dialog в домене
ecss10.sswДоменdirection_managerincoming_seizures.counterundefinedundefinedcounterautoresetОбщий счетчик входящих занятий в домене
ecss10.sswДоменdirection_managerincoming_accepted_seizures.counterundefinedundefinedcounterautoresetОбщий счетчик принятых занятий в домене
ecss10.sswДоменdirection_managerincoming_rejected_seizures.counterundefinedundefinedcounterautoresetОбщий счетчик отклоненных по каким-либо причинам занятий в домене

Модуль custom_cb_trike_task_service

SystemPrefixDomainSubsystemPrefixMetricNameVar1Var2MetricTypeOptionsОписание
ecss10.commonДоменcoreall_callbacks.countWidgetIdundefinedcounter
Счетчик запущенных и завершенных callback-ов с WidgetId в домене
ecss10.commonДоменcoresuccess_finished_callbacks.countWidgetIdundefinedcounter
Счетчик успешно завершенных callback-ов с WidgetId со статусом Cause(ISUP) в домене
ecss10.commonДоменcoreunsuccess_finished_callbacks.countWidgetIdCausecounter
Счетчик не успешно завершенных callback-ов с WidgetId со статусом Cause(ISUP) в домене
ecss10.commonДоменcoreunsuccess_finished_callbacks_by_client.countWidgetIdCausecounter
Счетчик не успешно завершенных из-за клиента callback-ов с WidgetId со статусом Cause(ISUP) в домене
ecss10.commonДоменcoreunsuccess_finished_callbacks_by_operator.countWidgetIdCausecounter
Счетчик не успешно завершенных из-за оператора callback-ов с WidgetId со статусом Cause(ISUP) в домене
ecss10.commonДоменcoreunsuccess_attempts_callback.countWidgetIdCausecointer
Счетчик не успешных попыток callback-а с WidgetId

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

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

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

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

МетрикаИмя в системе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 - Команды управления фильтрами произвольной вызывной статистики"