+1

Sử dụng Rollbar để monitor hệ thống trong Rails

Giới thiệu

Rollbar là một dịch vụ hỗ trợ các lập trình viên, cung cấp khả năng báo cáo các exception theo thời gian thực khi hệ thống hoạt động và theo dõi quá trình deploy hệ thống.

Hoạt động của Rollbar cũng khá đơn giản, mỗi khi hệ thống có lỗi nó sẽ gửi một thông báo tới Rollbar server. Rollbar server sẽ thu thập các lỗi để thống kê và gửi thông báo đến cho người quản trị trang web biết.

Rollbar cung cấp SDK dễ dàng nhúng vào hệ thống, và hỗ trợ cho rất nhiều ngôn ngữ như Go, Java, Ruby, iOS, macOS, Javascript (cả browser và server - nodejs), python, PHP, ReactNative, .NET ....

Trong bài viết này, chúng ta sẽ cùng tìm hiểu về cách cài đặt Rollbar trong ruby,

Không chỉ hỗ trợ Rails, Rollbar còn hỗ trợ tất cả các tích hợp và framework khác của ruby như Rails, Sinatra, Goalie, Rack, Grape, Ruby, ....

Trong bài viết này, chúng ta sẽ tìm hiểu về cách sử dụng Rollbar trong Rails

Cài đặt

Để cài đặt trong rails, ta thêm vào trong gemfile

gem 'rollbar'

sau đó chạy bundle install hoặc có thể cài trực tiếp gem bằng lệnh

$ gem install rollbar

Chạy lệnh sau:

$ rails generate rollbar POST_SERVER_ITEM_ACCESS_TOKEN

Giá trị POST_SERVER_ITEM_ACCESS_TOKEN sẽ được lấy từ trang https://rollbar.com/, sau khi ta tạo account, đây là dịch vụ trả phí, nhưng chúng ta có thể sử dụng miễn phí trong 14 ngày

Lệnh trên sẽ sinh ra file config/initializers/rollbar.rb chứa các giá trị để cấu hình Rollbar khi khởi tạo và cả access_token.

Nếu không muốn thêm trực tiếp access_token vào lệnh trên, chúng ta có thể sử dụng biến môi trường

$ rails generate rollbar
$ export ROLLBAR_ACCESS_TOKEN=POST_SERVER_ITEM_ACCESS_TOKEN

và cài đặt trong file config/initializers/rollbar.rb

Cách sử dụng:

Cách sử dụng rất đơn giản, chỉ cần thêm các lệnh rollbar sau cho từng nhu cầu cụ thể

Rollbar.log(level, ...)
Rollbar.debug()
Rollbar.info()
Rollbar.warning()
Rollbar.error()
Rollbar.critical()

VD: Giả sử ta có 1 hàm bị lỗi

class Post < ActiveRecord::Base
  class << self
    def generate_sample_data num
      (1..num).to_a.map do |i|
        res = STRING_FIELDS.inject({}){|r, j| r[j] = "#{j} #{i}"; r}
        res.merge! INTEGER_FIELDS.inject({}){|r, j| r[j] = (1..10).to_a.sample; r }
        res.merge!({"expired_at" => Time.zone.now})
        res.merge!({"url" => "https://example.com"})
        raise StandError
        res
      end
    rescue StandardError
      Rollbar.error('error in generate_sample_data')
    end      
  end
end

Ta thêm 1 text lỗi là raise StandError, giờ mong muốn là khi chạy đến dòng lỗi đấy thì sẽ chạy vào rescue và thực hiện gửi error lên server Rollbar

Tuy nhiên, sẽ có 2 trường hợp để hiển thị lỗi:

  • Thêm nội dung error message vào Rollbar.error tương tự như VD trên

Nếu thêm như thế, thì khi vào trang chủ Rollbar, ta sẽ xem được thông báo lỗi của error đấy chỉ có mỗi message error

  • Thêm exception vào tham số của Rollbar.error:
def generate_sample_data num
    ...
rescue StandardError => e 
   Rollbar.error(e)
end

Khi đấy chúng ta sẽ theo dõi được cả traceback của lỗi

Ngoài ra, ở phiên bản trả phí, chúng ta có thể theo dõi được cả giá trị tham số của từng file nữa

khi biết được cả params, thì ta có thể dễ dàng theo dõi được những giá trị không hợp lý của 1 hàm trên môi trường production mà gây nên lỗi, bởi vì trên môi trường production, nếu không tạo được data, validate bị lỗi dẫn đến Rollback, nếu cần thêm thông tin, ta không thể yêu cầu user chạy lại để tái hiện lỗi được

Các vị trí nên đặt Rollbar để monitor hệ thống

  • Trong rescue của service quan trọng: giúp lấy được thông tin khi service xử lý sai
  • Trong after_validation: nếu cần lấy thêm thông tin đối với các model phức tạp mà có thể bị validate failed
  • Theo dõi rails khởi động: để theo dõi được quá trình này, thì ta cần phải thay đổi một vài config Chuyển file từ config/initializers/rollbar.rb sang config/rollbar.rb và thêm đoạn code sau trong config/environment.rb
# config/environment.rb

require File.expand_path('../application', __FILE__)
require File.expand_path('../rollbar', __FILE__)

notify = ->(e) do
  begin
    Rollbar.with_config(use_async: false) do
      Rollbar.error(e)
    end
  rescue
    Rails.logger.error "Synchronous Rollbar notification failed.  Sending async to preserve info"
    Rollbar.error(e)
  end
end

begin
  Rails.application.initialize!
rescue Exception => e
  notify.(e)
  raise
end
  • Giám sát quá trình deploy: Giả sử ta dùng Capistrano 3 để deploy, ta thực hiện các bước sau để monitor quá trình deploy

Cài rollbar trong Gemfile tương tự như trên

Thêm require 'rollbar/capistrano3' trong file Capfile

Thêm code sau trong file deploy.rb

set :rollbar_token, 'POST_SERVER_ITEM_ACCESS_TOKEN'
set :rollbar_env, Proc.new { fetch :stage }
set :rollbar_role, Proc.new { :app }

Nếu muốn monitor quá trình deploy bằng các tool khác, chúng ta hãy tìm hiểu trong tài liệu doc của rollbar


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí