logjam_agent 0.29.6 → 0.32.2

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.
@@ -1,3 +1,3 @@
1
1
  module LogjamAgent
2
- VERSION = "0.29.6"
2
+ VERSION = "0.32.2"
3
3
  end
@@ -16,6 +16,7 @@ module LogjamAgent
16
16
  @sequence = SEQUENCE_START
17
17
  @socket = nil
18
18
  @ping_ensured = false
19
+ @socket_mutex = Mutex.new
19
20
  end
20
21
 
21
22
  def connection_specs
@@ -35,11 +36,11 @@ module LogjamAgent
35
36
  }
36
37
  end
37
38
 
38
- @@mutex = Mutex.new
39
+ @@context_mutex = Mutex.new
39
40
  @@zmq_context = nil
40
41
 
41
42
  def self.context
42
- @@mutex.synchronize do
43
+ @@context_mutex.synchronize do
43
44
  @@zmq_context ||=
44
45
  begin
45
46
  require 'ffi-rzmq'
@@ -50,24 +51,9 @@ module LogjamAgent
50
51
  end
51
52
  end
52
53
 
53
- def socket
54
- return @socket if @socket
55
- @socket = self.class.context.socket(ZMQ::DEALER)
56
- ensure_ping_at_exit
57
- @socket.setsockopt(ZMQ::LINGER, @config[:linger])
58
- @socket.setsockopt(ZMQ::SNDHWM, @config[:snd_hwm])
59
- @socket.setsockopt(ZMQ::RCVHWM, @config[:rcv_hwm])
60
- @socket.setsockopt(ZMQ::RCVTIMEO, @config[:rcv_timeo])
61
- @socket.setsockopt(ZMQ::SNDTIMEO, @config[:snd_timeo])
62
- spec = connection_specs.sort_by{rand}.first
63
- @socket.connect(spec)
64
- @socket
65
- end
66
-
67
54
  def reset
68
- if @socket
69
- @socket.close
70
- @socket = nil
55
+ @socket_mutex.synchronize do
56
+ reset_without_locking
71
57
  end
72
58
  end
73
59
 
@@ -84,27 +70,57 @@ module LogjamAgent
84
70
  key += ".#{engine}"
85
71
  end
86
72
  msg = LogjamAgent.encode_payload(data)
87
- if options[:sync]
88
- send_receive(app_env, key, msg)
89
- else
90
- publish(app_env, key, msg)
73
+ @socket_mutex.synchronize do
74
+ if options[:sync]
75
+ send_receive(app_env, key, msg)
76
+ else
77
+ publish(app_env, key, msg)
78
+ end
91
79
  end
92
80
  rescue => error
93
81
  reraise_expectation_errors!
94
82
  raise ForwardingError.new(error.message)
95
83
  end
96
84
 
85
+ private
86
+
87
+ def reset_without_locking
88
+ if @socket
89
+ @socket.close
90
+ @socket = nil
91
+ end
92
+ end
93
+
94
+ # this method assumes the caller holds the socket mutex
95
+ def socket
96
+ return @socket if @socket
97
+ @socket = self.class.context.socket(ZMQ::DEALER)
98
+ raise "ZMQ error on socket creation: #{ZMQ::Util.error_string}" if @socket.nil?
99
+ if LogjamAgent.ensure_ping_at_exit
100
+ ensure_ping_at_exit
101
+ else
102
+ at_exit { reset }
103
+ end
104
+ @socket.setsockopt(ZMQ::LINGER, @config[:linger])
105
+ @socket.setsockopt(ZMQ::SNDHWM, @config[:snd_hwm])
106
+ @socket.setsockopt(ZMQ::RCVHWM, @config[:rcv_hwm])
107
+ @socket.setsockopt(ZMQ::RCVTIMEO, @config[:rcv_timeo])
108
+ @socket.setsockopt(ZMQ::SNDTIMEO, @config[:snd_timeo])
109
+ spec = connection_specs.sort_by{rand}.first
110
+ @socket.connect(spec)
111
+ @socket
112
+ end
113
+
97
114
  def publish(app_env, key, data)
98
115
  info = pack_info(@sequence = next_fixnum(@sequence))
99
116
  parts = [app_env, key, data, info]
100
117
  if socket.send_strings(parts, ZMQ::DONTWAIT) < 0
118
+ error = ZMQ::Util.error_string
101
119
  reset if connection_specs.size > 1
102
- raise "ZMQ error on publishing: #{ZMQ::Util.error_string}"
120
+ raise "ZMQ error on publishing: #{error}"
103
121
  end
104
122
  end
105
123
 
106
- private
107
-
108
124
  def log_warning(message)
109
125
  LogjamAgent.error_handler.call ForwardingWarning.new(message)
110
126
  end
@@ -117,12 +133,12 @@ module LogjamAgent
117
133
  answer_parts = []
118
134
  if socket.send_strings(request_parts) < 0
119
135
  log_warning "ZMQ error on sending: #{ZMQ::Util.error_string}"
120
- reset
136
+ reset_without_locking
121
137
  return nil
122
138
  end
123
139
  if socket.recv_strings(answer_parts) < 0
124
140
  log_warning "ZMQ error on receiving: #{ZMQ::Util.error_string}"
125
- reset
141
+ reset_without_locking
126
142
  return nil
127
143
  end
128
144
  if answer_parts.first != "" || !VALID_RESPONSE_CODES.include?(answer_parts.second.to_s.to_i)
@@ -132,8 +148,10 @@ module LogjamAgent
132
148
  end
133
149
 
134
150
  def ping
135
- if @socket && !send_receive("ping", @app_env, "{}", NO_COMPRESSION)
136
- log_warning "failed to receive pong"
151
+ @socket_mutex.synchronize do
152
+ if @socket && !send_receive("ping", @app_env, "{}", NO_COMPRESSION)
153
+ log_warning "failed to receive pong"
154
+ end
137
155
  end
138
156
  end
139
157
 
@@ -0,0 +1,32 @@
1
+ $:.unshift File.expand_path('../../lib', __FILE__)
2
+
3
+ require 'logjam_agent/sinatra'
4
+
5
+ class SinatraTestApp < Sinatra::Base
6
+ register LogjamAgent::Sinatra
7
+
8
+ use LogjamAgent::Sinatra::Middleware
9
+
10
+ configure do
11
+ set :root, File.expand_path('../..', __FILE__)
12
+ set :environment, :test
13
+ set :loglevel, :debug
14
+ setup_logjam_logger
15
+
16
+ LogjamAgent.application_name = "myapp"
17
+ LogjamAgent.add_forwarder(:zmq, :host => "inproc://app")
18
+ LogjamAgent.parameter_filters << :password
19
+ LogjamAgent.ensure_ping_at_exit = false
20
+ end
21
+
22
+ before '/index' do
23
+ action_name "Simple#index"
24
+ end
25
+
26
+ get '/index' do
27
+ logger.info 'Hello World!'
28
+ 'Hello World!'
29
+ end
30
+
31
+ run! if __FILE__ == $0
32
+ end
@@ -0,0 +1,31 @@
1
+ $:.unshift File.expand_path('../../lib', __FILE__)
2
+
3
+ require 'logjam_agent/sinatra'
4
+
5
+ use LogjamAgent::Sinatra::Middleware
6
+
7
+ configure do
8
+ set :root, File.expand_path('../..', __FILE__)
9
+ set :environment, :test
10
+ set :loglevel, :debug
11
+ setup_logjam_logger
12
+
13
+ LogjamAgent.application_name = "myapp"
14
+ LogjamAgent.add_forwarder(
15
+ :zmq,
16
+ :host => "localhost",
17
+ :port => 9604,
18
+ :linger => 10,
19
+ :snd_hwm => 10,
20
+ :rcv_hwm => 10,
21
+ :rcv_timeo => 10,
22
+ :snd_timeo => 10
23
+ )
24
+ LogjamAgent.parameter_filters << :password
25
+ end
26
+
27
+ get '/index' do
28
+ action_name "Simple#index"
29
+ logger.info 'Hello World!'
30
+ 'Hello World!'
31
+ end
@@ -0,0 +1,20 @@
1
+ require_relative "test_helper.rb"
2
+ require_relative "sinatra_classic_app"
3
+ require "rack/test"
4
+
5
+ module LogjamAgent
6
+ class SinatraClassicTest < MiniTest::Test
7
+
8
+ include ::Rack::Test::Methods
9
+
10
+ def app
11
+ ::Sinatra::Application
12
+ end
13
+
14
+ def test_root
15
+ get '/index?mumu=1&password=5'
16
+ assert_equal 'Hello World!', last_response.body
17
+ end
18
+
19
+ end
20
+ end
@@ -0,0 +1,54 @@
1
+ require_relative "test_helper.rb"
2
+ require_relative "sinatra_app"
3
+ require "rack/test"
4
+
5
+ module LogjamAgent
6
+ class SinatraTest < MiniTest::Test
7
+ def setup
8
+ @@receiver ||= LogjamAgent::Receiver.new
9
+ LogjamAgent.enable!
10
+ end
11
+
12
+ def teardown
13
+ LogjamAgent.disable!
14
+ end
15
+
16
+ def logjam_message
17
+ @@receiver.receive
18
+ end
19
+
20
+ include ::Rack::Test::Methods
21
+
22
+ def app
23
+ SinatraTestApp
24
+ end
25
+
26
+ def test_root
27
+ get '/index?mumu=1&password=5'
28
+ assert_equal 'Hello World!', last_response.body
29
+ assert_equal 200, last_response.status
30
+
31
+ stream, topic, payload = logjam_message
32
+ assert_equal "myapp-test", stream
33
+ assert_equal "logs.myapp.test", topic
34
+ assert_equal 200, payload["code"]
35
+ assert_equal "Simple#index", payload["action"]
36
+ assert_kind_of Float, payload["total_time"]
37
+ assert_kind_of String, payload["started_at"]
38
+ assert_kind_of Integer, payload["started_ms"]
39
+ assert_kind_of String, payload["ip"]
40
+ # assert_kind_of Float, payload["view_time"]
41
+ lines = payload["lines"]
42
+ assert_match(/Started GET.*password=\[FILTERED\]/, lines[0][2])
43
+ assert_match(/Hello World/, lines[1][2])
44
+ assert_match(/Completed 200 OK/, lines[2][2])
45
+ assert_nil(lines[3])
46
+ request_info = payload["request_info"]
47
+ method, url, query_parameters = request_info.values_at(*%w(method url query_parameters))
48
+ assert_equal method, "GET"
49
+ assert_equal url, "/index?mumu=1&password=[FILTERED]"
50
+ assert_equal(query_parameters, { "mumu" => "1", "password" => "[FILTERED]" })
51
+ end
52
+
53
+ end
54
+ end
@@ -1,11 +1,16 @@
1
1
  require 'minitest/autorun'
