Описание работы HMED-M
Демон Приложение HMED-M (Hydra 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 |
Настройка фильтров
...
Настройка фильтров
Описание фильтров
Для всех фильтров, кроме условного доступен необязательный параметр condition, содержащий условие выполнения. Если условие не выполняется, фильтр пропускается.
Фильтр установки значений (set)
Фильтр используется для установки значения поля CDR или локальной переменной.
Параметры:
- field – поле CDR или локальная переменная; локальные переменные начинаются с символа $;
- value – значение.
Фильтр замены (replace)
Фильтр используется для изменения значения поля, в частности подходит для замены префиксов.
Фильтр последовательно проверяет значение поля на соответствие каждому регулярному выражению из карты соответствий. При первом соответствии, значение поля заменяется на новое (в случае, если новое значение является выражением, оно вычисляется при запуске приложения).
Параметры:
- field – поле CDR, значение которого требуется изменить;
- map – карта соответствий «регулярное выражение — новое значение» (см. пример настройки фильтров).
Фильтр добавления префикса (prepend)
Фильтр используется для добавления префикса полю CDR.
Параметры:
- field – поле CDR для добавления префикса;
- string – префикс для добавления в начале строки.
Фильтр пропуска (skip)
Фильтр используется для пропуска CDR, не несущих полезных данных.
При выполнении условия condition, фильтр завершает обработку CDR. Пропущенная CDR не попадает в выходную очередь.
Условный фильтр (if)
Фильтр используется для выполнения определенной цепочки фильтров в случае выполнения заданного условия. В случае невыполнения условия, фильтр выполняет другую цепочку.
Цепочки фильтров задаются тем же образом, что и цепочка фильтров в обработчике.
Параметры:
- 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.telco_route # использование констант
route_b_by_trunk_b:
field: route_b
value: $const.routes[$trunk_b] or $const.telco_route
route_b_to_primelink:
condition: $cdr.route_a != $const.telco_route and $cdr.route_b != $const.telco_route
field: route_b
value: $const.telco_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:
- '^52144': '781192244'
- '^52139': '781178739'
- '^521627': '7811797627'
- '^44': '781192244'
- '^39': '781178739'
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/telco_short_number
telco_short_number:
if: $cdr.station_a.starts_with?('322') and $route_a == $const.pl_route # условие
then:
# цепочка фильтров в случае выполнения условия
- prepend/station_a_with('8199')
else:
# цепочка фильтров в случае невыполнения условия
- replace/station_a_by_trunk
prepend:
telco_819_station_a_with_3221:
condition: $cdr.station_a.length() == 7 and $route_a == $const.pl_route and $cdr.station_a.starts_with?('819')
field: station_a
string: 3221
telco_819_station_b_with_3221:
condition: $cdr.station_b.length() == 7 and $cdr.station_b.starts_with?('819')
field: station_b
string: 3221
tiny_numbers_in_station_b_with_3222:
condition: $cdr.station_b.length() == 2 or $cdr.station_b.length() == 3
field: station_b
string: 3222 |
Настройка обработчиков
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_begin 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: AS-15 # проверка значения (только для строк)
... |
В случае, если CDR не проходит валидацию, она попадает в выходную очередь CDR, обработанных с ошибкой.