Skip to content

Commit

Permalink
Log recorder events to fluentd
Browse files Browse the repository at this point in the history
  • Loading branch information
eagletmt committed Aug 25, 2014
1 parent b69bdd8 commit 1a39f74
Show file tree
Hide file tree
Showing 5 changed files with 34 additions and 66 deletions.
2 changes: 1 addition & 1 deletion kaede.gemspec
Original file line number Diff line number Diff line change
Expand Up @@ -28,12 +28,12 @@ Gem::Specification.new do |spec|
spec.add_development_dependency "timecop"
spec.add_development_dependency "vcr"
spec.add_development_dependency "webmock"
spec.add_dependency "fluent-logger"
spec.add_dependency "nokogiri"
spec.add_dependency "redis"
spec.add_dependency "retryable"
spec.add_dependency "ruby-dbus"
spec.add_dependency "sequel"
spec.add_dependency "sleepy_penguin"
spec.add_dependency "thor"
spec.add_dependency "twitter"
end
10 changes: 3 additions & 7 deletions kaede.rb.sample
Original file line number Diff line number Diff line change
Expand Up @@ -13,13 +13,9 @@ Kaede.configure do |config|
config.cabinet_dir = '/home/pt'
config.redis = Redis.new(db: 1)
config.redis_queue = 'jobs'
config.twitter = Twitter::REST::Client.new do |config|
config.consumer_key = 'CONSUMER_KEY'
config.consumer_secret = 'CONSUMER_SECRET'
config.access_token = 'ACCESS_TOKEN'
config.access_token_secret = 'ACCESS_TOKEN_SECRET'
end
config.twitter_target = 'eagletmt'
config.fluent_tag_prefix = 'kaede'
config.fluent_host = 'localhost'
config.fluent_port = 24224
end

# vim: set ft=ruby:
4 changes: 1 addition & 3 deletions lib/kaede/config.rb
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@

module Kaede
class Config
attr_accessor :database_url, :redis, :redis_queue, :twitter, :twitter_target
attr_accessor :database_url, :redis, :redis_queue, :fluent_tag_prefix, :fluent_host, :fluent_port

path_attrs = [:b25, :recpt1, :assdumper, :clean_ts, :statvfs, :record_dir, :cache_dir, :cabinet_dir]
attr_reader *path_attrs
Expand All @@ -24,8 +24,6 @@ def initialize
self.record_dir = basedir.join('records')
self.cache_dir = basedir.join('cache')
self.cabinet_dir = basedir.join('cabinet')
self.twitter = nil
self.twitter_target = nil
self.redis = Redis.new
self.redis_queue = 'jobs'
end
Expand Down
57 changes: 23 additions & 34 deletions lib/kaede/notifier.rb
Original file line number Diff line number Diff line change
@@ -1,50 +1,45 @@
# coding: utf-8
require 'kaede'
require 'fluent-logger'

module Kaede
class Notifier
def initialize
@twitter = Kaede.config.twitter
@twitter_target = Kaede.config.twitter_target
if Kaede.config.fluent_host && Kaede.config.fluent_port
@fluent_logger = Fluent::Logger::FluentLogger.new(
Kaede.config.fluent_tag_prefix,
host: Kaede.config.fluent_host,
port: Kaede.config.fluent_port,
)
else
@fluent_logger = nil
end
end

def notify_before_record(program)
tweet("#{format_title(program)}を録画する")
log(:before_record, message: "#{format_title(program)}を録画する")
end

def notify_after_record(program)
tweet(
sprintf(
"%sを録画した。ファイルサイズ約%.2fGB。残り約%dGB\n",
format_title(program),
ts_filesize(program),
available_disk,
)
message = sprintf(
"%sを録画した。ファイルサイズ約%.2fGB。残り約%dGB\n",
format_title(program),
ts_filesize(program),
available_disk,
)
log(:after_record, message: message)
end

def notify_exception(exception, program)
msg = "#{program.title}(PID #{program.pid}) の録画中に #{exception.class} で失敗した……"
if @twitter_target
msg = "@#{@twitter_target} #{msg}"
end
tweet(msg)
log(:exception, message: "#{program.title}(PID #{program.pid}) の録画中に #{exception.class} で失敗した……")
end

def notify_duration_error(program, got_duration)
msg = sprintf('%s (PID:%d) の長さが%g秒しか無いようだが……', format_title(program), program.pid, got_duration)
if @twitter_target
msg = "@#{@twitter_target} #{msg}"
end
tweet(msg)
log(:duration_error, message: sprintf('%s (PID:%d) の長さが%g秒しか無いようだが……', format_title(program), program.pid, got_duration))
end

def notify_redo_error(program)
msg = "再実行にも失敗した…… (PID:#{program.pid})"
if @twitter_target
msg = "@#{@twitter_target} #{msg}"
end
tweet(msg)
log(:redo_error, message: "再実行にも失敗した…… (PID:#{program.pid})")
end

def format_title(program)
Expand Down Expand Up @@ -74,15 +69,9 @@ def in_gigabyte(size)
size / (1024 * 1024 * 1024)
end

def tweet(text)
return unless @twitter
Thread.start do
begin
@twitter.update(text)
rescue Exception => e
$stderr.puts "Failed to tweet: #{text}: #{e.class}: #{e.message}"
end
end
def log(tag, attributes)
return unless @fluent_logger
@fluent_logger.post(tag, attributes)
end
end
end
27 changes: 6 additions & 21 deletions spec/kaede/notifier_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,8 @@
let(:program) { Kaede::Program.new(1234, 5678, Time.now, Time.now + duration, nil, 19, 9, '6', 0, 'sub', 'title', 'comment') }

describe '#notify_before_record' do
it 'tweets' do
expect(notifier).to receive(:tweet).with(/title #6 sub/)
it 'logs to fluentd' do
expect(notifier).to receive(:log).with(:before_record, message: /title #6 sub/)
notifier.notify_before_record(program)
end
end
Expand All @@ -27,8 +27,8 @@
notifier.record_path(program).open('w') {}
end

it 'tweets' do
expect(notifier).to receive(:tweet).with(/title #6 sub.*0\.00GB/)
it 'logs to fluentd' do
expect(notifier).to receive(:log).with(:after_record, message: /title #6 sub.*0\.00GB/)
notifier.notify_after_record(program)
end
end
Expand All @@ -37,24 +37,9 @@
class MyException < Exception
end

it 'tweets' do
Kaede.configure do |config|
config.twitter_target = nil
end

expect(notifier).to receive(:tweet).with(/MyException で失敗した/)
it 'logs to fluentd' do
expect(notifier).to receive(:log).with(:exception, message: /MyException で失敗した/)
notifier.notify_exception(MyException.new, program)
end

context 'when twitter_target is set' do
it 'tweets to twitter_target' do
Kaede.configure do |config|
config.twitter_target = 'eagletmt'
end

expect(notifier).to receive(:tweet).with(/\A@eagletmt .* MyException で失敗した/)
notifier.notify_exception(MyException.new, program)
end
end
end
end

0 comments on commit 1a39f74

Please sign in to comment.