Oh!Coder

Coding Life

Exception-Notification Gem简介

| Comments

按照上个星期的安排,这个星期介绍Exception-Notification的基本使用。

在这个gem的README上,第一行就明确说明,此README只针对master分支。要想使用不同分支,需要参照对应分支上的README。好,下面开始。

功能简介

这个gem的主要功能很单一,就是当Rack/Rails应用当中发生错误时,捕捉错误然后给开发者发送通知用的。具体的实现方式,需要结合相应的gem,可以通过不同的渠道发送通知,也就是文档中所说的notifier。针对不同的工作环境,配置的位置也稍有不同。比如在生产环境下,配置代码可以写在config/environments/production.rb文件中。

对于4.x以后的版本,代码的配置规则也发生了一些改变。现在的代码书写规则如下:

1
2
3
4
5
6
Whatever::Application.config.middleware.use ExceptionNotification::Rack,
  :email => {
    :email_prefix => "[Whatever] ",
    :sender_address => %{"notifier" <[email protected]>},
    :exception_recipients => [email protected]}
  }

好,下面就针对不同的notifier,分别简单的做个介绍。

Email notifier

最原始,最简单的方式,是通过邮件的方式发送通知。这需要设置一下Rails的ActionMailer。配置ActionMailer的详细方法可以参照官方文档。这里要提一点的是,在配置好ActionMailer之后,别忘了设置服务器上的sendmail

关于这个gem中,如何对email进行详细的配置方式,这里就不列举了,有需要的朋友可以转到对应的文档进行查看。

CampFire notifier

这个notifier的主要功能是可以向Campfire room发送通知。实现这个功能需要结合一个名叫tinder的gem。简单的配置格式如下:

1
2
3
4
5
6
7
8
9
10
11
Whatever::Application.config.middleware.use ExceptionNotification::Rack,
  :email => {
    :email_prefix => "[Whatever] ",
    :sender_address => %{"notifier" <[email protected]>},
    :exception_recipients => [email protected]}
  },
  :campfire => {
    :subdomain => 'my_subdomain',
    :token => 'my_token',
    :room_name => 'my_room'
  }

对于上面的这个基本配置的详细参数的解释,可以参照文档

HipChat notifier

这个notifier的主要功能是可以向HipChat的聊天工具中发送通知。实现这个功能需要结合名为hipchat的gem一起使用。基本配置如下:

1
2
3
4
5
6
7
8
9
10
Whatever::Application.config.middleware.use ExceptionNotification::Rack,
  :email => {
    :email_prefix => "[Whatever] ",
    :sender_address => %{"notifier" <[email protected]>},
    :exception_recipients => [email protected]}
  },
  :hipchat => {
    :api_token => 'my_token',
    :room_name => 'my_room'
  }

除了这些基本的配置参数以外,还有一些可选参数,详情可以参见文档

Webhook notifier

notifier通过HTTP协议发送通知。实现此功能,需要配合名为HTTPParty的gem一起使用。基本的配置方式如下:

1
2
3
4
5
6
7
8
9
Whatever::Application.config.middleware.use ExceptionNotification::Rack,
  :email => {
    :email_prefix => "[Whatever] ",
    :sender_address => %{"notifier" <[email protected]>},
    :exception_recipients => [email protected]}
  },
  :webhook => {
    :url => 'http://domain.com:5555/hubot/path'
  }

默认情况下,WebhookNotifier调用URL会使用POST方法,通过http_method方法可以进行修改。具体的修改方法这里就不赘述了,详情可以参见文档

IRC notifier

这种通知方法,需要结合一个名为carrier-pigeon的gem才能发送到IRC channel上。基本的配置如下:

1
2
3
4
5
6
7
8
9
Whatever::Application.config.middleware.use ExceptionNotification::Rack,
  :email => {
    :email_prefix => "[Whatever] ",
    :sender_address => %{"notifier" <[email protected]>},
    :exception_recipients => [email protected]}
  },
  :irc => {
    :domain => 'irc.example.com'
  }

其中更详细的参数,可以参见文档

Slack notifier

实现这个功能就用到了上个星期提到的那个slack-notifier的gem。真实情况下,其实配置起来还是很简单的,虽然在我第一次配置的时候,不是非常顺利,:P

基本配置方式如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
Whatever::Application.config.middleware.use ExceptionNotification::Rack,
  :email => {
    :email_prefix => "[Whatever] ",
    :sender_address => %{"notifier" <[email protected]>},
    :exception_recipients => [email protected]}
  },
  :slack => {
    :webhook_url => "[Your webhook url]",
    :channel => "#exceptions",
    :additional_parameters => {
      :icon_url => "http://image.jpg"
    }
  }

Slack是最近比较流行的一个团队合作的交流软件,有兴趣的朋友可以一试。除了上面简单的配置以外,还可以添加一些其他可选配置参数,详情可以一边结合Slack-notifier,一边参照Slack的官方文档

自定义 notifier

简单来说,notifier是一个负责执行#call(exception, options)的对象,所以,可以通过为下面的notifier添加一个lambda表达式进行调用:

1
2
ExceptionNotifier.add_notifier :custom_notifier_name,
  ->(exception, options) { puts "Something goes wrong: #{exception.message}"}

对于高级用户,或者第三方开发者而言,可以在ExceptionNotifier命名空间下进行自定义。具体的class名称以Notifier作为后缀。例如:

1
2
3
4
5
6
7
8
9
10
11
module ExceptionNotifier
  class SimpleNotifier
    def initialize(options)
      # do something with the options...
    end

    def call(exception, options={})
      # send the notification
    end
  end
end

忽略异常

有三种方法可以忽略特定的异常:

  • :ignore_exceptions
  • :ignore_crawlers
  • :ignore_if

具体详情可以参见文档,这里就不赘述了。

其他

除了上面提到的功能以外,还有一些比如进行后台通知,或者设置手动异常通知

对于Rails 4.0以上的版本,ExceptionNotification可以作为一个Rails engine使用。只需要在终端中输入如下命令即可。

rails g exception_notification:install

这条命令会生成一个initialize文件,config/initializers/exception_notification.rb。在此文件中,可以自定义你的配置。

除了手动让后台通知遍历job/worker以外,还可以配置ExceptionNotification自动完成这件事。例如运行如下命令:

rails g exception_notification:install --resque

rails g exception_notification:install --sidekiq

好啦,据此为止,关于ExceptionNotification的大部分功能就介绍完啦!更多相关详细内容还请参见文档吧!

Comments