Описание работы HMED-M
Приложение HMED-M (Hydra Mediation — Mediation) является ядром предбиллинга. Его задачей является обработка поступающих с коллектора разобранных CDR по заданным правилам.
Обработка происходит в обработчике по цепочке фильтров. После завершения обработки результат проверяется валидаторами.
Основные настройки
Помимо общих настроек доступны следующие параметры:
sources: amqp: mediation: # входная очередь разобранных CDR # значение должно совпадать с выходной очередью HMED-C consumer: amqp/mediation destinations: amqp: ocs: # выходная очередь обработанных CDR # обработанные CDR передаются в тарификатор (HOCS) producer: amqp/ocs error: # выходная очередь CDR, обработанных с ошибкой producer: amqp/error handlers: default: destinations: # список выходных очередей - amqp/ocs error: destinations: # список выходных очередей для CDR, обработанных с ошибкой - amqp/error constants: # константы, доступные для использования в спецификациях фильтров через переменную $consts number_length: 11 routes: # константа может быть хэшем C26052: COMSTAR C26053: COMSTAR skip_trunks_b: # или массивом - C30052 - C30055 - C30056 workers: # список процессов, запускаемых приложением - processor: base/switch # процесс использует обработчик base со спецификацией switch
Настройка фильтров
Описание фильтров
Для всех фильтров, кроме условного доступен необязательный параметр condition, содержащий условие выполнения. Если условие не выполняется, фильтр пропускается.
Фильтр установки значений (set)
Фильтр используется для установки значения поля CDR или локальной переменной.
Параметры:
- field – поле CDR или локальная переменная; локальные переменные начинаются с символа $;
- value – значение.
Фильтр замены (replace)
Фильтр используется для изменения значения поля, в частности подходит для замены префиксов.
Фильтр последовательно проверяет значение поля на соответствие каждому регулярному выражению из карты соответствий. При первом соответствии, значение поля заменяется на новое (в случае, если новое значение является выражением, оно вычисляется при запуске приложения).
Параметры:
- field – поле CDR, значение которого требуется изменить;
- map – карта соответствий «регулярное выражение — новое значение» (см. пример настройки фильтров).
Фильтр добавления префикса (prepend)
Фильтр используется для добавления префикса полю CDR.
Параметры:
- field – поле CDR для добавления префикса;
- string – префикс для добавления в начале строки.
Фильтр пропуска (skip)
Фильтр используется для пропуска CDR, не несущих полезных данных.
При выполнении условия condition, фильтр завершает обработку CDR. Пропущенная CDR не попадает в выходную очередь.
Условный фильтр (if)
Фильтр используется для выполнения определенной цепочки фильтров в случае выполнения заданного условия. В случае невыполнения условия, фильтр выполняет другую цепочку.
Цепочки фильтров задаются тем же образом, что и цепочка фильтров в обработчике.
Параметры:
- if – условие (выражение);
- then – цепочка фильтров, выполняемая в случае выполнения условия;
- else – цепочка фильтров, выполняемая в случае невыполнения условия, необязательный параметр.
Пример настройки фильтров
Настройка обработчиков
processors: base: # спецификация обработчика switch: # валидатор (тип/спецификация) validator: base/main # цепочка фильтров filters: - skip/if_duration_is_0 # тип/спецификация - set/short_trunk_a_name - set/full_trunk_a_name - set/route_a_by_trunk_a - replace/dash_in_station_a_with_zeros - if/station_a_length_is_7 - prepend/telco_819_station_a_with_7499 # в скобках передаются аргументы, доступные в фильтре через переменную $args # $args[1] - первый аргумент, $args[2] - второй и т.д. - prepend/station_a_with('7495') - prepend/station_a_with('7') - replace/leading_string_in_station_a('8495', '7495') - replace/cut_international_prefix_in_station_b ... map: # поля выходной CDR, формируемой после обработки # эти поля проверяются валидатором trunk_a: $cdr.trunk_a trunk_b: $cdr.trunk_b route_a: $cdr.route_a route_b: $cdr.route_b station_a: $cdr.station_a station_b: $cdr.station_b duration_sec: $cdr.duration_sec termination_code: $cdr.termination_code call_begin: $cdr.call_begin call_end: $cdr.call_end service_code: "'AS-15'"
Настройка валидации
validators: base: # спецификация валидатора main: fields: call_begin: # проверяемое поле type: float # тип значения (integer - целое число, float - десятичная дробь, string - строка) required: true # признак обязательности присутствия поля в CDR station_a: type: string required: true length: # проверка длины строки min: 11 max: 15 service_code: type: string required: true value: AS-15 # проверка значения (только для строк) ...
В случае, если CDR не проходит валидацию, она попадает в выходную очередь CDR, обработанных с ошибкой.