reacter 0.0.19 → 0.0.20

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.
@@ -45,7 +45,9 @@ class Reacter
45
45
 
46
46
  def poll(&block)
47
47
  @_queue.bind(@_exchange).subscribe do |payload|
48
- yield Message.parse(payload)
48
+ format = @config.get(:format)
49
+ format = format.to_sym unless format.nil?
50
+ yield Message.as(format).parse(payload)
49
51
  end
50
52
  end
51
53
 
@@ -1,6 +1,7 @@
1
1
  #------------------------------------------------------------------------------#
2
2
  # Socket Adapter
3
3
  #
4
+ require 'em-http-request'
4
5
  require 'reacter/adapter'
5
6
  require 'reacter/config'
6
7
  require 'reacter/util'
@@ -42,9 +43,45 @@ class Reacter
42
43
  def connect(args={})
43
44
  @addr = @config.get(:address, '0.0.0.0')
44
45
  @port = @config.get(:port, 8080).to_i
46
+ @buffer = []
47
+
48
+ if args[:mode] == 'write'
49
+ @writer = EventMachine::HttpRequest.new(@config.get('write.url'))
50
+ end
45
51
  end
46
52
 
47
53
  def send(message, format=nil)
54
+ if defined?(@writer)
55
+ if (sz = @config.get(:buffersize))
56
+ if @buffer.length == sz
57
+ payload = @buffer.join(@config.get('write.joiner', "\n"))
58
+ @buffer = []
59
+ else
60
+ @buffer << Message.dump(message, format)
61
+ return true
62
+ end
63
+ else
64
+ payload = Message.dump(message, format)
65
+ end
66
+
67
+ if @config.get('write.template')
68
+ payload = @config.get('write.template').gsub('%{content}', payload)
69
+ end
70
+
71
+ method = @config.get('write.method', :post).to_sym
72
+
73
+ case method
74
+ when :post, :put
75
+ @writer.send(method, {
76
+ :body => payload
77
+ })
78
+ end
79
+
80
+ return true
81
+ else
82
+ return false
83
+ end
84
+
48
85
  # TODO: implement this for relay support
49
86
  # support: method
50
87
  # output format
@@ -39,6 +39,7 @@ class Reacter
39
39
  @buffer = []
40
40
  else
41
41
  @buffer << Message.dump(message, format)
42
+ return true
42
43
  end
43
44
  else
44
45
  payload = Message.dump(message, format)
@@ -22,7 +22,7 @@ class Reacter
22
22
 
23
23
  def received(message)
24
24
  if @output_format.nil?
25
- line = "logger: [#{message.state or :unknown}] #{message.source}/#{message.metric} = #{message.value}"
25
+ line = "logger: [#{message.time.to_i}] #{message.source}/#{message.metric} = #{message.value}"
26
26
  else
27
27
  line = Message.dump(message, @output_format)
28
28
  end
@@ -63,8 +63,11 @@ class Reacter
63
63
 
64
64
  # agent message dispatch subprocess
65
65
  dispatch = proc do |messages|
66
+ messages = [messages] unless messages.is_a?(Array)
67
+
66
68
  messages.each do |message|
67
69
  rv = message
70
+ rv = Message.new(rv) unless rv.is_a?(Message)
68
71
 
69
72
  # send this message to all agents
70
73
  @_agents.each do |agent|
@@ -44,6 +44,11 @@ class Reacter
44
44
  @_format = format
45
45
  end
46
46
 
47
+ def as(format)
48
+ load_parsers()
49
+ (@@_parsers[format] || Message)
50
+ end
51
+
47
52
  def load_parsers()
48
53
  unless defined?(@@_parsers)
49
54
  @@_parsers = {}
@@ -93,10 +98,10 @@ class Reacter
93
98
  # use first parser that claims it can handle this string
94
99
  @@_parsers.each do |name, parser|
95
100
  if parser.detected?(message)
96
- #Util.debug("Using parser #{name}")
101
+ Util.debug("Using parser #{name}")
97
102
  m = parser.parse(message)
98
103
  (m.is_a?(Array) ? messages += m : messages << m)
99
- next
104
+ break
100
105
  end
101
106
  end
102
107
 
@@ -8,7 +8,7 @@ class Reacter
8
8
  require 'oj'
9
9
 
10
10
  def detected?(message)
11
- (message[0] == '{' or message[0] == '[')
11
+ return false
12
12
  end
13
13
 
14
14
  def parse(message)
@@ -8,7 +8,7 @@ class Reacter
8
8
  require 'oj'
9
9
 
10
10
  def detected?(message)
11
- (message[0] == '{' or message[0] == '[')
11
+ false
12
12
  end
13
13
 
14
14
  def parse(message)
