Описание работы HMED-M
Демон Приложение HMED-M (Hydra Mediation – Mediation— Mediation) является ядром предбиллинга. Его задачей является обработка поступающих с коллектора разобранных CDR по заданным правилам.
Обработка происходит в процессоре обработчике по цепочке фильтров. После завершения обработки результат проверяется валидаторами.
Основные настройки
Помимо общих настроек доступны следующие параметры:
Code Block | ||
---|---|---|
| ||
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 |
...
Фильтр последовательно проверяет значение поля на соответствие каждому регулярному выражению из карты соответствий. При первом соответствии, значение поля заменяется на новое (в случае, если новое значение является выражением, оно вычисляется при загрузке демоназапуске приложения).
Параметры:
- field – поле CDR, значение которого требуется изменить;
- map – карта соответствий "регулярное выражение – новое значение" «регулярное выражение — новое значение» (см. пример настройки фильтров).
...
Цепочки фильтров задаются тем же образом, что и цепочка фильтров в процессореобработчике.
Параметры:
- if – условие (выражение);
- then – цепочка фильтров, выполняемая в случае выполнения условия;
- else – цепочка фильтров, выполняемая в случае невыполнения условия; , необязательный параметр.
Пример настройки фильтров
Code Block | ||
---|---|---|
| ||
filters: # тип фильтра set: # спецификация фильтра short_trunk_a_name: # условие выполнения фильтра condition: $cdr.trunk_a.like?('^C\d+') # обращение к полю CDR field: $trunk_a # установка локальной переменной value: $cdr.trunk_a[0:6].upper() short_trunk_b_name: condition: $cdr.trunk_b.like?('^C\d+') field: $trunk_b value: $cdr.trunk_b[0:6].upper() full_trunk_a_name: condition: $trunk_a.empty?() field: $trunk_a value: $cdr.trunk_a.upper() full_trunk_b_name: condition: $trunk_b.empty?() field: $trunk_b value: $cdr.trunk_b.upper() route_a_by_trunk_a: field: route_a value: $const.routes[$trunk_a] or $const.pltelco_route # использование констант route_b_by_trunk_b: field: route_b value: $const.routes[$trunk_b] or $const.pltelco_route route_b_to_primelink: condition: $cdr.route_a != $const.pltelco_route and $cdr.route_b != $const.pltelco_route field: route_b value: $const.pltelco_route replace: # Правилаправила замены префиксов по транкам station_a_by_trunk: # использование локальной переменной $trunk_a, установленной в set-фильтре condition: $cdr.station_a.length().in?($const.short_numbers_length) and $trunk_a.in?($const.station_a_replacements_by_trunks) field: station_a map: - '^92144^52144': '749992244781192244' - '^92139^52139': '749578739781178739' - '^921627^521627': '74957976277811797627' - '^921389': '7495981389' - '^921942': '7495517942' - '^921360': '7495741360' - '^921701': '7495741701' - '^921779': '7495741779' - '^921789': '7495741789' - '^921195': '7495510195' - '^921213': '7495514213' - '^921460': '7495600460' - '^921470': '7495600470' - '^921402': '7495728402' - '^921147': '7495730147' - '^921988': '7495739988' - '^921991': '7495739991' - '^921280': '7495580280' - '^921080': '7495981080' - '^96784': '749996784' - '^44': '749992244781192244' - '^39': '749578739781178739' - '^627': '7495797627' - '^389': '7495981389' - '^1942': '7495517942' - '^360': '7495741360' - '^701': '7495741701' - '^779': '7495741779' - '^789': '7495741789' - '^195': '7495510195' - '^213': '7495514213' - '^460': '7495600460' - '^470': '7495600470' - '^402': '7495728402' - '^147': '7495730147' - '^988': '7495739988' - '^991': '7495739991' - '^280': '7495580280' - '^080': '7495981080' leading_8_in_short_station_a: condition: $cdr.station_a.length() == $const.short_number_length field: station_a map: - '^8': 7 leading_8_in_long_station_b: condition: $cdr.station_b.length() >= $const.number_length field: station_b map: - '^8': 7 leading_8_in_short_station_b: condition: $cdr.station_b.length() == $const.short_number_length field: station_b map: - '^8': 7 if: station_a_length_is_7: if: $cdr.station_a.length() == 7 then: - if/pltelco_short_number pltelco_short_number: if: $cdr.station_a.starts_with?('922322') and $route_a == $const.pl_route # условие then: # цепочка фильтров в случае выполнения условия - prepend/station_a_with('74998199') else: # цепочка фильтров в случае невыполнения условия - replace/station_a_by_trunk prepend: pltelco_922819_station_a_with_74993221: condition: $cdr.station_a.length() == 7 and $route_a == $const.pl_route and $cdr.station_a.starts_with?('922819') field: station_a string: 74993221 pltelco_922819_station_b_with_74993221: condition: $cdr.station_b.length() == 7 and $cdr.station_b.starts_with?('922819') field: station_b string: 74993221 tiny_numbers_in_station_b_with_74953222: condition: $cdr.station_b.length() == 2 or $cdr.station_b.length() == 3 field: station_b string: 74953222 |
Настройка
...
обработчиков
Code Block | ||
---|---|---|
| ||
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/pltelco_922819_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_datetimebegin call_end: $cdr.call_end service_code: "'M200AS-15'" |
Настройка валидации
Code Block | ||
---|---|---|
| ||
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: M200AS-15 # проверка значения (только для строк) ... |
В случае, если CDR не проходит валидацию, она попадает в выходную очередь CDR, обработанных с ошибкой.