tcell_agent 1.1.3 → 1.1.4

Sign up to get free protection for your applications and to get access to all the features.
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
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 9d0b4e34b740cbb9f4e3a004dc99b77a01b09a53
4
- data.tar.gz: d3522bcd25ca86a2d3cd65e238b580d4a253f6e5
3
+ metadata.gz: 1fee1b53b8297dddbb44b9f4ae21b6371f61b138
4
+ data.tar.gz: a78a2255a86ff92852a058b58699acd5537c13e1
5
5
  SHA512:
6
- metadata.gz: 8c539fcef0eb17c3cbf0f39ae61f54e01843ed197dfc1b65fb813d78387cae444a7c285d2b77cab639a4c845b19798419acd7463e662529fd912282abc29638c
7
- data.tar.gz: 33c45e6e14e5cda851e4b3853ab5091322b7aa86be6fe4ba5f552701d4bd8d1289ba26cb4903fb871c8f1b0fcdb2bee887f720e67248a17bdae536b3dc916df7
6
+ metadata.gz: 23478b101ec414872fb96958c4de2208ad099d898513636e50c5ff22b18ff660b4d73068e0ebfc405a9512c56426ef4d189753f03280c6e1d80d541ff0fd1476
7
+ data.tar.gz: ea0ce97ae0cbf568cace44c6cfed0a39de4954bec81d0e5e2f012c0a7f710de4ddf19226024d36bac23c00bffdba93b9a64a2d54a69ec62355c5c8a8be37b903
@@ -227,9 +227,17 @@ elsif command == 'test'
227
227
  end
228
228
  puts 'passed'
229
229
 
230
- printf '%-50s', 'Application has api_key and app_id... '
230
+ printf '%-50s', 'Application has app_id... '
231
231
  tcell_application = config_hash.fetch('applications')[0]
232
- if !tcell_application.key?('app_id') || !tcell_application.key?('api_key')
232
+ if !tcell_application.key?('app_id') && !ENV['TCELL_AGENT_APP_ID']
233
+ puts 'failed'
234
+ Kernel.exit(1)
235
+ end
236
+ puts 'passed'
237
+
238
+ printf '%-50s', 'Application has api_key... '
239
+ tcell_application = config_hash.fetch('applications')[0]
240
+ if !tcell_application.key?('api_key') && !ENV['TCELL_AGENT_API_KEY']
233
241
  puts 'failed'
234
242
  Kernel.exit(1)
235
243
  end
@@ -1,8 +1,8 @@
1
1
  # See the file "LICENSE" for the full license governing this code.
2
2
 
3
- require "tcell_agent/utils/passwords"
4
- require "tcell_agent/utils/strings"
5
- require "tcell_agent/utils/io"
3
+ require 'tcell_agent/utils/passwords'
4
+ require 'tcell_agent/utils/strings'
5
+ require 'tcell_agent/utils/io'
6
6
  require 'tcell_agent/logger'
7
7
  require 'tcell_agent/configuration'
8
8
 
@@ -1,21 +1,21 @@
1
1
  # See the file "LICENSE" for the full license governing this code.
2
2
 
3
- require "tcell_agent/logger"
4
- require "tcell_agent/version"
5
- require "tcell_agent/api"
6
- require "tcell_agent/configuration"
3
+ require 'tcell_agent/logger'
4
+ require 'tcell_agent/version'
5
+ require 'tcell_agent/api'
6
+ require 'tcell_agent/configuration'
7
7
 
8
- require "tcell_agent/sensor_events/server_agent"
9
- require "tcell_agent/utils/queue_with_timeout"
8
+ require 'tcell_agent/sensor_events/server_agent'
9
+ require 'tcell_agent/utils/queue_with_timeout'
10
10
 
11
- require "tcell_agent/agent/event_processor"
12
- require "tcell_agent/agent/policy_manager"
13
- require "tcell_agent/agent/static_agent"
14
- require "tcell_agent/agent/policy_types"
15
- require "tcell_agent/agent/route_manager"
16
- require "tcell_agent/agent/fork_pipe_manager"
11
+ require 'tcell_agent/agent/event_processor'
12
+ require 'tcell_agent/agent/policy_manager'
13
+ require 'tcell_agent/agent/static_agent'
14
+ require 'tcell_agent/agent/policy_types'
15
+ require 'tcell_agent/agent/route_manager'
16
+ require 'tcell_agent/agent/fork_pipe_manager'
17
17
 
