Thursday, November 21, 2024

[Asterisk] Lưu Trữ Dữ Liệu queue_log vào MySQL

-

Đây là một hướng dẫn về cách chuyển dữ liệu từ file queue_log của Asterisk vào MySQL. Thông tin về cách thực hiện điều này đã được đăng trên internet ở nhiều nơi, nhưng hầu hết đều đã lỗi thời đáng kể. Trong dự án nâng cấp Asterisk của mình, mình muốn không chỉ dữ liệu CDR được ghi vào MySQL mà còn dữ liệu từ file queue_log của Asterisk. Đối với những người không quen thuộc với queue_log và bài viết này có lẽ không có ý nghĩa với bạn, nó là file queue_log mà Asterisk sử dụng để lưu trữ dữ liệu cuộc gọi về cuộc gọi mà nhập vào hàng đợi. Nó được lưu tại đường dẫn /var/log/asterisk/queue_log.

Trước hết, bạn cần một DB MySQL và bạn cần cài đặt các gói asterisk-addons và asterisk-addons-mysql. Nếu bạn sử dụng CentOS hoặc RHEL, bạn có thể sử dụng yum install asterisk-addons asterisk-addons-mysql để cài đặt các gói, giả sử bạn đã cấu hình kho lưu trữ yum của Digium thì hãy chạy lệnh dưới để cài đặt các module này.

yum install asterisk-addons asterisk-addons-mysql -y

Khi bạn đã cài đặt các tiện ích mở rộng (addons), bước tiếp theo bạn muốn thực hiện là tạo CSDL để lưu trữ dữ liệu từ queue_log của Asterisk. Có hai cấu trúc bảng riêng biệt mà bạn có thể chọn. Cấu trúc đầu tiên mặc định là ghi dữ liệu bổ sung liên quan đến cuộc gọi hàng đợi vào một trường trong CSDL. Cá nhân mình nghĩ làm như vậy là ngu ngốc. Nếu bạn có mình năm trường dữ liệu, tại sao bạn lại lưu trữ nó trong một trường cho mỗi mục nhập trong CSDL? Hãy tách nó ra. May mắn thay, có người khác cũng nghĩ về điều đó và có một tùy chọn không được tài liệu ghi chú mà bạn có thể sử dụng để làm điều đó.

Hãy thêm thông tin về điều đó như sau:

Giả sử bạn muốn sử dụng hình thức dữ liệu rõ ràng và tách biệt hơn, đây là cấu trúc bảng của mình:

USE asterisk;

