Asterisk CDR - Статистика звонков
CDR - детализированный отчет вызовов. Лог вызовов через ODBC: MySQL, PostgreSQL, TDS и др.
Детализированные отчеты о звонках используются для выставления счетов (биллинг),
анализа объемов голосового трафика или для отладки Asterisk.
Call Detail Records
Поля CDR записей
R/O - поле только для чтения, нет записи функцией
CDR
Option | Value/Example | Notes |
---|
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 |
Помимо поля 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.
ForkCDR: Разделить запись CDR текущего канала .
NoCDR: Не сохранять CDR для текущего вызова.
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
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:alsa.conf
В итоге, следующее событие отобразится в 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 и пользовательские переменные, если требуется.
<spoiler>
[master]
table = cdr
;
; List the column names to use when inserting CDRs.
;
columns => calldate, clid, dcontext, channel, dstchannel, lastapp, lastdata,
duration, billsec, disposition, amaflags, accountcode, uniqueid, userfield,
test
;
; Map CDR contents to the previously specified columns.
;
values => '${CDR(start)}','${CDR(clid)}','${CDR(dcontext)}','${CDR(channel)}',
'${CDR(dstchannel)}','${CDR(lastapp)}','${CDR(lastdata)}','${CDR(duration)}',
'${CDR(billsec)}','${CDR(disposition)}','${CDR(amaflags)}',
'${CDR(accountcode)}','${CDR(uniqueid)}','${CDR(userfield)}','${CDR(test)}'
In the cdr_sqlite3_custom.conf file, the contents of the columns and values options must each be on a single line.
</spoiler>
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