Asterisk CDR - Статистика звонков
CDR - детализированный отчет вызовов. Лог вызовов через ODBC: MySQL, PostgreSQL, TDS и др. Детализированные отчеты о звонках используются для выставления счетов (биллинг), анализа объемов голосового трафика или для отладки Asterisk.
Call Detail Records
CDR: Описание полей
- R/O - поле только для чтения, нет записи функцией CDR
Поле | Значение/Пример | Описание |
---|---|---|
accountcode | 54321 | Код аккаунта присвоенный абоненту, для биллинга например. По умолчанию не задан. |
src | 8129981138 | Идентификатор вызывающего абонента(Caller ID). Источник вызова, сохраняется автоматически. R/O |
dst | 111 | Пункт назначения вызова.Вызываемое расширение диалплана. |
dcontext | from-internal | Контекст назначения обработки вызова. auto, R/O |
clid | "Olegus" <81239981138> | Caller ID вызывающего абонента в полном формате - "name" <number>. auto, R/O |
channel | SIP/0004F2040808-a1bc23ef | Канал инициатор вызова. A-leg(side).auto, R/O |
dstchannel | SIP/0004F2046969-9786b0b0 | Канал назначения вызова. B-Leg(side).auto, R/O |
lastapp | Dial | Приложение обработки вызова выполненное последним в канале. auto, R/O |
lastdata | SIP/0004F2046969,30,tT | Данные (например 'Dial(данные)') приложения выполненного последним.auto, R/O |
start | 2016-05-27 12:02:00 | Время поступления вызова вызова. auto, R/O |
answer | 2016-05-27 12:02:15 | Время ответа на вызов абонентом или ответ приложения. auto, R/O |
end | 2016-05-27 12:08:15 | Время окончания соединения.Hangup. auto, R/O |
duration | 195 | Общая продолжительность вызова в секундах.auto, R/O |
billsec | 180 | Продолжительность соединения в секундах с момента ответа(снятия трубки или выполнения команды Answer в диалплане).auto, R/O |
disposition | ANSWERED | Состояние обработки вызова. Может быть: NO ANSWER, FAILED, BUSY, ANSWERED или UNKNOWN. |
amaflags | DOCUMENTATION | Automatic Message Accounting (AMA) flag. значения: OMIT, BILLING, DOCUMENTATION или Unknown. |
userfield | custom | Пользовательское поле. Пусто по умолчанию, назначается в диалплане. set(CDR(userfield)=<value>). R/W |
uniqueid | 1288332400.1 | Уникальный идентификатор канала. R/O |
Примерная схема таблицы CDR
CREATE TABLE cdr ( calldate datetime NOT NULL default '0000-00-00 00:00:00', clid varchar(80) NOT NULL default '', src varchar(80) NOT NULL default '', dst varchar(80) NOT NULL default '', dcontext varchar(80) NOT NULL default '', channel varchar(80) NOT NULL default '', dstchannel varchar(80) NOT NULL default '', lastapp varchar(80) NOT NULL default '', lastdata varchar(80) NOT NULL default '', duration int(11) NOT NULL default '0', billsec int(11) NOT NULL default '0', disposition varchar(45) NOT NULL default '', amaflags int(11) NOT NULL default '0', accountcode varchar(20) NOT NULL default '', uniqueid varchar(32) NOT NULL default '', userfield varchar(255) NOT NULL default '', did varchar(255) NOT NULL default '', recordingfile varchar(255) NOT NULL default '' )ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
Помимо поля userfield вы можете создавать собственные CDR переменные или модифицировать стандартные.
Поля CDR записей могут быть назначены в диалплане Asterisk функцией CDR(). Функция CDR() также может быть использована для установки полей CDR, которые определяются пользователем.
exten => 177,1,Verbose(Call start time: ${CDR(start)}) same => n,Set(CDR(userfield)=red_eyes)
Также можно добавить собственные поля:
exten => 177,1,NoOp() same => n,Set(CDR(mycustomfield)=greentea) same => n,Verbose(I need some more ${CDR(mycustomfield)})
Если создано кастомное поле CDR, в базе данных тоже потребуется дополнительное поле.
Приложения и функции CDR
Команды и функции диалплана для работы с CDR.
- Asterisk app: ForkCDR: Разделить запись CDR текущего канала .
- Asterisk app: NoCDR: Не сохранять CDR для текущего вызова.
- Asterisk app: ResetCDR: Сбросить CDR для текущего канала.
- function 'CDR': Задать пользовательское значение CDR в канале. Не работает для Read Only полей CDR.
cdr.conf
Содержит общие (глобальные) параметры CDR и конфигурацию бакендов cdr_scv и cdr_radius.
Файл конфигурации cdr.conf
Option | Value/Example | Notes |
---|---|---|
enable | yes | Включить лог CDR. По умолчанию включено. |
unanswered | no | Сохранять или нет информацию о неотвеченных вызовах. Не касается внешних вызовов. О них сохраняется полная информация, независимо от значения данной опции. |
endbeforehexten | no | Закрыть и сохранить запись CDR до выполнения расширения 'h' (hangup). Если значение - 'no', закрытие CDR произойдет, только по завершению всех шагов диалплана. Если - 'yes', при завершении вызова, независимо от того продолжается выполнение диалплана в контексте или нет |
initiatedseconds | no | По умолчанию 'billsec' вычисляется, просто как разница 'end' минус 'answer' в секундах. Включение опции initiatedseconds=yes, укажет Asterisk использовать точные значения до микросекунд |
batch | no | Записывать CDR группой, вместо записи каждого вызова отдельно. Снижает нагрузку на Asterisk. Зависит от перечисленных ниже опций. |
size | 100 | Кол-во строк CDR в буфере, при достижении которого, будет произведена запись. |
time | 300 | Предел времени хранения данных в буфере. Запись будет произведена, независимо от порога строк в буфере, заданного параметром size. |
scheduleronly | no | Set whether CDR batch processing should be done by spawning a new thread, or within the context of the CDR batch scheduler. The default value is no, and we recommend not changing it. |
safeshutdown | yes | Блокировать остановку Asterisk, пока буфер не очищен (данные сохранены).Предотвращает потерю данных, при корректном выключении Asterisk. |
backends
Модули баз данных предоставляют различные бакенды для записи CDR. Все они требуют специфических настроек.
Проверка подключенных backends: CLI>cdr show status
Call Detail Record (CDR) settings ---------------------------------- Logging: Enabled Mode: Simple Log unanswered calls: No Log congestion: No * Registered Backends ------------------- mysql Adaptive ODBC cdr-custom
cdr_adaptive_odbc
Как следует из названия, модуль cdr_adaptive_odbc сохраняет CDR в базу данных через ODBC.
«adaptive» в данном случае означает, что она пытается приспособиться к структуре таблицы: нет статической структуры таблиц, которые должны быть использованы с этим модулем.
Когда модуль загружен (или при перезагрузке), он читает структуру таблицы. Он ищет имя столбца, которому соответствует переменная CDR.
Это относится как к встроенным CDR переменным, так и к пользовательским переменным.
Например, чтобы передавать данные из встроенной переменной CDR channel, в таблице базы данных должен быть столбец channel.
пример:
Добавим в кастомную CDR переменную useragent значение равное номеру SIP телефона.
exten ⇒ 177,n,Set(CDR(useragent)=${CHANNEL(useragent)})
Чтобы данные переменной useragent были занесены через cdr_adaptive_odbc, надо создать столбец useragent в БД.
В файле конфигурации cdr_adaptive_odbc можно создать множество таблиц. Имя секции может быть любым, модуль не использует его. Вот пример простой конфигурации таблицы:
[mytable] connection = asterisk table = asterisk_cdr alias start => calldate
Option | Value/Example | Notes |
---|---|---|
connection | asterisk | База данных. Параметры соединения настраиваются в Asterisk: res_odbc.conf. Обязательный параметр. |
table | asterisk_cdr | Имя таблицы БД. Обязательное поле. |
usegmtime | no | Использовать время GMT вместо локального времени. По умолчанию -'no'. |
В дополнение к вышеперечисленным опциям cdr_adaptive_odbc.conf, можно задать ещё несколько.
Обычно, CDR ищет столбец соответствующий имени переменной. Параметр alias позволяет соотнести имя переменной с отличным от него именем столбца.
alias <CDR variable> => <column name>
Например:
alias src => source
Также, можно отфильтровать определенное содержимое.
filter <CDR variable> => <content>
Например:
filter accountcode => 321
И наконец, можно добавить статические данные, дополнительно к поступающим из CDR.
static <"Static Content Goes Here"> => <column name>
Например:
static "My Data" => my_id
cdr_csv
Модуль cdr_csv простейший бакенд, сохраняющий CDR данные в CSV файл, разделяя запятой.
Конфигурация находится в файле cdr.conf
Для работы не требует конфигурации, тем не менее есть несколько параметров:
Option | default | Notes |
---|---|---|
usegmtime | no | Сохранять время GMT вместо локального. По умолчанию - no. |
loguniqueid | no | Сохранять uniqueid переменную CDR. По умолчанию - no |
loguserfield | no | Сохранять userfield CDR переменную . По умолчанию - 'no'. |
accountlogs | yes | Создавать отдельный csv файл для каждой переменной accountcode. По умолчанию - yes. |
Порядок CDR переменных в CSV файле созданном модулем CDR_CSV:
<accountcode>,<src>,<dst>,<dcontext>,<clid>,<channel>,<dstchannel>,<lastapp>, <lastadata>,<start>,<answer>,<end>,<duration>,<billsec>,<disposition>, <amaflags>[,<uniqueid>][,<userfield>]
cdr_custom
Данный модуль используется для создания пользовательского (custom) CSV файла.
Конфигурационный файл модуля cdr_custom.conf.
Единственная секция [mappings] может быть использована в этом файле. Шаблон задается с помощью функций диалплана Asterisk.
В следующем примере cdr_custom создает файл /var/log/asterisk/cdr-custom/Master.csv. Шаблон использует функции function 'CDR'() для извлечения значений и function 'CSV_QUOTE'() обеспечивающую правильное форматирование CSV файла (${CSV_QUOTE(${CDR(lastdata)})}).
[mappings] Master.csv => ${CSV_QUOTE(${CDR(clid)})},${CSV_QUOTE(${CDR(src)})}, ${CSV_QUOTE(${CDR(dst)})},${CSV_QUOTE(${CDR(dcontext)})}, ${CSV_QUOTE(${CDR(channel)})},${CSV_QUOTE(${CDR(dstchannel)})}, ${CSV_QUOTE(${CDR(lastapp)})},${CSV_QUOTE(${CDR(lastdata)})}, ${CSV_QUOTE(${CDR(start)})},${CSV_QUOTE(${CDR(answer)})}, ${CSV_QUOTE(${CDR(end)})},${CSV_QUOTE(${CDR(duration)})}, ${CSV_QUOTE(${CDR(billsec)})},${CSV_QUOTE(${CDR(disposition)})}, ${CSV_QUOTE(${CDR(amaflags)})},${CSV_QUOTE(${CDR(accountcode)})}, ${CSV_QUOTE(${CDR(uniqueid)})},${CSV_QUOTE(${CDR(userfield)})}
cdr_manager
Модуль cdr_manager интерпретирует данные CDR, как события Asterisk Manager Interface (AMI).
Конфигурационный файл - cdr_manager.conf.
Первая секция [general] содержит единственную опцию enabled, по умолчанию = no.
[general] enabled = yes
Следующая секция cdr_manager.conf это [mappings]. Здесь назначается пользовательская CDR переменная передаваемая менеджеру Asterisk.
<CDR variable> => <Header name>
пример:
[mappings]
rate => Rate carrier => Carrier
В данной конфигурации заданные переменные появятся как события в интерфейсе менеджера.
Источником событий станет следующий диалплан:
exten => 177,1,Answer() same => n,Set(CDR(rate)=0.03) same => n,Set(CDR(carrier)=BВ&С) same => n,Hangup()
Следующая команда инициирует вызов:
*CLI> console dial 177@test
В итоге, следующее событие отобразится в Asterisk Call ManagerFinally:
Event: Cdr Privilege: cdr,all AccountCode: Source: Destination: 177 DestinationContext: test CallerID: Channel: Console/dsp DestinationChannel: LastApplication: Hangup LastData: StartTime: 2016-05-23 08:29:21 AnswerTime: 2016-05-23 08:29:22 EndTime: 2016-05-23 08:29:23 Duration: 0 BillableSeconds: 0 Disposition: ANSWERED AMAFlags: DOCUMENTATION UniqueID: 1383680051.3 UserField: Rate: 0.03 Carrier: BВ&С
cdr_mysql
Файл конфигурации - cdr_mysql.conf
Данный модуль для сохранения CDR в MySQL. В новых системах рекомендуется, по возможности, использовать модуль cdr_adaptive_odbc.
cdr_odbc
Файл конфигурации - cdr_odbc.conf
Модуль для сохранения CDR через ODBC драйвер. В новых системах рекомендуется, по возможности, использовать модуль cdr_adaptive_odbc.
cdr_pgsql
Файл конфигурации - cdr_pgsql.conf
Модуль для сохранения CDR в базу данных PostgreSQL. В новых системах рекомендуется, по возможности, использовать модуль cdr_adaptive_odbc.
cdr_radius
cdr_radius бакенд связывает CDR с Radius сервером.
Используется конфигурационный файл cdr.conf в секции [radius].
Option | Value/Default | Notes |
---|---|---|
usegmtime | yes | Сохранять время GMT вместо локального. |
loguniqueid | yes | Сохранять uniqueid переменную CDR. |
loguserfield | yes | Сохранять userfield CDR переменную. |
radiuscfg | /etc/radiusclient-ng/radiusclient .conf | Местоположение конфигурационного файла radiusclient-ng. |
cdr_sqlite
Устарело. Используйте cdr_sqlite3_custom.
cdr_sqlite3_custom
CDR бакенд для сохранения данных в SQLite БД версии 3. База данных создается модулем, как /var/log/asterisk/master.db
Данный модуль использует конфигурационный файл cdr_sqlite3_custom.conf.
Конфигурация указывает имя таблицы CDR и пользовательские переменные, если требуется.
cdr_syslog
Сохраняет CDR используя syslog linux. Чтобы включить данную возможность, сперва добавьте запись в конфиг syslog, /etc/syslog.conf.
Например:
local.* /var/log/asterisk/asterisk-cdr.log
Конфигурационный файл Asterisk - cdr_syslog.conf:
[cdr] facility = local priority = info template = "Вызов от ${CDR(src)}"
пример записи syslog, для приведенной конфигурации:
cat /var/log/asterisk/asterisk-cdr.log
Sep 17 18:15:57 pbx cdr: «Вызов от 8129981138»
cdr_tds
Конфигурационный файл - cdr_tds.conf
cdr_tds модуль использует FreeTDS библиотеку для отправки CDR Microsoft SQL Server или Sybase БД.
FreeTDS возможно использовать с unixODBC, так что конфигурация может быть сделана и в cdr_adaptive_odbc.