18
- require "tcell_agent/routes/table"
18
+ require 'tcell_agent/routes/table'
19
19
 
20
20
  require 'net/http'
21
21
  require 'thread'
@@ -25,9 +25,8 @@ require 'monitor'
25
25
 
26
26
  module TCellAgent
27
27
  class Agent
28
-
29
28
  attr_accessor :start_pid
30
- attr_accessor :eventQueue
29
+ attr_accessor :event_queue
31
30
 
32
31
  attr_accessor :fork_event_queue
33
32
  attr_accessor :fork_event_thread
@@ -49,53 +48,46 @@ module TCellAgent
49
48
  attr_accessor :policy_polling_thread
50
49
  attr_accessor :policy_polling_worker_mutex
51
50
 
52
-
53
51
  attr_accessor :event_queue_monitor
54
52
  attr_accessor :event_dispatch_monitor
55
53
 
56
54
  attr_accessor :stop_agent
57
55
  attr_accessor :complete_policy_cache
58
56
 
59
-
60
- def initialize(start_pid=Process.pid)
57
+ def initialize(start_pid = Process.pid)
61
58
  @start_pid = start_pid
62
- @dispatchEventsTimeout = TCellAgent.configuration.event_time_limit_seconds || 55
63
- @dispatchEventsLimit = TCellAgent.configuration.event_batch_size_limit || 20
59
+ @dispatch_events_timeout = TCellAgent.configuration.event_time_limit_seconds || 55
60
+ @dispatch_events_limit = TCellAgent.configuration.event_batch_size_limit || 20
64
61
  @worker_mutex = Mutex.new
65
62
  @policy_polling_worker_mutex = Mutex.new
66
63
  @@policy_tapi = TCellApi.new
67
64
 
68
65
  # Agent request thread
69
66
  @policies = {
70
- TCellAgent::PolicyTypes::Rust => TCellAgent::Policies::RustPolicies.new
67
+ TCellAgent::PolicyTypes::RUST => TCellAgent::Policies::RustPolicies.new
71
68
  }
72
69
  @lock = Monitor.new
73
70
 
74
- self.initialize_processor_variables
71
+ initialize_processor_variables
75
72
 
76
- if TCellAgent.configuration.preload_policy_filename != nil
77
- TCellAgent.logger.info("Preloading a policy file")
73
+ if TCellAgent.configuration.preload_policy_filename
74
+ TCellAgent.logger.info('Preloading a policy file')
78
75
  begin
79
76
  policy_file = File.open(TCellAgent.configuration.preload_policy_filename).read
80
77
  policy_jsons = JSON.parse(policy_file)
81
- if policy_jsons.key?("result")
82
- policy_jsons = policy_jsons["result"]
83
- end
84
- processPolicyJson(policy_jsons, false)
78
+ policy_jsons = policy_jsons['result'] if policy_jsons.key?('result')
79
+ process_policy_json(policy_jsons, false)
85
80
  rescue StandardError => e
86
81
  TCellAgent.logger.error(e.message)
87
82
  end
88
83
  end
89
84
  cached_policies = policies_from_cachefile
90
- if (cached_policies)
91
- processPolicyJson(cached_policies, false)
92
- end
85
+ process_policy_json(cached_policies, false) if cached_policies
93
86
  end
94
87
 
95
88
  def initialize_processor_variables
96
89
  @complete_policy_cache = {}
97
90
 
98
- @metricsLock = Monitor.new
99
91
  @stop_agent = false
100
92
  @route_table = TCellAgent::Routes::RouteTable.new
101
93
 
@@ -103,43 +95,41 @@ module TCellAgent
103
95
  @event_dispatch_monitor = Monitor.new
104
96
  @mutex = Monitor.new
105
97
 
106
-
107
98
  @response_time_table = {}
108
99
  @sessions_metrics = TCellAgent::SensorEvents::SessionsMetric.new
109
100
  @sessions_metrics_mutex = Monitor.new
