logjam_agent 0.33.0 → 0.33.3
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 +4 -4
- data/README.md +2 -1
- data/lib/logjam_agent/rack/logger.rb +23 -17
- data/lib/logjam_agent/version.rb +1 -1
- data/lib/logjam_agent/zmq_forwarder.rb +7 -4
- data/test/sinatra_test.rb +1 -0
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: eb075dc1c42d045d800df979adde0ba2a4861de680c5154e42fb04552d2d4019
|
4
|
+
data.tar.gz: 6f0bf552907f852f0d6e16dcbf05f66b7d0ec5488c36e206046ae4edd5319db3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 30597a450700826424e80d43bdd1e210b0a11e27ba1576bdfe3498fa71d3bd122d30e36b8ba5038a1e2544e30e0a7b63b2ef2e3214df7719276fbdd311d8693f
|
7
|
+
data.tar.gz: 271462e2feac5b3ef4eaa29197b64b7d627b6f2561b699f3f0f24ec90a567ef3925d888486e40820f69b410528215f5f790d5f6a0248a2e4a66ec22dd323e7ca
|
data/README.md
CHANGED
@@ -10,7 +10,8 @@ Has experimental support for Sinatra.
|
|
10
10
|
Currently only one mechanism is available for data transport:
|
11
11
|
ZeroMQ. Support for AMQP has been dropped.
|
12
12
|
|
13
|
-
|
13
|
+
|
14
|
+

