dj-monitor 0.0.0.1.beta

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore ADDED
@@ -0,0 +1,17 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'http://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in DJMonitor.gemspec
4
+ gemspec
data/README.textile ADDED
@@ -0,0 +1,60 @@
1
+ h1. DJ Monitor
2
+
3
+ This gem is meant to monitor a DJ Work queue. Right now its a work in progress and only works for me. Some config options need to be extracted as of yet (defaults to mine)
4
+
5
+ h2. More Information
6
+
7
+ Not right now.
8
+
9
+ h2. Required Gems
10
+
11
+ This gem requires these gems:
12
+
13
+ * pony
14
+ * sequel
15
+
16
+ h2. Dependencies
17
+
18
+ To use this gem, you will need:
19
+
20
+ * The Ruby language (version 1.8.7 or 1.9.2)
21
+ * it need to be run for the rails root of your app
22
+
23
+ h2. Installing the gem
24
+
25
+ * gem install dj-monitor
26
+
27
+ h2. Getting Started
28
+
29
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit.
30
+
31
+ h2. Documentation and Support
32
+
33
+ This is the only documentation.
34
+
35
+ h4. Issues
36
+
37
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit.
38
+
39
+ h2. Similar Projects
40
+
41
+ * This project is based on *delayed_job-monitor* from *Michael Guterl*. Thanks!
42
+
43
+ h2. Contributing
44
+
45
+ If you make improvements to this application, please share with others.
46
+
47
+ * Make your feature addition or bug fix.
48
+ * Make a test for it!
49
+ * Commit with Git.
50
+ * Send the author message.
51
+
52
+ If you add functionality to this application, create an alternative implementation, or build an application that is similar, please contact me and I'll add a note to the README so that others can find your work.
53
+
54
+ h2. Credits
55
+
56
+ This project is based on *delayed_job-monitor* from *Michael Guterl*. Thanks!
57
+
58
+ h2. License
59
+
60
+ None
data/Rakefile ADDED
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env rake
2
+ require "bundler/gem_tasks"
data/bin/dj-monitor ADDED
@@ -0,0 +1,13 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ # assumes the cwd is a rails application
4
+
5
+ require 'yaml'
6
+ require 'rubygems'
7
+ require 'dj-monitor'
8
+
9
+ rails_env = ENV['RAILS_ENV'] || 'development'
10
+ STDOUT.puts "Loading #{rails_env}"
11
+ configuration = YAML.load_file("config/database.yml")
12
+ STDOUT.puts "Monitoring DJ in #{configuration[rails_env]['database']}"
13
+ Monitor.run(:database => configuration[rails_env])
@@ -0,0 +1,21 @@
1
+ # -*- encoding: utf-8 -*-
2
+ require File.expand_path('../lib/dj-monitor/version', __FILE__)
3
+
4
+ Gem::Specification.new do |gem|
5
+ gem.authors = ["David Westerink"]
6
+ gem.email = ["davidakachaos@gmail.com"]
7
+ gem.description = %q{Monitors the status of your Delayed Jobs.}
8
+ gem.summary = %q{This project is based on delayed_job-monitor from Michael Guterl. Thanks!}
9
+ gem.homepage = "https://github.com/davidakachaos/DJMonitor"
10
+
11
+ gem.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
12
+ gem.files = `git ls-files`.split("\n")
13
+ gem.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
14
+ gem.name = "dj-monitor"
15
+ gem.require_paths = ["lib"]
16
+ gem.version = Djmonitor::VERSION
17
+
18
+ gem.add_development_dependency "rspec"
19
+ gem.add_dependency(%q<sequel>, ["~> 3.12.1"])
20
+ gem.add_dependency(%q<pony>, ["~> 1.0.0"])
21
+ end
@@ -0,0 +1,134 @@
1
+ require 'sequel'
2
+ require 'pony'
3
+
4
+ class Monitor
5
+
6
+ class << self
7
+
8
+ def run(options)
9
+ Monitor.new(options).run
10
+ end
11
+
12
+ attr_accessor :default_table_name
13
+
14
+ end
15
+
16
+ DEFAULT_TABLE_NAME = "delayed_jobs".freeze
17
+
18
+ self.default_table_name = DEFAULT_TABLE_NAME
19
+
20
+ attr_reader :table_name
21
+
22
+ DEFAULT_THRESHOLDS = {
23
+ :total_job_threshold => 50,
24
+ :failed_job_threshold => 1,
25
+ :scheduled_job_threshold => 40,
26
+ :waiting_job_threshold => 10,
27
+ :running_job_threshold => 5
28
+ }.freeze
29
+
30
+ THRESHOLD_ATTRIBUTES = DEFAULT_THRESHOLDS.keys
31
+
32
+ attr_accessor *THRESHOLD_ATTRIBUTES
33
+
34
+ def initialize(options)
35
+ @options = options
36
+ @db_options = @options[:database]
37
+ @table_name = @db_options.delete(:table_name) { Monitor.default_table_name }
38
+
39
+ # set thresholds, use default if not provided
40
+ DEFAULT_THRESHOLDS.each do |attribute, threshold|
41
+ send("#{attribute}=", options.delete(attribute) { threshold })
42
+ end
43
+ end
44
+
45
+ def run
46
+ if sick?
47
+ alert
48
+ # else
49
+ # puts "All is fine!"
50
+ # puts "Total jobs:\t\t#{total_jobs}"
51
+ # puts "Failed jobs:\t\t#{failed_jobs}"
52
+ # puts "Scheduled jobs:\t\t#{scheduled_jobs}"
53
+ # puts "Waiting jobs:\t\t#{waiting_jobs}"
54
+ # puts "Running jobs:\t\t#{running_jobs}"
55
+ end
56
+ end
57
+
58
+ def alert
59
+ Pony.mail(:to => @options[:alert_to] ? @options[:alert_to] : "dw@penthion.nl",
60
+ :from => @options[:alert_from] ? @options[:alert_from] : "monitor@penthion.nl",
61
+ :subject => @options[:alert_subject] ? @options[:alert_subject] : "[Alert] DJ Queue (#{@options[:database]})",
62
+ :body => alert_body)
63
+ end
64
+
65
+ def alert_body
66
+ %Q{
67
+ Delayed::Job Summary
68
+ --------------------
69
+
70
+ Total jobs:\t\t#{total_jobs}
71
+ Failed jobs:\t\t#{failed_jobs}
72
+ Scheduled jobs:\t\t#{scheduled_jobs}
73
+ Waiting jobs:\t\t#{waiting_jobs}
74
+ Running jobs:\t\t#{running_jobs}
75
+ }
76
+ end
77
+
78
+ def sick?
79
+ total_jobs >= total_job_threshold ||
80
+ failed_jobs >= failed_job_threshold ||
81
+ scheduled_jobs >= scheduled_job_threshold ||
82
+ waiting_jobs >= waiting_job_threshold ||
83
+ running_jobs >= running_job_threshold
84
+ end
85
+
86
+ def healthy?
87
+ !sick?
88
+ end
89
+
90
+ def reset
91
+ @total_jobs = nil
92
+ @scheduled_jobs = nil
93
+ @waiting_jobs = nil
94
+ @running_jobs = nil
95
+ @failed_jobs = nil
96
+ end
97
+
98
+ def total_jobs
99
+ @total_jobs ||= count
100
+ end
101
+
102
+ def scheduled_jobs
103
+ @scheduled_jobs ||= count(["run_at > ? AND locked_at IS NULL AND attempts = 0", Time.now])
104
+ end
105
+
106
+ def waiting_jobs
107
+ @waiting_jobs ||= count(["run_at <= ? AND locked_at IS NULL AND attempts = 0", Time.now])
108
+ end
109
+
110
+ def running_jobs
111
+ @running_jobs ||= count(["locked_at IS NOT NULL"])
112
+ end
113
+
114
+ def failed_jobs
115
+ @failed_jobs ||= count(["(run_at > ? AND last_error IS NOT NULL) OR failed_at IS NOT NULL", Time.now])
116
+ end
117
+
118
+ def count(filter = nil)
119
+ if filter
120
+ delayed_jobs.filter(filter).count
121
+ else
122
+ delayed_jobs.count
123
+ end
124
+ end
125
+
126
+ def delayed_jobs
127
+ @delayed_jobs ||= database[table_name.to_sym]
128
+ end
129
+
130
+ def database
131
+ @database ||= Sequel.connect(@db_options)
132
+ end
133
+
134
+ end
@@ -0,0 +1,11 @@
1
+ require 'rails'
2
+
3
+ module Delayed
4
+ class Railtie < Rails::Railtie
5
+ initializer :after_initialize do
6
+ #Delayed::Worker.max_attempts = 3
7
+ #Delayed::Backend::ActiveRecord::Job.send(:include, Delayed::Workless::Scaler) if defined?(Delayed::Backend::ActiveRecord::Job)
8
+ #Delayed::Backend::Mongoid::Job.send(:include, Delayed::Workless::Scaler) if defined?(Delayed::Backend::Mongoid::Job)
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,3 @@
1
+ module Djmonitor
2
+ VERSION = "0.0.0.1.beta"
3
+ end
data/lib/dj-monitor.rb ADDED
@@ -0,0 +1,6 @@
1
+ require File.dirname(__FILE__) + "/dj-monitor/version"
2
+
3
+ module Djmonitor
4
+ require File.dirname(__FILE__) + "/dj-monitor/monitor"
5
+ require File.dirname(__FILE__) + "/dj-monitor/railtie" if defined?(Rails::Railtie)
6
+ end
metadata ADDED
@@ -0,0 +1,90 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: dj-monitor
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.0.1.beta
5
+ prerelease: 8
6
+ platform: ruby
7
+ authors:
8
+ - David Westerink
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-01-06 00:00:00.000000000Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: rspec
16
+ requirement: &2153755540 !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :development
23
+ prerelease: false
24
+ version_requirements: *2153755540
25
+ - !ruby/object:Gem::Dependency
26
+ name: sequel
27
+ requirement: &2153754580 !ruby/object:Gem::Requirement
28
+ none: false
29
+ requirements:
30
+ - - ~>
31
+ - !ruby/object:Gem::Version
32
+ version: 3.12.1
33
+ type: :runtime
34
+ prerelease: false
35
+ version_requirements: *2153754580
36
+ - !ruby/object:Gem::Dependency
37
+ name: pony
38
+ requirement: &2153740220 !ruby/object:Gem::Requirement
39
+ none: false
40
+ requirements:
41
+ - - ~>
42
+ - !ruby/object:Gem::Version
43
+ version: 1.0.0
44
+ type: :runtime
45
+ prerelease: false
46
+ version_requirements: *2153740220
47
+ description: Monitors the status of your Delayed Jobs.
48
+ email:
49
+ - davidakachaos@gmail.com
50
+ executables:
51
+ - dj-monitor
52
+ extensions: []
53
+ extra_rdoc_files: []
54
+ files:
55
+ - .gitignore
56
+ - Gemfile
57
+ - README.textile
58
+ - Rakefile
59
+ - bin/dj-monitor
60
+ - dj-monitor.gemspec
61
+ - lib/dj-monitor.rb
62
+ - lib/dj-monitor/monitor.rb
63
+ - lib/dj-monitor/railtie.rb
64
+ - lib/dj-monitor/version.rb
65
+ homepage: https://github.com/davidakachaos/DJMonitor
66
+ licenses: []
67
+ post_install_message:
68
+ rdoc_options: []
69
+ require_paths:
70
+ - lib
71
+ required_ruby_version: !ruby/object:Gem::Requirement
72
+ none: false
73
+ requirements:
74
+ - - ! '>='
75
+ - !ruby/object:Gem::Version
76
+ version: '0'
77
+ required_rubygems_version: !ruby/object:Gem::Requirement
78
+ none: false
79
+ requirements:
80
+ - - ! '>'
81
+ - !ruby/object:Gem::Version
82
+ version: 1.3.1
83
+ requirements: []
84
+ rubyforge_project:
85
+ rubygems_version: 1.8.6
86
+ signing_key:
87
+ specification_version: 3
88
+ summary: This project is based on delayed_job-monitor from Michael Guterl. Thanks!
89
+ test_files: []
90
+ has_rdoc: