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

You are viewing an old version of this page. View the current version.

Compare with Current View Page History

« Previous Version 39 Next »

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

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

Обработка проходит несколько этапов:

  1. Получение CDR — производится с помощью коллекторов. Для одного типа коллектора можно задать несколько спецификаций. Каждая спецификация коллектора связана с парсером для передачи ему на разбор полученных CDR.
  2. Разбор CDR — производится парсерами. Для одного типа парсера можно задать несколько спецификаций.
  3. Отправка обработанной CDR в выходную очередь, которая является входной для HMED-M. Имеется возможность задать несколько выходных очередей. В случае, если CDR была разобрана с ошибкой, она отправляется в отдельные выходные очереди.

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

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

# настройки точек назначения обработанных CDR
destinations:
  amqp:
    mediation:
      # выходная очередь обработанных CDR во входную очередь HMED-M
      # значение должно совпадать со значением настройки sources.amqp.mediation.consumer в конфигурации HMED-M
      producer: amqp/mediation
    error:
      # выходная очередь CDR, обработанных с ошибкой
      producer: amqp/error

# выходы для разобранных CDR
handlers:
  default:
    destinations:
      # список выходных очередей CDR; задаются из точек назначения, описанных в секции destinations, в формате тип/спецификация
      - amqp/mediation
  error:
    destinations:
      # список выходных очередей CDR, обработанных с ошибкой
      - amqp/error

# обрабатывающие процессы
workers:
  # процесс collector реализует файловый коллектор со спецификацией switch
  # спецификации коллекторов задаются в секции collectors, описанной ниже
  - collector: file/switch

Настройка сбора CDR из файлов

Предположим, CDR, поступающие с АТС, сохраняются в файлы с именем в формате cdr_12345.log в директории /cdr.

В таком случае коллектор нужно настроить следующим образом:

/etc/hydra/hmed/collecting/collectors/collector.yml
collectors:
  # файловые коллекторы
  file:
	# спецификация коллектора
    switch:
	  # спецификация парсера для разбора прочитанных CDR
      parser: plain/switch_2
      # спецификации путей к файлам CDR
      paths:
        - directory: /var/cdr/ # путь к файлам с CDR
          filename_pattern: ^cdr_\d+\.log$ # регулярное выражение, соответствующее формату имени файлов с CDR

Для того, чтобы CDR собирались из нескольких директорий или по разным шаблонам имен файлов, в секции paths задается несколько спецификаций.

Коллектор реагирует на событие create файловой системы, таким образом обработка файла с CDR начинается немедленно после его создания.

Настройка парсинга CDR

Допустим, файл с CDR имеет следующий вид:

файл CDR
C2905117 4999224453 C2505821 84997242904 31-01-12 18:58:10 4 16
C2905111 4999224453 C2505808 84957491303 31-01-12 18:56:25 108 16
C2905118 4999224453 C2505822 84952589899 31-01-12 18:58:12 0 21

Каждая CDR начинается с новой строки и содержит поля: транк А, номер А, транк Б, номер Б, дата и время звонка, кол-во секунд и код причины завершения вызова.

Для разбора файла такого вида используются следующие параметры конфигурации:

/etc/hydra/hmed/collecting/parsers/parser.yml
parsers:
  plain:
    # спецификация парсера
    switch_2:
      cdr_delimiter: "\n" # разделитель между CDR в файле (символ новой строки)
      preprocessors:
		# предобработчики строки перед разбором
        - type: trim # обрезание краевых символов
          direction: left # край строки, возможные значения: left, right, both
          char: ' ' # символ
        - type: substring # взятие подстроки ('test' -> 'es')
          begin: 1 # начальная позиция (будет обрезан первый символ строки)
          end: -1 # конечная позиция (значение -1 означает, что подстрока будет взята до предпоследнего символа строки)
      records:
        - matcher:
			# регулярное выражение для разбора CDR на поля
            #        1      2             3     4           5                                     6     7
            #        trk_a  station_a     trk_b station_b   day    month year  hour minute second dur   status
            pattern: ^(\w+) (\d+|-)[^\s]* (\w+) (\d+)[^\s]* (\d{2}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}) (\d+) (\d+)$
          fields:
            map:
              # соответствие полей CDR и строки, разобранной регулярным выражением
			  # первое поле $g1, второе $g2 и т.д.
			  # подстановка $g0 содержит всю строку
              trunk_a: $g1
              station_a: $g2
              trunk_b: $g3
              station_b: $g4
              call_datetime: $g5
              duration_sec: int($g6) # приведение к целому числу
              termination_code: $g7
        - matcher:
            min_length: 50 # для тех CDR, которые не удовлетворяют первому регулярному выражению и имеют длину >= 50 символов
          fields:
            delimeter: '\s+' # используем разделитель для получения полей (поддерживаются регулярные выражения)
            map:
              trunk_a: $f1 # первое поле в массиве строк после разбиения исходной строки
              station_a: $f2 # второе поле и т. д.
              trunk_b: $f3
              station_b: $f4
              call_datetime: $f5
              duration_sec: int($f6)
              termination_code: $f7
              entire_cdr: $f0 # в переменной $f хранится вся строка с CDR

Таким образом на выходе коллектора получатся разобранные CDR в формате JSON вида:

Разобранная CDR
[
  {trunk_a: 'C2905117',
   station_a: '4999224453',
   trunk_b: 'C2505821',
   station_b: '84997242904',
   call_datetime: '31-01-2012 18:58:10',
   duration_sec: 4,
   termination_code: '16'},
  ...
]
  • No labels