分享 使用 Slack & exception_notification 监控 Rails 异常

xiaoronglv · 2014年12月28日 · 最后由 benzhang 回复于 2020年08月26日 · 10763 次阅读
本帖已被管理员设置为精华贴

每个程序员都希望 Sidekiq/Rails App 的抛异常时,能够尽快的被通知到,并且能附上整个堆栈、所有的参数。然后在最快的时间内处理掉异常。

exception_notification 这个 Gem 就是解决这类需求的一个好工具。

The Exception Notification gem provides a set of notifiers for sending notifications when errors occur in a Rack/Rails application.

当程序出异常的时候,通过各种渠道第一时间通知程序员。

  1. Email
  2. Campfire
  3. Hipchat
  4. 其他自定义提醒方式

邮件提醒

我以前偏爱邮件提醒,不过我刚刚发现了一个更好玩的,更及时的通知方式。

Slack

Slack 是一个很棒的团队沟通工具,支持各种系统的接入比如 Google drive、Dropbox、各种项目管理工具。

它是以 channel 来划分团队沟通通道,可以创建不同的 channel(有点像 QQ 群组)。

  1. General: 全公司的人都在里面的频道
  2. Random: 扯淡频道,各种八卦,各种段子
  3. Ruby: Ruby 程序员讨论问题的地方
  4. Android: 所有 Android 程序员讨论问题的地方
  5. ...

Slack 提供了 webhooks,可以 post 数据至 webhooks,整个 channel 的人都能收到。

利用这个特性,当我们的程序出异常时可通过 webhooks 向特定的 channel 发送消息,所有在那个频道的程序员都能立即收到消息。

以下就是实现这个混搭的过程:exception_notification + Slack

1. 创建一个 Sidekiq 的 Channel

创建一个频道

2. 查看这个 channel 的 webhooks

点此查看你的 webhooks,其实就是一个 URL。

查看 webhooks

3. 引入 exception_notification 和 slack-notifier

# Gemfile
# Slack api 封装
gem 'slack-notifier'
# 异常监控
gem 'exception_notification'

4. 在 rails 中生成默认的配置文件

rails g exception_notification:install

This command generates an initialize file (config/initializers/exception_notification.rb) where you can customize your configurations.

5. 在默认的配置文件中添加 slack notifier

# config/initializers/exception_notification.rb
require 'exception_notification/sidekiq'

# 自定义 notifier(slack)
module ExceptionNotifier
  class SlackNotifier

    attr_accessor :notifier

    def initialize(options)
      begin
        webhook_url = options.fetch(:webhook_url)
        @message_opts = options.fetch(:additional_parameters, {})
        @notifier = Slack::Notifier.new webhook_url, options
      rescue
        @notifier = nil
      end
    end

    def call(exception, options={})
      message = [
        "项目:  Plan",
        "Time: #{ Time.now.to_s }",
        "参数:  #{options.to_s}",
        "Backtrack: #{exception.backtrace.join("\n")}",
        "==============================================="
      ].join("\n\n")

      @notifier.ping(message, @message_opts) if valid?
    end

    protected

    def valid?
      [email protected]?
    end
  end
end

# 换上你自己的 slack webhook 网址
ExceptionNotification.configure do |config|
  config.add_notifier :slack, {
    :webhook_url => "https://hooks.slack.com/services/your_webhooks",
    :channel     => "#sidekiq",
    :username => "plan"
  }
end

效果图

bingo! 搭建成功。

如果我们的程序抛异常了,就可以在 Slack 中第一时间内收到异常信息了。

效果图

参考资料

  1. Railscast: Exception Notifications

  2. exception_notification

  3. slack-notifier

插播小广告,我们薄荷还在招聘 Ruby 小伙伴,你懂的。

投递简历

slack 用了几个月,挺好用的,就是不太稳定,

用 Slack 接通知的想法不错!

大爱 Slack,集成这个 Gem 看来可以抛弃 Airbrake 了。

正在运营的业务中部分流程是整合进 Slack 来处理的。

是的,我在我公司的项目里就是用了 slack_notifer 来做业务流程上的提醒,很好用

想法比较新颖

#2 楼 @huacnlee #3 楼 @hpyhacking

用 Slack 接各种通知 exception backup 等等,邮箱清净多了

很酷炫的通知方式

我更偏好用 errbit 汇总错误,同时每个错误都发送邮件或者链接到 slack 做实时通知。

@foxzool 赞!! 在安居客的时候,也有一个 channel 用来直播大家的 commit 记录 激情

#10 楼 @foxzool

赞,显示效果真不错。

一直在用 exception_notification,我们设定的是发到一个邮件组。这种直播形式的没尝试过,未来可以试试。

15 楼 已删除

@foxzool @huacnlee @yukihiro_matz @cisolarix

Hi 各位好,

请教大家一个问题。

无论是使用邮件,还是 slack,发送通知到第三方时都会请求网络。

  1. 万一 slack 或邮件服务商的接口挂了,会不会影响 puma 的那个线程?无休止的等待下去?
  2. 使用 Ruby 的 timeout,貌似会开启一个新的线程执行,可行吗? (代码如下:)

https://gist.github.com/xiaoronglv/e22e8af634351561c0f7#file-custom_notifier-rb-L74

cool 改天研究研究 哈哈

#16 楼 @xiaoronglv 我放到 activejob 让 sidekiq 去跑 slack 通知任务

#16 楼 @xiaoronglv 发邮件用本地 postfix 发,不然突发几千个异常用第三方邮件服务发会肉痛的。

#19 楼 @foxzool

一定要给异步的请求加超时。

我们也是这么用的,exception_notification 自带了 slack 的 notifier 的啊https://github.com/smartinez87/exception_notification/blob/master/docs/notifiers/slack.md 不过我们自己扩展了一下,多加了些参数。

没注意是 15 年的老帖子了😂

hpyhacking 回复

Airbrake 还是很有必要的把,几千个异常过来,不好管理吧

需要 登录 后方可回复, 如果你还没有账号请 注册新账号