|
14
15
|
|
15
16
|
|
16
17
|
## Usage
|
@@ -32,23 +32,16 @@ module LogjamAgent
|
|
32
32
|
|
33
33
|
def call_app(request, env)
|
34
34
|
start_time = Time.now
|
35
|
-
|
36
|
-
if
|
37
|
-
|
38
|
-
|
39
|
-
http_start_time = Time.at($1.to_f / 1_000_000.0)
|
40
|
-
elsif start_time_header =~ /\Ats=(\d+)(?:\.(\d+))?\z/
|
41
|
-
# HTTP_X_STARTTIME is seconds since the epoch (UTC) with a milliseconds resolution
|
42
|
-
http_start_time = Time.at($1.to_f + $2.to_f / 1000)
|
43
|
-
end
|
44
|
-
|
45
|
-
if http_start_time && (wait_time_ms = (start_time - http_start_time) * 1000) > 0
|
35
|
+
wait_time_ms = 0.0
|
36
|
+
if http_start_time = extract_http_start_time(env)
|
37
|
+
wait_time_ms = (start_time - http_start_time) * 1000
|
38
|
+
if wait_time_ms > 0
|
46
39
|
start_time = http_start_time
|
40
|
+
else
|
41
|
+
wait_time_ms = 0.0
|
47
42
|
end
|
48
|
-
else
|
49
|
-
wait_time_ms = 0.0
|
50
43
|
end
|
51
|
-
before_dispatch(request, env, start_time)
|
44
|
+
before_dispatch(request, env, start_time, wait_time_ms)
|
52
45
|
result = @app.call(env)
|
53
46
|
rescue ActionDispatch::RemoteIp::IpSpoofAttackError
|
54
47
|
result = [403, {}, ['Forbidden']]
|
@@ -57,6 +50,20 @@ module LogjamAgent
|
|
57
50
|
after_dispatch(env, result, run_time_ms, wait_time_ms)
|
58
51
|
end
|
59
52
|
|
53
|
+
def extract_http_start_time(env)
|
54
|
+
start_time_header = env['HTTP_X_STARTTIME']
|
55
|
+
if start_time_header
|
56
|
+
if start_time_header =~ /\At=(\d+)\z/
|
57
|
+
# HTTP_X_STARTTIME is microseconds since the epoch (UTC)
|
58
|
+
return Time.at($1.to_f / 1_000_000.0)
|
59
|
+
elsif start_time_header =~ /\Ats=(\d+)(?:\.(\d+))?\z/
|
60
|
+
# HTTP_X_STARTTIME is seconds since the epoch (UTC) with a milliseconds resolution
|
61
|
+
return Time.at($1.to_f + $2.to_f / 1000)
|
62
|
+
end
|
63
|
+
end
|
64
|
+
return nil
|
65
|
+
end
|
66
|
+
|
60
67
|
def compute_tags(request)
|
61
68
|
@taggers.collect do |tag|
|
62
69
|
case tag
|
@@ -78,7 +85,7 @@ module LogjamAgent
|
|
78
85
|
false
|
79
86
|
end
|
80
87
|
|
81
|
-
def before_dispatch(request, env, start_time)
|
88
|
+
def before_dispatch(request, env, start_time, wait_time_ms)
|
82
89
|
logger.formatter.reset_attributes if logger.formatter.respond_to?(:reset_attributes)
|
83
90
|
TimeBandits.reset
|
84
91
|
Thread.current.thread_variable_set(:time_bandits_completed_info, nil)
|
@@ -90,6 +97,7 @@ module LogjamAgent
|
|
90
97
|
|
91
98
|
logjam_request.start_time = start_time
|
92
99
|
logjam_fields = logjam_request.fields
|
100
|
+
logjam_fields[:wait_time] = wait_time_ms if wait_time_ms > 0.0
|
93
101
|
spoofed = nil
|
94
102
|
ip = nil
|
95
103
|
begin
|
@@ -125,7 +133,6 @@ module LogjamAgent
|
|
125
133
|
|
126
134
|
if wait_time_ms < 0
|
127
135
|
warn LogjamAgent::NegativeWaitTime.new("#{wait_time_ms} ms")
|
128
|
-
wait_time_ms = 0.0
|
129
136
|
end
|
130
137
|
|
131
138
|
message = "Completed #{status} #{::Rack::Utils::HTTP_STATUS_CODES[status]} in %.1fms" % run_time_ms
|
@@ -135,7 +142,6 @@ module LogjamAgent
|
|
135
142
|
ActiveSupport::LogSubscriber.flush_all!
|
136
143
|
request_info = { :total_time => run_time_ms, :code => status }
|
137
144
|
request_info[:view_time] = view_time if view_time
|
138
|
-
request_info[:wait_time] = wait_time_ms if wait_time_ms > 0
|
139
145
|
logjam_request.fields.merge!(request_info)
|
140
146
|
|
141
147
|
env["time_bandits.metrics"] = TimeBandits.metrics
|
data/lib/logjam_agent/version.rb
CHANGED
@@ -45,7 +45,8 @@ module LogjamAgent
|
|
45
45
|
begin
|
46
46
|
require 'ffi-rzmq'
|
47
47
|
context = ZMQ::Context.new(1)
|
48
|
-
|
48
|
+
pid = Process.pid
|
49
|
+
at_exit { context.terminate if Process.pid == pid }
|
49
50
|
context
|
50
51
|
end
|
51
52
|
end
|
@@ -59,7 +60,8 @@ module LogjamAgent
|
|
59
60
|
|
60
61
|
def ensure_ping_at_exit
|
61
62
|
return if @ping_ensured
|
62
|
-
|
63
|
+
pid = Process.pid
|
64
|
+
at_exit { (ping; reset) if Process.pid == pid }
|
63
65
|
@ping_ensured = true
|
64
66
|
end
|
65
67
|
|
@@ -99,7 +101,8 @@ module LogjamAgent
|
|
99
101
|
if LogjamAgent.ensure_ping_at_exit
|
100
102
|
ensure_ping_at_exit
|
101
103
|
else
|
102
|
-
|
104
|
+
pid = Process.pid
|
105
|
+
at_exit { reset if Process.pid == pid}
|
103
106
|
end
|
104
107
|
@socket.setsockopt(ZMQ::LINGER, @config[:linger])
|
105
108
|
@socket.setsockopt(ZMQ::SNDHWM, @config[:snd_hwm])
|
@@ -141,7 +144,7 @@ module LogjamAgent
|
|
141
144
|
reset_without_locking
|
142
145
|
return nil
|
143
146
|
end
|
144
|
-
if answer_parts.first !=
|
147
|
+
if answer_parts.first != app_env || !VALID_RESPONSE_CODES.include?(answer_parts.second.to_s.to_i)
|
145
148
|
log_warning "unexpected answer from logjam broker: #{answer_parts.inspect}"
|
146
149
|
end
|
147
150
|
answer_parts.second
|
data/test/sinatra_test.rb
CHANGED
@@ -37,6 +37,7 @@ module LogjamAgent
|
|
37
37
|
assert_kind_of String, payload["started_at"]
|
38
38
|
assert_kind_of Integer, payload["started_ms"]
|
39
39
|
assert_kind_of String, payload["ip"]
|
40
|
+
assert_nil payload["wait_time"]
|
40
41
|
# assert_kind_of Float, payload["view_time"]
|
41
42
|
lines = payload["lines"]
|
42
43
|
assert_match(/Started GET.*password=\[FILTERED\]/, lines[0][2])
|
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.33.
|
4
|
+
version: 0.33.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Stefan Kaes
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2022-07-29 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|
@@ -275,7 +275,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
275
275
|
- !ruby/object:Gem::Version
|
276
276
|
version: '0'
|
277
277
|
requirements: []
|
278
|
-
rubygems_version: 3.
|
278
|
+
rubygems_version: 3.3.15
|
279
279
|
signing_key:
|
280
280
|
specification_version: 4
|
281
281
|
summary: Logjam client library to be used with logjam
|