bipbip 0.4.5 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 27e9aa7d8a9f00d2940ec3dde1918556f32b5453
4
- data.tar.gz: e73717090f198d321f70deab0dd4540d08addc33
3
+ metadata.gz: a8c565ef72aa8710b7d485185227db02f8f1f916
4
+ data.tar.gz: c3dc8e55ee5adfe49ca1214ee1f4f0d26e9eb102
5
5
  SHA512:
6
- metadata.gz: b47fdeb97354d69730a3a3cf72cd8bcaa32f05622031e4a152dec618228ebb2027ebb6da37c2182afe87b84f2ee27df1e3fa7f993ca297dc5ee531ce7a589f04
7
- data.tar.gz: ebe253a1196b617650450c467d3e4ff4194c3c7bfdd6dc9579967895eab62549420ead96d308b9568dbe461e8e5806e1cc32ee9da67b5ef7c1ee52cc7a6235f9
6
+ metadata.gz: 9be1a3363765235384983bebb7f36959698ad3cbad7e315aa19f33281c1c8c851dcaadeaca4c5714780e301e820126d4a11240158f0cd8e2db2f5f354350e0fb
7
+ data.tar.gz: c5ac6e22536847ca6ab813bae641ff143cbaf28812c96e8a843ce22823ac0a53a928bd753a026b6d36c2c7bffe8840db4cb3d2fe42bce4c20390ba525c096275
data/README.md CHANGED
@@ -96,7 +96,6 @@ services:
96
96
  -
97
97
  plugin: log-parser
98
98
  path: /var/log/syslog
99
- regexp_timestamp: '^\w+ \d{1,2} \d{2}\:\d{2}\:\d{2}'
100
99
  matchers:
101
100
  -
102
101
  name: oom_killer
@@ -154,15 +153,6 @@ Alias /apc-status /usr/local/bin/apc-status.php
154
153
 
155
154
  Then set the `url`-configuration for the plugin to where the script is being served, e.g. `http//localhost:80/apc-status`.
156
155
 
157
- #### log-parser
158
- The log file is being read backwards from the end.
159
- Each line should contain a timestamp which matches `regexp_timestamp` and can be parsed by `DateTime.parse`.
160
- Multiple `matchers` can be specified, each creates a metrics with the number of matched lines as a value.
161
-
162
- Example values for `regexp_timestamp`:
163
- * *default*: `^\d{4}-\d{2}-\d{2}T\d{2}\:\d{2}\:\d{2}`
164
- * syslog traditional: `^\w+ \d{1,2} \d{2}\:\d{2}\:\d{2}` (not recommended because year is missing)
165
-
166
156
  Custom external plugins
167
157
  -----------------------
168
158
  Additional plugins can be created as independent gems.
@@ -34,7 +34,7 @@ module Bipbip
34
34
  if data.empty?
35
35
  raise "#{name} #{source_identifier}: Empty data"
36
36
  end
37
- Bipbip.logger.debug "#{name} #{source_identifier}: Data: #{data}"
37
+ log(Logger::DEBUG, "Data: #{data}")
38
38
  storages.each do |storage|
39
39
  storage.store_sample(self, time, data)
40
40
  end
@@ -42,19 +42,19 @@ module Bipbip
42
42
  interruptible_sleep (frequency - (Time.now - time))
43
43
  end
44
44
  rescue => e
45
- Bipbip.logger.error "#{name} #{source_identifier}: Error: #{e.message}"
45
+ log(Logger::ERROR, e.message)
46
46
  interruptible_sleep retry_delay
47
47
  retry_delay += frequency if retry_delay < frequency * 10
48
48
  retry
49
49
  rescue Exception => e
50
- Bipbip.logger.error "#{name} #{source_identifier}: Fatal error: #{e.message}"
50
+ log(Logger::FATAL, e.message)
51
51
  raise e
52
52
  end
53
53
  end
54
54
  end
55
55
 
56
56
  def interrupt
57
- Bipbip.logger.info "Interrupting plugin process #{Process.pid}"
57
+ log(Logger::INFO, "Interrupting plugin process #{Process.pid}")
58
58
  @interrupted = true
59
59
  interrupt_sleep
60
60
  end
@@ -76,7 +76,7 @@ module Bipbip
76
76
  end
77
77
 
78
78
  def metrics_names
79
- metrics_schema.map {|metric| metric[:name] }
79
+ metrics_schema.map { |metric| metric[:name] }
80
80
  end
81
81
 
82
82
  def metrics_schema
@@ -86,5 +86,11 @@ module Bipbip
86
86
  def monitor
87
87
  raise 'Missing method monitor'
88
88
  end
89
+
90
+ private
91
+
92
+ def log(severity, message)
93
+ Bipbip.logger.add(severity, message, "#{name} #{source_identifier}")
94
+ end
89
95
  end
90
96
  end
@@ -1,10 +1,7 @@
1
- require 'date'
1
+ require 'rb-inotify'
2
2
 
3
3
  module Bipbip
4
4
 
5
- TIMESTAMP_REGEXP = '^\d{4}-\d{2}-\d{2}T\d{2}\:\d{2}\:\d{2}'
6
- REGEXP_IGNORE_LINE = '^\s*$'
7
-
8
5
  class Plugin::LogParser < Plugin
