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
The config file cdr-pusher.yaml is installed at the following location: /etc/cdr-pusher.yaml
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: 1000
The CDR-Pusher application aims to be run as Service, it can easily be run by 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 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.
You can also use supervisor using the supervisor service: $ /etc/init.d/supervisor start
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 :
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
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