griffin-interceptors 0.1.4 → 0.1.9
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 +5 -5
- data/griffin-interceptors.gemspec +2 -1
- data/lib/griffin/interceptors/server/filtered_payload_interceptor.rb +9 -3
- data/lib/griffin/interceptors/server/logging_interceptor.rb +1 -1
- data/lib/griffin/interceptors/server/newrelic_interceptor.rb +22 -21
- data/lib/griffin/interceptors/server/raven_interceptor.rb +3 -0
- data/lib/griffin/interceptors/server/worker_killer_interceptor.rb +55 -0
- data/lib/griffin/interceptors/version.rb +1 -1
- metadata +23 -9
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 239fb7f3036b63120fdeb63eeb5504848b95a1e89d34708186fec7fb7b492203
|
4
|
+
data.tar.gz: de98b38b9a0ee827b439948cf0179da9ab2f2bcb08b06da2db05de23403a95fa
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5051fa9479be355ae9a5982dfffd6896149c7261e9bea9f75ab8db3d72752eda04546eeeb12fdcb52b672bc7a60b7420806c1e782482dfa57b426b818bfee014
|
7
|
+
data.tar.gz: f6eec90328bd4aa6e7617a9b2bacdbcf7512565d3b97186ef39ff98a49fb74719c84c94270c8170959c9ea5402993434593ffb88c83cbc3dd0c1e8ab27732ac0
|
@@ -20,7 +20,8 @@ Gem::Specification.new do |spec|
|
|
20
20
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
21
21
|
spec.require_paths = ['lib']
|
22
22
|
|
23
|
-
spec.add_dependency '
|
23
|
+
spec.add_dependency 'get_process_mem', '~> 0.2.3'
|
24
|
+
spec.add_dependency 'griffin', '>= 0.2.3'
|
24
25
|
|
25
26
|
spec.add_development_dependency 'bundler'
|
26
27
|
spec.add_development_dependency 'rake'
|
@@ -2,8 +2,8 @@
|
|
2
2
|
|
3
3
|
require 'griffin/interceptors/server/payload_interceptor'
|
4
4
|
|
5
|
-
# Check actionpack exists to use ActionDispatch::Http::ParameterFilter
|
6
|
-
gem 'actionpack'
|
5
|
+
# Check actionpack exists to use ActionDispatch::Http::ParameterFilter if needed
|
6
|
+
gem 'actionpack' unless defined?(ActiveSupport::ParameterFilter)
|
7
7
|
|
8
8
|
module Griffin
|
9
9
|
module Interceptors
|
@@ -19,7 +19,13 @@ module Griffin
|
|
19
19
|
end
|
20
20
|
end
|
21
21
|
|
22
|
-
|
22
|
+
# ActionDispatch::Http::ParameterFilter is deprecated and will be removed from Rails 6.1.
|
23
|
+
parameter_filter_klass = if defined?(ActiveSupport::ParameterFilter)
|
24
|
+
ActiveSupport::ParameterFilter
|
25
|
+
else
|
26
|
+
ActionDispatch::Http::ParameterFilter
|
27
|
+
end
|
28
|
+
@parameter_filter = parameter_filter_klass.new(@filters)
|
23
29
|
end
|
24
30
|
|
25
31
|
def server_streamer(call: nil, **)
|
@@ -19,26 +19,14 @@ module Griffin
|
|
19
19
|
|
20
20
|
return yield if @ignored_services.include?(service_name)
|
21
21
|
|
22
|
-
transaction_name = build_transaction_name(service_name, method.name)
|
23
|
-
state = NewRelic::Agent::TransactionState.tl_get
|
24
|
-
|
25
22
|
# gRPC's HTTP method is fixed. https://github.com/grpc/grpc/blob/af89e8c00e796f3398b09b7daed693df2b14da56/doc/PROTOCOL-HTTP2.md
|
26
|
-
|
27
|
-
|
28
|
-
#
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
# gRPC alway returns HTTP status code 200
|
34
|
-
state.current_transaction.http_response_code = '200'
|
35
|
-
|
36
|
-
resp
|
37
|
-
rescue => e
|
38
|
-
NewRelic::Agent::Transaction.notice_error(e)
|
39
|
-
raise e
|
40
|
-
ensure
|
41
|
-
NewRelic::Agent::Transaction.stop(state)
|
23
|
+
request = Request.new("/#{service_name}/#{method.name}", call.metadata['user-agent'], 'POST')
|
24
|
+
|
25
|
+
in_transaction("#{service_name}/#{method.name}", request) do |txn|
|
26
|
+
yield.tap do
|
27
|
+
# gRPC always returns HTTP status code 200.
|
28
|
+
txn.http_response_code = '200'
|
29
|
+
end
|
42
30
|
end
|
43
31
|
end
|
44
32
|
|
@@ -46,8 +34,21 @@ module Griffin
|
|
46
34
|
|
47
35
|
private
|
48
36
|
|
49
|
-
|
50
|
-
|
37
|
+
if Gem::Version.new(NewRelic::VERSION::STRING) >= Gem::Version.new('6.0.0')
|
38
|
+
def in_transaction(partial_name, request)
|
39
|
+
NewRelic::Agent::Tracer.in_transaction(partial_name: partial_name, category: :web, options: { request: request }) do
|
40
|
+
yield NewRelic::Agent::Tracer.current_transaction
|
41
|
+
end
|
42
|
+
end
|
43
|
+
else
|
44
|
+
def in_transaction(partial_name, request)
|
45
|
+
state = NewRelic::Agent::TransactionState.tl_get
|
46
|
+
# Specify the controller category so that the transaction gets categorized as a web transaction.
|
47
|
+
# See https://github.com/newrelic/newrelic-ruby-agent/blob/5.7.0.350/lib/new_relic/agent/transaction.rb#L39.
|
48
|
+
NewRelic::Agent::Transaction.wrap(state, "Controller/#{partial_name}", :controller, request: request) do
|
49
|
+
yield state.current_transaction
|
50
|
+
end
|
51
|
+
end
|
51
52
|
end
|
52
53
|
end
|
53
54
|
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'get_process_mem'
|
4
|
+
|
5
|
+
module Griffin
|
6
|
+
module Interceptors
|
7
|
+
module Server
|
8
|
+
class WorkerKillerInterceptor < GRPC::ServerInterceptor
|
9
|
+
def initialize(memory_limit_min: 1024**3, memory_limit_max: 2 * (1024**3), check_cycle: 16)
|
10
|
+
@worker_memory_limit_max = memory_limit_max
|
11
|
+
@worker_memory_limit_min = memory_limit_min
|
12
|
+
@worker_check_cycle = check_cycle
|
13
|
+
@worker_memory_limit = @worker_memory_limit_min + rand(@worker_memory_limit_max - @worker_memory_limit_min + 1)
|
14
|
+
@worker_check_count = 0
|
15
|
+
@sent_signals = false
|
16
|
+
end
|
17
|
+
|
18
|
+
def request_response(*)
|
19
|
+
yield.tap do
|
20
|
+
break if @sent_signals
|
21
|
+
|
22
|
+
@worker_process_start ||= Time.now
|
23
|
+
@worker_check_count += 1
|
24
|
+
|
25
|
+
if (@worker_check_count % @worker_check_cycle) == 0
|
26
|
+
rss = GetProcessMem.new.bytes
|
27
|
+
if rss > @worker_memory_limit
|
28
|
+
Griffin.logger.warn("Worker (pid: #{Process.pid}) exceeds memory limit (#{rss.to_i} bytes > #{@worker_memory_limit} bytes)")
|
29
|
+
send_restart_signal(@worker_process_start)
|
30
|
+
end
|
31
|
+
|
32
|
+
@worker_check_count = 0
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
alias_method :server_streamer, :request_response
|
38
|
+
alias_method :client_streamer, :request_response
|
39
|
+
alias_method :bidi_streamer, :request_response
|
40
|
+
|
41
|
+
private
|
42
|
+
|
43
|
+
def send_restart_signal(start_time)
|
44
|
+
# No need to get a lock, sending signals duplicately is acceptable
|
45
|
+
@sent_signals = true
|
46
|
+
pid = Process.pid
|
47
|
+
alive_sec = (Time.now - start_time).round
|
48
|
+
|
49
|
+
Griffin.logger.info("Send signal(USR1) pid: #{pid}, alive_sec: #{alive_sec}")
|
50
|
+
Process.kill :USR1, pid
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
metadata
CHANGED
@@ -1,29 +1,43 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: griffin-interceptors
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.9
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Yuta Iwama
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2020-08-05 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: get_process_mem
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 0.2.3
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 0.2.3
|
13
27
|
- !ruby/object:Gem::Dependency
|
14
28
|
name: griffin
|
15
29
|
requirement: !ruby/object:Gem::Requirement
|
16
30
|
requirements:
|
17
31
|
- - ">="
|
18
32
|
- !ruby/object:Gem::Version
|
19
|
-
version: 0.
|
33
|
+
version: 0.2.3
|
20
34
|
type: :runtime
|
21
35
|
prerelease: false
|
22
36
|
version_requirements: !ruby/object:Gem::Requirement
|
23
37
|
requirements:
|
24
38
|
- - ">="
|
25
39
|
- !ruby/object:Gem::Version
|
26
|
-
version: 0.
|
40
|
+
version: 0.2.3
|
27
41
|
- !ruby/object:Gem::Dependency
|
28
42
|
name: bundler
|
29
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -112,13 +126,14 @@ files:
|
|
112
126
|
- lib/griffin/interceptors/server/rails_exception_interceptor.rb
|
113
127
|
- lib/griffin/interceptors/server/raven_interceptor.rb
|
114
128
|
- lib/griffin/interceptors/server/timeout_interceptor.rb
|
129
|
+
- lib/griffin/interceptors/server/worker_killer_interceptor.rb
|
115
130
|
- lib/griffin/interceptors/server/x_request_id_interceptor.rb
|
116
131
|
- lib/griffin/interceptors/version.rb
|
117
132
|
homepage: https://github.com/cookpad/griffin-interceptors
|
118
133
|
licenses:
|
119
134
|
- MIT
|
120
135
|
metadata: {}
|
121
|
-
post_install_message:
|
136
|
+
post_install_message:
|
122
137
|
rdoc_options: []
|
123
138
|
require_paths:
|
124
139
|
- lib
|
@@ -133,9 +148,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
133
148
|
- !ruby/object:Gem::Version
|
134
149
|
version: '0'
|
135
150
|
requirements: []
|
136
|
-
|
137
|
-
|
138
|
-
signing_key:
|
151
|
+
rubygems_version: 3.1.2
|
152
|
+
signing_key:
|
139
153
|
specification_version: 4
|
140
154
|
summary: A collection of interceptors for griffin
|
141
155
|
test_files: []
|