kurchatov 0.0.6.pre.2 → 0.0.6.pre.3

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: 116f2470062649b8e151d15fe01322b6d8a585b2
4
- data.tar.gz: acd0e139de670b6f5d4d420340907bffbfc6d8a0
3
+ metadata.gz: d3567df8dc93294bfc5cb0980d6ba82ebcf22f52
4
+ data.tar.gz: 9fcd2f6f8c17dbefea266452f832f9d368db34ad
5
5
  SHA512:
6
- metadata.gz: 9dc4133170af3e71c14ccb5210d6e9ea58a4b1015a63597ad947a6afb8cfc54151370852f26705d77ed61ae5daccc75343568dff212813dff0b56ad71a218fe1
7
- data.tar.gz: 3c5568f8e757a9eacbf1e2a598ec3705c7908b281eb1a4a8a45774ecc7ed1ee0942358f3b7ac97e032eb74c9634827692395460eab78f3d06ed645e32c84d076
6
+ metadata.gz: ea845863682c7b511035e7dbabfebae21f5d8d9e9c4a2e11b1081790a2afef3f09231d1787099b192e6e2258c6149bd79148974e95611e78aae7581d3620974f
7
+ data.tar.gz: 6ad670d192fddfecb12d62fd5ed5a6b90547e438a3158d7f52c288fd2f233387af1fa3756350a2465e896af805df98cb1acd82fbef16f6bd094a22a0ef37197e
data/examples/la.rb CHANGED
@@ -14,6 +14,7 @@ collect :os => 'linux' do
14
14
  end
15
15
 
16
16
  collect :os => 'darwin' do
17
+ interval = 2
17
18
  event(
18
19
  :metric => shell('uptime | cut -d":" -f4- | sed s/,//g').to_f,
19
20
  :desc => 'LA averaged over 1 minute',
@@ -10,8 +10,9 @@ module Kurchatov
10
10
  ]
11
11
 
12
12
  def event(hash = {})
13
+ @normilize = normalize_event(hash)
13
14
  Log.info("Mock message for test plugin: #{hash.inspect}") if Kurchatov::Config[:test_plugin]
14
- return unless normalize_event(hash)
15
+ return unless @normilize
15
16
  events << hash
16
17
  end
17
18
 
@@ -19,10 +20,13 @@ module Kurchatov
19
20
 
20
21
  def normalize_event(hash = {})
21
22
  hash[:description] = hash[:desc] if hash[:description].nil? && hash[:desc]
23
+
24
+ hash[:metric] = hash[:metric].to_f if hash[:metric].kind_of?(String)
22
25
  if hash[:metric].kind_of?(Float)
23
26
  hash[:metric] = 0.0 if hash[:metric].nan?
24
27
  hash[:metric] = hash[:metric].round(2)
25
28
  end
29
+
26
30
  set_diff_metric(hash)
27
31
  set_event_state(hash)
28
32
  return false if hash[:miss]
@@ -17,7 +17,7 @@ module Kurchatov
17
17
  @thread.join # call error
18
18
  rescue => e
19
19
  desc = "Plugin '#{@plugin.name}' died. #{e.class}: #{e}\n." +
20
- "Plugin: #{@plugin.inspect}. Trace: #{e.backtrace.join("\n")}"
20
+ "Trace: #{e.backtrace.join("\n")}"
21
21
  Log.error(desc)
22
22
  unless @plugin.ignore_errors
23
23
  event(:service => 'riemann client errors', :desc => desc, :state => 'critical')
@@ -61,7 +61,7 @@ module Kurchatov
61
61
  end
62
62
  @plugins_to_run << p if p.runnable_by_config?
63
63
  end
64
- Log.info("Start plugins: #{@plugins_to_run.inspect}")
64
+ Log.info("Start plugins: #{@plugins_to_run}")
65
65
  @plugins_to_run
66
66
  end
67
67
 
@@ -1,10 +1,12 @@
1
1
  module Kurchatov
2
2
  class Plugin
3
3
 
4
- attr_accessor :name
4
+ attr_accessor :name, :ignore_errors, :always_start
5
5
 
6
6
  def initialize(name)
7
7
  @name = name
8
+ @ignore_errors = false
9
+ @always_start = false
8
10
  end
9
11
 
10
12
  def run
@@ -3,6 +3,7 @@
3
3
  module Kurchatov
4
4
  class Queue
5
5
  QUEUE_MAX_SIZE = 1_000
6
+ QUEUE_MAX_FLUSH = 200
6
7
 
7
8
  def initialize
8
9
  @events = ::Queue.new
@@ -10,16 +11,21 @@ module Kurchatov
10
11
 
11
12
  def <<(event)
12
13
  if @events.size >= QUEUE_MAX_SIZE
14
+ # GC start if QUEUE_MAX_SIZE
15
+ ObjectSpace.garbage_collect
13
16
  drop = @events.shift
14
17
  Log.error("Drop event: #{drop.inspect}. See Kurchatov::Queue::QUEUE_MAX_SIZE")
15
18
  end
