Как разобрать CDR Asterisk'а

Sufir

Я не волшебник, я только учусь
Кто-то из уважаемых (из не уважаемых тоже, за полезный ответ +1 к уважению) форумчан знаком с CDR Asterisk'а?

Сразу оговорюсь, доступа к самому астериску, конфигам и телефонам у меня нет, поэтому, к сожалению, поэкспериментировать и проанализировать непосредственно у меня возможности нет. CEL тоже нет, только одна табличка с CDR - нужно выжать максимум из него. Поэтому спрашиваю.

Собственно, кто-то может подсказать по формату и алгоритму формирования CDR? Или порекомендовать достаточно подробную и доступную статью или мануал? Что-то в мане по астериску информация не исчерпывающая и в гугле только копипасты с него...

Суть в чём, нужно получить все звонки на определённый номер. К примеру 2222. Допустим, если взять все записи где dst = 2222 - мы получим все непосредственные звонки на данный номер, я так понимаю? А как получить звонки переведённые с других внутренних телефонов или пришедшие из очереди?
Мне не важна история, откуда и как - нужна только информация, что в время N было соединение с номера X на номер 2222.
 

Ragazzo

TDD interested
Sufir
Дак ты все параметры логируешь в таблицу или нет? Могу у коллеги спросить если что, отпишусь в личку.
P.S. сомневаюсь что тут много астериксятников, лучше у них на форуме еще спроси)
 

Sufir

Я не волшебник, я только учусь
Не я логирую, дали табличку в постгресе с CDR и всё, я до вчерашнего дня и про астериск-то не слышал...
Астериск 1.8, CDR стандартный, со стандартным набором полей: https://wiki.asterisk.org/wiki/display/AST/PostgreSQL+CDR+Backend, accountcode не заполняется
 

MiksIr

miksir@home:~$
А что, переведенные не пишутся в CDR? Очереди вроде пишутся, а вот насчет переведенных... попробую подергать сегодня.
 

michelle

Новичок
CDR невсегда отражает полную инфу по звонку.

Поясняю, запись в CDR табличку летит только после того, как закончен разговор.
Ести пошел трансфер звонка - звонок невсегда прерывается и запись непоявляется.

В свое время эксперементировал с трансферами - получил CDR запись, что я звонил самому себе, хотя звонок реально прошел через 4-5 телефонов.

Очередь - вытаскивый данные из /var/log/asterisk/queue_log - парсинг этого лога даст много полезной инфы по прохождению звонка в очереди.

нужна только информация, что в время N было соединение с номера X на номер 2222
Примерно так (стандартные поля в базе):
calldate - время начала звонка
src - Номер А - кто звонил
dst - Номер Б - кому звонил
duration - общая продолжительность звонка
billsec - продолжительность чистого разговора - то есть абонент Б поднял трубку и говорит
disposition - Текст или код (ANSWERED/NO ANSWER/FAILED) - что произошло со звонком

Более точная инфа -
Дока по CDR полям на русском
Главный портал по докам астериска
 

Ragazzo

TDD interested
MiksIr
Насколько я понял пишуться но не все, т.е. там где есть Transfered те да, а некоторые не отлавливаются, очереди думаю по контексту можно выцеплять, но там же еще очереди(их логи) можно настраивать специфически чисто под астериск, т.е. не одним cdr обходиться а еще логом очередей.
 

Sufir

Я не волшебник, я только учусь
Да вот, что-то этой точной инфы вообще не густо как-то. Видимо тому кто хорошо знаком с самим астериском и его работой этого достаточно, а так вот, с нуля, с логами разобраться по этому невозможно совершенно.
Очередь - вытаскивый данные из /var/log/asterisk/queue_log - парсинг этого лога даст много полезной инфы по прохождению звонка в очереди.
Прохождение меня, как раз, не интересует абсолютно. Мне бы только конечные данные получить, что на номер Б было соединение с номером А в течение времени n. Если брать только по dst - получаются не все звонки. Значит нужно получать как-то ещё. Если я возму все записи с SIP/2222-00000001 с disposition = ANSWERED будет ли это то что мне нужно?
 

Ragazzo

TDD interested
Sufir
Если я возму все записи с SIP/2222-00000001 с disposition = ANSWERED будет ли это то что мне нужно?
Нет, эта запись просто обозначает что на номер 2222 через SIP и по этому каналу был вызов со статусом отвечено. Выложи сюда структуру своей cdr чтобы понятней было.
 

michelle

Новичок
А номер 2222 - это что за номер - обычный телефон или агент очереди?
И выложи строк 10 cdr - посмотрим что там происходит.
 

Sufir

Я не волшебник, я только учусь
2222 - это для примера. Это внутренние короткие номера, которые и нужно отслеживать.

