Страницы

CUCM CDR Explaind по-русски

Вроде и ничего сложного, а вопросы всё поступают.. Итак CDR explained по-русски :).

Затравка

Для начала ссылка на Википедию, где говорится, что CDR – это сервис, обеспечивающий журналирование работы телекоммуникационного оборудования. Обычно (и Cisco в этом не исключение) CDR-запись представляет собой текстовый файл, содержащий различные данные о каждом (не)состоявшемся вызове. Прошу заметить, что CDR не сможет выставлять ежемесячные (и еженедельные тоже) денежно-временные лимиты на платные направления или работать в качестве pre-paid биллинга, зато позволяет анализировать активность абонентов пост-фактум, делать прогнозы, определять самых разговорчивых сотрудников (ознакомьтесь также с CAR – CDR Analysis and Reporting) и т.д.

Запускаем CDR

Если мы все поняли и все равно решили познакомиться/пощупать CDR-файлы, то:
Поднимем FTP-сервер, например Filezilla.

Укажем FTP-сервер в CUCM:
Cisco Unified Serviceability -> Tools -> CDR Management -> Add new
В Directory Path нужно указать хотя бы "/" (заливать файлы в корневой каталог)

Укажем как часто выкладывать CDR-файлы на (S)FTP (по умолчанию каждую минуту)
System -> Enterprise Parameters -> CDR File Time Interval Required Field

Запустим CDR на всех Call-processing серверах
Cisco Unified CM Administration -> System -> Service Parameters -> Сервер -> Cisco CallManager:
– CDR Enabled Flag -> True – включим CDR
– CDR Log Calls with Zero Duration Flag -> True
– включим учет несостоявшихся звонков и звонков длительностью меньше секунды

Удивляемся CDR'ам