2
2
  require 'minitest/unit'
3
3
  require 'minitest/pride' if ENV['RAINBOW_COLORED_TESTS'] == "1" && $stdout.tty?
4
- require 'mocha/setup'
5
-
6
- require_relative "../lib/logjam_agent"
4
+ require 'mocha/minitest'
7
5
 
8
6
  class MiniTest::Test
9
7
  require "active_support/testing/declarative"
10
8
  extend ActiveSupport::Testing::Declarative
11
9
  end
10
+
11
+ $:.unshift File.expand_path('../../lib', __FILE__)
12
+ require "logjam_agent"
13
+ require "logjam_agent/receiver"
14
+
15
+ # for Sinatra
16
+ ENV['RACK_ENV'] = "test"
@@ -24,5 +24,10 @@ module LogjamAgent
24
24
  assert_equal "tcp://a:1", augmented
25
25
  end
26
26
 
27
+ test "supports inproc" do
28
+ augmented = augment_connection_spec("inproc://hugo-schnugo", 2)
29
+ assert_equal "inproc://hugo-schnugo", augmented
30
+ end
31
+
27
32
  end
28
33
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: logjam_agent
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.29.6
4
+ version: 0.32.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Stefan Kaes
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-10-22 00:00:00.000000000 Z
11
+ date: 2020-12-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake
@@ -122,6 +122,48 @@ dependencies:
122
122
  - - ">="
123
123
  - !ruby/object:Gem::Version
124
124
  version: '0'
