CDR-Pusher
CDR-Pusher is a Go Application that will push your CDRs (Call Detail Record) from your Telco Switch (Asterisk, FreeSWITCH, Kamailio and other supported switches http://www.cdr-stats.org/pricing/switch-connectors/) to the centralised PostgreSQL Database CDR-Pusher on the CDR-Stats server.
Before starting this section, ensure you have Configured Postgresql for Remote Access on CDR-Stats
Install / Run
Install Golang dependencies (Debian/Ubuntu):
$ apt-get -y install mercurial git bzr bison
Install GVM to select which version of Golang you want to install:
$ bash < <(curl -s -S -L https://raw.githubusercontent.com/moovweb/gvm/master/binscripts/gvm-installer)
$ source /root/.gvm/scripts/gvm $ gvm install go1.4.2 –binary $ gvm use go1.4.2 –default
Make sure you are running by default Go version >= 1.4.2, check by typing the following:
$ go version
To install and run the cdr-pusher application, follow these steps:
$ mkdir /opt/app
$ cd /opt/app
$ git clone https://github.com/cdr-stats/cdr-pusher.git
$ cd cdr-pusher $ export GOPATH=`pwd`
$ make build
$ ./bin/cdr-pusher
The config file cdr-pusher.yaml is installed at the following location: /etc/cdr-pusher.yaml
Configuration File
Below is an example of the CDR-Pusher configuration file. Refer to the instructions for your switch type on how to configure the file. Config file /etc/cdr-pusher.yaml:
# CDR FETCHING - SOURCE
# ---------------------
# storage_source_type: DB backend type where CDRs are stored
# (accepted values: "sqlite3" and "mysql")
storage_source: "sqlite3"
# db_file: specify the database path and name
db_file: "/usr/local/freeswitch/cdr.db"
# Database DNS
# Use this with Mysql
db_dns: ""
# db_table: the DB table name
db_table: "cdr"
# db_flag_field defines the table field that will be added/used to track the import
db_flag_field: "flag_imported"
# max_fetch_batch: Max number of CDR to push in batch (value: 1-1000)
max_fetch_batch: 100
# heartbeat: Frequency of check for new CDRs in seconds
heartbeat: 1
# cdr_fields is list of fields that will be fetched (from SQLite3) and pushed (to PostgreSQL)
# - if dest_field is callid, it will be used in riak as key to insert
cdr_fields:
- orig_field: uuid
dest_field: callid
type_field: string
- orig_field: caller_id_name
dest_field: caller_id_name
type_field: string
- orig_field: caller_id_number
dest_field: caller_id_number
type_field: string
- orig_field: destination_number
dest_field: destination_number
type_field: string
- orig_field: hangup_cause_q850
dest_field: hangup_cause_id
type_field: int
- orig_field: duration
dest_field: duration
type_field: int
- orig_field: billsec
dest_field: billsec
type_field: int
# - orig_field: account_code
# dest_field: accountcode
# type_field: string
- orig_field: "datetime(start_stamp)"
dest_field: starting_date
type_field: date
# - orig_field: "strftime('%s', answer_stamp)" # convert to epoch
- orig_field: "datetime(answer_stamp)"
dest_field: extradata
type_field: jsonb
- orig_field: "datetime(end_stamp)"
dest_field: extradata
type_field: jsonb
# CDR PUSHING - DESTINATION
# -------------------------
# storage_dest_type defines where push the CDRs (accepted values: "postgres" or "riak")
storage_destination: "postgres"
# Used when storage_dest_type = postgres
# datasourcename: connect string to connect to PostgreSQL used by sql.Open
pg_datasourcename: "user=postgres password=password host=localhost port=5432 dbname=cdr-pusher sslmode=disable"
# Used when storage_dest_type = postgres
# pg_store_table: the DB table name to store CDRs in Postgres
table_destination: "cdr_import"
# Used when storage_dest_type = riak
# riak_connect: connect string to connect to Riak used by riak.ConnectClient
riak_connect: "127.0.0.1:8087"
# Used when storage_dest_type = postgres
# riak_bucket: the bucket name to store CDRs in Riak
riak_bucket: "cdr_import"
# switch_ip: leave this empty to default to your external IP (accepted value: ""|"your IP")
switch_ip: ""
# cdr_source_type: write the id of the cdr sources type
# (accepted value: unknown: 0, csv: 1, api: 2, freeswitch: 3, asterisk: 4, yate: 5, kamailio: 6, opensips: 7, sipwise: 8, veraz: 9)
cdr_source_type: 0
# SETTINGS FOR FAKE GENERATOR
# ---------------------------
# fake_cdr will populate the SQLite database with fake CDRs for testing purposes (accepted value: "yes|no")
fake_cdr: "no"
# fake_amount_cdr is the number of CDRs to generate into the SQLite database for testing (value: 1-1000)
# this amount of CDRs will be created every second
fake_amount_cdr: 1000Deployment
The CDR-Pusher application aims to be run as Service, it can easily be run by Supervisord.
Install Supervisord
Some Linux distributions offer a version of Supervisor that is installable through the system package manager. These packages may include distribution-specific changes to Supervisor:
$ apt-get install supervisor
Configure CDR-Pusher with Supervisord
Create an Supervisor conf file for cdr-pusher:
$ vim /etc/supervisor/conf.d/cdr-pusher-prog.conf
A supervisor configuration could look as follows:
[program:cdr-pusher] autostart=true autorestart=true startretries=10 startsecs = 5 directory = /opt/app/cdr-pusher/bin command = /opt/app/cdr-pusher/bin/cdr-pusher user = root redirect_stderr = true stdout_logfile = /var/log/cdr-pusher/cdr-pusher.log stdout_logfile_maxbytes=50MB stdout_logfile_backups=10
Make sure the directory to store the logs is created, in this case you should create ‘/var/log/cdr-pusher’:
$ mkdir /var/log/cdr-pusher
Supervisord Manage
Supervisord provides 2 commands, supervisord and supervisorctl:
supervisord: Initialize Supervisord, run configured processes
supervisorctl stop programX: Stop process programX. programX is config name in [program:mypkg]. supervisorctl start programX: Run the process.
supervisorctl restart programX: Restart the process.
supervisorctl stop groupworker: Restart all processes in group groupworker
supervisorctl stop all: Stop all processes. Notes: start, restart and stop won’t reload the latest configs.
supervisorctl reload: Reload the latest configs.
supervisorctl update: Reload all the processes where the config has changed.
Supervisord Service
You can also use supervisor using the supervisor service: $ /etc/init.d/supervisor start
Configure CDR-Pusher
Edit `/etc/cdr-pusher.yaml` Get started by configuring the CDR source, this is your original CDR backend, for instance on Asterisk this can be MySQL, SQlite or Postgresql. For Mysql & PostgreSQL you will need to configure the DNS too: https://github.com/go-sql-driver/mysql
Some of the settings to configure:
# storage_source_type: DB backend type where CDRs are stored # (accepted values: "sqlite3" and "mysql") storage_source: "mysql" # Database DNS db_dns: "root:password@/accounting"
Then configure the ‘CDR Pushing’ section, here you will need to define where the CDRs will go, this will ‘almost’ always be the ‘cdr-pusher’ database living on your CDR-Stats server. C
heck your CDR-Stats installation, you should find the Database settings for cdr-pusher database in settings_local.py
Some of the settings to configure:
# storage_dest_type defines where push the CDRs (accepted values: "postgres", "riak" or "both") storage_destination: "postgres" # Used when storage_dest_type = postgres pg_datasourcename: "user=postgres password=password host=localhost port=5432 dbname=cdr-pusher sslmode=disable"
Configure your Switch CDR with CDR-Pusher
You will need to configure CDR-Pusher and you Telco Switch to work together, for this we put some individual instructions for :
Configure FreeSWITCH with CDR-Stats and CDR-Pusher Configure
Asterisk with CDR-Stats and CDR-Pusher
Configure Kamailio with CDR-Stats and CDR-Pusher
Restart Supervisord
After changes in CDR-Pusher configuration you will need to restart supervisord, you can do so with gently with: /etc/init.d/supervisor stop /etc/init.d/supervisor start
Troubleshooting
An easy way to verify that CDR-Stats is running smoothly, it’s by looking at the logs. Find the import log activity on CDR-Stats at:
tail -f /var/log/cdr-stats/djcelery_error.log
Find the import log activity on CDR-Pusher at:
tail -f /var/log/cdr-pusher/cdr-pusher.log
Check out the CDR-Stats Database ‘import_cdr’ to see realtime import:
python manage.py dbshell –database=import_cdr
Now go on to configure the CDR-Pusher for your switch type:
Configure CDR-Pusher for Asterisk Configure CDR-Pusher for Freeswitch Configure CDR-Pusher for KamailioOther Switch Connectors