9
6
 
10
7
  def metrics_schema
@@ -14,21 +11,18 @@ module Bipbip
14
11
  end
15
12
 
16
13
  def monitor
17
- time_first = nil
18
-
19
- lines = lines_backwards.take_while do |line|
20
- if line.match(REGEXP_IGNORE_LINE)
21
- true
22
- elsif timestamp_match = line.match(regexp_timestamp)
23
- time = DateTime.parse(timestamp_match[0]).to_time
24
- time_first ||= time
25
- (time > log_time_min)
26
- else
27
- Bipbip::logger.warn("Log parser: Unparseable line `#{line.chomp}` in `#{config['path']}`")
14
+ unless IO.select([notifier.to_io], [], [], 0).nil?
15
+ n = notifier
16
+ begin
17
+ n.process
18
+ rescue NoMethodError => e
19
+ # Ignore errors from closed notifier - see https://github.com/nex3/rb-inotify/issues/41
20
+ raise e unless n.watchers.empty?
28
21
  end
29
22
  end
30
23
 
31
- self.log_time_min = time_first unless time_first.nil?
24
+ lines = @lines.entries
25
+ @lines.clear
32
26
 
33
27
  Hash[config['matchers'].map do |matcher|
34
28
  name = matcher['name']
@@ -40,48 +34,46 @@ module Bipbip
40
34
 
41
35
  private
42
36
 
43
- def log_time_min
44
- @log_time_min ||= Time.now - @frequency.to_i
37
+ def notifier
38
+ if @notifier.nil?
39
+ @notifier = create_notifier
40
+ @lines = []
41
+ @size = File.stat(config['path']).size
42
+ end
43
+ @notifier
45
44
  end
46
45
 
47
- def log_time_min=(time)
48
- @log_time_min = time
46
+ def create_notifier
47
+ # Including the "attrib" event, because on some systems "unlink" triggers "attrib", but then the inode's deletion doesn't trigger "delete_self"
48
+ events = [:modify, :delete_self, :move_self, :unmount, :attrib]
49
+ notifier = INotify::Notifier.new
50
+ notifier.watch(config['path'], *events) do |event|
51
+ if event.flags.include?(:modify)
52
+ roll_file
53
+ else
54
+ log(Logger::WARN, "File event `#{event.flags.join(',')}` detected, resetting notifier")
55
+ reset_notifier
56
+ end
57
+ end
58
+ notifier
49
59
  end
50
60
 
51
- def regexp_timestamp
52
- @regexp_timestamp ||= Regexp.new(config.fetch('regexp_timestamp', TIMESTAMP_REGEXP))
61
+ def reset_notifier
62
+ unless @notifier.nil?
63
+ @notifier.stop
64
+ @notifier.close
65
+ @notifier = nil
66
+ end
53
67
  end
54
68
 
55
- def lines_backwards
56
- buffer_size = 65536
57
-
58
- Enumerator.new do |yielder|
59
- File.open(config['path']) do |file|
60
- file.seek(0, File::SEEK_END)
61
-
62
- while file.pos > 0
63
- buffer_size = file.pos if file.pos < buffer_size
64
-
65
- file.seek(-buffer_size, File::SEEK_CUR)
66
- buffer = file.read(buffer_size)
67
- file.seek(-buffer_size, File::SEEK_CUR)
68
-
69
- line_list = buffer.each_line.entries
70
-
71
- if file.pos != 0
72
- # Remove first line as can be incomplete
73
- # due to seeking backward with buffer_size steps
74
- first_line = line_list.shift
75
- raise "Line length exceeds buffer size `#{buffer_size}`" if first_line.length == buffer_size
76
- file.seek(first_line.length, File::SEEK_CUR)
77
- end
78
-
79
- line_list.reverse.each do |line|
80
- yielder.yield(line)
81
- end
82
- end
83
- end
69
+ def roll_file
70
+ file = File.new(config['path'], 'r')
71
+ if file.size != @size
72
+ file.seek(@size)
73
+ @lines.push(*file.readlines)
74
+ @size = file.size
84
75
  end
76
+ file.close
85
77
  end
86
78
 
87
79
  end
@@ -1,3 +1,3 @@
1
1
  module Bipbip
2
- VERSION = '0.4.5'
2
+ VERSION = '0.5.0'
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bipbip
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.5
4
+ version: 0.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Cargo Media
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2014-10-22 00:00:00.000000000 Z
13
+ date: 2014-11-03 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: copperegg
@@ -152,6 +152,20 @@ dependencies:
152
152
  - - "~>"
153
153
  - !ruby/object:Gem::Version
154
154
  version: 0.1.3
155
+ - !ruby/object:Gem::Dependency
156
+ name: rb-inotify
157
+ requirement: !ruby/object:Gem::Requirement
158
+ requirements:
159
+ - - "~>"
160
+ - !ruby/object:Gem::Version
161
+ version: 0.9.5
162
+ type: :runtime
163
+ prerelease: false
164
+ version_requirements: !ruby/object:Gem::Requirement
165
+ requirements:
166
+ - - "~>"
167
+ - !ruby/object:Gem::Version
168
+ version: 0.9.5
155
169
  - !ruby/object:Gem::Dependency
156
170
  name: rake
157
171
  requirement: !ruby/object:Gem::Requirement