Структура стандартная, по ману: https://wiki.asterisk.org/wiki/display/AST/PostgreSQL+CDR+Backend
PHP:
CREATE TABLE "public"."cdr_251" (
  "id" int4 DEFAULT nextval('cdr_251_id_seq'::regclass) NOT NULL,
  "calldate" timestamp(6) DEFAULT now() NOT NULL,
  "clid" varchar(80) DEFAULT ''::character varying NOT NULL,
  "src" varchar(80) DEFAULT ''::character varying NOT NULL,
  "dst" varchar(80) DEFAULT ''::character varying NOT NULL,
  "dcontext" varchar(80) DEFAULT ''::character varying NOT NULL,
  "channel" varchar(80) DEFAULT ''::character varying NOT NULL,
  "dstchannel" varchar(80) DEFAULT ''::character varying NOT NULL,
  "lastapp" varchar(80) DEFAULT ''::character varying NOT NULL,
  "lastdata" varchar(80) DEFAULT ''::character varying NOT NULL,
  "duration" int8 DEFAULT (0)::bigint NOT NULL,
  "billsec" int8 DEFAULT (0)::bigint NOT NULL,
  "disposition" varchar(45) DEFAULT ''::character varying NOT NULL,
  "amaflags" int8 DEFAULT (0)::bigint NOT NULL,
  "accountcode" varchar(20) DEFAULT ''::character varying NOT NULL, // Не заполняется
  "uniqueid" varchar(32) DEFAULT ''::character varying NOT NULL,
  "userfield" varchar(255) DEFAULT ''::character varying NOT NULL, // Не заполняется
CONSTRAINT "cdr_251_pkey" PRIMARY KEY ("id")
) WITH (OIDS=FALSE);
 

Вложения

michelle

Новичок
Я вижу много вхождений в очередь - может в этом весь прикол - звноки поступают в очередь и естественно в cdr невидны звонки на требуемый номер.

P.S. За то, что все звонки проходят через контекст default - руки вашему админу оборвать надо - потенциальная дыра для любителей позвонить нахаляву в экзотические страны.
P.P.S. Это не ваша тема?
 

Sufir

Я не волшебник, я только учусь
Наша. Это всё наша преле... тема. Так, я понимаю что максимум, что можно взять на данный момент, это записи где dst равен нужному нам номеру. Или и такие записи могут не являться реальными соединениями/разговорами?
 

michelle

Новичок
По dst - все правильно - это номер куда звонят. И смотри disposition.

Если звонок идет прямо на номер - поймать его можно в CDR.
Но если он заворачивается в очередь и там на него ответил нужный номер - это можно поймать только в /var/log/asterisk/queue_log
 

MiksIr

miksir@home:~$
А tcp доступа к астериску нет? Может смотреть в сторону коннекта к менеджеру и там уже логгировать те события, которые нужны?
 

michelle

Новичок
А tcp доступа к астериску нет? Может смотреть в сторону коннекта к менеджеру и там уже логгировать те события, которые нужны?
В CEL все есть, зачем изобретаь велосипед.
Дело в очередях - там могут пропадать звонки!
 

Ragazzo

TDD interested
michelle
у человека же только cdr. Звонки в очередях не пропадают, они просто логируются не там, ну по конексту же можно выцепить на крайний случай, т.е. по dcontext.
 

michelle

Новичок
Ragazzo
У него нет доступа и к tcp!

Вопрос к топикстартеру - как он узнал что звонков в cdr таблице меньше, чем было по факту?
Или он хотел подстраховаться что статистика неполная?
 

Sufir

Я не волшебник, я только учусь
Вопрос к топикстартеру - как он узнал что звонков в cdr таблице меньше, чем было по факту?
Он - это я, можно напрямую обращаться. Менеджеры и СТП сообщили, что не все звонки.

ну по конексту же можно выцепить на крайний случай, т.е. по dcontext.
Как? Да там почти везде default...

P.S.: Буду с админом говорить по поводу CEL.
 

Ragazzo

TDD interested
Sufir
Как? Да там почти везде default...
это тоже админу кстати скажи, как michelle говорил, а то странно что у вас все в контексте default да еще если и наружу смотрит.
 

michelle

Новичок
dcontext - это поле в базе! :)

Поговори с админом насчет звонков в контексте default - нельзя так!
Хотя .... если этот астериск стоит внутри наглухо закрытой сети, да еще передает звонки наружу через хорошо настроенный гейт - тогда можно и default.
Но без него - лучше и спокойнее!

Менеджеры и СТП сообщили, что не все звонки
Тогда однозначно - завнок попадает в очередь!
Так что проси админа чтобы была возможность парсить и queue_log! Скрипт лучше пиши сам! Или воспользуйся последним советом из Тема по queue

С CEL - в зависимости от детализации - можешь потонуть в данных. И точно не помню с какой версии asterisk ее ввели.
 
Сверху