110
101
 
111
- @dispatchEvents = []
112
- @eventQueue = BoundedQueue.new(200)
102
+ @dispatch_events = []
103
+ @event_queue = BoundedQueue.new(200)
113
104
 
114
- @fork_event_queue=Queue.new
115
- @fork_event_thread_mutex=Monitor.new
105
+ @fork_event_queue = Queue.new
106
+ @fork_event_thread_mutex = Monitor.new
116
107
 
117
- @metrics_event_queue=Queue.new
118
- @metrics_event_thread_mutex=Monitor.new
108
+ @metrics_event_queue = Queue.new
109
+ @metrics_event_thread_mutex = Monitor.new
119
110
  end
120
111
 
121
- def is_parent_process?
112
+ def parent_process?
122
113
  @start_pid == Process.pid
123
114
  end
124
115
 
125
116
  def start
126
- if (TCellAgent::Utils::Strings.blank?(TCellAgent.configuration.api_key) ||
127
- TCellAgent::Utils::Strings.blank?(TCellAgent.configuration.app_id))
128
- puts " ********* ********* ********* *********"
129
- puts "* tCell.io *"
130
- puts "* Configuration info is missing, you may *"
131
- puts "* need to download config file and place *"
132
- puts "* it in the config/ directory *"
133
- puts " ********* ********* ********* *********"
117
+ if TCellAgent::Utils::Strings.blank?(TCellAgent.configuration.api_key) ||
118
+ TCellAgent::Utils::Strings.blank?(TCellAgent.configuration.app_id)
119
+ puts ' ********* ********* ********* *********'
120
+ puts '* tCell.io *'
121
+ puts '* Configuration info is missing, you may *'
122
+ puts '* need to download config file and place *'
123
+ puts '* it in the config/ directory *'
124
+ puts ' ********* ********* ********* *********'
134
125
  TCellAgent.configuration.enabled = false
135
126
  return
136
127
  end
137
128
 
138
- TCellAgent.logger.debug("Starting thread agent")
129
+ TCellAgent.logger.debug('Starting thread agent')
139
130
 
140
- self.ensure_policy_polling_running
141
- self.ensure_event_processor_running
131
+ ensure_policy_polling_running
132
+ ensure_event_processor_running
142
133
  end
143
-
144
134
  end
145
135
  end
@@ -1,37 +1,33 @@
1
- # encoding: utf-8
2
-
3
1
  # See the file "LICENSE" for the full license governing this code.
4
2
 
5
- require "tcell_agent/logger"
6
- require "tcell_agent/version"
7
- require "tcell_agent/api"
8
- require "tcell_agent/configuration"
3
+ require 'tcell_agent/logger'
4
+ require 'tcell_agent/version'
5
+ require 'tcell_agent/api'
6
+ require 'tcell_agent/configuration'
9
7
 
10
- require "tcell_agent/policies/http_tx_policy"
11
- require "tcell_agent/policies/http_redirect_policy"
8
+ require 'tcell_agent/policies/http_tx_policy'
9
+ require 'tcell_agent/policies/http_redirect_policy'
12
10
 
13
- require "tcell_agent/sensor_events/server_agent"
14
- require "tcell_agent/sensor_events/metrics"
11
+ require 'tcell_agent/sensor_events/server_agent'
12
+ require 'tcell_agent/sensor_events/metrics'
15
13
 
16
- require "tcell_agent/utils/queue_with_timeout"
14
+ require 'tcell_agent/utils/queue_with_timeout'
17
15
 
18
- require "tcell_agent/agent/fork_pipe_manager"
19
- require "tcell_agent/agent/static_agent"
16
+ require 'tcell_agent/agent/fork_pipe_manager'
17
+ require 'tcell_agent/agent/static_agent'
20
18
 
21
19
  require 'net/http'
22
20
  require 'thread'
23
21
  require 'logger'
24
22
  require 'json'
25
23
 
26
-
27
24
  module TCellAgent
28
- class Agent
29
-
25
+ class Agent # rubocop:disable Metrics/ClassLength
30
26
  # cmdi events are special because they can be triggered very easily by running any shell command.
31
27
  # Startup scripts are likely to run shell commands. It's not a good idea to startup the event
