12/08/2018, 17:11

Log slow queries và gửi tới Chatwork với Rails

Khi ứng dụng Web của bạn đã đưa vào sử dụng, đôi khi bạn muốn theo dõi performance của những đoạn logic nào đó. Hôm này mình sẽ làm một bài demo về việc gửi log của những slow queries đến Chatwork. Ở đây mình sẽ sử dụng: ActiveSupport::Notifications: cho phép mình theo dõi các SQL queries ...

Khi ứng dụng Web của bạn đã đưa vào sử dụng, đôi khi bạn muốn theo dõi performance của những đoạn logic nào đó. Hôm này mình sẽ làm một bài demo về việc gửi log của những slow queries đến Chatwork.

Ở đây mình sẽ sử dụng:

  • ActiveSupport::Notifications: cho phép mình theo dõi các SQL queries cũng như thông tin về việc render view.
  • gem "chatwork": để gửi message đến chatwork.

1. ActiveSupport::Notifications

Ở đây mình chỉ quan tâm đến việc theo dõi các SQL, vậy ở đây mình sẽ subscribe sql.active_record cùng với callback như sau:

callback = lambda {|*args| ... }

ActiveSupport::Notifications
  .subscribed(callback,"sql.active_record") do
  # your code is here
end

Tất cả SQL nằm ở trong ActiveSupport::Notifications tạo bởi active record sẽ được thực hiện trong callback.

callback = lambda do |_, start_time, end_time, *args|
  puts args.last[:sql]
  puts "#{(end_time - start_time) * 1000} ms"
end

ActiveSupport::Notifications.subscribed(callback, "sql.active_record") do 
   Farmer.accessible_by(current_ability).first(10)
end

Sau khi chạy, bạn sẽ có kết quả như sau:

2. Gem chatwork

gem 'chatwork'

=> bundle install

Bạn có thể xem chi tiết về cách sử dụng ở đây: https://github.com/asonas/chatwork-ruby Trong bài này, mình sẽ áp dụng cách sử dụng luôn.

Tạo message với chatwork:

ChatWork.api_key = "XXX"
ChatWork::Message.create(room_id: 1234, body: "Hello, ChatWork!")

Bây giờ bạn đã gửi được message vào chatwork của room_id nào đó tùy ý.

3. Kết hợp ActiveSupport::Notifications với gem chatwork

Ở trên, bạn đã biết cách lấy log từ các đoạn logic/code của mình, và cách gửi message tới chatwork. Bây giờ, mình sẽ kết hợp để log các slow queries và gửi đến chatwork như sau:

ChatWork.api_key = "XXX"

callback = lambda do |_, start_time, end_time, *args|
  sql = args.last[:sql]
  duration = (end_time - start_time) * 1000
  if duration > 2.0
     ChatWork::Message.create(room_id: 1234, body: "Slow SQL Queries. #{sql} took #{duration}")
   end
end

ActiveSupport::Notifications.subscribed(callback, "sql.active_record") do
 // đoạn code bạn muốn theo dõi
end

Đến đây bài Demo này là kết thúc. Bây giờ, nếu có query nào mất hơn 2s, nó sẽ gửi message thông báo tới chatwork của bạn.

Để hiểu rõ hơn, bạn hãy tham khảo những tài liệu sau:

https://blog.westagilelabs.com/log-your-slow-queries-in-slack-using-rails-8863cbee1582

http://guides.rubyonrails.org/active_support_instrumentation.html

https://github.com/asonas/chatwork-ruby

https://viblo.asia/p/su-dung-gem-chatwork-DbmvmVArGAg

https://viblo.asia/p/api-chatwork-trong-ruby-AyQMp8BaM0Ek

0