munin-plugins-rails 0.2.10

Sign up to get free protection for your applications and to get access to all the features.
data/README.rdoc ADDED
@@ -0,0 +1,74 @@
1
+ = Munin-Rails-Plugins
2
+ Collection of Concise Munin plugins for Rails server environments.
3
+ This will make monitoring your rails app a piece of cake.
4
+
5
+ This project contains munin plugins that not only work in munin, but are also concise (see references).
6
+ Most things in this repository rely heavily on the request-log-analyzer gem.
7
+
8
+ == What's in the box?
9
+ * passenger_memory_stats - Munin plugin to monitor the memory usage of passenger application servers.
10
+ * pasenger_queue - Montoring of passenger queue lenth.
11
+ * passenger_status - Running, active and maximum number of passenger instances as well as sessions.
12
+ * rails_database_time - Min, avg, max of database times.
13
+ * rails_request_duration - Min, avg, max of the total request durations.
14
+ * rails_request_error - Application errors and process blocker counters.
15
+ * rails_requests - Get, put, post and delete requests.
16
+ * rails_view_render_time - Min, avg and max view render times.
17
+
18
+ For screenshots, head over to: http://barttenbrinke.github.com/munin-plugins-rails/
19
+
20
+ == Installation
21
+ The plugins follows the default munin installation scheme:
22
+ git clone git://github.com/barttenbrinke/munin-plugins-rails.git
23
+ cp munin-plugins-rails/rails_requests /usr/share/munin/plugins/
24
+ chmod +x /usr/share/munin/plugins/rails_requests
25
+ ln -s /usr/share/munin/plugins/rails_requests /etc/munin/plugins/rails_requests
26
+ vi /etc/munin/plugin-conf.d/munin-node
27
+
28
+ Paste the configuration from the documentation of rails_requests into the munin-node file.
29
+ [rails_requests]
30
+ env.log_file '/path/to/production.log'
31
+ user www-data
32
+ command /usr/local/bin/ruby %c
33
+
34
+ Run "/etc/munin/plugins/rails_requests autoconf" and "munin-run rails_requests" to test the plugin.
35
+
36
+ For more detailed information, see the documentation embedded in the plugin.
37
+ Each plugin is packed with an example config and a ln -s you can copy.
38
+
39
+ == Monitoring multiple applications
40
+
41
+ If you want to run the plugin for more than one app the best way is to symlink the plugin multiple times.
42
+ Also set a different graph_category for each of app. For instance:
43
+
44
+ ln -s /usr/share/munin/plugins/rails_requests /etc/munin/plugins/rails_app1_requests
45
+ ln -s /usr/share/munin/plugins/rails_requests /etc/munin/plugins/rails_app2_requests
46
+
47
+ And in the munin-node file:
48
+
49
+ [rails_app1_*]
50
+ env.log_file '/path/to/app1/production.log'
51
+ env.graph_category App1
52
+
53
+ [rails_app2_*]
54
+ env.log_file '/path/to/app2/production.log'
55
+ env.graph_category App2
56
+
57
+ == Problems
58
+ * sudo gem install request-log-analyzer
59
+ * Check if the paths in the plugin configuration are correct.
60
+ * Make sure the specified user is allowed to write to /tmp and access your rails logfile.
61
+
62
+ If you encounter performance problems with your app, please take a look at the request-log-analyzer wiki on
63
+ examples on how to drill down to the core of your problem. If you want to hire an expert, please visit us at
64
+ http://railsdoctors.com or mail me at: bart@railsdoctors.com
65
+
66
+ Happy monitoring!
67
+
68
+ == Additional information
69
+ * Railsdoctors: http://railsdoctors.com
70
+ * Request-log-analzer: http://github.com/wvanbergen/request-log-analyzer/
71
+ * Screenshots http://barttenbrinke.github.com/munin-plugins-rails/
72
+ * Munin: http://munin.projects.linpro.no/wiki/ConcisePlugins
73
+ * License: MIT
74
+
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.2.10
@@ -0,0 +1,4 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'munin-plugins-rails'
4
+ Munin::Command.new.run(ARGV)
@@ -0,0 +1,7 @@
1
+ require 'munin/request_log_analyzer_plugin'
2
+ require 'munin/rails_plugin'
3
+ require 'munin/command'
4
+
5
+ Dir.glob(File.join(File.dirname(__FILE__), "munin", "plugins", "*.rb")).each do |file|
6
+ require file
7
+ end
@@ -0,0 +1,77 @@
1
+ require 'fileutils'
2
+ require 'erb'
3
+ module Munin
4
+ class Command
5
+ def run(args)
6
+ if args.first == "install"
7
+ install_passenger_plugins
8
+ elsif args.first == "add"
9
+ args.shift
10
+ install_application(args)
11
+ end
12
+ end
13
+ PASSENGER_PLUGINS = %W{munin_passenger_memory_stats munin_passenger_queue munin_passenger_status}
14
+ RAILS_PLUGINS = %W{munin_rails_database_time munin_rails_request_duration munin_rails_request_error munin_rails_requests munin_rails_view_render_time}
15
+
16
+ PASSENGER_PLUGIN_CONFIG = <<-DATA
17
+ [<%= plugin_target_name %>]
18
+ user root
19
+ command /usr/local/bin/ruby %c
20
+ env.passenger_status '/usr/local/bin/passenger-status'
21
+ env.passenger_memory_stats '/usr/local/bin/passenger-memory-stats'
22
+ env.graph_category Passenger
23
+ DATA
24
+
25
+ RAILS_PLUGIN_CONFIG = <<-DATA
26
+ [<%= plugin_target_name %>]
27
+ env.log_file <%= options[:log_file] %>
28
+ user root
29
+ command /usr/local/bin/ruby %c
30
+ env.request_log_analyzer /usr/local/bin/request-log-analyzer
31
+ env.graph_category <%= plugin_target_name %>
32
+ DATA
33
+
34
+ def install_application(args)
35
+ app_name = args.shift
36
+ log_file = args.shift
37
+ RAILS_PLUGINS.each do |plugin|
38
+ plugin_target_name = [app_name, plugin].join("_")
39
+ add_plugin(plugin, plugin_target_name)
40
+ add_plugin_config(plugin_target_name, RAILS_PLUGIN_CONFIG, :log_file => log_file)
41
+ end
42
+ end
43
+
44
+ def install_passenger_plugins
45
+ PASSENGER_PLUGINS.each do |plugin|
46
+ add_plugin(plugin, plugin)
47
+ add_plugin_config(plugin, PASSENGER_PLUGIN_CONFIG)
48
+ end
49
+ end
50
+
51
+ def add_plugin_config(plugin_target_name, config_template, options = {})
52
+ FileUtils.mkdir_p(munin_plugin_config_path)
53
+ template = ERB.new config_template
54
+ File.open(File.join(munin_plugin_config_path, plugin_target_name), "w+") do |file|
55
+ file << template.result(binding)
56
+ end
57
+ end
58
+
59
+ def add_plugin(plugin_file, plugin_target_name = nil)
60
+ FileUtils.mkdir_p(munin_plugins_path)
61
+ plugin_target_name ||= plugin_file
62
+ `ln -nsf "#{File.join(munin_dir, plugin_file)}" "#{munin_plugins_path}/#{plugin_target_name}"`
63
+ end
64
+
65
+ def munin_plugins_path
66
+ "/etc/munin/plugins"
67
+ end
68
+
69
+ def munin_plugin_config_path
70
+ "/etc/munin/plugin-conf.d"
71
+ end
72
+
73
+ def munin_dir
74
+ File.join(File.dirname(__FILE__), "..", "..", "munin")
75
+ end
76
+ end
77
+ end
@@ -0,0 +1,42 @@
1
+ module Munin
2
+ class PassengerMemoryStats < RequestLogAnalyzerPlugin
3
+ def ensure_configuration
4
+ require_passenger_gem
5
+ require_passenger_memory_stats
6
+
7
+ super
8
+ end
9
+
10
+ def config
11
+ memory_info = open('/proc/meminfo', 'r') do |lines|
12
+ lines.inject({}) do |h, line|
13
+ matched = line.match(/^([\w_\(\)]+):\s+(\d+)/)
14
+ h[matched[1].to_sym] = matched[2].to_i * 1024
15
+ h
16
+ end
17
+ end
18
+ upper_limit = memory_info[:MemTotal]
19
+ puts <<-CONFIG
20
+ graph_category #{graph_category}
21
+ graph_title Passenger memory stats
22
+ graph_vlabel Bytes
23
+ graph_args --base 1000 -l 0 --upper-limit #{upper_limit}
24
+ graph_info The memory used by passenger instances on this application server
25
+
26
+ memory.label memory
27
+ CONFIG
28
+ exit 0
29
+ end
30
+
31
+ # Collect the data
32
+ # <tt>debug</tt> Show debug information
33
+ def run
34
+ stats = run_command(passenger_memory_stats, debug)
35
+
36
+ #### Total private dirty RSS: 81.81 MB
37
+ stats =~ /RSS:\s*([\d\.]+)\s*MB\Z/m
38
+ memory = ($1.to_f * 1024 * 1024).to_i
39
+ puts "memory.value #{memory}"
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,27 @@
1
+ module Munin
2
+ class PassengerQueue < RequestLogAnalyzerPlugin
3
+ def ensure_configuration
4
+ require_passenger_status
5
+ super
6
+ end
7
+
8
+ def config
9
+ puts <<-CONFIG
10
+ graph_category #{graph_category}
11
+ graph_title Passenger queue
12
+ graph_vlabel count
13
+ graph_args --base 1000 -l 0
14
+ graph_info The amount of requests waiting on global queue
15
+
16
+ requests.label requests
17
+ CONFIG
18
+ exit 0
19
+ end
20
+
21
+ def run
22
+ status = run_command(passenger_status, debug)
23
+ status =~ /Waiting on global queue:\s+(\d+)/
24
+ puts "requests.value #{$1}"
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,46 @@
1
+ module Munin
2
+ class PassengerStatus < RequestLogAnalyzerPlugin
3
+ def ensure_configuration
4
+ require_passenger_status
5
+ super
6
+ end
7
+
8
+ def config
9
+ status = `#{passenger_status}`
10
+
11
+ status =~ /max\s+=\s+(\d+)/
12
+ upper_limit = $1 || 150
13
+
14
+ puts <<-CONFIG
15
+ graph_category #{graph_category}
16
+ graph_title Passenger status
17
+ graph_vlabel count
18
+ graph_args --base 1000 -l 0 --upper-limit #{upper_limit}
19
+ graph_info The amount of active passengers on this application server - railsdoctors.com
20
+
21
+ sessions.label sessions
22
+ max.label max processes
23
+ running.label running processes
24
+ active.label active processes
25
+ CONFIG
26
+ exit 0
27
+ end
28
+
29
+ def run
30
+ status = run_command(passenger_status, debug)
31
+
32
+ status =~ /max\s+=\s+(\d+)/
33
+ puts "max.value #{$1}"
34
+
35
+ status =~ /count\s+=\s+(\d+)/
36
+ puts "running.value #{$1}"
37
+
38
+ status =~ /active\s+=\s+(\d+)/
39
+ puts "active.value #{$1}"
40
+
41
+ total_sessions = 0
42
+ status.scan(/Sessions: (\d+)/).flatten.each { |count| total_sessions += count.to_i }
43
+ puts "sessions.value #{total_sessions}"
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,49 @@
1
+ module Munin
2
+ class RailsDatabaseTime < RailsPlugin
3
+ def config
4
+ puts <<-CONFIG
5
+ graph_category #{graph_category}
6
+ graph_title Database time
7
+ graph_vlabel Seconds
8
+ graph_args --base 1000 -l 0
9
+ graph_info The minimum, maximum and average database times - railsdoctors.com
10
+
11
+ min.label min
12
+ max.label max
13
+ average.label avg
14
+ CONFIG
15
+ exit 0
16
+ end
17
+
18
+ # Gather information
19
+ def run
20
+ ensure_log_file
21
+
22
+ # Initialize values
23
+ max_value = 0
24
+ min_value = 1.0/0.0
25
+ cumulative = 0
26
+ hits = 0
27
+
28
+ rla = parse_request_log_analyzer_data
29
+
30
+ if rla && rla["Database time"]
31
+ rla["Database time"].each do |item|
32
+ max_value = item[1][:max] if item[1][:max] > max_value
33
+ min_value = item[1][:min] if item[1][:min] < min_value
34
+ hits += item[1][:hits]
35
+ cumulative += item[1][:sum]
36
+ end
37
+ else
38
+ hits = 1
39
+ min_value = 0
40
+ end
41
+
42
+ # Report in seconds
43
+ puts "max.value #{max_value}"
44
+ puts "min.value #{min_value}"
45
+ puts "average.value #{cumulative / hits.to_f}"
46
+ end
47
+
48
+ end
49
+ end
@@ -0,0 +1,47 @@
1
+ module Munin
2
+ class RailsRequestDuration < RailsPlugin
3
+ def config
4
+ puts <<-CONFIG
5
+ graph_category #{graph_category}
6
+ graph_title Request time
7
+ graph_vlabel Seconds
8
+ graph_args --base 1000 -l 0
9
+ graph_info The minimum, maximum and average request times - railsdoctors.com
10
+
11
+ min.label min
12
+ max.label max
13
+ average.label avg
14
+ CONFIG
15
+ exit 0
16
+ end
17
+
18
+ # Gather information
19
+ def run
20
+ ensure_log_file
21
+
22
+ # Initialize values
23
+ max_value = 0
24
+ min_value = 1.0/0.0
25
+ cumulative = 0
26
+ hits = 0
27
+
28
+ rla = parse_request_log_analyzer_data
29
+
30
+ if rla && rla["Request duration"]
31
+ rla["Request duration"].each do |item|
32
+ max_value = item[1][:max] if item[1][:max] > max_value
33
+ min_value = item[1][:min] if item[1][:min] < min_value
34
+ hits += item[1][:hits]
35
+ cumulative += item[1][:sum]
36
+ end
37
+ else
38
+ hits = 1
39
+ min_value = 0
40
+ end
41
+
42
+ puts "max.value #{max_value}"
43
+ puts "min.value #{min_value}"
44
+ puts "average.value #{cumulative / hits.to_f}"
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,42 @@
1
+ module Munin
2
+ class RailsRequestError < RailsPlugin
3
+ def config
4
+ puts <<-CONFIG
5
+ graph_category #{graph_category}
6
+ graph_title Request errors
7
+ graph_vlabel Count
8
+ graph_info The amount of request errors - railsdoctors.com
9
+
10
+ error.label error
11
+ blocker.label blocker
12
+ CONFIG
13
+ exit 0
14
+ end
15
+
16
+ # Gather information
17
+ def run
18
+ ensure_log_file
19
+
20
+ # Initialize values
21
+ error_value = 0
22
+ blocker_value = 0
23
+
24
+ rla = parse_request_log_analyzer_data
25
+
26
+ if rla && rla["Failed requests"]
27
+ rla["Failed requests"].each do |item|
28
+ error_value += item[1]
29
+ end
30
+ end
31
+
32
+ if rla && rla["Process blockers (> 1 sec duration)"]
33
+ rla["Process blockers (> 1 sec duration)"].each do |item|
34
+ blocker_value += item[1]
35
+ end
36
+ end
37
+
38
+ puts "error.value #{error_value}"
39
+ puts "blocker.value #{blocker_value}"
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,51 @@
1
+ module Munin
2
+ class RailsRequests < RailsPlugin
3
+ def config
4
+ puts <<-CONFIG
5
+ graph_category #{graph_category}
6
+ graph_title Processed requests
7
+ graph_vlabel Requests per second
8
+ graph_info The amount of requests processed by this application server - railsdoctors.com
9
+
10
+ get.label get
11
+ get.draw AREA
12
+ post.label post
13
+ post.draw STACK
14
+ put.label put
15
+ put.draw STACK
16
+ delete.label delete
17
+ delete.draw STACK
18
+ CONFIG
19
+ exit 0
20
+ end
21
+
22
+ # Gather information
23
+ def run
24
+ ensure_log_file
25
+
26
+ # Initialize values
27
+ get_value = 0
28
+ post_value = 0
29
+ put_value = 0
30
+ delete_value = 0
31
+
32
+ # Walk through the
33
+ File.open(get_request_log_analyzer_file).each_line{ |line|
34
+ if match = line.match(/^\s+GET\:\s(\d+).*/)
35
+ get_value = match[1].to_i
36
+ elsif match = line.match(/^\s+POST\:\s(\d+).*/)
37
+ post_value = match[1].to_i
38
+ elsif match = line.match(/^\s+PUT\:\s(\d+).*/)
39
+ put_value = match[1].to_i
40
+ elsif match = line.match(/^\s+DELETE\:\s(\d+).*/)
41
+ delete_value = match[1].to_i
42
+ end
43
+ }
44
+
45
+ puts "get.value #{get_value / interval.to_f}"
46
+ puts "post.value #{post_value / interval.to_f}"
47
+ puts "put.value #{put_value / interval.to_f}"
48
+ puts "delete.value #{delete_value / interval.to_f}"
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,47 @@
1
+ module Munin
2
+ class RailsViewRenderTime < RailsPlugin
3
+ def config
4
+ puts <<-CONFIG
5
+ graph_category #{graph_category}
6
+ graph_title View render times
7
+ graph_vlabel Seconds
8
+ graph_args --base 1000 -l 0
9
+ graph_info The minimum, maximum and average view render times - railsdoctors.com
10
+
11
+ min.label min
12
+ max.label max
13
+ average.label avg
14
+ CONFIG
15
+ exit 0
16
+ end
17
+
18
+ # Gather information
19
+ def run
20
+ ensure_log_file
21
+
22
+ # Initialize values
23
+ max_value = 0
24
+ min_value = 1.0/0.0
25
+ cumulative = 0
26
+ hits = 0
27
+
28
+ rla = parse_request_log_analyzer_data
29
+
30
+ if rla && rla["View rendering time"]
31
+ rla["View rendering time"].each do |item|
32
+ max_value = item[1][:max] if item[1][:max] > max_value
33
+ min_value = item[1][:min] if item[1][:min] < min_value
34
+ hits += item[1][:hits]
35
+ cumulative += item[1][:sum]
36
+ end
37
+ else
38
+ hits = 1
39
+ min_value = 0
40
+ end
41
+
42
+ puts "max.value #{max_value}"
43
+ puts "min.value #{min_value}"
44
+ puts "average.value #{cumulative / hits.to_f}"
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,83 @@
1
+ module Munin
2
+ class RailsPlugin < RequestLogAnalyzerPlugin
3
+
4
+ attr_accessor :interval
5
+ attr_accessor :number_of_lines
6
+ attr_accessor :log_file
7
+ attr_accessor :log_format
8
+ attr_accessor :after_time
9
+ attr_accessor :floor_time
10
+ attr_accessor :temp_folder
11
+ attr_accessor :temp_prefix
12
+ attr_accessor :temp_file_name
13
+ attr_accessor :request_log_analyzer
14
+
15
+ def handle_arguments(args, environment)
16
+ super
17
+
18
+ self.interval = environment['interval'] ? environment['interval'].to_i : 300
19
+ self.number_of_lines = environment['lines'] || 50000
20
+ self.log_file = environment['log_file'] || args[0]
21
+ self.log_format = environment['log_format'] ? "--format #{environment['log_format']}" : ''
22
+ self.after_time = (Time.now - interval).strftime('%Y%m%d%H%M%S')
23
+ self.floor_time = Time.at((Time.now.to_f / interval).floor * interval)
24
+
25
+ self.temp_folder = '/tmp'
26
+ self.temp_prefix = graph_category == 'App' ? 'rla' : graph_category.downcase
27
+ self.temp_file_name = "#{temp_prefix}_#{floor_time.to_i}.yml"
28
+ self.request_log_analyzer = environment['request_log_analyzer'] || '/usr/bin/request-log-analyzer'
29
+ end
30
+
31
+ def parse_request_log_analyzer_data
32
+ YAML::load_file( get_request_log_analyzer_file )
33
+ end
34
+
35
+ def get_request_log_analyzer_file
36
+ fetch_or_create_yaml_file(log_file, debug)
37
+ end
38
+
39
+ def ensure_configuration
40
+ require_request_log_analyzer_gem
41
+ require_yaml_gem
42
+ require_tail_command
43
+
44
+ super
45
+ end
46
+
47
+ def ensure_log_file
48
+ if log_file == "" || log_file.nil?
49
+ $stderr.puts "Filepath unspecified. Exiting"
50
+ exit 1
51
+ end
52
+ end
53
+
54
+ def fetch_or_create_yaml_file(log_file, debug = false)
55
+ # Clean up any old temp files left in de temp folder
56
+ Dir.new(temp_folder).entries.each do |file_name|
57
+ if match = file_name.match(/^#{temp_prefix}_.*\.yml/)
58
+ if match[0] != temp_file_name
59
+ puts "Removing old cache file: #{file_name}" if debug
60
+ File.delete(temp_folder + "/" + file_name)
61
+ end
62
+ end
63
+ end
64
+
65
+ temp_file = temp_folder + "/" + temp_file_name
66
+
67
+ # Create temp file rla if needed
68
+ unless File.exists?(temp_file)
69
+ puts "Processing the last #{number_of_lines} lines of #{log_file} which are less then #{interval} seconds old." if debug
70
+ status = `tail -n #{number_of_lines} #{log_file} | #{request_log_analyzer} - --after #{after_time} #{log_format} -b --dump #{temp_file}`
71
+
72
+ unless $?.success?
73
+ $stderr.puts "failed executing request-log-analyzer. Is the gem path correct?"
74
+ exit 1
75
+ end
76
+ else
77
+ puts "Processing cached YAML result #{temp_file}" if debug
78
+ end
79
+
80
+ return temp_file
81
+ end
82
+ end
83
+ end
@@ -0,0 +1,115 @@
1
+ module Munin
2
+ class RequestLogAnalyzerPlugin
3
+ attr_accessor :graph_category
4
+ attr_accessor :passenger_memory_stats
5
+ attr_accessor :passenger_status
6
+ attr_accessor :debug
7
+ attr_accessor :environment
8
+
9
+ def initialize(args, environment)
10
+ handle_arguments(args, environment)
11
+ ensure_configuration
12
+
13
+ if args[0] == "config"
14
+ config
15
+ elsif args[0] == "autoconf"
16
+ autoconf
17
+ end
18
+ end
19
+
20
+ def handle_arguments(args, environment)
21
+ self.environment = environment
22
+ self.graph_category = environment['graph_category'] || 'App'
23
+
24
+ if args[0] == "debug"
25
+ args.shift
26
+ self.debug = true
27
+ end
28
+ end
29
+
30
+ def require_passenger_gem
31
+ require_gem("passenger", ">=2.0")
32
+ end
33
+
34
+ def run_command(command, debug = false)
35
+ result = `#{command}`
36
+
37
+ unless $?.success?
38
+ $stderr.puts "failed executing #{command}"
39
+ exit 1
40
+ end
41
+
42
+ puts result if debug
43
+
44
+ result
45
+ end
46
+
47
+ def require_request_log_analyzer_gem
48
+ require_gem("request-log-analyzer", ">=1.1.6")
49
+ end
50
+
51
+ def require_yaml_gem
52
+ begin
53
+ require 'yaml'
54
+ rescue Exception => e
55
+ puts "no (yaml not found)"
56
+ exit 1
57
+ end
58
+ end
59
+
60
+ def require_command(command_name)
61
+ status = `#{command_name}`
62
+ unless $?.success?
63
+ puts "no (error when excuting #{command_name})"
64
+ exit 1
65
+ end
66
+ end
67
+
68
+ def require_tail_command
69
+ unless `echo "test" | tail 2>/dev/null`.include?("test")
70
+ puts "no (tail command not found)"
71
+ exit 1
72
+ end
73
+ end
74
+
75
+ def require_passenger_status
76
+ self.passenger_status = environment['passenger_status'] || '/usr/local/bin/passenger-status'
77
+ #to use if you have multiple passenger on the host like phusion passenger standalone
78
+ if environment['apache_pid_file']
79
+ self.passenger_status = "cat #{environment['apache_pid_file']} | xargs -0 #{passenger_status}"
80
+ end
81
+
82
+ require_command(passenger_status)
83
+ end
84
+
85
+ def require_passenger_memory_stats
86
+ self.passenger_memory_stats = environment['passenger_memory_stats'] || '/usr/local/bin/passenger-memory-stats'
87
+
88
+ require_command(passenger_memory_stats)
89
+ end
90
+
91
+ def require_gem(gemname, version = nil)
92
+ begin
93
+ require 'rubygems'
94
+ if version
95
+ gem gemname, version
96
+ else
97
+ gem gemname
98
+ end
99
+ rescue Exception => e
100
+ puts "no (Gem not found: #{e})"
101
+ exit 1
102
+ end
103
+ end
104
+
105
+ def ensure_configuration
106
+
107
+ end
108
+
109
+ def autoconf
110
+ ensure_configuration
111
+ puts "yes"
112
+ exit 0
113
+ end
114
+ end
115
+ end
@@ -0,0 +1,48 @@
1
+ #!/usr/bin/env ruby
2
+ pod=<<-POD
3
+
4
+ =head1 NAME
5
+ passenger_memory_stats - Munin plugin to monitor the memory usage of passenger application servers.
6
+ Monitors the memory consumed by passenger instances.
7
+
8
+ =head1 APPLICABLE SYSTEMS
9
+ All systems that have passenger installed.
10
+
11
+ =head1 CONFIGURATION
12
+ The plugin needs to execute passenger-memory-stats.
13
+ This configuration section shows the defaults of the plugin:
14
+
15
+ [passenger_*]
16
+ user root
17
+ command /usr/local/bin/ruby %c
18
+
19
+ Options
20
+ env.passenger_memory_stats '/path/to/passenger-memory-stats' # Path to passenger memory status.
21
+ env.graph_category 'App' # Graph Category. Defaults to App.
22
+
23
+ ln -s /usr/share/munin/plugins/passenger_memory_stats /etc/munin/plugins/passenger_memory_stats
24
+
25
+ =head1 INTERPRETATION
26
+ The plugin shows the memory consumed by passenger instances.
27
+
28
+ =head1 MAGIC MARKERS
29
+ #%# family=auto
30
+ #%# capabilities=autoconf
31
+
32
+ =head1 VERSION
33
+ 1.9.7
34
+
35
+ =head1 BUGS
36
+ None known
37
+
38
+ =head1 AUTHOR
39
+ Ilya Lityuga
40
+ Bart ten Brinke - railsdoctors.com
41
+
42
+ =head1 LICENSE
43
+ MIT
44
+
45
+ POD
46
+ require 'rubygems'
47
+ require 'munin-plugins-rails'
48
+ Munin::PassengerMemoryStats.new(ARGV, ENV).run
@@ -0,0 +1,51 @@
1
+ #!/usr/bin/env ruby
2
+ pod=<<-POD
3
+
4
+ =head1 NAME
5
+ passenger_queue - Munin plugin to monitor passenger queue.
6
+ Monitors the amount of requests in global queue.
7
+
8
+ =head1 APPLICABLE SYSTEMS
9
+ All systems that have passenger installed.
10
+
11
+ =head1 CONFIGURATION
12
+ The plugin needs to execute passenger-status.
13
+ This configuration section shows the defaults of the plugin:
14
+
15
+ [passenger_*]
16
+ user root
17
+ command /usr/local/bin/ruby %c
18
+
19
+ Options
20
+ env.passenger_status '/path/to/passenger-status' # Path to passenger-status
21
+ env.apache_pid_file '/path/to/apache2.pid' # Path to passenger-status (like /var/run/apache2.pid)
22
+ env.graph_category 'App' # Graph Category. Defaults to App.
23
+
24
+ ln -s /usr/share/munin/plugins/passenger_queue /etc/munin/plugins/passenger_queue
25
+
26
+ =head1 INTERPRETATION
27
+ The plugin shows the current number of requests waiting on global queue.
28
+
29
+ =head1 MAGIC MARKERS
30
+ #%# family=auto
31
+ #%# capabilities=autoconf
32
+
33
+ =head1 VERSION
34
+ 1.9.7
35
+
36
+ =head1 BUGS
37
+ None known
38
+
39
+ =head1 AUTHOR
40
+ Michaël Witrant - http://michael.witrant.com/
41
+ Bart ten Brinke - railsdoctors.com
42
+ Daniel Manges - http://gist.github.com/20319
43
+
44
+ =head1 LICENSE
45
+ MIT
46
+
47
+ POD
48
+ require 'rubygems'
49
+ require 'munin-plugins-rails'
50
+
51
+ Munin::PassengerQueue.new(ARGV, ENV).run
@@ -0,0 +1,50 @@
1
+ #!/usr/bin/env ruby
2
+ pod=<<-POD
3
+
4
+ =head1 NAME
5
+ passenger_status - Munin plugin to monitor passenger application servers.
6
+ Monitors the amount of sessions and running, active and maximum amount of passenger instances.
7
+
8
+ =head1 APPLICABLE SYSTEMS
9
+ All systems that have passenger installed.
10
+
11
+ =head1 CONFIGURATION
12
+ The plugin needs to execute passenger-status.
13
+ This configuration section shows the defaults of the plugin:
14
+
15
+ [passenger_*]
16
+ user root
17
+ command /usr/local/bin/ruby %c
18
+
19
+ Options
20
+ env.passenger_status '/path/to/passenger-status' # Path to passenger-status
21
+ env.graph_category 'App' # Graph Category. Defaults to App.
22
+ env.apache_pid_file '/var/run/apache2.pid' # Use if you want to monitor multiple installations.
23
+
24
+ ln -s /usr/share/munin/plugins/passenger_status /etc/munin/plugins/passenger_status
25
+
26
+ =head1 INTERPRETATION
27
+ The plugin shows the maximum, active and current number of running passenger instances.
28
+
29
+ =head1 MAGIC MARKERS
30
+ #%# family=auto
31
+ #%# capabilities=autoconf
32
+
33
+ =head1 VERSION
34
+ 1.9.7.1
35
+
36
+ =head1 BUGS
37
+ None known
38
+
39
+ =head1 AUTHOR
40
+ Bart ten Brinke - railsdoctors.com
41
+ Daniel Manges - http://gist.github.com/20319
42
+
43
+ =head1 LICENSE
44
+ MIT
45
+
46
+ POD
47
+ require 'rubygems'
48
+ require 'munin-plugins-rails'
49
+
50
+ Munin::PassengerStatus.new(ARGV, ENV).run
@@ -0,0 +1,53 @@
1
+ #!/usr/bin/env ruby
2
+ pod=<<-POD
3
+
4
+ =head1 NAME
5
+ rails_database_time - Munin plugin to monitor the minimum, average and maximum database times.
6
+
7
+ =head1 APPLICABLE SYSTEMS
8
+ All systems that have a rails application log.
9
+
10
+ =head1 CONFIGURATION
11
+ The request-log-analyzer gem has to be intalled.
12
+ Also the script has to be able to access the rails log file and tail.
13
+ This configuration section shows the defaults of the plugin:
14
+
15
+ [rails_database_time]
16
+ env.log_file '/path/to/production.log'
17
+ user www-data
18
+ command /usr/local/bin/ruby %c
19
+ log_format rails3
20
+
21
+ Options
22
+ env.lines 50000 # Number of lines to tail
23
+ env.interval 300 # Munin interval in seconds (used for graphs and caching)
24
+ env.log_format # request-log-analyzer log format (passed to '--format')
25
+ env.request_log_analyzer '/usr/local/bin' # Path to gem. Use this for Debian.
26
+ env.graph_category 'App' # Graph Category. Defaults to App.
27
+
28
+ ln -s /usr/share/munin/plugins/rails_database_time /etc/munin/plugins/rails_database_time
29
+
30
+ =head1 INTERPRETATION
31
+ Three lines are graphed, showing the minimum, average and maximum database times.
32
+
33
+ =head1 MAGIC MARKERS
34
+ #%# family=auto
35
+ #%# capabilities=autoconf
36
+
37
+ =head1 VERSION
38
+ 1.9.7
39
+
40
+ =head1 BUGS
41
+ None known
42
+
43
+ =head1 AUTHOR
44
+ Bart ten Brinke - railsdoctors.com
45
+
46
+ =head1 LICENSE
47
+ MIT
48
+
49
+ POD
50
+ require 'rubygems'
51
+ require 'munin-plugins-rails'
52
+
53
+ Munin::RailsDatabaseTime.new(ARGV, ENV).run
@@ -0,0 +1,53 @@
1
+ #!/usr/bin/env ruby
2
+ pod=<<-POD
3
+
4
+ =head1 NAME
5
+ rails_request_duration - Munin plugin to monitor the minimum, average and maximum request duration.
6
+
7
+ =head1 APPLICABLE SYSTEMS
8
+ All systems that have a rails application log.
9
+
10
+ =head1 CONFIGURATION
11
+ The request-log-analyzer gem has to be intalled.
12
+ Also the script has to be able to access the rails log file and tail.
13
+ This configuration section shows the defaults of the plugin:
14
+
15
+ [rails_request_duration]
16
+ env.log_file '/path/to/production.log'
17
+ user www-data
18
+ command /usr/local/bin/ruby %c
19
+ log_format rails3
20
+
21
+ Options
22
+ env.lines 50000 # Number of lines to tail
23
+ env.interval 300 # Munin interval in seconds (used for graphs and caching)
24
+ env.log_format # request-log-analyzer log format (passed to '--format')
25
+ env.request_log_analyzer '/usr/local/bin' # Path to gem. Use this for Debian.
26
+ env.graph_category 'App' # Graph Category. Defaults to App.
27
+
28
+ ln -s /usr/share/munin/plugins/rails_request_duration /etc/munin/plugins/rails_request_duration
29
+
30
+ =head1 INTERPRETATION
31
+ Three lines are graphed, showing the minimum, average and maximum request times.
32
+
33
+ =head1 MAGIC MARKERS
34
+ #%# family=auto
35
+ #%# capabilities=autoconf
36
+
37
+ =head1 VERSION
38
+ 1.9.7
39
+
40
+ =head1 BUGS
41
+ None known
42
+
43
+ =head1 AUTHOR
44
+ Bart ten Brinke - railsdoctors.com
45
+
46
+ =head1 LICENSE
47
+ MIT
48
+
49
+ POD
50
+ require 'rubygems'
51
+ require 'munin-plugins-rails'
52
+
53
+ Munin::RailsRequestDuration.new(ARGV, ENV).run
@@ -0,0 +1,54 @@
1
+ #!/usr/bin/env ruby
2
+ pod=<<-POD
3
+
4
+ =head1 NAME
5
+ rails_request_error - Munin plugin to monitor the amount of errors and process blockers.
6
+
7
+ =head1 APPLICABLE SYSTEMS
8
+ All systems that have a rails application log.
9
+
10
+ =head1 CONFIGURATION
11
+ The request-log-analyzer gem has to be intalled.
12
+ Also the script has to be able to access the rails log file and tail.
13
+ This configuration section shows the defaults of the plugin:
14
+
15
+ [rails_request_error]
16
+ env.log_file '/path/to/production.log'
17
+ user www-data
18
+ command /usr/local/bin/ruby %c
19
+ log_format rails3
20
+
21
+ Options
22
+ env.lines 50000 # Number of lines to tail
23
+ env.interval 300 # Munin interval in seconds (used for graphs and caching)
24
+ env.log_format # request-log-analyzer log format (passed to '--format')
25
+ env.request_log_analyzer '/usr/local/bin' # Path to gem. Use this for Debian.
26
+ env.graph_category 'App' # Graph Category. Defaults to App.
27
+
28
+ ln -s /usr/share/munin/plugins/rails_request_error /etc/munin/plugins/rails_request_error
29
+
30
+ =head1 INTERPRETATION
31
+ Two lines are graphed, one showing the amount of errors raised and one showing the amount of process
32
+ blockers. Process blockers are requests that took longer than 1 second to complete.
33
+
34
+ =head1 MAGIC MARKERS
35
+ #%# family=auto
36
+ #%# capabilities=autoconf
37
+
38
+ =head1 VERSION
39
+ 1.9.7
40
+
41
+ =head1 BUGS
42
+ None known
43
+
44
+ =head1 AUTHOR
45
+ Bart ten Brinke - railsdoctors.com
46
+
47
+ =head1 LICENSE
48
+ MIT
49
+
50
+ POD
51
+ require 'rubygems'
52
+ require 'munin-plugins-rails'
53
+
54
+ Munin::RailsRequestError.new(ARGV, ENV).run
@@ -0,0 +1,54 @@
1
+ #!/usr/bin/env ruby
2
+ pod=<<-POD
3
+
4
+ =head1 NAME
5
+ rails_requests - Munin plugin to monitor the amount of get, put, post and delete requests from a
6
+ rails application log.
7
+
8
+ =head1 APPLICABLE SYSTEMS
9
+ All systems that have a rails application log.
10
+
11
+ =head1 CONFIGURATION
12
+ The request-log-analyzer gem has to be intalled.
13
+ Also the script has to be able to access the rails log file and tail.
14
+ This configuration section shows the defaults of the plugin:
15
+
16
+ [rails_requests]
17
+ env.log_file '/path/to/production.log'
18
+ user www-data
19
+ command /usr/local/bin/ruby %c
20
+ log_format rails3
21
+
22
+ Options
23
+ env.lines 50000 # Number of lines to tail
24
+ env.interval 300 # Munin interval in seconds (used for graphs and caching)
25
+ env.log_format # request-log-analyzer log format (passed to '--format')
26
+ env.request_log_analyzer '/usr/local/bin' # Path to gem. Use this for Debian.
27
+ env.graph_category 'App' # Graph Category. Defaults to App.
28
+
29
+ ln -s /usr/share/munin/plugins/rails_requests /etc/munin/plugins/rails_requests
30
+
31
+ =head1 INTERPRETATION
32
+ All HTTP methods are stacked so that the total equals the amount of requests processed per 5 minutes.
33
+
34
+ =head1 MAGIC MARKERS
35
+ #%# family=auto
36
+ #%# capabilities=autoconf
37
+
38
+ =head1 VERSION
39
+ 1.9.7
40
+
41
+ =head1 BUGS
42
+ None known
43
+
44
+ =head1 AUTHOR
45
+ Bart ten Brinke - railsdoctors.com
46
+
47
+ =head1 LICENSE
48
+ MIT
49
+
50
+ POD
51
+ require 'rubygems'
52
+ require 'munin-plugins-rails'
53
+
54
+ Munin::RailsRequests.new(ARGV, ENV).run
@@ -0,0 +1,53 @@
1
+ #!/usr/bin/env ruby
2
+ pod=<<-POD
3
+
4
+ =head1 NAME
5
+ rails_view_render_time - Munin plugin to monitor the minimum, average and maximum view render times.
6
+
7
+ =head1 APPLICABLE SYSTEMS
8
+ All systems that have a rails application log.
9
+
10
+ =head1 CONFIGURATION
11
+ The request-log-analyzer gem has to be intalled.
12
+ Also the script has to be able to access the rails log file and tail.
13
+ This configuration section shows the defaults of the plugin:
14
+
15
+ [rails_view_render_time]
16
+ env.log_file '/path/to/production.log'
17
+ user www-data
18
+ command /usr/local/bin/ruby %c
19
+ log_format rails3
20
+
21
+ Options
22
+ env.lines 50000 # Number of lines to tail
23
+ env.interval 300 # Munin interval in seconds (used for graphs and caching)
24
+ env.log_format # request-log-analyzer log format (passed to '--format')
25
+ env.request_log_analyzer '/usr/local/bin' # Path to gem. Use this for Debian.
26
+ env.graph_category 'App' # Graph Category. Defaults to App.
27
+
28
+ ln -s /usr/share/munin/plugins/rails_view_render_time /etc/munin/plugins/rails_view_render_time
29
+
30
+ =head1 INTERPRETATION
31
+ Three lines are graphed, showing the minimum, average and maximum view render times.
32
+
33
+ =head1 MAGIC MARKERS
34
+ #%# family=auto
35
+ #%# capabilities=autoconf
36
+
37
+ =head1 VERSION
38
+ 1.9.7
39
+
40
+ =head1 BUGS
41
+ None known
42
+
43
+ =head1 AUTHOR
44
+ Bart ten Brinke - railsdoctors.com
45
+
46
+ =head1 LICENSE
47
+ MIT
48
+
49
+ POD
50
+ require 'rubygems'
51
+ require 'munin-plugins-rails'
52
+
53
+ Munin::RailsViewRenderTime.new(ARGV, ENV).run
metadata ADDED
@@ -0,0 +1,90 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: munin-plugins-rails
3
+ version: !ruby/object:Gem::Version
4
+ hash: 3
5
+ prerelease: false
6
+ segments:
7
+ - 0
8
+ - 2
9
+ - 10
10
+ version: 0.2.10
11
+ platform: ruby
12
+ authors:
13
+ - Andrew Eberbach
14
+ - Bart ten Brinke
15
+ autorequire:
16
+ bindir: bin
17
+ cert_chain: []
18
+
19
+ date: 2011-03-19 00:00:00 +01:00
20
+ default_executable: request-log-analyzer-munin
21
+ dependencies: []
22
+
23
+ description:
24
+ email: andrew@ebertech.ca
25
+ executables:
26
+ - request-log-analyzer-munin
27
+ extensions: []
28
+
29
+ extra_rdoc_files:
30
+ - README.rdoc
31
+ files:
32
+ - VERSION
33
+ - lib/munin-plugins-rails.rb
34
+ - lib/munin/command.rb
35
+ - lib/munin/plugins/passenger_memory_stats.rb
36
+ - lib/munin/plugins/passenger_queue.rb
37
+ - lib/munin/plugins/passenger_status.rb
38
+ - lib/munin/plugins/rails_database_time.rb
39
+ - lib/munin/plugins/rails_request_duration.rb
40
+ - lib/munin/plugins/rails_request_error.rb
41
+ - lib/munin/plugins/rails_requests.rb
42
+ - lib/munin/plugins/rails_view_render_time.rb
43
+ - lib/munin/rails_plugin.rb
44
+ - lib/munin/request_log_analyzer_plugin.rb
45
+ - munin/munin_passenger_memory_stats
46
+ - munin/munin_passenger_queue
47
+ - munin/munin_passenger_status
48
+ - munin/munin_rails_database_time
49
+ - munin/munin_rails_request_duration
50
+ - munin/munin_rails_request_error
51
+ - munin/munin_rails_requests
52
+ - munin/munin_rails_view_render_time
53
+ - README.rdoc
54
+ - bin/request-log-analyzer-munin
55
+ has_rdoc: true
56
+ homepage:
57
+ licenses: []
58
+
59
+ post_install_message:
60
+ rdoc_options: []
61
+
62
+ require_paths:
63
+ - lib
64
+ required_ruby_version: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ">="
68
+ - !ruby/object:Gem::Version
69
+ hash: 3
70
+ segments:
71
+ - 0
72
+ version: "0"
73
+ required_rubygems_version: !ruby/object:Gem::Requirement
74
+ none: false
75
+ requirements:
76
+ - - ">="
77
+ - !ruby/object:Gem::Version
78
+ hash: 3
79
+ segments:
80
+ - 0
81
+ version: "0"
82
+ requirements: []
83
+
84
+ rubyforge_project:
85
+ rubygems_version: 1.3.7
86
+ signing_key:
87
+ specification_version: 3
88
+ summary: Plugins for Munin that use passenger and RLA
89
+ test_files: []
90
+