Ощущаем власть всевидящего ока до тех пор, пока не заглянем в содержимое CDR-файла:
"cdrRecordType","globalCallID_callManagerId","globalCallID_callId","origLegCallIdentifier","dateTimeOrigination","origNodeId","origSpan","origIpAddr","callingPartyNumber","callingPartyUnicodeLoginUserID","origCause_location","origCause_value","origPrecedenceLevel","origMediaTransportAddress_IP","origMediaTransportAddress_Port","origMediaCap_payloadCapability","origMediaCap_maxFramesPerPacket","origMediaCap_g723BitRate","origVideoCap_Codec","origVideoCap_Bandwidth","origVideoCap_Resolution","origVideoTransportAddress_IP","origVideoTransportAddress_Port","origRSVPAudioStat","origRSVPVideoStat","destLegIdentifier","destNodeId","destSpan","destIpAddr","originalCalledPartyNumber","finalCalledPartyNumber","finalCalledPartyUnicodeLoginUserID","destCause_location","destCause_value","destPrecedenceLevel","destMediaTransportAddress_IP","destMediaTransportAddress_Port","destMediaCap_payloadCapability","destMediaCap_maxFramesPerPacket","destMediaCap_g723BitRate","destVideoCap_Codec","destVideoCap_Bandwidth","destVideoCap_Resolution","destVideoTransportAddress_IP","destVideoTransportAddress_Port","destRSVPAudioStat","destRSVPVideoStat","dateTimeConnect","dateTimeDisconnect","lastRedirectDn","pkid","originalCalledPartyNumberPartition","callingPartyNumberPartition","finalCalledPartyNumberPartition","lastRedirectDnPartition","duration","origDeviceName","destDeviceName","origCallTerminationOnBehalfOf","destCallTerminationOnBehalfOf","origCalledPartyRedirectOnBehalfOf","lastRedirectRedirectOnBehalfOf","origCalledPartyRedirectReason","lastRedirectRedirectReason","destConversationId","globalCallId_ClusterID","joinOnBehalfOf","comment","authCodeDescription","authorizationLevel","clientMatterCode","origDTMFMethod","destDTMFMethod","callSecuredStatus","origConversationId","origMediaCap_Bandwidth","destMediaCap_Bandwidth","authorizationCodeValue","outpulsedCallingPartyNumber","outpulsedCalledPartyNumber","origIpv4v6Addr","destIpv4v6Addr","origVideoCap_Codec_Channel2","origVideoCap_Bandwidth_Channel2","origVideoCap_Resolution_Channel2","origVideoTransportAddress_IP_Channel2","origVideoTransportAddress_Port_Channel2","origVideoChannel_Role_Channel2","destVideoCap_Codec_Channel2","destVideoCap_Bandwidth_Channel2","destVideoCap_Resolution_Channel2","destVideoTransportAddress_IP_Channel2","destVideoTransportAddress_Port_Channel2","destVideoChannel_Role_Channel2","IncomingProtocolID","IncomingProtocolCallRef","OutgoingProtocolID","OutgoingProtocolCallRef","currentRoutingReason","origRoutingReason","lastRedirectingRoutingReason","huntPilotPartition","huntPilotDN","calledPartyPatternUsage","IncomingICID","IncomingOrigIOI","IncomingTermIOI","OutgoingICID","OutgoingOrigIOI","OutgoingTermIOI","outpulsedOriginalCalledPartyNumber","outpulsedLastRedirectingNumber"
INTEGER,INTEGER,INTEGER,INTEGER,INTEGER,INTEGER,INTEGER,INTEGER,VARCHAR(50),VARCHAR(128),INTEGER,INTEGER,INTEGER,INTEGER,INTEGER,INTEGER,INTEGER,INTEGER,INTEGER,INTEGER,INTEGER,INTEGER,INTEGER,VARCHAR(64),VARCHAR(64),INTEGER,INTEGER,INTEGER,INTEGER,VARCHAR(50),VARCHAR(50),VARCHAR(128),INTEGER,INTEGER,INTEGER,INTEGER,INTEGER,INTEGER,INTEGER,INTEGER,INTEGER,INTEGER,INTEGER,INTEGER,INTEGER,VARCHAR(64),VARCHAR(64),INTEGER,INTEGER,VARCHAR(50),UNIQUEIDENTIFIER,VARCHAR(50),VARCHAR(50),VARCHAR(50),VARCHAR(50),INTEGER,VARCHAR(129),VARCHAR(129),INTEGER,INTEGER,INTEGER,INTEGER,INTEGER,INTEGER,INTEGER,VARCHAR(50),INTEGER,VARCHAR(2048),VARCHAR(50),INTEGER,VARCHAR(32),INTEGER,INTEGER,INTEGER,INTEGER,INTEGER,INTEGER,VARCHAR(32),VARCHAR(50),VARCHAR(50),VARCHAR(64),VARCHAR(64),INTEGER,INTEGER,INTEGER,INTEGER,INTEGER,INTEGER,INTEGER,INTEGER,INTEGER,INTEGER,INTEGER,INTEGER,INTEGER,VARCHAR(32),INTEGER,VARCHAR(32),INTEGER,INTEGER,INTEGER,VARCHAR(50),VARCHAR(50),INTEGER,VARCHAR(50),VARCHAR(50),VARCHAR(50),VARCHAR(50),VARCHAR(50),VARCHAR(50),VARCHAR(50),VARCHAR(50)
1,1,3248,24720560,1368432257,1,0,269156618,"2001","",0,0,4,269156618,19932,6,20,0,0,0,0,0,0,"0","0",24720561,1,0,34341130,"2002","2002","",0,16,4,34341130,27558,6,20,0,0,0,0,0,0,"0","0",1368432262,1368432267,"2002","9f1296dd-249b-47ea-9ee8-dbbff954fb2f","devices","devices","devices","devices",5,"SEPC8F9F9D691CA","SEP5C501544120A",0,12,0,0,0,0,0,"StandAloneCluster",0,"","",0,"",3,3,0,0,64,64,"","","","10.1.11.16","10.1.12.2",0,0,0,0,0,0,0,0,0,0,0,0,0,"",0,"",0,0,0,"","",2,"","","","","","","",""

Разбираемся с CDR

Однако на самом деле всё довольно просто: для каждого вызова создается всего одна текстовая строчка (хотя, возможно, бывают ситуации и с несколькими строками, не буду обманывать), несущая всю необходимую информацию. Причем для каждого значения есть подробное описание от Cisco. Чтобы не быть голословными давайте заполучим CDR Admin Guide в несколько кликов:

cisco.com/go/support ->
-> Voice and Unified Communications ->
-> Manager (CallManager) 8.6 ->
-> Maintain and Operate Guides ->
-> Cisco Unified Communications Manager Call Detail Records Administration Guide 8.6(1)