32
28
  # processor before worker processses are forked, so the safest thing to do is let a different
33
29
  # event start the event processor to avoid deadlocking worker processes.
34
- def safe_to_send_cmdi_events?()
30
+ def safe_to_send_cmdi_events?
35
31
  event_processor_running?
36
32
  end
37
33
 
@@ -40,71 +36,63 @@ module TCellAgent
40
36
  return if TCellAgent.configuration.should_start_event_manager? == false
41
37
  @worker_mutex.synchronize do
42
38
  return if event_processor_running?
43
- if self.is_parent_process? == false
44
- self.initialize_processor_variables
45
- end
39
+ initialize_processor_variables if parent_process? == false
46
40
  start_event_processor
47
41
  end
48
42
  end
49
43
 
50
44
  def event_processor_running?
51
- if TCellAgent::Agent.is_parent_process? == false
52
- return true
53
- end
45
+ return true if TCellAgent::Agent.parent_process? == false
54
46
  @event_processor_thread && @event_processor_thread.alive?
55
47
  end
56
48
 
57
49
  def stop_event_processor
58
- TCellAgent.logger.debug("Stopping event processor thread")
59
- if @event_processor_thread && @event_processor_thread.alive?
60
- @event_processor_thread.exit
61
- end
50
+ TCellAgent.logger.debug('Stopping event processor thread')
51
+ @event_processor_thread.exit if @event_processor_thread && @event_processor_thread.alive?
62
52
  end
63
53
 
64
54
  def send_dispatch_events(tapi)
65
- events_to_send = []
66
- @event_dispatch_monitor.synchronize {
67
- events_to_send = @dispatchEvents
68
- @dispatchEvents = []
69
- }
70
- if (@response_time_table.size > 0)
71
- metrics_event = TCellAgent::SensorEvents::MetricsEvent.new
72
- metrics_event.set_route_count_table(@response_time_table)
73
- events_to_send.push( metrics_event )
74
- @mutex.synchronize do
75
- @response_time_table = {}
76
- end
77
- end
78
- if @sessions_metrics.has_sessions?
79
- sessions_to_send = []
80
- @sessions_metrics_mutex.synchronize do
81
- sessions_to_send = @sessions_metrics
82
- @sessions_metrics = TCellAgent::SensorEvents::SessionsMetric.new
83
- end
84
- events_to_send.push( sessions_to_send )
55
+ events_to_send = []
56
+ @event_dispatch_monitor.synchronize do
57
+ events_to_send = @dispatch_events
58
+ @dispatch_events = []
59
+ end
60
+
61
+ unless @response_time_table.empty?
62
+ metrics_event = TCellAgent::SensorEvents::MetricsEvent.new
63
+ metrics_event.set_route_count_table(@response_time_table)
64
+ events_to_send.push(metrics_event)
65
+ @mutex.synchronize do
66
+ @response_time_table = {}
85
67
  end
86
- success = tapi.send_event_set(events_to_send)
87
- if ( success == false )
88
- ensured_events = events_to_send.find_all{|item| item.ensure == true }
89
- @event_dispatch_monitor.synchronize {
90
- @dispatchEvents.push(*ensured_events)
91
- }
68
+ end
69
+
70
+ if @sessions_metrics.sessions?
71
+ sessions_to_send = []
72
+ @sessions_metrics_mutex.synchronize do
73
+ sessions_to_send = @sessions_metrics
74
+ @sessions_metrics = TCellAgent::SensorEvents::SessionsMetric.new
92
75
  end
93
- end
76
+ events_to_send.push(sessions_to_send)
77
+ end
78
+
79
+ return if tapi.send_event_set(events_to_send)
94
80
 
81
+ ensured_events = events_to_send.find_all { |item| item.ensure == true }
82
+ @event_dispatch_monitor.synchronize do
83
+ @dispatch_events.push(*ensured_events)
84
+ end
85
+ end
95
86
 
96
- def start_event_processor(send_empties=true)
87
+ def start_event_processor(send_empties = true)
97
88
  return if TCellAgent.configuration.should_start_event_manager? == false
98
89
 
