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 28 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
 
handlers:
  default:
    destinations:
      # список выходных очередей CDR
      - amqp/mediation
  error:
    destinations:
      # список выходных очередей CDR, обработанных с ошибкой
      - amqp/error
 
workers:
  - collector: file/switch # файловый коллектор со спецификацией switch; можно задать несколько разных коллекторов

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

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

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

conf/local/collecting/collectors/default.yml
collectors:
  # файловые коллекторы
  file:
	# спецификация коллектора
    switch:
	  # спецификация парсера для разбора прочитанных CDR
      parser: plain/switch_2
      # спецификации путей к файлам CDR
      paths:
        - directory: /tmp/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 начинается с новой строки и содержит поля: транк А, номер А, транк Б, номер Б, дата и время звонка, кол-во секунд и код статуса.

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

conf/lcoal/collecting/parsers/default.yml
parsers:
  plain:
    # спецификация парсера
    switch_2:
      cdr_delimiter: "\n" # разделитель между CDR в файле (символ новой строки)
      preprocessors:
		# предобработчики строки перед разбором
        - type: trim # обрезание пробельных символов
          direction: left # край строки
          char: ' ' # пробельный символ
        - type: substring # взятие подстроки
          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 и т.д.
              trunk_a: $g1
              station_a: $g2
              trunk_b: $g3
              station_b: $g4
              call_datetime: $g5
              duration_sec: int($g6) # приведение к целому числу
              termination_code: $g7

Таким образом на выходе коллектора получатся разобранные 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