125
+ - !ruby/object:Gem::Dependency
126
+ name: sinatra
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ">="
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ">="
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
139
+ - !ruby/object:Gem::Dependency
140
+ name: rack-test
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - ">="
144
+ - !ruby/object:Gem::Version
145
+ version: '0'
146
+ type: :development
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - ">="
151
+ - !ruby/object:Gem::Version
152
+ version: '0'
153
+ - !ruby/object:Gem::Dependency
154
+ name: appraisal
155
+ requirement: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - ">="
158
+ - !ruby/object:Gem::Version
159
+ version: '0'
160
+ type: :development
161
+ prerelease: false
162
+ version_requirements: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - ">="
165
+ - !ruby/object:Gem::Version
166
+ version: '0'
125
167
  - !ruby/object:Gem::Dependency
126
168
  name: activesupport
127
169
  requirement: !ruby/object:Gem::Requirement
@@ -142,14 +184,14 @@ dependencies:
142
184
  requirements:
143
185
  - - ">="
144
186
  - !ruby/object:Gem::Version
145
- version: 0.6.0
187
+ version: 0.12.2
146
188
  type: :runtime
147
189
  prerelease: false
148
190
  version_requirements: !ruby/object:Gem::Requirement
149
191
  requirements:
150
192
  - - ">="
151
193
  - !ruby/object:Gem::Version
152
- version: 0.6.0
194
+ version: 0.12.2
153
195
  - !ruby/object:Gem::Dependency
154
196
  name: ffi-rzmq-core
155
197
  requirement: !ruby/object:Gem::Requirement
@@ -185,32 +227,40 @@ executables: []
185
227
  extensions: []
186
228
  extra_rdoc_files: []
187
229
  files:
188
- - ".gitignore"
189
- - Gemfile
190
230
  - README.md
191
231
  - Rakefile
192
232
  - lib/logjam_agent.rb
193
233
  - lib/logjam_agent/actionpack/lib/action_dispatch/middleware/remote_ip.rb
234
+ - lib/logjam_agent/active_support/core_ext/array/extract.rb
235
+ - lib/logjam_agent/active_support/parameter_filter.rb
194
236
  - lib/logjam_agent/buffered_logger.rb
195
237
  - lib/logjam_agent/forwarders.rb
196
238
  - lib/logjam_agent/middleware.rb
239
+ - lib/logjam_agent/monkey_patches/ffi-rzmq-patch.rb
197
240
  - lib/logjam_agent/rack/logger.rb
241
+ - lib/logjam_agent/rack/rails_support.rb
242
+ - lib/logjam_agent/rack/sinatra_request.rb
198
243
  - lib/logjam_agent/railtie.rb
244
+ - lib/logjam_agent/receiver.rb
199
245
  - lib/logjam_agent/request.rb
246
+ - lib/logjam_agent/sinatra.rb
200
247
  - lib/logjam_agent/syslog_like_formatter.rb
201
248
  - lib/logjam_agent/util.rb
202
249
  - lib/logjam_agent/version.rb
203
250
  - lib/logjam_agent/zmq_forwarder.rb
204
- - logjam_agent.gemspec
205
- - script/console
206
251
  - test/request_test.rb
252
+ - test/sinatra_app.rb
253
+ - test/sinatra_classic_app.rb
254
+ - test/sinatra_classic_test.rb
255
+ - test/sinatra_test.rb
207
256
  - test/test_helper.rb
208
257
  - test/util_test.rb
209
258
  - test/zmq_forwarder_test.rb
210
- homepage: ''
211
- licenses: []
259
+ homepage: https://github.com/skaes/logjam_agent
260
+ licenses:
261
+ - MIT
212
262
  metadata: {}
213
- post_install_message:
263
+ post_install_message:
214
264
  rdoc_options: []
215
265
  require_paths:
216
266
  - lib
@@ -225,12 +275,16 @@ required_rubygems_version: !ruby/object:Gem::Requirement
225
275
  - !ruby/object:Gem::Version
226
276
  version: '0'
227
277
  requirements: []
228
- rubygems_version: 3.0.6
229
- signing_key:
278
+ rubygems_version: 3.1.4
279
+ signing_key:
230
280
  specification_version: 4
231
281
  summary: Logjam client library to be used with logjam
232
282
  test_files:
283
+ - test/sinatra_app.rb
284
+ - test/sinatra_classic_test.rb
285
+ - test/sinatra_classic_app.rb
233
286
  - test/request_test.rb
234
- - test/test_helper.rb
235
- - test/util_test.rb
236
287
  - test/zmq_forwarder_test.rb
288
+ - test/util_test.rb
289
+ - test/test_helper.rb
290
+ - test/sinatra_test.rb