99
- if TCellAgent::Agent.is_parent_process? == false
100
- return
101
- end
90
+ return if TCellAgent::Agent.parent_process? == false
102
91
 
103
- TCellAgent.logger.debug("Starting event processor thread")
92
+ TCellAgent.logger.debug('Starting event processor thread')
104
93
  @events_send_empties = send_empties
105
94
  Thread.abort_on_exception = true
106
95
  @event_processor_thread = Thread.new do
107
-
108
96
  begin
109
97
  tapi = TCellApi.new
110
98
 
@@ -113,30 +101,32 @@ module TCellAgent
113
101
  begin
114
102
  begin
115
103
  now = Time.now
116
- wait_for = @dispatchEventsTimeout - (now - last_run_time).to_i.abs
117
- event = @eventQueue.pop([wait_for, 1].max)
118
- if event == nil
119
- if (@events_send_empties || @dispatchEvents.length > 0)
104
+ wait_for = @dispatch_events_timeout - (now - last_run_time).to_i.abs
105
+ event = @event_queue.pop([wait_for, 1].max)
106
+ if event.nil?
107
+ if @events_send_empties || !@dispatch_events.empty?
120
108
  last_run_time = Time.now
121
- self.send_dispatch_events(tapi)
109
+ send_dispatch_events(tapi)
122
110
  end
123
111
  else
124
112
  event.post_process
125
113
  if event.send == true
126
- @event_dispatch_monitor.synchronize {
127
- @dispatchEvents.push(event)
128
- }
114
+ @event_dispatch_monitor.synchronize do
115
+ @dispatch_events.push(event)
116
+ end
129
117
  end
130
- if (event.flush || @dispatchEvents.length >= @dispatchEventsLimit || wait_for < 0)
118
+ if event.flush || @dispatch_events.length >= @dispatch_events_limit || wait_for < 0
131
119
  last_run_time = Time.now
132
- self.send_dispatch_events(tapi)
120
+ send_dispatch_events(tapi)
133
121
  end
134
122
  end
135
- rescue ThreadError
123
+ rescue ThreadError => te
124
+ TCellAgent.logger.error("ThreadError while processing events: #{te.message}")
125
+ TCellAgent.logger.debug(te.backtrace)
136
126
  last_run_time = Time.now
137
- @event_dispatch_monitor.synchronize {
138
- @dispatchEvents = []
139
- }
127
+ @event_dispatch_monitor.synchronize do
128
+ @dispatch_events = []
129
+ end
140
130
  end
141
131
  rescue TCellAgent::ConfigurationException
142
132
  Thread.exit
@@ -144,18 +134,16 @@ module TCellAgent
144
134
  last_run_time = Time.now
145
135
  TCellAgent.logger.error("Exception while processing events: #{e.message}")
146
136
  TCellAgent.logger.debug(e.backtrace)
147
- @event_dispatch_monitor.synchronize {
148
- @dispatchEvents = []
149
- }
137
+ @event_dispatch_monitor.synchronize do
138
+ @dispatch_events = []
139
+ end
150
140
  end
151
141
  end
152
142
  rescue StandardError => xyz
153
143
  TCellAgent.logger.error("Exception while starting processor: #{xyz.message}")
154
144
  TCellAgent.logger.debug(xyz.backtrace)
155
145
  end
156
-
157
146
  end
158
-
159
147
  end
160
148
 
161
149
  def ensure_fork_event_thread_running
@@ -167,46 +155,38 @@ module TCellAgent
167
155
  end
168
156
 
169
157
  def event_fork_thread_running?
170
- if TCellAgent::Agent.is_parent_process?
171
- return true
172
- end
158
+ return true if TCellAgent::Agent.parent_process?
173
159
  @fork_event_thread && @fork_event_thread.alive?
174
160
  end
175
161
 
176
162
  def start_fork_event_thread
177
163
  @fork_event_thread = Thread.new do
178
- begin
179
- loop do
180
- begin
181
- event = @fork_event_queue.pop
182
- if event.send == false
183
- event.post_process
184
- else
185
- TCellAgent::Agent.send_to_event_pipe(event)
186
- end
187
- rescue StandardError => e
188
- TCellAgent.logger.error("Exception while processing (forked) events: #{e.message}")
189
- TCellAgent.logger.debug(e.backtrace)
164
+ loop do
165
+ begin
166
+ event = @fork_event_queue.pop
167
+ if event.send
168
+ TCellAgent::Agent.send_to_event_pipe(event)
169
+ else
170
+ event.post_process
190
171
  end
172
+ rescue StandardError => e
173
+ TCellAgent.logger.error("Exception while processing (forked) events: #{e.message}")
174
+ TCellAgent.logger.debug(e.backtrace)
191
175
  end
192
- rescue StandardError => e
193
- TCellAgent.logger.error("Exception while running (forked) events: #{e.message}")
194
- TCellAgent.logger.debug(e.backtrace)
195
176
  end
196
177
  end
197
178
  end
198
179
 
199
180
  def queue_forked_event(event)
200
- begin
201
- self.ensure_fork_event_thread_running
202
- if (@fork_event_queue.length() > 100)
203
- TCellAgent.logger.debug("Dropping (forked) event because queue full")
204
- return
205
- end
206
- @fork_event_queue.push(event)
207
- rescue StandardError => queue_exception
208
- TCellAgent.logger.debug("Could not add (forked) event #{queue_exception.message}")
181
+ ensure_fork_event_thread_running
182
+ if @fork_event_queue.length > 100
183
+ TCellAgent.logger.debug('Dropping (forked) event because queue full')
184
+ return
209
185
  end
186
+ @fork_event_queue.push(event)
187
+ rescue StandardError => queue_exception
188
+ TCellAgent.logger.debug("Could not add (forked) event #{queue_exception.message}")
189
+ TCellAgent.logger.debug(queue_exception.backtrace)
210
190
  end
211
191
 
212
192
  def ensure_metrics_event_thread_running
@@ -218,17 +198,13 @@ module TCellAgent
218
198
  end
219
199
 
220
200
  def event_metrics_thread_running?
221
- if TCellAgent::Agent.is_parent_process?
222
- return true
223
- end
201
+ return true if TCellAgent::Agent.parent_process?
224
202
  @metrics_event_thread && @metrics_event_thread.alive?
225
203
  end
226
204
 
227
205
  def stop_metrics_event_thread
228
- TCellAgent.logger.debug("Stopping metrics event thread")
229
- if @metrics_event_thread && @metrics_event_thread.alive?
230
- @metrics_event_thread.exit
231
- end
206
+ TCellAgent.logger.debug('Stopping metrics event thread')
207
+ @metrics_event_thread.exit if @metrics_event_thread && @metrics_event_thread.alive?
232
208
  end
233
209
 
234
210
  def start_metrics_event_thread
@@ -247,54 +223,50 @@ module TCellAgent
247
223
  end
248
224
 
249
225
  def _queue_metric(event)
250
- return if TCellAgent.configuration.should_consume_event? == false
226
+ return unless TCellAgent.configuration.should_consume_event?
227
+
251
228
  begin
252
- self.ensure_metrics_event_thread_running
253
- if (@metrics_event_queue.length() > 100)
254
- TCellAgent.logger.debug("Dropping (forked) metric because queue full")
229
+ ensure_metrics_event_thread_running
230
+ if @metrics_event_queue.length > 100
231
+ TCellAgent.logger.debug('Dropping (forked) metric because queue full')
255
232
  return
256
233
  end
257
234
  @metrics_event_queue.push(event)
258
235
  rescue StandardError => queue_exception
259
236
  TCellAgent.logger.debug("Could not add (forked) metric #{queue_exception.message}")
237
+ TCellAgent.logger.debug(queue_exception.backtrace)
260
238
  end
261
239
  end
262
240
 
263
- def queueSensorEvent(event)
264
- return if TCellAgent.configuration.should_consume_event? == false
265
- begin
266
- if TCellAgent::Agent.is_parent_process? == false
267
- self.queue_forked_event(event)
268
- return
269
- end
241
+ def queue_sensor_event(event)
242
+ return unless TCellAgent.configuration.should_consume_event?
270
243
 
271
- begin
272
- self.ensure_event_processor_running
273
- @event_queue_monitor.synchronize {
274
- @eventQueue.push(event, 10)
275
- }
244
+ if TCellAgent::Agent.parent_process? == false
245
+ queue_forked_event(event)
246
+ return
247
+ end
276
248
 