CREATE TABLE queue_log (
  id int(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  time char(26) default NULL,
  callid varchar(32) NOT NULL default '',
  queuename varchar(32) NOT NULL default '',
  agent varchar(32) NOT NULL default '',
  event varchar(32) NOT NULL default '',
  data1 varchar(100) NOT NULL default '',
  data2 varchar(100) NOT NULL default '',
  data3 varchar(100) NOT NULL default '',
  data4 varchar(100) NOT NULL default '',
  data5 varchar(100) NOT NULL default '',
  PRIMARY KEY (`id`)
);

Sau khi bạn đã tạo bảng trong CSDL, các bước tiếp theo liên quan đến việc thay đổi cấu hình của máy chủ Asterisk.

Trong file /etc/asterisk/res_config_mysql.conf, bạn cần chỉnh sửa phần [general] để định hướng nó tới CSDL MySQL. Thông tin trong phần [general] sẽ cho biết Asterisk nơi để kết nối và lấy dữ liệu từ CSDL MySQL.

Ví dụ dưới đây mình đặt dbhost thành địa chỉ IP của máy chủ MySQL, dbname là tên CSDL MySQL bạn muốn sử dụng, dbuserdbpass là tên người dùng và mật khẩu để truy cập CSDL MySQL của bạn, dbport là cổng MySQL (thông thường là 3306), và requirements để cài đặt cách Asterisk xử lý khi gặp lỗi.

[general]
dbhost = 192.168.13.200
dbname = asterisk
dbuser = hoanghd
dbpass = Hoanghd164
dbport = 3306
requirements=warn

Trong file /etc/asterisk/logger.conf, bạn cần thay đổi dòng queue_log_to_file từ no thành yes. Điều này sẽ làm cho queue_log được ghi vào trong /var/log/asterisk, ngay cả khi nó ghi đến các nơi khác ví dụ trường hợp này là MySQL. Điều này quan trọng để đảm bảo queue_log luôn được lưu trữ trong log.

Ngay dưới dòng queue_log_to_file, bạn nên thêm dòng queue_adaptive_realtime = yes. Tùy chọn queue_adaptive_realtime không được ghi chú trong tài liệu và file cấu hình của Asterisk nhưng nó là tùy chọn quan trọng giúp tách dữ liệu thành nhiều trường trước khi ghi vào CSDL.

Trong /etc/asterisk/extconfig.conf, bạn cần bỏ dấu (#) ở trước dòng queue_log => mysql,general. Điều này là để kích hoạt việc sử dụng queue_log để ghi vào cả CSDL MySQL chứ không phải chỉ lưu trữ trong log.

Những thay đổi này giúp Asterisk chuyển dữ liệu từ file queue_log vào CSDL MySQL và lưu trữ dữ liệu một cách cấu trúc trong CSDL để dễ dàng truy vấn và phân tích dữ liệu về cuộc gọi hàng đợi.

Sau khi bạn đã thực hiện tất cả các thay đổi như đã hướng dẫn, bạn cần khởi động lại dịch vụ Asterisk bằng lệnh “core restart now”. Sau khi Asterisk đã khởi động lại, nếu bạn gõ “reload”, bạn sẽ thấy thông báo sau trên màn hình điều khiển (CLI):

asterisk*CLI> reload
  == Parsing '/etc/asterisk/extconfig.conf':   == Found
  == Binding queue_log to mysql/general/queue_log
  == Parsing '/etc/asterisk/logger.conf':   == Found
       > Found column 'id' of type 'int(10) unsigned'
       > Found column 'time' of type 'char(26)'
       > Found column 'callid' of type 'varchar(32)'
       > Found column 'queuename' of type 'varchar(32)'
       > Found column 'agent' of type 'varchar(32)'
       > Found column 'event' of type 'varchar(32)'
       > Found column 'data1' of type 'varchar(100)'
       > Found column 'data2' of type 'varchar(100)'
       > Found column 'data3' of type 'varchar(100)'
       > Found column 'data4' of type 'varchar(100)'
       > Found column 'data5' of type 'varchar(100)'
 Asterisk Queue Logger restarted

Điều này chỉ ra rằng bạn đã thành công trong việc cấu hình Asterisk để sử dụng MySQL để lưu trữ dữ liệu từ queue_log. Nếu có vấn đề gì xảy ra, bạn có thể kiểm tra file /var/log/asterisk/messages để xem thông báo lỗi. Thường thì bạn sẽ thấy các thông báo lỗi như sau, trừ khi bạn cũng đang sử dụng file cấu hình res_config_mysql.conf để định nghĩa các tham số cho Kiến trúc RealTime của Asterisk:

[Mar 27 16:45:26] WARNING[3575] res_config_mysql.c: MySQL RealTime: No database user found, using 'asterisk' as default.
[Mar 27 16:45:26] WARNING[3575] res_config_mysql.c: MySQL RealTime: No database password found, using 'asterisk' as default.
[Mar 27 16:45:26] WARNING[3575] res_config_mysql.c: MySQL RealTime: No database host found, using localhost via socket.
[Mar 27 16:45:26] WARNING[3575] res_config_mysql.c: MySQL RealTime: No database name found, using 'asterisk' as default.
[Mar 27 16:45:26] WARNING[3575] res_config_mysql.c: MySQL RealTime: No database port found, using 3306 as default.
[Mar 27 16:45:26] WARNING[3575] res_config_mysql.c: MySQL RealTime: No database socket found (and unable to detect a suitable path).

Nếu bạn thực hiện truy vấn từ CSDL, bạn sẽ thấy kết quả tương tự như sau:

Như vậy, bạn đã hoàn thành việc cấu hình Asterisk để ghi dữ liệu từ queue_log vào CSDL MySQL và có thể truy vấn và phân tích dữ liệu về cuộc gọi hàng đợi một cách dễ dàng. Chúc bạn thành công và nếu có câu hỏi hoặc ý kiến, hãy đăng chúng lên để được hỗ trợ thêm.

LEAVE A REPLY

Please enter your comment!
Please enter your name here

4,956FansLike
256FollowersFollow
223SubscribersSubscribe
spot_img

Related Stories