Asterisk CDR - Call Detail Records - Детализированный отчет о звонках
CDR - детализированный отчет о звонках. Лог вызовов через ODBC: MySQL, PostgreSQL, TDS и др. Детализированные отчеты о звонках используются для выставления счетов (биллинг), анализа объемов голосового трафика или для отладки Asterisk.
Поля CDR записей
- R/O - read only
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 | Продолжительность соединения в секундах с момента ответа(снятия трубки или выполнения команды Asterisk app: 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
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переменным, так и к пользовательским переменным.
Например, чтобы передавать данные из встроенной переменной CDRchannel, в таблице базы данных должен быть столбец 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 | База данных. Параметры соединения настраиваются в 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.