scout 5.8.8 → 5.8.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 17887658dacdcf2a9af9ffad002a01da70371ee1
4
- data.tar.gz: e33d1f81045691d14b119ee8b5505f1be5409e8a
3
+ metadata.gz: b8225b7bb56901315cf31c6e6d4308b3d2102d60
4
+ data.tar.gz: e38d3ec3d1c97ddf4a06c1ae5e79c63c16e8fba7
5
5
  SHA512:
6
- metadata.gz: 2798cc3b483bf9ec3393114e6c6afced138ae8254ecc8ba1841f4725c5b14e53951d35c84c5b4a764f31beca0ce3a5872858cd7d7cab8f1014497b76e5b28b0d
7
- data.tar.gz: 09ec0a737b96185bde361c5bf84661a8cf6050bb3f228e3015562a4bc455335e91e3d66b03efc73618611210c72748a8174bf5c70eea6becc47df846f10aa49d
6
+ metadata.gz: 5f338aa1e81174c811d63c08ab5f01c801b4d4ad9ab34b78762764ae937c7ef6bb5f2ae6ae0c9010c017081c416da96149269e1cb678e111a177c50f697b95d3
7
+ data.tar.gz: 915f66476f32bc8fd1f3547861a5bbe764761c864988a78593dbcb7ff1724bea2b2ce1a46be2a12b234505656676fc947edc95b41f175c3aa3cef3b658e5eb87
data/CHANGELOG.markdown CHANGED
@@ -1,3 +1,7 @@
1
+ # 5.8.9
2
+
3
+ * Added support for realtime system metrics (processes, cpu, memory, disks, network devices)
4
+
1
5
  # 5.8.8
2
6
 
3
7
  * Counters report nil values on initial report, rather than not reporting
@@ -9,7 +9,7 @@ module Scout
9
9
 
10
10
  # * history_file is the *path* to the history file
11
11
  # * plugin_ids is an array of integers
12
- def initialize(history_file, streaming_key, p_app_id, p_key, p_secret, plugin_ids, hostname, http_proxy, logger = nil)
12
+ def initialize(history_file, streaming_key, p_app_id, p_key, p_secret, plugin_ids, system_metric_collectors, hostname, http_proxy, logger = nil)
13
13
  @@continue_streaming = true
14
14
  @history_file = history_file
15
15
  @history = Hash.new
@@ -42,40 +42,16 @@ module Scout
42
42
  # main loop. Continue running until global $continue_streaming is set to false OR we've been running for MAX DURATION
43
43
  iteration=1 # use this to log the data at a couple points
44
44
  while(streamer_start_time+MAX_DURATION > Time.now && @@continue_streaming) do
45
- plugins=[]
46
- selected_plugins.each_with_index do |plugin_hash,i|
47
- # create an actual instance of the plugin
48
- plugin=get_instance_of(plugin_hash)
45
+ plugins = gather_plugin_reports(selected_plugins)
49
46
 
50
- start_time=Time.now
51
-
52
- data = {}
53
- begin
54
- Timeout.timeout(30, PluginTimeoutError) do
55
- data = plugin.run
56
- end
57
- rescue Timeout::Error, PluginTimeoutError
58
- error "Plugin took too long to run."
59
- end
60
-
61
- duration=((Time.now-start_time)*1000).to_i
62
-
63
- id_and_name = plugin_hash['id_and_name']
64
- @history["last_runs"][id_and_name] = start_time
65
- @history["memory"][id_and_name] = data[:memory]
66
-
67
- plugins << {:duration=>duration,
68
- :fields=>plugin.reports.inject{|memo,hash|memo.merge(hash)},
69
- :name=>plugin_hash['name'],
70
- :id=>plugin_hash['id'],
71
- :class=>plugin_hash['code_class']}
72
- end
47
+ system_metric_data = gather_system_metric_reports(system_metric_collectors)
73
48
 
74
49
  bundle={:hostname=>hostname,
75
50
  :server_time=>Time.now.strftime("%I:%M:%S %p"),
76
51
  :server_unixtime => Time.now.to_i,
77
52
  :num_processes=>`ps -e | wc -l`.chomp.to_i,
78
- :plugins=>plugins }
53
+ :plugins=>plugins,
54
+ :system_metrics => system_metric_data}
79
55
 
80
56
  # stream the data via pusherapp
81
57
  begin
