Asterisk Queue/CDR Log Analyzer เป็นโปรแกรมอีกตัวหนึ่งซึ่งสามารถวิเคราะห์ Queues ได้แบบละเอียดลึกซึ้งมาก (ลึกซึ้งจริงๆ) ซึ่งท่านที่ใช้ Asterisk ทำ Call Center ไม่ว่าจะขนาดเล็กหรือขนาดใหญ่ก็ต้องรู้จัก Queues เป็นอย่างดีแล้วนะครับ สำหรับท่านที่ใช้ Elastix ผมก็มีบทความเกี่ยวกับ Queues ด้วยนะครับ นอกจากนั้นโปรแกรม Qnalyzer นี้ยังวิเคราะห์ CDR ได้ด้วยนะครับ
สำหรับการทำงานของโปรแกรม Qanalyzer นี้นะครับ มันจะไปอ่านทุกเหตุการ์ที่เกี่ยวข้องกับ Queues จากไฟล์ /var/log/asterisk/queue_log แล้วไรท์ข้อมูลลงดาต้าเบส และอ่าน CDR จากไฟล์ /var/lob/asterisk/csr-csv/Master.csv แล้วไรท์ลงดาต้าเบสเช่นเดียวกัน แต่คนละเทเบิล
โปรแกรมนี้ประกอบด้วย 3 ส่วนคือ Graph, CDR + Queue และ Loader โดยที่ Graph เอาไว้แสดงผลสถิติต่างๆในรูปแบบกราฟ ส่วน CDR+Queue เอาไว้อ่านข้อมูลจาก Queue Log และ CDR แล้วไรท์ลงดาต้าเบส ส่วน Loader เอาไว้รันเป็น Daemon เขียนด้วย Python
เอาหล่ะครับเรามาเริ่มติดตั้งโปรแกรม Qanalyzer กันเลยดีกว่า
1. ติดตั้งโปรแกรม Image_Graph
โปรแกรมนี้เอาไว้สร้างกราฟครับ ติดตั้งได้โดยใช้คำสั่ง "pear" บน CentOS ได้เลยครับ แต่อาจต้องติดตั้งโปรแกรมอื่นก่อนแล้วแต่ว่าโปรแกรมจะฟ้องว่าต้องติดตั้งโปรแกรมอะไรก่อน อันนี้เป็นการติดตั้งบนเครื่องที่่ผมใช้ทดสอบครับ
- โค้ด: เลือกทั้งหมด
pear channel-update pear.php.net
pear upgrade --force Archive_Tar
pear upgrade --force pear
pear install Numbers_Roman
pear install Numbers_Words-0.18.1
pear install Image_Color
pear install Image_Canvas-0.3.5
pear install Image_graph-0.8.0
2. ดาวนโหลดโปรแกรม Asterisk Queue/CDR Log Analyzer
เว็บไซต์ http://www.micpc.com/qloganalyzer
ไฟล์ Source Code http://www.micpc.com/qloganalyzer/qanalyzer.tar.gz
- โค้ด: เลือกทั้งหมด
cd /home
wget http://www.micpc.com/qloganalyzer/qanalyzer.tar.gz
หรือดาวน์โหลดจากเว็บบอร์ดนี้ครับ
- โค้ด: เลือกทั้งหมด
cd /home
wget http://www.voip4share.com/images/shared/qanalyzer.tar.gz
3. ติดตั้งโปรแกรม
ผมจะติดตั้งไว้ใน Root Directory ของ Apache Web Server นะครับคือที่ไดเร็คตอรี่หลัก /var/www/html
- โค้ด: เลือกทั้งหมด
tar xzvf qanalyzer.tar.gz -C /var/www/html
จะได้ไดเร็คตอรี่ย่อยชื่อ qanalyzer อยู่ภายใต้ไดเร็คตอรี่หลัก /var/ww/html
4. ติดตั้งดาต้าเบส Queue และ CDR
ท่านใดที่ได้ติดตั้งดาต้าเบส CDR ไว้แล้วจากบทความ Asterisk CDR MySQL หรือบทความ Asterisk-Stat ให้ไปที่ข้อ 4.2 ได้เลยครับ
4.1 ติดตั้ง CDR Database
4.1.1 สำหรับท่านที่ยังไม่เคยติดตั้ง Asterisk CDR Database มาก่อนเลย
แนะนำให้ติดตั้งก่อนครับ เพราะต้องทำหลายขั้นตอนเหมือนกัน โดยอ่านจากบทความนี้ Asterisk CDR MySQL
ซึ่งถ้าทำตามตัวอย่างเราก็จะได้ดาต้าเบสชื่อ asterisk_cdr ภายในมีเทเบิล cdr อยู่ และ User ที่จะเข้ามาใช้ดาต้าเบสนี้ชื่อว่า root และ Password คือ password
4.1.2 สำหรับท่านที่ติดตั้งแล้ว Asterisk CDR Database ไว้แล้ว
ให้สร้างอีก 1 เทเบิล ตั้งชื่อเป็น cdr2 ก็ได้ครับ เพื่อไม่ให้ข้อมูล CDR ไปปนกับเทเบิล cdr เดิม ดังนี้
สมมติว่าดาต้าเบสชื่อ asterisk_cdr ใช้ user=root และ password=password เข้านะครับ และสร้างดาต้าเบสชื่อ cdr2
- โค้ด: เลือกทั้งหมด
mysql -uroot -ppassword asterisk_cdr
ที่พร้อมท์ mysql> วางบรรทัดต่อไปนี้
- โค้ด: เลือกทั้งหมด
CREATE TABLE cdr2 (
id int(10) unsigned NOT NULL auto_increment,
billed datetime NOT NULL default '0000-00-00 00:00:00',
uniqueid varchar(32) NOT NULL default '',
userfield varchar(255) NOT NULL default '',
accountcode varchar(20) NOT NULL default '',
src varchar(80) NOT NULL default '',
dst varchar(80) NOT NULL default '',
dcontext varchar(80) NOT NULL default '',
clid 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 '',
calldate datetime NOT NULL default '0000-00-00 00:00:00',
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',
PRIMARY KEY (`id`)
);
ALTER TABLE `cdr2` ADD INDEX ( `calldate` );
ALTER TABLE `cdr2` ADD INDEX ( `dst` );
ALTER TABLE `cdr2` ADD INDEX ( `src` );
ALTER TABLE `cdr2` ADD INDEX ( `accountcode` );
4.2 ติดตั้ง Queue และ User Database
- โค้ด: เลือกทั้งหมด
cd /var/www/html/qanalyzer/install/loader
เราจะสร้างไว้ในดาต้าเบส asterisk_cdr เช่นเดิม
เปิดไฟล์ queuelog.sql
ค้นหาบรรทัด
USE asterisk;
แล้วเปลี่ยนเป็น USE asterisk_cdr;
บันทีกไฟล์แล้วอิมพอร์ตดาต้าเบส
- โค้ด: เลือกทั้งหมด
mysql -uroot -ppassword asterisk_cdr < queuelog.sql
เราก็จะได้เทเบิล queuelog และ users ซึ่งเทเบิล queuelog เอาไว้เก็บ Queue ที่โปรแกรมอ่านมาจากไฟล์ /var/log/asterisk/queuelog ส่วนเทเบิล users เอาไว้เก็บ User/Pass ที่จะใช้ล๊อกอินเข้าเว็บของโปรแกรม
5. แก้ไขข้อมูลที่จะคอนเน็คกับด้าต้าเบสในไฟล์สำคัญ
5.1 ไฟล์ /var/www/html/qanalyzer/install/cdr/cdrload.php
ไฟล์นี้จะโหลด CDR จากไฟล์ Master.csv ลงดาต้าเบส
- โค้ด: เลือกทั้งหมด
$locale_db_host = 'localhost';
$locale_db_name = 'asterisk_cdr';
$locale_db_login = 'root';
$locale_db_pass = 'password';
$logfile = "/var/log/asterisk/cdr-csv/Master.csv";
5.2 ไฟล์ /var/www/html/qanalyzer/install/loader/loadq.py
ไฟล์ loadq.py เป็น Python Script ซึ่งจะโหลดข้อมูลจาก Queue Log ลงดาต้าเบส แก้ไขข้อมูลที่จะคอนเน็คกับดาต้าเบสให้ถูกต้อง ดังนี้
- โค้ด: เลือกทั้งหมด
conn = MySQLdb.connect(host = "localhost",
user = "root",
passwd = "password",
db = "asterisk_cdr")
5.3 ไฟล์ /var/www/html/qanalyzer/includes/db_connect.php
- โค้ด: เลือกทั้งหมด
if(!isset($hn)) $hn = "localhost";
if(!isset($un)) $un = "root";
if(!isset($ps)) $ps = "password";
if(!isset($ut)) $ut = "users";
if(!isset($lt)) $lt = "queuelog";
if(!isset($ct)) $ct = "cdr2";
if(!isset($db)) $db = "asterisk_cdr";
6. รันสคริปต์เพื่อให้โหลดข้อมูล CDR และ Queue Log ลงดาต้าเบส
6.1 สำหรับ Queue Log
ไฟล์ที่จะทำหน้าที่นี้คือไฟล์ /var/www/html/qanalyzer/install/loader/loadq.sh ในไฟล์ก็มีข้อมูลแค่นี้ครับ
- โค้ด: เลือกทั้งหมด
#!/bin/bash
/var/www/html/qanalyzer/install/loader/loadq.py </var/log/asterisk/queue_log
tail -f -n 0 /var/log/asterisk/queue_log | /var/www/html/qanalyzer/install/loader/loadq.py &
ซึ่งบรรทัดแรกจะอ่านข้อมูล(เก่า)ในไฟล์ /var/log/asterisk/queue_log มาเก็บไว้ในดาต้าเบสก่อน จากนั้นบรรทัดที่ 2 ก็จะคอยดักเอาข้อความใหม่ที่เกิดในไฟล์ queue_log ไปเก็บในดาต้าเบส ไม่ต้องกลัวว่าข้อมูลจะซ้ำนะครับ เพราะ Script มันจะเช็คก่อน
ลองรัน Script นี้ดูครับ
- โค้ด: เลือกทั้งหมด
cd /var/www/html/qanalyzer/install/loader
chmod +x loadq.sh
./loadq.sh
สั่งรันแล้วต้องรอสักพักครับ เพราะว่า Script กำลังดึงข้อมูลและไรท์ลงดาต้าเบส รอจนเสร็จก็จะมีข้อความแจ้งคล้ายๆแบบนี้
69151 rows were inserted
ถ้ารันได้โดยไม่มีปัญหาอะไรก็แสดงว่าเวอร์คครับ ปัญหาส่วนใหญ่ที่รันไม่ได้คือ คอนเน็คกับดาต้าเบสไม่ได้เพราะว่าเราตั้งค่าผิด
6.2 สำหรับ CDR Log
รันไฟล์ /var/www/html/qanalyzer/install/cdr/cdrload.php ครับ แต่ก่อนที่จะรันไฟล์นี้ หากใครตั้งชื่อเทเบิลในข้อ 4.1.2 เป็น "cdr2" หรือชื่ออื่นที่ไม่ใช่ "cdr" ให้แก้ไขไฟล์ cdrload.php นี้ก่อนนะครับ ดังนี้
$locale_db_host = 'localhost';
$locale_db_name = 'asterisk_cdr';
$locale_db_login = 'root';
$locale_db_pass = 'password';
$logfile = "/var/log/asterisk/cdr-csv/Master.csv";
$sql="SELECT UNIX_TIMESTAMP(calldate) as calldate FROM cdr2 ORDER BY calldate DESC LIMIT 1";
$sql = "INSERT INTO cdr2 (calldate, clid, src, dst, dcontext, channel, dstchannel, lastapp,
แล้วก็สั่งรันด้วยคำสั่ง
- โค้ด: เลือกทั้งหมด
php /var/www/html/qanalyzer/install/cdr/cdrload.php
รอจนกว่าจะเสร็จครับ รันครั้งแรกกว่าจะเสร็จนานพอสมควรถ้าในไฟล์ Master.csv มีข้อมูลมาก แต่พอครั้งต่อไปก็ไม่นานเท่าไหร่ และไม่ต้องห่วงว่าข้อมูลจะซ้ำครับเพราะสคริปต์จะเช็ควันที่ก่อนอัพดาต้าเบส
7. การสั่งอัพเดทข้อมูลใหม่
เมื่อเราต้องการแสดงข้อมูลใหม่ ก็ต้องสั่งรันสคริปต์ loadq.sh ใหม่ สคริปต์นี้ก็จะเช็คไฟล์ CDR และ Queue Log ใหม่ แต่จะไร้ท์ลงดาต้าเบสเฉพาะข้อมูลใหม่เท่านั้นครับ และจะสังเกตัได้ว่ามันไม่ได้ทำงานแบบ Realtime ถ้าต้องการให้ทำงานแบบ Realtime ให้ดูหัวข้อต่อไปครับ
สาเหตุที่ดีฟอลท์โปรแกรมนี้ไม่ได้ทำงานแบบ Realtime ก็เพราะว่าปกติเวลาเราจะวิเคราะห์ Queue เราไม่ได้ทำกันบ่อยๆ หรือไม่ได้ดูแบบ Realtime การสรุปผลจะสรุปทุกวัน หรือทุกครึ่งวัน หรือถ้าต้องการถี่กว่านั้นก็ทุกชั่วโมง ปกติเราก็จะสั่งงานโดยใช้ Cron ครับ สมมติว่าต้องการทุก 1 ชั่วโมง ก็เขียน Cron แบบนี้
- โค้ด: เลือกทั้งหมด
crontab -e
ใส่บรรทัดนี้เพิ่ม
- โค้ด: เลือกทั้งหมด
#Asterisk Queue/CDR Analyzer Cron Job
*/30 * * * * /var/www/html/qanalyzer/install/loader/loadq.sh > /dev/null 2>&1
*/30 * * * * php /var/www/html/qanalyzer/install/cdr/cdrload.php > /dev/null 2>&1
ซึ่งก็จะดึงข้อมูลทุก 30 นาทีตามที่เราต้องการ
แต่ดึงทุกชั่วโมงนี่ก็ถี่ไปหน่อยนะครับ ถ้าไม่ต้องการข้อมูลเร่งด่วนก็น่าจะดึงวันละครั้งก็พอ เช่นตอนเที่ยงคืน
* 0 * * * /var/www/html/qanalyzer/install/loader/loadq.sh > /dev/null 2>&1
* 0 * * * php /var/www/html/qanalyzer/install/cdr/cdrload.php > /dev/null 2>&1
7. ติดตั้ง Graphic Library และ Font
7.1 ติดตั้ง gd graphic library และ php-gd
- โค้ด: เลือกทั้งหมด
yum -y install gd
และสำหรับการติดตั้ง php-gd ต้องให้สอดคล้องกับเวอร์ชั่นของ php ที่เราได้ติดตั้งอยู่นะครับ
7.2 ติดตั้ง True Type Font
ดีฟอลท์ CentOS รวมทั้ง Linux ตัวอื่นๆด้วยจะไม่รู้จัก True Type Font (ฟอนท์นามสกุล ttf) ของ Windows นะครับ ถ้าไม่ติดตั้งโปรแกรมเพิ่ม และโชคร้ายของเราตรงที่โปรแกรม Asterisk Queue/CDR Analyzer นี้มันใช้ True Type Font เขียนบนกราฟด้วย สวยงาม (ผมยังไม่เห็นของจริงเลย) แต่ถ้าสนใจแต่เฉพาะข้อมูลรายงานที่เป็นตัวหนังสือและตัวเลข ก็ไม่ต้องติดตั้ง TTF ก็ได้ครับ
เว็บ http://corefonts.sourceforge.net จะบอกรายละเอียดของการติดตั้ง TTF บน Linux
ผมสรุปให้แบบนี้ครับ ติดตั้งโปรแกรมอื่นเพิ่มเติม ดังนี้
- โค้ด: เลือกทั้งหมด
yum -y install freetype-devel libtool ttmkfdir chkfontpath
และอีก 2 โปรแกรมต้องติดตั้งเอง
Centos 5 i386
- โค้ด: เลือกทั้งหมด
wget http://www.voip4share.com/sources/cabextract-1.4-1.el5.rf.i386.rpm
CentOS 5 x86_64
- โค้ด: เลือกทั้งหมด
wget http://www.voip4share.com/sources/cabextract-1.4-1.el5.rf.x86_64.rpm
CentOS 6 i386
- โค้ด: เลือกทั้งหมด
wget http://www.voip4share.com/sources/cabextract-1.4-1.el6.rf.i686.rpm
CentOS 6 x86_64
- โค้ด: เลือกทั้งหมด
wget http://www.voip4share.com/sources/cabextract-1.4-1.el6.rf.x86_64.rpm
ติดตั้ง msttcorefonts สำหรับ CentOS 5 และ 6 ทั้ง i386 และ x86_64
- โค้ด: เลือกทั้งหมด
wget wget http://www.voip4share.com/sources/msttcorefonts-2.5-1.noarch.rpm
ปล. สำหรับโปรแกรม ttmkfdir และ chkfontpath ผมก็มีให้ด้วยนะครับเวอร์ชั่นใหม่กว่าติดตั้งจาก yum อีก ดาวน์โหลด ttmkfdir และ chkfontpath ได้เลย
หรือถ้าท่านที่อยากเอาไปทำเองผมก็มีไฟล์ .spec และ .srpm ให้ด้วยนะครับดังนี้ chkfontpath, ttmkfdir รายละเอียดวิธีการติดตั้งลองค้นดูในเน็ตครับ ถือถามผมก็ได้ เพราะถ้าผมเขียนบอกในนี้มันจะยืดยาวเกินไป
เมื่อติดตั้ง msttcorefonts ก็จะได้ไฟล์ True Type Fonts อยู่ในไดเร็คตอรี่ /usr/share/fonts/msttcorefonts ให้ทำ Symbolic Link เป็น /usr/share/pear/Image/Canvas/Fonts ตามนี้ครับ
- โค้ด: เลือกทั้งหมด
ln -s /usr/share/fonts/msttcorefonts /usr/share/pear/Image/Canvas/Fonts
cp /usr/share/pear/Image/Canvas/Fonts/verdana.ttf /usr/share/pear/Image/Canvas/Fonts/Verdana.ttf
บรรทัดที่ 2 เปลี่ยนชื่อไฟล์จาก verdana.ttf เป็น Verdana.ttf ครับ ไม่งั้นกราฟจะไม่มีตัวหนังสือ
7.3 รีสตาร์ท xfs
xfs เป็น Font server ครับ
- โค้ด: เลือกทั้งหมด
service xfs reload
7.4 เทสกราฟ
http://x.x.x.x/qanalyzer/install/graph/graph_test.php
ถ้าเห็นกราฟพร้อมตัวหนังสือแสดงว่าเวอร์คครับ (เห็นแต่กราฟก็ยังไม่เวอร์ค)
8. ดูรายงานจากเว็บ
http://x.x.x.x/qanalyzer
ดีฟอลท์ Username/Password คือ admin/admin ครับ
หน้าล๊อกอิน
หน้าหลัก
Queue: Call Complete By Caller
Queue: Call Entering Queue
Queue: Call Abandoned
9. เปลี่ยน Username/Password ล๊อกอินเข้าโปรแกรม
ตอนนี้โปรแกรม Asterisk Queue/CDR Analyzer นี้ยังเปลี่ยน Username/Password จากโปรแกรมไม่ได้นะครับ ถ้าต้องการเปลี่ยนต้องเข้าไปเปลี่ยนในดาต้าเบสเอง
- โค้ด: เลือกทั้งหมด
mysql -uroot -ppassword asterisk_cdr
ที่พร้อมท์ mysql> ให้ทำดังนี้
เปลี่ยนพาสเวอร์ด admin เป็น admin1234
- โค้ด: เลือกทั้งหมด
UPDATE asterisk_cdr.users SET password = 'admin1234' WHERE users.id =1;
เพิ่ม admin อีกคน
- โค้ด: เลือกทั้งหมด
INSERT INTO asterisk_cdr.users (id, userid, password, level, state) VALUES (NULL, 'kikka', 'kenji', '1', 'y');