Page tree
Skip to end of metadata
Go to start of metadata

Описание работы HMED-M

Приложение HMED-M (Hydra Mediation — Mediation) является ядром предбиллинга. Его задачей является обработка поступающих с коллектора разобранных CDR по заданным правилам.

Обработка происходит в обработчике по цепочке фильтров. После завершения обработки результат проверяется валидаторами.

Основные настройки

Помимо общих настроек доступны следующие параметры:

conf/local/mediation/default.yml
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 – цепочка фильтров, выполняемая в случае невыполнения условия, необязательный параметр.

Пример настройки фильтров

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

 

Настройка обработчиков

conf/local/mediation/default.yml
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'"

Настройка валидации

conf/local/mediation/default.yml
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, обработанных с ошибкой.

  • No labels