Очень интересная страничка CDR Field Descriptions подробно описывает все поля CDR-файла. Например:
dateTimeConnect, dateTimeDisconnect – время соединения и разъединения абонентов соответственно. Прошу заметить, что время указывается в UTC (The time gets stored as UTC) и в секундах с 1 января 1970 года (пруфлинк, где указано как перевести количество секунд в удобоваримый вид с помощью Excel). Также нашел ссылку на самописный UCMcdr crawler by Patrick Geschwindner (запасная ссылка) на странице learningnetwork.cisco.com (не пользовался).

Заключительный аккорд

Ну и, наконец, сводная табличка выборочных интересных параметров:
dateTimeOrigination Время начала вызова 13.05.2013 14:04:17 13.05.2013 14:04:29 13.05.2013 14:04:37 13.05.2013 14:04:51
callingPartyNumber Кто звонит 2001 2001 2002 2002
origCause_value Причина разъединения (0 если трубку положил тот, кому звонили) 0 16 0 16
originalCalledPartyNumber Кому звонит (после translation pattern) 2002 2002 2001 2001
finalCalledPartyNumber До кого дозвонился (после всех Forward) 2002 2002 2001 2001
destCause_value Причина разъединения (0 если трубку положил тот, кто звонил) 16 0 16 0
dateTimeConnect Время начала общения (0, если трубку никто не снял) 13.05.2013 14:04:22 0 13.05.2013 14:04:42 0
dateTimeDisconnect Время окончания разговора 13.05.2013 14:04:27 13.05.2013 14:04:36 13.05.2013 14:04:47 13.05.2013 14:04:57
lastRedirectDn Именно с него произошел последний Forward звонка 2002 2002 2001 2001
duration Длительность разговора (0, если меньше 1 или разговора не было) 5 0 5 0

Для конвертации даты/времени в Excel использовал вот такую формулу:
=IF(C1=0;"0";C1/86400+DATE(1970;1;1)+TIME(6;;))

Источники и ссылки:

CDR Administration Guide
Что за цифры вместо даты/времени и как их перевести?
Сообщение со ссылкой на UCMcdr crawler
Сам UCMcdr crawler или вот так, а ещё лучше так, или даже так
CDR на Вики
Для обработки CDR (платные, не пользовался): Биллинговый комплекс TariscopeWinTariff (пишите в комментах, добавлю еще).

11 комментариев:

  1. Спасибо за статейку! Как раз пытаюсь вникнуть в то что пишет CDR, а тут попалась ваша статья, мне ее как раз не хватало.

    ОтветитьУдалить
  2. спасибо!
    но нен совсем понятно куда всавлять формулу... пробовал..ничего не получается

    ОтветитьУдалить
    Ответы
    1. Добрый день,
      Если дата/время из CDR находится в столбце C, то вставляем формулу в любой другой столбец, например в D и "растягиваем" формулу на все необходимые строки. Если дата/время в другом столбце, то необходимо подправить формулу - заменить C на необходимый столбец.

      Удалить
  3. Cсылка на UCMcdr crawler битая, кто нибудь может поделится рабочей?

    ОтветитьУдалить
    Ответы
    1. Попробуйте вот эту: https://dl.dropboxusercontent.com/u/53426117/PermLinks/UCMcdr.exe

      Удалить
    2. Есть возможность обновить ссылку? Очень нужна прога. Спасибо!

      Удалить
    3. Согласен, присоединяюсь. Прога нужна. Ссылка не работает(

      Удалить
    4. Благодаря Владимиру Иванову программка UCMcdr нашлась :).
      На всякий случай вот дополнительная ссылка https://drive.google.com/open?id=0B8GgVsQ0wE8aZHIxNFBOY2MwUFE

      Удалить
  4. Этот комментарий был удален автором.

    ОтветитьУдалить
  5. нашел, вот ссылка
    https://cp.sync.com/dl/571897a70#tcnbp9bd-vc5gvqt5-j3ksydk7-mza2xryv

    ОтветитьУдалить
  6. при попытке открыть файл логов в UCMcdr выдается ошибка
    https://ibb.co/k6Rkmd

    ОтветитьУдалить