16
19
  @events << event
17
20
  end
18
21
 
19
- def all
22
+ def to_flush
20
23
  cur_events = Array.new
24
+ count = 0
21
25
  until @events.empty?
22
26
  cur_events << @events.shift
27
+ count += 1
28
+ break if count > QUEUE_MAX_FLUSH
23
29
  end
24
30
  cur_events
25
31
  end
@@ -30,7 +30,7 @@ module Kurchatov
30
30
  end
31
31
 
32
32
  def flush
33
- @events_to_send ||= events.all
33
+ @events_to_send ||= events.to_flush
34
34
  unless @events_to_send.empty?
35
35
  @riemanns.each { |riemann| riemann << @events_to_send }
36
36
  Log.debug("Sended events via #{@name.inspect}: #{@events_to_send}")
@@ -4,8 +4,8 @@ module Kurchatov
4
4
  include Beefcake::Message
5
5
  optional :time, :int64, 1
6
6
  optional :state, :string, 2
7
- optional :service, :string, 3
8
- optional :host, :string, 4
7
+ required :service, :string, 3
8
+ required :host, :string, 4
9
9
  optional :description, :string, 5
10
10
  repeated :tags, :string, 7
11
11
  optional :ttl, :float, 8
@@ -26,7 +26,7 @@ module Kurchatov
26
26
  def metric
27
27
  metric_d || metric_sint64 || metric_f
28
28
  end
29
-
29
+
30
30
  def metric=(m)
31
31
  if Integer === m and (-(2**63)...2**63) === m
32
32
  self.metric_sint64 = m
@@ -1,6 +1,16 @@
1
1
  require 'beefcake'
2
2
  require 'kurchatov/riemann/event'
3
3
 
4
+ # monkey patch
5
+ module Beefcake::Message
6
+ def initialize(attrs={})
7
+ attrs ||= {}
8
+ fields.values.each do |fld|
9
+ self[fld.name] = attrs[fld.name]
10
+ end
11
+ end
12
+ end
13
+
4
14
  module Kurchatov
5
15
  module Riemann
6
16
  class Message
@@ -1,3 +1,3 @@
1
1
  module Kurchatov
2
- VERSION = "0.0.6.pre.2"
2
+ VERSION = "0.0.6.pre.3"
3
3
  end
@@ -0,0 +1,16 @@
1
+ not_exists:
2
+ - not error please
3
+
4
+ # create sample_plugin from sample
5
+ sample_plugin:
6
+ cmd: 'ls'
7
+ url: 'http://example.com'
8
+ parent: sample
9
+ sleep: 2
10
+
11
+ # cteate sample_0 and sample_1
12
+ sample:
13
+ - url: 'http://google.com'
14
+ cmd: 'test -f ./tests/run.sh'
15
+ - url: 'https://www.kernel.org'
16
+ cmd: 'ps'
@@ -0,0 +1,43 @@
1
+ events:
2
+
3
+ - :metric: 3
4
+ :critical: 2
5
+ :warning: 1
6
+ :result: critical
7
+ :service: metric > critical
8
+
9
+ - :metric: 2
10
+ :critical: 2
11
+ :warning: 1
12
+ :result: critical
13
+ :service: metric == critical
14
+
15
+ - :metric: 1
16
+ :critical: 2
17
+ :warning: 1
18
+ :result: warning
19
+ :service: metric == warning
20
+
21
+ - :metric: 0
22
+ :critical: 2
23
+ :warning: 1
24
+ :result: ok
25
+ :service: metric < warning
26
+
27
+ - :state: true
28
+ :result: ok
29
+ :service: state TrueClass
30
+
31
+ - :state: false
32
+ :result: critical
33
+ :service: state FalseClass
34
+
35
+ - :eval: 'shell("ls /| wc -l | wc -l")'
36
+ :warning: 0
37
+ :result: warning
38
+ :service: Shell test
39
+
40
+ - :eval: 'rest_get("http://ya.ru").size'
41
+ :critical: 10
42
+ :result: critical
43
+ :service: Http get test
@@ -0,0 +1,12 @@
1
+ name "sample"
2
+ always_start true
3
+
4
+ collect do
5
+ data = YAML.load_file('./tests/data/event.yml')
6
+ data["events"].each do |e|
7
+ e[:metric] = eval(e[:eval]) if e.has_key? :eval
8
+ event(e)
9
+ end
10
+ sleep(plugin.sleep.to_f || 0)
11
+ exit 0 if plugin.sleep
12
+ end
data/tests/run.sh CHANGED
@@ -1,59 +1,3 @@
1
1
  #!/bin/sh -e
2
-
3
-
4
2
  bundle exec ruby ./tests/server.rb &
