HMED-C занимается сбором и парсингом 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_12345.log в директории /tmp/cdr.
В таком случае коллектор нужно настроить следующим образом:
collectors:
# файловые коллекторы
file:
# спецификация коллектора
switch:
# спецификация парсера для разбора прочитанных CDR
parser: plain/switch_2
# спецификации путей к файлам CDR
paths:
- directory: /tmp/cdr/ # путь к файлам с CDR
filename_pattern: ^cdr_\d+\.log$ # регулярное выражение, соответствующее формату имени файлов с CDR |
Для того, чтобы CDR собирались из нескольких директорий или по разным шаблонам имен файлов, в секции paths задается несколько спецификаций.
Коллектор реагирует на событие create файловой системы, таким образом обработка файла с CDR начинается немедленно после его создания.
Допустим, в качестве АТС используется М200. Файл с CDR будет иметь примерно следующий вид:
C2905117 4999224453 C2505821 84997242904 31-01-12 18:58:10 4 16 |
Каждая CDR начинается с новой строки и содержит поля: транк А, номер А, транк Б, номер Б, дата и время звонка, кол-во секунд и код статуса.
Для разбора файла такого вида используются следующие параметры конфигурации:
parsers:
plain:
# спецификация парсера
switch_2:
# разделитель между CDR в файле (символ новой строки)
cdr_delimiter: "\n"
preprocessors:
# предобработчики строки перед разбором
- type: substring
begin: 1
end: -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 вида:
[
{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'},
...
] |
В секции preprocessors доступны следующие предобработчики: