tcell_agent 1.1.3 → 1.1.4

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.
Files changed (118) hide show
  1. checksums.yaml +4 -4
  2. data/bin/tcell_agent +10 -2
  3. data/lib/tcell_agent.rb +3 -3
  4. data/lib/tcell_agent/agent.rb +42 -52
  5. data/lib/tcell_agent/agent/event_processor.rb +129 -162
  6. data/lib/tcell_agent/agent/fork_pipe_manager.rb +57 -62
  7. data/lib/tcell_agent/agent/policy_manager.rb +83 -104
  8. data/lib/tcell_agent/agent/policy_types.rb +24 -29
  9. data/lib/tcell_agent/agent/route_manager.rb +36 -46
  10. data/lib/tcell_agent/agent/static_agent.rb +19 -21
  11. data/lib/tcell_agent/api.rb +23 -28
  12. data/lib/tcell_agent/appsensor/injections_reporter.rb +7 -11
  13. data/lib/tcell_agent/authlogic.rb +7 -7
  14. data/lib/tcell_agent/cmdi.rb +22 -23
  15. data/lib/tcell_agent/config/unknown_options.rb +71 -69
  16. data/lib/tcell_agent/configuration.rb +187 -191
  17. data/lib/tcell_agent/devise.rb +13 -15
  18. data/lib/tcell_agent/hooks/login_fraud.rb +1 -1
  19. data/lib/tcell_agent/instrumentation.rb +120 -124
  20. data/lib/tcell_agent/logger.rb +29 -45
  21. data/lib/tcell_agent/patches.rb +5 -5
  22. data/lib/tcell_agent/policies/dataloss_policy.rb +263 -288
  23. data/lib/tcell_agent/policies/http_redirect_policy.rb +25 -37
  24. data/lib/tcell_agent/policies/http_tx_policy.rb +48 -52
  25. data/lib/tcell_agent/policies/login_fraud_policy.rb +15 -20
  26. data/lib/tcell_agent/policies/policy.rb +0 -2
  27. data/lib/tcell_agent/policies/rust_policies.rb +24 -29
  28. data/lib/tcell_agent/rails.rb +2 -3
  29. data/lib/tcell_agent/rails/auth/authlogic.rb +2 -2
  30. data/lib/tcell_agent/rails/auth/devise.rb +2 -2
  31. data/lib/tcell_agent/rails/auth/doorkeeper.rb +2 -2
  32. data/lib/tcell_agent/rails/better_ip.rb +12 -16
  33. data/lib/tcell_agent/rails/csrf_exception.rb +4 -7
  34. data/lib/tcell_agent/rails/dlp.rb +208 -107
  35. data/lib/tcell_agent/rails/dlp/process_request.rb +37 -47
  36. data/lib/tcell_agent/rails/dlp_handler.rb +9 -11
  37. data/lib/tcell_agent/rails/js_agent_insert.rb +11 -14
  38. data/lib/tcell_agent/rails/middleware/body_filter_middleware.rb +8 -7
  39. data/lib/tcell_agent/rails/middleware/context_middleware.rb +4 -5
  40. data/lib/tcell_agent/rails/middleware/global_middleware.rb +5 -8
  41. data/lib/tcell_agent/rails/middleware/headers_middleware.rb +24 -27
  42. data/lib/tcell_agent/rails/on_start.rb +5 -5
  43. data/lib/tcell_agent/rails/responses.rb +7 -9
  44. data/lib/tcell_agent/rails/routes.rb +62 -81
  45. data/lib/tcell_agent/rails/routes/grape.rb +25 -30
  46. data/lib/tcell_agent/rails/routes/route_id.rb +9 -14
  47. data/lib/tcell_agent/rails/settings_reporter.rb +44 -33
  48. data/lib/tcell_agent/rails/tcell_body_proxy.rb +15 -18
  49. data/lib/tcell_agent/routes/table.rb +31 -33
  50. data/lib/tcell_agent/rust/{libtcellagent-1.3.0.dylib → libtcellagent-1.3.1.dylib} +0 -0
  51. data/lib/tcell_agent/rust/{libtcellagent-1.3.0.so → libtcellagent-1.3.1.so} +0 -0
  52. data/lib/tcell_agent/rust/{libtcellagent-alpine-1.3.0.so → libtcellagent-alpine-1.3.1.so} +0 -0
  53. data/lib/tcell_agent/rust/models.rb +32 -37
  54. data/lib/tcell_agent/rust/tcellagent-1.3.1.dll +0 -0
  55. data/lib/tcell_agent/rust/whisperer.rb +101 -104
  56. data/lib/tcell_agent/sensor_events/app_config.rb +7 -7
  57. data/lib/tcell_agent/sensor_events/appsensor_event.rb +26 -27
  58. data/lib/tcell_agent/sensor_events/appsensor_meta_event.rb +20 -88
  59. data/lib/tcell_agent/sensor_events/command_injection.rb +52 -80
  60. data/lib/tcell_agent/sensor_events/discovery.rb +27 -27
  61. data/lib/tcell_agent/sensor_events/dlp.rb +50 -56
  62. data/lib/tcell_agent/sensor_events/honeytokens.rb +9 -9
  63. data/lib/tcell_agent/sensor_events/metrics.rb +20 -21
  64. data/lib/tcell_agent/sensor_events/patches.rb +10 -12
  65. data/lib/tcell_agent/sensor_events/sensor.rb +32 -36
  66. data/lib/tcell_agent/sensor_events/server_agent.rb +130 -127
  67. data/lib/tcell_agent/sensor_events/util/sanitizer_utilities.rb +60 -80
  68. data/lib/tcell_agent/sensor_events/util/utils.rb +3 -5
  69. data/lib/tcell_agent/servers/passenger.rb +5 -9
  70. data/lib/tcell_agent/servers/puma.rb +18 -27
  71. data/lib/tcell_agent/servers/rails_server.rb +5 -9
  72. data/lib/tcell_agent/servers/thin.rb +2 -4
  73. data/lib/tcell_agent/servers/unicorn.rb +18 -27
  74. data/lib/tcell_agent/servers/webrick.rb +2 -4
  75. data/lib/tcell_agent/settings_reporter.rb +126 -0
  76. data/lib/tcell_agent/sinatra.rb +24 -26
  77. data/lib/tcell_agent/start_background_thread.rb +21 -142
  78. data/lib/tcell_agent/system_info.rb +4 -3
  79. data/lib/tcell_agent/tcell_context.rb +150 -0
  80. data/lib/tcell_agent/userinfo.rb +3 -3
  81. data/lib/tcell_agent/utils/io.rb +19 -24
  82. data/lib/tcell_agent/utils/params.rb +9 -15
  83. data/lib/tcell_agent/utils/queue_with_timeout.rb +26 -32
  84. data/lib/tcell_agent/utils/strings.rb +4 -6
  85. data/lib/tcell_agent/version.rb +1 -1
  86. data/spec/lib/tcell_agent/agent/policy_manager_spec.rb +5 -5
  87. data/spec/lib/tcell_agent/agent/static_agent_spec.rb +7 -7
  88. data/spec/lib/tcell_agent/cmdi_spec.rb +21 -21
  89. data/spec/lib/tcell_agent/hooks/login_fraud_spec.rb +29 -24
  90. data/spec/lib/tcell_agent/instrumentation_spec.rb +4 -4
  91. data/spec/lib/tcell_agent/patches_spec.rb +8 -8
  92. data/spec/lib/tcell_agent/policies/appsensor_policy_spec.rb +23 -23
  93. data/spec/lib/tcell_agent/policies/patches_policy_spec.rb +2 -2
  94. data/spec/lib/tcell_agent/rails/csrf_exception_spec.rb +69 -0
  95. data/spec/lib/tcell_agent/rails/dlp_spec.rb +1039 -0
  96. data/spec/lib/tcell_agent/rails/js_agent_insert_spec.rb +271 -0
  97. data/spec/lib/tcell_agent/rails/logger_spec.rb +5 -5
  98. data/spec/lib/tcell_agent/rails/middleware/appsensor_middleware_spec.rb +3 -3
  99. data/spec/lib/tcell_agent/rails/middleware/dlp_middleware_spec.rb +4 -4
  100. data/spec/lib/tcell_agent/rails/middleware/global_middleware_spec.rb +5 -5
  101. data/spec/lib/tcell_agent/rails/middleware/redirect_middleware_spec.rb +1 -1
  102. data/spec/lib/tcell_agent/rails/middleware/tcell_body_proxy_spec.rb +11 -8
  103. data/spec/lib/tcell_agent/rails/responses_spec.rb +2 -2
  104. data/spec/lib/tcell_agent/rails/routes/grape_spec.rb +2 -2
  105. data/spec/lib/tcell_agent/rails/routes/route_id_spec.rb +1 -1
  106. data/spec/lib/tcell_agent/rails/routes/routes_spec.rb +4 -4
  107. data/spec/lib/tcell_agent/rust/models_spec.rb +83 -75
  108. data/spec/lib/tcell_agent/rust/whisperer_spec.rb +14 -14
  109. data/spec/lib/tcell_agent/sensor_events/appsensor_meta_event_spec.rb +19 -70
  110. data/spec/lib/tcell_agent/sensor_events/sessions_metric_spec.rb +1 -1
  111. data/spec/lib/tcell_agent/settings_reporter_spec.rb +162 -0
  112. data/spec/lib/tcell_agent/tcell_context_spec.rb +154 -0
  113. data/spec/spec_helper.rb +5 -0
  114. metadata +18 -10
  115. data/lib/tcell_agent/appsensor/meta_data.rb +0 -132
  116. data/lib/tcell_agent/patches/meta_data.rb +0 -59
  117. data/lib/tcell_agent/rust/tcellagent-1.3.0.dll +0 -0
  118. data/spec/lib/tcell_agent/appsensor/meta_data_spec.rb +0 -71
@@ -1,5 +1,3 @@
1
- # encoding: utf-8
2
-
3
1
  # See the file "LICENSE" for the full license governing this code.
4
2
 
5
3
  require 'logger'
@@ -11,103 +9,93 @@ module TCellAgent
11
9
  module SensorEvents
12
10
  module Util
13
11
  def self.hmac(data)
14
- hmac_key = Util.get_hmac_key()
12
+ hmac_key = Util.get_hmac_key
15
13
 
16
14
  h = OpenSSL::HMAC.hexdigest(OpenSSL::Digest.new('sha256'), hmac_key.to_s, data)
17
15
 
18
- return h[0...h.length/2]
16
+ h[0...h.length / 2]
19
17
  end
20
18
 
21
19
  def self.request_sanitized_json(request)
22
- sanitized_headers = Hash.new
23
- headers = request.headers.select {|k,v| k.start_with? 'HTTP_'}
24
- .collect {|pair| [pair[0].sub(/^HTTP_/, ''), pair[1]]}
25
- .sort
20
+ sanitized_headers = {}
21
+ headers = request.headers.select { |k, _v| k.start_with? 'HTTP_' }
22
+ .collect { |pair| [pair[0].sub(/^HTTP_/, ''), pair[1]] }
23
+ .sort
26
24
  headers.each do |header_name, header_value|
27
25
  lower_header_name = header_name.downcase
28
- if lower_header_name == "cookie"
29
- sanitized_headers[header_name] = [self.santize_request_cookie_string(header_value)]
30
- elsif ["content_type", "content_length","user_agent","csp"].include?(lower_header_name)
31
- sanitized_headers[header_name] = [header_value]
32
- else
33
- sanitized_headers[header_name] = []
34
- end
26
+ sanitized_headers[header_name] = if lower_header_name == 'cookie'
27
+ [santize_request_cookie_string(header_value)]
28
+ elsif %w[content_type content_length user_agent csp].include?(lower_header_name)
29
+ [header_value]
30
+ else
31
+ []
32
+ end
35
33
  end
36
- new_request = {"method"=>request.request_method,
37
- "uri"=>self.sanitize_uri(request.fullpath),
38
- "headers"=>sanitized_headers}
34
+ new_request = { 'method' => request.request_method,
35
+ 'uri' => sanitize_uri(request.fullpath),
36
+ 'headers' => sanitized_headers }
39
37
  request_body = request.body.read
40
38
  if request_body
41
- new_request["post_data"] = sanitize_query_string(request_body)
39
+ new_request['post_data'] = sanitize_query_string(request_body)
42
40
  end
43
41
  new_request
44
42
  end
45
43
 
46
44
  def self.response_sanitized_json(response)
47
- status, headers, body = *response
48
- sanitized_headers = Hash.new
49
- content_type = "unknown"
45
+ status, headers, _body = *response
46
+ sanitized_headers = {}
47
+ content_type = 'unknown'
50
48
  headers.each do |header_name, header_value|
51
49
  lower_header_name = header_name.downcase
52
- if lower_header_name == "set-cookie"
53
- sanitized_headers[header_name] = [self.santize_response_cookie_string(header_value)]
50
+ if lower_header_name == 'set-cookie'
51
+ sanitized_headers[header_name] = [santize_response_cookie_string(header_value)]
54
52
  else
55
- if lower_header_name == "content-type"
56
- content_type = header_value
57
- end
58
- if ["content-type", "content-length"].include?(lower_header_name)
59
- sanitized_headers[header_name] = [header_value]
60
- else
61
- sanitized_headers[header_name] = []
62
- end
53
+ content_type = header_value if lower_header_name == 'content-type'
54
+ sanitized_headers[header_name] = if ['content-type', 'content-length'].include?(lower_header_name)
55
+ [header_value]
56
+ else
57
+ []
58
+ end
63
59
  end
64
60
  end
65
- new_response = {"status"=> status,
66
- "headers"=>sanitized_headers}
67
- new_response
61
+
62
+ { 'status' => status,
63
+ 'headers' => sanitized_headers }
68
64
  end
69
65
 
70
66
  def self.santize_request_cookie_string(request_cookie_string)
71
- sanitized_cookies = Hash.new
72
- cookies = CGI::Cookie::parse(request_cookie_string)
67
+ sanitized_cookies = {}
68
+ cookies = CGI::Cookie.parse(request_cookie_string)
73
69
  cookies.each do |cookie_name, cookie_value|
74
- if cookie_value.length != 1
75
- next
76
- end
70
+ next if cookie_value.length != 1
77
71
  sanitized_cookies[cookie_name] = Util.hmac(cookie_value[0])
78
72
  end
79
- sanitized_cookies.map{|k,v| "#{k}=#{v}"}.join(';')
73
+ sanitized_cookies.map { |k, v| "#{k}=#{v}" }.join(';')
80
74
  end
81
75
 
82
76
  def self.santize_response_cookie_string(response_cookie_string_value)
83
77
  cookie_parts = response_cookie_string_value.split('; ')
84
78
  cookie_string = cookie_parts[0]
85
- cookies = CGI::Cookie::parse(cookie_string)
86
- if cookies.length != 1
87
- return "[COOKIEMALFORMED]"
88
- end
79
+ cookies = CGI::Cookie.parse(cookie_string)
80
+ return '[COOKIEMALFORMED]' if cookies.length != 1
89
81
  cookie_name = cookies.keys.first
90
82
  cookie_values = cookies.values.first
91
- if (cookie_values.length != 1)
92
- return "[COOKIEHADTOOMANYVALUES]"
93
- end
83
+ return '[COOKIEHADTOOMANYVALUES]' if cookie_values.length != 1
94
84
  h = Util.hmac(cookie_values[0])
95
85
  new_cookie_string = "#{cookie_name}=#{h}"
96
86
  cookie_parts[0] = new_cookie_string
97
- cookie_parts.map{|k,v| "#{k}=#{v}"}.join('; ')
87
+ cookie_parts.map { |k, v| "#{k}=#{v}" }.join('; ')
98
88
  end
99
89
 
100
90
  def self.sanitize_query_string(query)
101
- params = CGI::parse(query)
91
+ params = CGI.parse(query)
102
92
  params.each do |param_name, param_values|
103
- if param_values == nil || param_values.length == 0
104
- next
105
- end
106
- if (param_name.match(/password/i) ||
107
- param_name.match(/passwd/i) ||
108
- param_name.match(/token/i) ||
109
- param_name.match(/sessionid/i))
110
- params[param_name] = ["?"]
93
+ next if param_values.nil? || param_values.empty?
94
+ if param_name.match(/password/i) ||
95
+ param_name.match(/passwd/i) ||
96
+ param_name.match(/token/i) ||
97
+ param_name.match(/sessionid/i)
98
+ params[param_name] = ['?']
111
99
  next
112
100
  end
113
101
  new_param_values = []
@@ -117,50 +105,42 @@ module TCellAgent
117
105
  end
118
106
  params[param_name] = new_param_values
119
107
  end
120
- params.map{|k,v| "#{k}=#{v.join(',')}"}.join('&')
108
+ params.map { |k, v| "#{k}=#{v.join(',')}" }.join('&')
121
109
  end
122
110
 
123
111
  def self.strip_values_query_string(query)
124
- params = CGI::parse(query)
112
+ params = CGI.parse(query)
125
113
  params.each do |param_name, param_values|
126
- if param_values == nil || param_values.length == 0
127
- next
128
- end
129
- params[param_name] = [""]
114
+ next if param_values.nil? || param_values.empty?
115
+ params[param_name] = ['']
130
116
  end
131
- params.map{|k,v| "#{k}=#{v.join(',')}"}.join('&')
117
+ params.map { |k, v| "#{k}=#{v.join(',')}" }.join('&')
132
118
  end
133
119
 
134
120
  def self.sanitize_uri(uri_string)
135
121
  uri = URI(uri_string)
136
122
  query = uri.query
137
- if (query)
138
- uri.query = sanitize_query_string(query)
139
- end
140
- return uri.to_s
123
+ uri.query = sanitize_query_string(query) if query
124
+ uri.to_s
141
125
  end
142
126
 
143
127
  def self.strip_uri_values(uri_string)
144
128
  uri = URI(uri_string)
145
129
  query = uri.query
146
- if (query)
147
- uri.query = strip_values_query_string(query)
148
- end
149
- return uri.to_s
130
+ uri.query = strip_values_query_string(query) if query
131
+ uri.to_s
150
132
  end
151
133
 
152
134
  def self.get_hmac_key
153
- if (TCellAgent.configuration.hmac_key)
154
- return TCellAgent.configuration.hmac_key
155
- elsif (TCellAgent.configuration.app_id)
156
- return TCellAgent.configuration.app_id
157
- end
158
- return "tcell_hmac_key"
135
+ return TCellAgent.configuration.hmac_key if TCellAgent.configuration.hmac_key
136
+ return TCellAgent.configuration.app_id if TCellAgent.configuration.app_id
137
+
138
+ 'tcell_hmac_key'
159
139
  end
160
140
 
161
141
  def self.clean_header_keys(request_env_or_header_keys)
162
142
  if request_env_or_header_keys.is_a?(Hash)
163
- request_env_or_header_keys.select {|k,v| k.start_with? 'HTTP_'}.collect {|k,v| k.sub(/^HTTP_/, '') }
143
+ request_env_or_header_keys.select { |k, _v| k.start_with? 'HTTP_' }.collect { |k, _v| k.sub(/^HTTP_/, '') }
164
144
  else
165
145
  request_env_or_header_keys.map { |k| k.sub(/^HTTP_/, '') }
166
146
  end
@@ -14,11 +14,9 @@ module TCellAgent
14
14
  end
15
15
  end
16
16
 
17
- def self.calculateRouteId(method, path, params=nil)
18
- route_id = jhash("#{(method || "").downcase}|#{path}")
19
- if (route_id)
20
- route_id = route_id.to_s
21
- end
17
+ def self.calculate_route_id(method, path)
18
+ route_id = jhash("#{(method || '').downcase}|#{path}")
19
+ route_id = route_id.to_s if route_id
22
20
  route_id
23
21
  end
24
22
  end
@@ -1,17 +1,16 @@
1
1
  PhusionPassenger::LoaderSharedHelpers.class_eval do
2
-
3
2
  alias_method :tcell_after_loading_app_code, :after_loading_app_code
4
3
  def after_loading_app_code(options)
5
4
  tcell_after_loading_app_code(options)
6
5
 
7
- TCellAgent::Instrumentation.safe_block("Initial Passenger Instrumentation") do
6
+ TCellAgent::Instrumentation.safe_block('Initial Passenger Instrumentation') do
8
7
  # This runs in Passenger's AppPreloader (a process which is killed at some point)
9
8
  # but it's still a good place to do the initial instrumentation so it's only sent once.
10
9
  # Since this process doesn't receive any requests there is no need to run policy polling
11
10
  # but we still need the event processor to send the startup events
12
11
  original_policy_polling = TCellAgent.configuration.enable_policy_polling
13
12
  TCellAgent.configuration.enable_policy_polling = false
14
- TCellAgent.run_instrumentation("Passenger")
13
+ TCellAgent.run_instrumentation('Passenger')
15
14
  TCellAgent.configuration.enable_policy_polling = original_policy_polling
16
15
  end
17
16
  end
@@ -20,11 +19,10 @@ PhusionPassenger::LoaderSharedHelpers.class_eval do
20
19
  def before_handling_requests(forked, options)
21
20
  result_if_needed = tcell_before_handling_requests(forked, options)
22
21
 
23
- TCellAgent.run_instrumentation("Passenger", false)
22
+ TCellAgent.run_instrumentation('Passenger', false)
24
23
 
25
24
  result_if_needed
26
25
  end
27
-
28
26
  end
29
27
 
30
28
  # Passenger's parent process is known as the AppPreloader, the problem is this
@@ -32,10 +30,8 @@ end
32
30
  # This will give every child process its own event manager to avoid the dependency
33
31
  # on this disappearing process
34
32
  class << TCellAgent::Agent
35
-
36
- alias_method :tcell_is_parent_process?, :is_parent_process?
37
- def is_parent_process?
33
+ alias_method :tcell_parent_process?, :parent_process?
34
+ def parent_process?
38
35
  true
39
36
  end
40
-
41
37
  end
@@ -1,40 +1,21 @@
1
1
  if defined?(Puma.cli_config)
2
- unless Puma.cli_config.options[:preload_app]
3
- # this ensures instrumentation runs for preload_app = false.
4
- # Instrumentation will run for each worker but there's
5
- # nothing we can do about that (Unicorn's preload_app behaves the same way)
6
- Puma::Server.class_eval do
7
-
8
- alias_method :original_run, :run
9
- def run(background=true)
10
- TCellAgent.run_instrumentation("Puma Cluster Mode (Worker)")
11
-
12
- original_run(background)
13
- end
14
-
15
- end
16
-
17
-
18
- else
19
-
20
- if Puma.cli_config.options[:workers] == 0
2
+ if Puma.cli_config.options[:preload_app]
3
+ if Puma.cli_config.options[:workers] == 0 # rubocop:disable Style/NumericPredicate
21
4
  # Puma is running in single mode, so run both the initial instrumentation and
22
5
  # start the agent
23
6
  Puma::Runner.class_eval do
24
-
25
7
  alias_method :original_start_server, :start_server
26
8
  def start_server
27
- TCellAgent.run_instrumentation("Puma Single Mode")
9
+ TCellAgent.run_instrumentation('Puma Single Mode')
28
10
 
29
11
  original_start_server
30
12
  end
31
-
32
13
  end
33
14
 
34
15
  else
35
16
 
36
17
  # Runs initial instrumentation only once on the master process
37
- puma_server_starting = proc { TCellAgent.run_instrumentation("Puma Cluster Mode") }
18
+ puma_server_starting = proc { TCellAgent.run_instrumentation('Puma Cluster Mode') }
38
19
 
39
20
  # before_fork was added in Puma v2.13.0
40
21
  if Puma.cli_config.options[:before_fork]
@@ -46,11 +27,10 @@ if defined?(Puma.cli_config)
46
27
  # Each puma worker still needs the agent started but no need to run
47
28
  # initial instrumentation again
48
29
  Puma::Server.class_eval do
49
-
50
30
  alias_method :original_run, :run
51
- def run(background=true)
31
+ def run(background = true)
52
32
  begin
53
- TCellAgent.logger.debug("Instrumenting: Puma Cluster Mode (Worker)")
33
+ TCellAgent.logger.debug('Instrumenting: Puma Cluster Mode (Worker)')
54
34
  TCellAgent.thread_agent.start
55
35
  rescue StandardError => e
56
36
  TCellAgent.logger.error("Could not start thread agent. #{e.message}")
@@ -58,9 +38,20 @@ if defined?(Puma.cli_config)
58
38
 
59
39
  original_run(background)
60
40
  end
61
-
62
41
  end
63
42
  end
64
43
 
44
+ else
45
+ # this ensures instrumentation runs for preload_app = false.
46
+ # Instrumentation will run for each worker but there's
47
+ # nothing we can do about that (Unicorn's preload_app behaves the same way)
48
+ Puma::Server.class_eval do
49
+ alias_method :original_run, :run
50
+ def run(background = true)
51
+ TCellAgent.run_instrumentation('Puma Cluster Mode (Worker)')
52
+
53
+ original_run(background)
54
+ end
55
+ end
65
56
  end
66
57
  end
@@ -3,27 +3,23 @@
3
3
  # launched through Rack::Server interface
4
4
 
5
5
  Rails::Server.class_eval do
6
-
7
6
  alias_method :tcell_build_app, :build_app
8
7
  def build_app(app)
9
- require("tcell_agent/servers/unicorn") if defined?(Unicorn::HttpServer)
10
- require("tcell_agent/servers/webrick") if defined?(Rack::Handler::WEBrick)
11
- require("tcell_agent/servers/thin") if defined?(Thin::Server)
8
+ require('tcell_agent/servers/unicorn') if defined?(Unicorn::HttpServer)
9
+ require('tcell_agent/servers/webrick') if defined?(Rack::Handler::WEBrick)
10
+ require('tcell_agent/servers/thin') if defined?(Thin::Server)
12
11
 
13
12
  if defined?(Puma::Server)
14
13
  Puma::Server.class_eval do
15
-
16
14
  alias_method :original_run, :run
17
- def run(background=true)
18
- TCellAgent.run_instrumentation("Puma Single Mode")
15
+ def run(background = true)
16
+ TCellAgent.run_instrumentation('Puma Single Mode')
19
17
 
20
18
  original_run(background)
21
19
  end
22
-
23
20
  end
24
21
  end
25
22
 
26
23
  tcell_build_app(app)
27
24
  end
28
-
29
25
  end
@@ -1,11 +1,9 @@
1
- require("tcell_agent/servers/unicorn") if defined?(Unicorn::HttpServer)
1
+ require('tcell_agent/servers/unicorn') if defined?(Unicorn::HttpServer)
2
2
 
3
3
  Thin::Server.class_eval do
4
-
5
4
  alias_method :original_start, :start
6
5
  def start
7
- TCellAgent.run_instrumentation("Thin Server")
6
+ TCellAgent.run_instrumentation('Thin Server')
8
7
  original_start
9
8
  end
10
-
11
9
  end
@@ -1,10 +1,9 @@
1
1
  Unicorn::HttpServer.class_eval do
2
-
3
2
  # - This will be false when preload_app is false (even when unicorn is sent USR2 SIGNAL)
4
3
  # - This check also ensures that a server is running as opposed to a different command such
5
4
  # as `bundle exec rails runner User.count`.
6
5
  unless Unicorn::HttpServer::START_CTX && Unicorn::HttpServer::START_CTX[0]
7
- TCellAgent.run_instrumentation("Unicorn")
6
+ TCellAgent.run_instrumentation('Unicorn')
8
7
  end
9
8
 
10
9
  # this only runs when preload_app=true because when preload_app=false
@@ -12,7 +11,7 @@ Unicorn::HttpServer.class_eval do
12
11
  # the class definitions
13
12
  alias_method :tcell_bind_new_listeners!, :bind_new_listeners!
14
13
  def bind_new_listeners!
15
- TCellAgent.run_instrumentation("Unicorn")
14
+ TCellAgent.run_instrumentation('Unicorn')
16
15
 
17
16
  tcell_bind_new_listeners!
18
17
  end
@@ -24,15 +23,15 @@ Unicorn::HttpServer.class_eval do
24
23
  def load_config!
25
24
  tcell_load_config!
26
25
 
27
- TCellAgent::Instrumentation.safe_block("Reloading Tcell Config") do
26
+ TCellAgent::Instrumentation.safe_block('Reloading Tcell Config') do
28
27
  new_config = TCellAgent::Configuration.new
29
- TCellAgent.logger.debug("Reloading config")
28
+ TCellAgent.logger.debug('Reloading config')
30
29
  TCellAgent.logger.debug(
31
- "ENABLED:#{new_config.enabled}" +
32
- "|ENABLE_EVENT_MANAGER:#{new_config.enable_event_manager}" +
33
- "|ENABLE_EVENT_CONSUMER:#{new_config.enable_event_consumer}" +
34
- "|ENABLE_POLICY_POLLING:#{new_config.enable_policy_polling}" +
35
- "|ENABLE_INSTRUMENTATION:#{new_config.enable_instrumentation}" +
30
+ "ENABLED:#{new_config.enabled}" \
31
+ "|ENABLE_EVENT_MANAGER:#{new_config.enable_event_manager}" \
32
+ "|ENABLE_EVENT_CONSUMER:#{new_config.enable_event_consumer}" \
33
+ "|ENABLE_POLICY_POLLING:#{new_config.enable_policy_polling}" \
34
+ "|ENABLE_INSTRUMENTATION:#{new_config.enable_instrumentation}" \
36
35
  "|ENABLE_INTERCEPT_REQUESTS:#{new_config.enable_intercept_requests}"
37
36
  )
38
37
  old_config = TCellAgent.configuration
@@ -41,7 +40,7 @@ Unicorn::HttpServer.class_eval do
41
40
 
42
41
  if new_config.enabled ^ old_config.enabled
43
42
  if new_config.enabled
44
- TCellAgent.run_instrumentation("Unicorn")
43
+ TCellAgent.run_instrumentation('Unicorn')
45
44
 
46
45
  else
47
46
  TCellAgent.thread_agent.stop_event_processor
@@ -52,15 +51,13 @@ Unicorn::HttpServer.class_eval do
52
51
 
53
52
  if new_config.enable_event_manager ^ old_config.enable_event_manager
54
53
  if new_config.enable_event_manager
55
- TCellAgent.run_instrumentation("Unicorn Restart")
54
+ TCellAgent.run_instrumentation('Unicorn Restart')
56
55
  else
57
56
  TCellAgent.thread_agent.stop_event_processor
58
57
  end
59
- else
58
+ elsif new_config.enable_event_manager
60
59
  # Just in case
61
- if new_config.enable_event_manager
62
- TCellAgent.thread_agent.ensure_event_processor_running
63
- end
60
+ TCellAgent.thread_agent.ensure_event_processor_running
64
61
  end
65
62
 
66
63
  if new_config.enable_event_consumer ^ old_config.enable_event_consumer
@@ -69,11 +66,9 @@ Unicorn::HttpServer.class_eval do
69
66
  else
70
67
  TCellAgent.thread_agent.stop_metrics_event_thread
71
68
  end
72
- else
69
+ elsif new_config.enable_event_consumer
73
70
  # Just in case
74
- if new_config.enable_event_consumer
75
- TCellAgent.thread_agent.ensure_metrics_event_thread_running
76
- end
71
+ TCellAgent.thread_agent.ensure_metrics_event_thread_running
77
72
  end
78
73
 
79
74
  if new_config.enable_policy_polling ^ old_config.enable_policy_polling
@@ -82,11 +77,9 @@ Unicorn::HttpServer.class_eval do
82
77
  else
83
78
  TCellAgent.thread_agent.stop_policy_polling
84
79
  end
85
- else
80
+ elsif new_config.enable_policy_polling
86
81
  # Just in case
87
- if new_config.enable_policy_polling
88
- TCellAgent.thread_agent.ensure_policy_polling_running
89
- end
82
+ TCellAgent.thread_agent.ensure_policy_polling_running
90
83
  end
91
84
  end
92
85
  end
@@ -94,7 +87,7 @@ Unicorn::HttpServer.class_eval do
94
87
  # this only runs when preload_app=true because when preload_app=false
95
88
  # the gems aren't loaded early enough for tcell to override
96
89
  # the class definitions
97
- alias tcell_init_worker_process init_worker_process
90
+ alias_method :tcell_init_worker_process, :init_worker_process
98
91
  def init_worker_process(work)
99
92
  start_process = tcell_init_worker_process(work)
100
93
 
@@ -103,7 +96,6 @@ Unicorn::HttpServer.class_eval do
103
96
  TCellAgent.thread_agent.policy_polling_worker_mutex = Mutex.new
104
97
  TCellAgent.thread_agent.policy_polling_thread = nil
105
98
  TCellAgent.thread_agent.start
106
-
107
99
  rescue StandardError => e
108
100
  TCellAgent.logger.error("Could not start thread agent. #{e.message}")
109
101
  end
@@ -111,5 +103,4 @@ Unicorn::HttpServer.class_eval do
111
103
 
112
104
  start_process
113
105
  end
114
-
115
106
  end