5
-
6
- rm -rf ./tmp
7
- mkdir -p ./tmp
8
- cat > tmp/config.yml <<EOF
9
- not_exists:
10
- - not error please
11
- test2:
12
- url: './tests/run.sh'
13
- cmd: 'ls'
14
- parent: 'test'
15
- counter: 2
16
- test:
17
- - url: 'http://google.com'
18
- cmd: 'test -f ./tests/run.sh'
19
- - url: 'https://www.kernel.org'
20
- cmd: 'ps'
21
- EOF
22
-
23
- cat > tmp/test1.rb <<EOF
24
- interval 10
25
- name "test"
26
-
27
- default[:url] = 'http://notexists'
28
- default[:cmd] = 'ls /notexists'
29
-
30
- collect do
31
- @counter ||= 0
32
- Log.info "file command #{plugin.cmd} return: #{shell(plugin.cmd)}"
33
- Log.info "get size from #{plugin.url}: #{rest_get(plugin.url).size}"
34
- @counter += 1
35
- exit 0 if plugin.counter && @counter > plugin.counter.to_i
36
- event(:metric => 3, :critical => 2, :warning => 1)
37
- event(:metric => 2, :critical => 2, :warning => 1)
38
- event(:metric => 1, :critical => 2, :warning => 1)
39
- event(:metric => 0, :critical => 2, :warning => 1)
40
- end
41
- EOF
42
-
43
- # --test-plugin
44
- bundle exec ./bin/kurchatov --test-plugin ./tmp/test1.rb --logfile ./tmp/testplugin.log -l debug || echo "Mock error in 'ls /notexists'"
45
- echo "Stdout --test-plugin:"
46
- cat ./tmp/testplugin.log
47
- grep -q 'STDERR: ls: cannot access /notexists' ./tmp/testplugin.log
48
-
49
- # load config and helpers
50
- bundle exec ./bin/kurchatov -d ./tmp/ -c ./tmp/config.yml --hosts 127.0.0.1 -l debug --stop-on-error --logfile ./tmp/loadplugins.log
51
- echo "Stdout loader"
52
- cat ./tmp/loadplugins.log
53
- grep 'Start plugins' ./tmp/loadplugins.log | grep -q '@name="test_0"'
54
- grep 'Start plugins' ./tmp/loadplugins.log | grep -q '@name="test_1"'
55
- grep 'Start plugins' ./tmp/loadplugins.log | grep -q '@name="test2"'
56
- grep 'file command ls return: CHANGELOG' ./tmp/loadplugins.log
57
- grep 'get size from http://google.com:' ./tmp/loadplugins.log
58
- grep 'get size from https://www.kernel.org' ./tmp/loadplugins.log
59
- grep 'get size from ./tests/run.sh' ./tmp/loadplugins.log
3
+ bundle exec kurchatov -c ./tests/data/config.yml -d ./tests/data -H 127.0.0.1 --stop-on-error
data/tests/server.rb CHANGED
@@ -1,11 +1,38 @@
1
1
  require 'socket'
2
2
  require 'timeout'
3
+ require 'kurchatov/riemann/client'
4
+ require 'yaml'
3
5
 
4
- server = TCPServer.new('127.0.0.1', 5555)
5
- Timeout::timeout(60) {
6
- loop {
7
- client = server.accept
8
- line = client.gets
9
- puts line
10
- }
11
- } rescue exit 0
6
+ PORT = 5555
7
+ HOST = '127.0.0.1'
8
+ RECEIVE_INTERVAL = 20
9
+
10
+ server = TCPServer.new(HOST, PORT)
11
+ events = []
12
+ puts "Run riemann server at #{HOST}:#{PORT}"
13
+
14
+ Timeout::timeout(RECEIVE_INTERVAL) {
15
+ client = server.accept
16
+ loop do
17
+ line = client.read(4)
18
+ break if line.nil? || line.size != 4
19
+ length = line.unpack('N').first
20
+ str = client.read(length)
21
+ message = Kurchatov::Riemann::Message.decode(str)
22
+ message.events.each do |event|
23
+ events << event
24
+ end
25
+ end
26
+ }
27
+
28
+ data = YAML.load_file('./tests/data/event.yml')
29
+ events.each do |e|
30
+ data["events"].each do |d|
31
+ next unless d[:service] == e[:service]
32
+ next if d[:result] == e[:state]
33
+ raise "Recieved state: #{e[:state]}, data state: #{d[:result]}. \n Data: #{d.inspect} \n Event: #{e.inspect}"
34
+ end
35
+ end
36
+
37
+ raise "Not all events recieved" unless 3 * data["events"].count == events.count
38
+ puts "All done!"
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: kurchatov
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.6.pre.2
4
+ version: 0.0.6.pre.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Vasiliev Dmitry
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-01-28 00:00:00.000000000 Z
11
+ date: 2014-01-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: beefcake
@@ -200,6 +200,9 @@ files:
200
200
  - lib/ohai/plugins/windows/cpu.rb
201
201
  - lib/ohai/plugins/windows/hostname.rb
202
202
  - lib/ohai/plugins/windows/platform.rb
203
+ - tests/data/config.yml
204
+ - tests/data/event.yml
205
+ - tests/data/sample.rb
203
206
  - tests/run.sh
204
207
  - tests/server.rb
205
208
  homepage: https://github.com/vadv/kurchatov