@@ -104,6 +80,59 @@ module Scout
104
80
 
105
81
  private
106
82
 
83
+ def gather_plugin_reports(selected_plugins)
84
+ plugins = []
85
+ selected_plugins.each_with_index do |plugin_hash, i|
86
+ # create an actual instance of the plugin
87
+ plugin = get_instance_of(plugin_hash)
88
+ start_time = Time.now
89
+
90
+ data = {}
91
+ begin
92
+ Timeout.timeout(30, PluginTimeoutError) do
93
+ data = plugin.run
94
+ end
95
+ rescue Timeout::Error, PluginTimeoutError
96
+ error "Plugin took too long to run."
97
+ end
98
+ duration = ((Time.now-start_time) * 1000).to_i
99
+
100
+ id_and_name = plugin_hash['id_and_name']
101
+ @history["last_runs"][id_and_name] = start_time
102
+ @history["memory"][id_and_name] = data[:memory]
103
+
104
+ plugins << { :duration => duration,
105
+ :fields => plugin.reports.inject{|memo,hash|memo.merge(hash)},
106
+ :name => plugin_hash['name'],
107
+ :id => plugin_hash['id'],
108
+ :class => plugin_hash['code_class'] }
109
+ end
110
+ plugins
111
+ end
112
+
113
+ def gather_system_metric_reports(system_metric_collectors)
114
+ system_metric_data = {}
115
+ all_collectors = { :disk => ServerMetrics::Disk,
116
+ :cpu => ServerMetrics::Cpu,
117
+ :memory => ServerMetrics::Memory,
118
+ :network => ServerMetrics::Network,
119
+ :process => ServerMetrics::Processes }
120
+
121
+ realtime_collectors = all_collectors.select { |key, klass| system_metric_collectors.include?(key) }
122
+ realtime_collectors.each_pair do |key, klass|
123
+ begin
124
+ collector_previous_run = @history[:server_metrics][key]
125
+ collector = collector_previous_run.is_a?(Hash) ? klass.from_hash(collector_previous_run) : klass.new() # continue with last run, or just create new
126
+ system_metric_data[key] = collector.run
127
+ @history[:server_metrics][key] = collector.to_hash # store its state for next time
128
+ rescue Exception => e
129
+ raise if e.is_a?(SystemExit)
130
+ error "Problem running server/#{key} metrics: #{e.message}: \n#{e.backtrace.join("\n")}"
131
+ end
132
+ end
133
+ system_metric_data
134
+ end
135
+
107
136
  # Compile instances of the plugins specified in the passed plugin_ids
108
137
  def compile_plugins(all_plugins,plugin_ids)
109
138
  num_classes_compiled=0
@@ -199,4 +228,4 @@ module Scout
199
228
  end
200
229
 
201
230
  end
202
- end
231
+ end
@@ -11,17 +11,19 @@ module Scout
11
11
  :sync_log => true,
12
12
  :working_dir => File.dirname(history_file)}
13
13
 
14
- # streamer command might look like: start,A0000000000123,a,b,c,1,3
14
+ # streamer command might look like: start,A0000000000123,a,b,c,1,3,cpu,memory
15
15
  tokens = streamer_command.split(",")
16
16
  tokens.shift # gets rid of the "start"
17
17
  streaming_key = tokens.shift
18
18
  p_app_id = tokens.shift
19
19
  p_key = tokens.shift
20
20
  p_secret = tokens.shift
21
- plugin_ids = tokens.map(&:to_i)
21
+ numerical_tokens = tokens.select { |token| token =~ /\A\d+\Z/ }
22
+ system_metric_collectors = (tokens - numerical_tokens).map(&:to_sym)
23
+ plugin_ids = numerical_tokens.map(&:to_i)
22
24
 
23
25
  # we use STDOUT for the logger because daemon_spawn directs STDOUT to a log file
24
- streamer_args = [history_file,streaming_key,p_app_id,p_key,p_secret,plugin_ids,hostname,http_proxy,Logger.new(STDOUT)]
26
+ streamer_args = [history_file,streaming_key,p_app_id,p_key,p_secret,plugin_ids,system_metric_collectors,hostname,http_proxy,Logger.new(STDOUT)]
25
27
  if File.exists?(streamer_pid_file)
26
28
  Scout::StreamerDaemon.restart(daemon_spawn_options, streamer_args)
27
29
  else