@@ -0,0 +1,52 @@
1
+ require 'time'
2
+ require 'reacter/parser'
3
+
4
+ class Reacter
5
+ class Message
6
+ class LogstashParser < Parser
7
+ class<<self
8
+ require 'multi_json'
9
+ require 'oj'
10
+
11
+ def detected?(message)
12
+ message.include?('@fields')
13
+ end
14
+
15
+ def parse(message)
16
+ message = Hash[MultiJson.load(message)]
17
+
18
+ return {
19
+ :metric => message.get(@config.get(:metric, '@fields.name')),
20
+ :source => message.get(@config.get(:source, '@fields.host')),
21
+ :time => Time.parse(message.get(@config.get(:timestamp, '@timestamp'))).to_i,
22
+ :value => message.get(@config.get(:timestamp, '@fields.value')),
23
+ :attributes => message.get('@fields', {}).merge({
24
+ 'tags' => message.get('tags', [])
25
+ })
26
+ }
27
+ end
28
+
29
+ def dump(message)
30
+ return "LOGSTASH DUMP"
31
+ message = message.to_h if message.is_a?(Message)
32
+ return nil unless message.is_a?(Hash)
33
+ return nil unless message[:source]
34
+ return nil unless message[:metric]
35
+ return nil unless message[:value]
36
+ return nil unless message[:time]
37
+
38
+ # attributes = {
39
+ # :host => message[:source]
40
+ # }.merge(message[:attributes] || {})
41
+
42
+ # MultiJson.dump({
43
+ # :name => message[:metric],
44
+ # :timestamp => message[:time].to_i,
45
+ # :value => message[:value],
46
+ # :tags => attributes
47
+ # })
48
+ end
49
+ end
50
+ end
51
+ end
52
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: reacter
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.19
4
+ version: 0.0.20
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -13,7 +13,7 @@ date: 2013-03-18 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: eventmachine
16
- requirement: &10277620 !ruby/object:Gem::Requirement
16
+ requirement: &7808000 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: '0'
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *10277620
24
+ version_requirements: *7808000
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: em-http-server
27
- requirement: &10277180 !ruby/object:Gem::Requirement
27
+ requirement: &7805180 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ! '>='
@@ -32,10 +32,21 @@ dependencies:
32
32
  version: '0'
33
33
  type: :runtime
34
34
  prerelease: false
35
- version_requirements: *10277180
35
+ version_requirements: *7805180
36
+ - !ruby/object:Gem::Dependency
37
+ name: em-http-request
38
+ requirement: &7802460 !ruby/object:Gem::Requirement
39
+ none: false
40
+ requirements:
41
+ - - ! '>='
42
+ - !ruby/object:Gem::Version
43
+ version: '0'
44
+ type: :runtime
45
+ prerelease: false
46
+ version_requirements: *7802460
36
47
  - !ruby/object:Gem::Dependency
37
48
  name: deep_merge
38
- requirement: &10276520 !ruby/object:Gem::Requirement
49
+ requirement: &7733280 !ruby/object:Gem::Requirement
39
50
  none: false
40
51
  requirements:
41
52
  - - ! '>='
@@ -43,10 +54,10 @@ dependencies:
43
54
  version: '0'
44
55
  type: :runtime
45
56
  prerelease: false
46
- version_requirements: *10276520
57
+ version_requirements: *7733280
47
58
  - !ruby/object:Gem::Dependency
48
59
  name: hashlib
49
- requirement: &10275600 !ruby/object:Gem::Requirement
60
+ requirement: &7731840 !ruby/object:Gem::Requirement
50
61
  none: false
51
62
  requirements:
52
63
  - - ! '>='
@@ -54,10 +65,10 @@ dependencies:
54
65
  version: '0'
55
66
  type: :runtime
56
67
  prerelease: false
57
- version_requirements: *10275600
68
+ version_requirements: *7731840
58
69
  - !ruby/object:Gem::Dependency
59
70
  name: hiredis
60
- requirement: &10274860 !ruby/object:Gem::Requirement
71
+ requirement: &7754180 !ruby/object:Gem::Requirement
61
72
  none: false
62
73
  requirements:
63
74
  - - ! '>='
@@ -65,10 +76,10 @@ dependencies:
65
76
  version: '0'
66
77
  type: :runtime
67
78
  prerelease: false
68
- version_requirements: *10274860
79
+ version_requirements: *7754180
69
80
  - !ruby/object:Gem::Dependency
70
81
  name: multi_json
71
- requirement: &10273860 !ruby/object:Gem::Requirement
82
+ requirement: &7753480 !ruby/object:Gem::Requirement
72
83
  none: false
73
84
  requirements:
74
85
  - - ! '>='
@@ -76,10 +87,10 @@ dependencies:
76
87
  version: '0'
77
88
  type: :runtime
78
89
  prerelease: false
79
- version_requirements: *10273860
90
+ version_requirements: *7753480
80
91
  - !ruby/object:Gem::Dependency
81
92
  name: oj
82
- requirement: &10272700 !ruby/object:Gem::Requirement
93
+ requirement: &7753060 !ruby/object:Gem::Requirement
83
94
  none: false
84
95
  requirements:
85
96
  - - ! '>='
@@ -87,7 +98,7 @@ dependencies:
87
98
  version: '0'
88
99
  type: :runtime
89
100
  prerelease: false
90
- version_requirements: *10272700
101
+ version_requirements: *7753060
91
102
  description: A utility for consuming, transforming, and routing monitoring data from
92
103
  various sources
93
104
  email: ghetzel@outbrain.com
@@ -117,6 +128,7 @@ files:
117
128
  - lib/reacter/parsers/json.rb
118
129
  - lib/reacter/parsers/tsdb.rb
119
130
  - lib/reacter/parsers/kairosdb.rb
131
+ - lib/reacter/parsers/logstash.rb
120
132
  - lib/reacter/util.rb
121
133
  - bin/reacter
122
134
  homepage: http://outbrain.github.com/reacter/