277
- rescue RuntimeError
278
- TCellAgent.logger.debug("Dropping event because queue full")
249
+ begin
250
+ ensure_event_processor_running
251
+ @event_queue_monitor.synchronize do
252
+ @event_queue.push(event, 10)
279
253
  end
280
-
281
254
  rescue StandardError => queue_exception
282
- TCellAgent.logger.debug("Could not add event #{queue_exception.message}")
255
+ TCellAgent.logger.debug("Dropping event because queue full #{queue_exception.message}")
256
+ TCellAgent.logger.debug(queue_exception.backtrace)
283
257
  end
284
258
  end
285
259
 
286
260
  def increment_session_info(hmac_session_id, user_id, ip_address, user_agent)
287
-
288
- TCellAgent::Instrumentation.safe_block("Incrementing session info") do
289
-
290
- if TCellAgent::Agent.is_parent_process? == false
291
- TCellAgent.queue_metric({
292
- "_type"=>"increment_session_info",
293
- "hmac_session_id" => hmac_session_id,
294
- "user_id" => user_id,
295
- "ip_address" => ip_address,
296
- "user_agent" => user_agent
297
- })
261
+ TCellAgent::Instrumentation.safe_block('Incrementing session info') do
262
+ if TCellAgent::Agent.parent_process? == false
263
+ TCellAgent.queue_metric(
264
+ '_type' => 'increment_session_info',
265
+ 'hmac_session_id' => hmac_session_id,
266
+ 'user_id' => user_id,
267
+ 'ip_address' => ip_address,
268
+ 'user_agent' => user_agent
269
+ )
298
270
  return
299
271
  end
300
272
 
@@ -309,29 +281,24 @@ module TCellAgent
309
281
  end
310
282
 
311
283
  def increment_route(route_id, response_time)
312
- TCellAgent::Instrumentation.safe_block("Incrementing route") do
313
-
314
- if TCellAgent::Agent.is_parent_process? == false
315
- TCellAgent.queue_metric({
316
- "_type"=>"increment_route",
317
- "route_id"=>route_id,
318
- "response_time"=>response_time
319
- })
284
+ TCellAgent::Instrumentation.safe_block('Incrementing route') do
285
+ if TCellAgent::Agent.parent_process? == false
286
+ TCellAgent.queue_metric(
287
+ '_type' => 'increment_route',
288
+ 'route_id' => route_id,
289
+ 'response_time' => response_time
290
+ )
320
291
  return
321
292
  end
322
293
  @mutex.synchronize do
323
- if (route_id == nil || route_id == "")
324
- route_id = "?"
325
- end
326
- @response_time_table[route_id] = @response_time_table.fetch(route_id,{})
327
- @response_time_table[route_id]["c"] = @response_time_table[route_id].fetch("c",0) + 1
328
- @response_time_table[route_id]["mx"] = [@response_time_table[route_id].fetch("mx",0), response_time].max
329
- @response_time_table[route_id]["mn"] = [@response_time_table[route_id].fetch("mn",response_time), response_time].min
330
- @response_time_table[route_id]["t"] = ((@response_time_table[route_id].fetch("t",0)*(@response_time_table[route_id]["c"]-1)) + response_time) / @response_time_table[route_id]["c"]
294
+ route_id = '?' if route_id.nil? || route_id == ''
295
+ @response_time_table[route_id] = @response_time_table.fetch(route_id, {})
296
+ @response_time_table[route_id]['c'] = @response_time_table[route_id].fetch('c', 0) + 1
297
+ @response_time_table[route_id]['mx'] = [@response_time_table[route_id].fetch('mx', 0), response_time].max
298
+ @response_time_table[route_id]['mn'] = [@response_time_table[route_id].fetch('mn', response_time), response_time].min
299
+ @response_time_table[route_id]['t'] = ((@response_time_table[route_id].fetch('t', 0) * (@response_time_table[route_id]['c'] - 1)) + response_time) / @response_time_table[route_id]['c']
331
300
  end
332
-
333
301
  end
334
302
  end
335
-
336
303
  end
337
304
  end