Đọc, xử lý log và gửi tin nhắn tới Slack bằng Fluentd
I. Giới Thiệu
Trong phát triển phần mềm, việc monitor hệ thống khá là quan trọng. Nó giúp chúng ta kiểm soát được hệ thống đang chạy, đồng thời giúp ta nắm bắt được các lỗi xảy ra trong hệ thống một cách nhanh nhất để có thể khắc phục.
Đối với việc monitoring một hệ thống, thì việc căn bản đầu tiên là có một tác vụ tự động gửi notification về để thông báo cho chúng ta khi có lỗi xảy ra trên hệ thống. Trong bài viết này, chúng ta sẽ thực hiện cách notification đơn giản bằng cách sử dụng Fluentd để gửi message về Slack .
II. Tổng Quan
1. Fluentd
- Fluentd là một ứng dụng opensource, cho phép chúng ta có thể tập hợp log từ nhiều nguồn khác nhau để có thể sử dụng cho việc search, truy vấn. Dưới đây có một bài viết chi tiết về Fluentd, các bạn có thể tham khảo tại đây
- Fluentd hiện đang được khá nhiều các công ty lớn sử dụng và cộng đồng khá lớn.
2. Slack
- Slack hiện đang là công cụ chat được sử dụng rộng rãi trong các công ty IT hiện nay. Ngoài việc cung cấp một môi trường chat khá trực quan và ổn định, Slack còn cung cấp các API mở để cho các Developer có thể phát triển các ứng dụng, các con bot notification để thông báo về tình trạng của hệ thống.
III. Thực Hiện
1. Cài đặt Fluentd
-
Cài đặt theo link bên dưới đây, lưu ý các bạn nhớ lựa chọn phiên bản phù hợp với hệ điều hành mình đang sử dụng
https://docs.fluentd.org/v0.12/categories/installation -
Tiếp theo, ta cài đặt thêm 2 gem cho Fluentd để có thể gửi notification về Slack
$ td-agent-gem install fluent-plugin-slack
$ td-agent-gem install fluent-plugin-grep
2. Lấy WebhookURL từ Slack
- Để có thể lấy được WebhookURL, bạn bắt buộc phải là Admin của Workspace.
- Ở trên Slack, bấm vào
Add an app or custom integration
ở channel mà bạn muốn gửi notification về.
- Ở màn hinh mới hiện ra, bấm vào
Build
ở góc trên bên phải
- Ở Navigation Bar bên trái, lựa chọn
Incoming Webhooks
, tiếp theo, bấm vào liên kếtincoming webhook integration
.
- Lựa chọn channel mà bạn muốn kết nối tới và bấm
Add Incoming Webhooks integration
.
- Ở trang tiếp theo, bạn có thể copy
Webhook URL
, nó là chuỗi có định dạng như sau
https://hooks.slack.com/services/TXXXXXX/BXXXXXXX/XXXXXXXXXXXXXXXXXXXXXXXX
3. Thiết lập file log
- Tiếp theo, ta thiếp lập định dạng cho file log. Giả sử ta có file log theo dữ liệu dưới đây, mỗi hàng cách nhau bằng dâu
Tab
#/var/log/test.log
log_date_time:201903151534 log_time_stamp:1552631662257 media_id:576 widget_id:1254 permant_link:https://news.merumo.ne.jp/article/genre/8312328
log_date_time:201903151546 log_time_stamp:1552632383886 media_id:576 widget_id:1254 permant_link:https://news.merumo.ne.jp/article/genre/8312328
log_date_time:201903151650 log_time_stamp:1552636241584 media_id:574 widget_id:1240 permant_link:https://news.merumo.ne.jp/article/genre/8312328
4. Thiết lập cho Fluentd
- Tiếp theo, ta thiết lập cấu hình cho Fluentd tại địa chỉ
/etc/td-agent/td-agent.conf
. - Ta có thể thiết lập định dạng format của file log, từ đó Fluentd có thể lấy các giá trị theo như định dạng mong muốn, và từ đó gửi notification về Slack theo định dạng.
<source>
type tail
read_from_head true
path /var/log/test.log
pos_file /var/log/test.log.pos
format /^(?<log_date_hour>[0-9]*)([\t])(?<log_timestamp>[0-9]{10})([0-9]*)([\t])(?<media_id>[^\t]*)([\t])(?<widget_id>[^\t]*)([\t])(?<permant_link>[^\t]*)/
tag slack.test.notification
</source>
<match slack.test.notification>
type slack
webhook_url https://hooks.slack.com/services/TXXXXXX/BXXXXXXX/XXXXXXXXXXXXXXXXXXXXXXXX
channel taxel_slack_test
username 記事足りないくん
flush_interval 1s
color warning
icon_emoji :ghost:
message_keys "media_id,widget_id,permant_link"
message "記事が不足しています\n -media_id: %s\n -widget_id:%s \n -permant_link: %s\n"
</match>
- Ở đây ta có vài giá trị cần lưu ý:
path
: Đường dẫn tới file log.format
: Quy định format cho file log mà ta cần đọc. Ta có thể đặt tên cho các giá trị sẽ đọc được của file log.webhook_url
: Slack Webhook URL đã lấy được phía trên.channel
: Tên của channel trên Slack sẽ nhận notification.username
: Tên của chatbot sẽ gửi notification về Slack. Ta có thể chọn tên bất kỳ theo ý thích.message_keys
: Các giá trị ta muốn đưa vào message sẽ gửi về Slack. Các giá trị này được quy định phía trên ở trườngformat
message
: Nội dung message sẽ được gửi về Slack. Đối với các giá trị sẽ được thay thế từmessage_keys
, ta thay nó bằng ký tự%s
5. Chạy và xem kết quả
- Cuối cùng, ta chạy Fluentd và xem kết quả.
systemctl start td-agent
IV. Kết Luận
- Có thể thấy với vài thao tác khá đơn giản, ta đã có thể thực hiện một con bot để gửi notification thông báo về Slack một cách dễ dàng và nhanh chóng.
- Tuy nhiên, đây chỉ là một chức năng nhỏ của Fluentd và chưa thể hiện hết khả năng và ứng dụng của nó.