@@ -45,8 +47,8 @@ module Scout
45
47
 
46
48
  # this method is called by DaemonSpawn's class start method.
47
49
  def start(streamer_args)
48
- history,streaming_key,p_app_id,p_key,p_secret,plugin_ids,hostname,http_proxy,log = streamer_args
49
- @scout = Scout::Streamer.new(history, streaming_key, p_app_id, p_key, p_secret, plugin_ids, hostname, http_proxy, log)
50
+ history,streaming_key,p_app_id,p_key,p_secret,plugin_ids,system_metric_collectors,hostname,http_proxy,log = streamer_args
51
+ @scout = Scout::Streamer.new(history, streaming_key, p_app_id, p_key, p_secret, plugin_ids, system_metric_collectors, hostname, http_proxy, log)
50
52
  end
51
53
 
52
54
  # this method is called by DaemonSpawn's class stop method.
data/lib/scout/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Scout
2
- VERSION = "5.8.8"
2
+ VERSION = "5.8.9"
3
3
  end
@@ -0,0 +1,60 @@
1
+ require 'test/unit'
2
+ begin
3
+ require 'pry'
4
+ rescue LoadError
5
+ # not using pry
6
+ end
7
+ # must be loaded after
8
+ $LOAD_PATH << File.expand_path( File.dirname(__FILE__) + '/../lib' )
9
+ $LOAD_PATH << File.expand_path( File.dirname(__FILE__) + '/..' )
10
+ require 'lib/scout'
11
+ require 'mocha/setup'
12
+
13
+ class StreamerTest < Test::Unit::TestCase
14
+ def test_reports_system_metrics
15
+ stub_history_file
16
+ plugin_ids_stub = []
17
+ system_metric_collectors = [:disk]
18
+
19
+ mock_pusher do
20
+ streamer = Scout::Streamer.new(:history_file_stub, :streaming_key_stub, :pusher_app_id_stub, :pusher_key_stub, :pusher_secret_stub, plugin_ids_stub, system_metric_collectors, :hostname_stub, :http_proxy_stub)
21
+ end
22
+
23
+ response = Pusher::Channel.streamer_data.first
24
+ assert_equal [:disk], response[:system_metrics].keys
25
+ end
26
+
27
+ private
28
+
29
+ def stub_history_file
30
+ File.stubs(:read).with(:history_file_stub).returns(YAML.dump({:server_metrics => {}}))
31
+ File.stubs(:dirname).with(:history_file_stub).returns('tmp')
32
+ end
33
+
34
+ # this with a block to mock the pusher call. You can access the streamer data through the Pusher::Channel.streamer_data
35
+ # Must be called with a code block
36
+ def mock_pusher(num_runs=1)
37
+ # redefine the trigger! method, so the streamer doesn't loop indefinitely. We can't just mock it, because
38
+ # we need to set the $continue_streaming=false
39
+ $num_runs_for_mock_pusher=num_runs
40
+ Pusher::Channel.module_eval do
41
+ alias orig_trigger! trigger!
42
+ def self.streamer_data;@@streamer_data;end # for getting the data back out
43
+ def trigger!(event_name, data, socket=nil)
44
+ $num_run_for_tests = $num_run_for_tests ? $num_run_for_tests+1 : 1
45
+ @@streamer_data_temp ||= Array.new
46
+ @@streamer_data_temp << data
47
+ if $num_run_for_tests >= $num_runs_for_mock_pusher
48
+ Scout::Streamer.continue_streaming=false
49
+ $num_run_for_tests=nil
50
+ @@streamer_data = @@streamer_data_temp.clone
51
+ @@streamer_data_temp = nil
52
+ end
53
+ end
54
+ end
55
+ yield # must be called with a block
56
+ Pusher::Channel.module_eval do
57
+ alias trigger! orig_trigger!
58
+ end
59
+ end
60
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: scout
3
3
  version: !ruby/object:Gem::Version
4
- version: 5.8.8
4
+ version: 5.8.9
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andre Lewis
@@ -81,6 +81,7 @@ files:
81
81
  - scout.gemspec
82
82
  - test/plugins/disk_usage.rb
83
83
  - test/scout_test.rb
84
+ - test/streamer_test.rb
84
85
  - vendor/httpclient/README.txt
85
86
  - vendor/httpclient/bin/httpclient
86
87
  - vendor/httpclient/lib/hexdump.rb