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