Đọ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ết incoming 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ường format
    • 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ó.

V. Tham Khảo