rorvswild 1.5.17 → 1.6.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 6ce241e0d917e560c8a5683bdc210dbd4f5158cd7bf49444ced9548d85b61e5e
4
- data.tar.gz: b354848c0048368c615e4c2dd5231864a164c127af0aaf590fbfcd5c2a1cb36c
3
+ metadata.gz: f0d7eae69ceb93804c2297b8fb97a400e09d183eeeb46ac879dc02873ba7f5b0
4
+ data.tar.gz: 0bfe3e2d48fcecd010eeb399ad896d6e4e519073aa6ae0fc160ebcb9e1cf554c
5
5
  SHA512:
6
- metadata.gz: fc3e48e9328b450bfb3cb7e7e4536e249470bcf7cb1fd2b3c7f67416daa66e1c281e742446a97f868276ac3028a573a84247b80b7f3053fbaeb9f9dfe4209c57
7
- data.tar.gz: eab70d88fd705bdd5d679b625a9b6e06b6612cff6eaa6dc5080d6cd80a38f6f28e1a198f475b683cecdb25be7ac98d54a67eecfb8ee8cea230d987248e846823
6
+ metadata.gz: 5bf001a094bfa234414b8247c18d57159b734f1a829ef62997cdf66b7265fdc40e9cdad0530ecac8bc108459b202930487f0cad30b610cc4ebd7b00326ef17af
7
+ data.tar.gz: 25ace108524d491befd74c9682c92f2a95e17c4ee4b8e11174143bb29425685074d81923f4cf981e0f0dc313ab7c493731206037d6036d2d74ff633411519ffd
data/README.md CHANGED
@@ -218,30 +218,71 @@ In the case you want a custom logger such as Syslog, you can only do it by initi
218
218
  RorVsWild.start(api_key: "API_KEY", logger: Logger::Syslog.new)
219
219
  ```
220
220
 
221
- #### Server metrics monitoring
221
+ ### Deployment tracking
222
222
 
223
- We are adding server metrics as a beta feature.
224
- It monitors load average, CPU, memory, swap and disk space.
225
- For now, only Linux is supported.
226
- It has to be explicitly enabled with a feature flag :
223
+ Since version 1.6.0, RorVsWild compares performances between each deployment.
224
+ That is convenient to detect quickly a performance deterioration.
225
+
226
+ It is working without any actions from your part if the application is :
227
+
228
+ - Deployed via Capistrano
229
+ - Inside a Git repositoriy
230
+ - Hosted on Heroku if [Dyno metadata](https://devcenter.heroku.com/articles/dyno-metadata) is enabled
231
+ - Hosted on Scalingo
232
+
233
+ Because we are not aware of all cloud hosting providers, there is a generic method to provide these data via the configuration :
227
234
 
228
235
  ```yaml
229
236
  # config/rorvswild.yml
230
237
  production:
231
238
  api_key: API_KEY
232
- features:
233
- - server_metrics
239
+ deployment:
240
+ revision: <%= "Anything that will return the deployment version" %> # Mandatory
241
+ description: <%= "Eventually if you have a description such as a Git message" %>
242
+ author: <%= "Author's name of the deployment" %>
243
+ email: <%= "emailOf@theAuthor.com" %>
234
244
  ```
235
245
 
236
246
  Here is the equivalent if you prefer initialising RorVsWild manually :
237
247
 
238
248
  ```ruby
239
249
  # config/initializers/rorvswild.rb
240
- RorVsWild.start(api_key: "API_KEY", features: ["server_metrics"])
250
+ RorVsWild.start(api_key: "API_KEY", deployment: {
251
+ revision: "Unique version number such as Git commit ID",
252
+ description: "Message such as in Git",
253
+ author: "Deployer's name",
254
+ email: "Deployer's email"
255
+ })
241
256
  ```
242
257
 
258
+ Only the revision is mandatory, but it's better if you are able to provide more information.
259
+
260
+
261
+ #### Server metrics monitoring
262
+
263
+ Since version 1.6.0 RorVsWild monitors server metrics such as load average, CPU, memory, swap and disk space.
264
+ For now, only Linux is supported.
243
265
  The data are available in a server tab beside requests and jobs.
244
266
 
267
+ Metrics are grouped by hostnames.
268
+ Cloud providers give random hostnames which change on every deployment.
269
+ You can manually define them:
270
+
271
+ ```yaml
272
+ # config/rorvswild.yml
273
+ production:
274
+ api_key: API_KEY
275
+ server:
276
+ name: <%= "Some code that return a relevant hostname" %>
277
+ ```
278
+
279
+ Here is the equivalent if you prefer initialising RorVsWild manually :
280
+
281
+ ```ruby
282
+ # config/initializers/rorvswild.rb
283
+ RorVsWild.start(api_key: "API_KEY", server: {name: "host.name"})
284
+ ```
285
+
245
286
  ## Contributing
246
287
 
247
288
  1. Fork it ( https://github.com/[my-github-username]/rorvswild/fork )
@@ -30,16 +30,18 @@ module RorVsWild
30
30
  @client = Client.new(@config)
31
31
  @queue = config[:queue] || Queue.new(client)
32
32
  @locator = RorVsWild::Locator.new
33
+ Host.load_config(config)
34
+ Deployment.load_config(config)
33
35
 
34
36
  RorVsWild.logger.debug("Start RorVsWild #{RorVsWild::VERSION}")
35
37
  setup_plugins
36
38
  cleanup_data
39
+ send_deployment
37
40
  end
38
41
 
39
42
  def load_features
40
43
  features = config[:features] || []
41
- features.include?("server_metrics")
42
- require "rorvswild/metrics" if features.include?("server_metrics")
44
+ RorVsWild.logger.info("Server metrics are now monitored enabled by default") if features.include?("server_metrics")
43
45
  end
44
46
 
45
47
  def setup_plugins
@@ -85,7 +87,7 @@ module RorVsWild
85
87
  raise
86
88
  ensure
87
89
  current_data[:runtime] = RorVsWild.clock_milliseconds - current_data[:started_at]
88
- post_job
90
+ queue_job
89
91
  end
90
92
  end
91
93
 
@@ -96,7 +98,7 @@ module RorVsWild
96
98
  def stop_request
97
99
  return unless current_data
98
100
  current_data[:runtime] = RorVsWild.clock_milliseconds - current_data[:started_at]
99
- post_request
101
+ queue_request
100
102
  end
101
103
 
102
104
  def catch_error(extra_details = nil, &block)
@@ -109,7 +111,7 @@ module RorVsWild
109
111
  end
110
112
 
111
113
  def record_error(exception, extra_details = nil)
112
- post_error(exception_to_hash(exception, extra_details))
114
+ send_error(exception_to_hash(exception, extra_details))
113
115
  end
114
116
 
115
117
  def push_exception(exception, options = nil)
@@ -153,21 +155,8 @@ module RorVsWild
153
155
  config[:ignore_jobs].include?(name)
154
156
  end
155
157
 
156
- def os_description
157
- @os_description ||= `uname -sr`
158
- rescue Exception => ex
159
- @os_description = RbConfig::CONFIG["host_os"]
160
- end
161
-
162
- def hostname
163
- if gae_instance = ENV["GAE_INSTANCE"] || ENV["CLOUD_RUN_EXECUTION"]
164
- gae_instance
165
- elsif dyno = ENV["DYNO"] # Heroku
166
- dyno.start_with?("run.") ? "run.*" :
167
- dyno.start_with?("release.") ? "release.*" : dyno
168
- else
169
- Socket.gethostname
170
- end
158
+ def send_deployment
159
+ client.post("/deployments", deployment: Deployment.to_h)
171
160
  end
172
161
 
173
162
  #######################
@@ -177,7 +166,12 @@ module RorVsWild
177
166
  private
178
167
 
179
168
  def initialize_data
180
- Thread.current[:rorvswild_data] = {sections: [], section_stack: [], started_at: RorVsWild.clock_milliseconds}
169
+ Thread.current[:rorvswild_data] = {
170
+ sections: [],
171
+ section_stack: [],
172
+ environment: Host.to_h,
173
+ started_at: RorVsWild.clock_milliseconds,
174
+ }
181
175
  end
182
176
 
183
177
  def cleanup_data
@@ -186,15 +180,15 @@ module RorVsWild
186
180
  result
187
181
  end
188
182
 
189
- def post_request
183
+ def queue_request
190
184
  (data = cleanup_data) && data[:name] && queue.push_request(data)
191
185
  end
192
186
 
193
- def post_job
187
+ def queue_job
194
188
  queue.push_job(cleanup_data)
195
189
  end
196
190
 
197
- def post_error(hash)
191
+ def send_error(hash)
198
192
  client.post_async("/errors".freeze, error: hash)
199
193
  end
200
194
 
@@ -208,15 +202,7 @@ module RorVsWild
208
202
  backtrace: exception.backtrace || ["No backtrace"],
209
203
  exception: exception.class.to_s,
210
204
  extra_details: context,
211
- environment: {
212
- os: os_description,
213
- user: Etc.getlogin,
214
- host: Socket.gethostname,
215
- ruby: RUBY_DESCRIPTION,
216
- pid: Process.pid,
217
- cwd: Dir.pwd,
218
- lib_paths: locator.lib_paths,
219
- },
205
+ environment: Host.to_h,
220
206
  }
221
207
  end
222
208
 
@@ -0,0 +1,93 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RorVsWild
4
+ module Deployment
5
+ def self.load_config(config)
6
+ read
7
+ if hash = config[:deployment]
8
+ @description = hash[:description]
9
+ @revision = hash[:revision]
10
+ @author = hash[:author]
11
+ @email = hash[:email]
12
+ end
13
+ end
14
+
15
+ def self.revision
16
+ @revision
17
+ end
18
+
19
+ def self.description
20
+ @description
21
+ end
22
+
23
+ def self.author
24
+ @author
25
+ end
26
+
27
+ def self.email
28
+ @email
29
+ end
30
+
31
+ def self.ruby
32
+ RUBY_VERSION
33
+ end
34
+
35
+ def self.rails
36
+ Rails.version if defined?(Rails)
37
+ end
38
+
39
+ def self.rorvswild
40
+ RorVsWild::VERSION
41
+ end
42
+
43
+ def self.to_h
44
+ @to_h ||= {revision: revision, description: description, author: author, email: email, ruby: ruby, rails: rails, rorvswild: rorvswild}.compact
45
+ end
46
+
47
+ def self.read
48
+ read_from_heroku || read_from_scalingo || read_from_git || read_from_capistrano
49
+ end
50
+
51
+ private
52
+
53
+ def self.read_from_heroku
54
+ return unless ENV["HEROKU_SLUG_COMMIT"]
55
+ @revision = ENV["HEROKU_SLUG_COMMIT"]
56
+ @description = ENV["HEROKU_SLUG_DESCRIPTION"]
57
+ end
58
+
59
+ def self.read_from_scalingo
60
+ return unless ENV["SOURCE_VERSION"]
61
+ @revision = ENV["SOURCE_VERSION"]
62
+ end
63
+
64
+ def self.read_from_git
65
+ @revision = normalize_string(`git rev-parse HEAD`) rescue nil
66
+ return unless @revision
67
+ lines = `git log -1 --pretty=%an%n%ae%n%B`.lines rescue nil
68
+ return unless lines
69
+ @author = normalize_string(lines[0])
70
+ @email = normalize_string(lines[1])
71
+ @description = lines[2..-1] && normalize_string(lines[2..-1].join)
72
+ @revision
73
+ end
74
+
75
+ def self.read_from_capistrano
76
+ return unless File.readable?("REVISION")
77
+ return unless @revision = File.read("REVISION")
78
+ lines = `git --git-dir ../../repo log --format=%an%n%ae%n%B -n 1 #{@revision}`.lines rescue nil
79
+ return unless lines
80
+ @author = normalize_string(lines[0])
81
+ @email = normalize_string(lines[1])
82
+ @description = lines[2..-1] && normalize_string(lines[2..-1].join)
83
+ @revision
84
+ end
85
+
86
+ def self.normalize_string(string)
87
+ if string
88
+ string = string.strip
89
+ string.empty? ? nil : string
90
+ end
91
+ end
92
+ end
93
+ end
@@ -0,0 +1,58 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RorVsWild
4
+ module Host
5
+ def self.load_config(config)
6
+ @name = config.dig(:server, :name)
7
+ end
8
+
9
+ def self.os
10
+ @os_description ||= `uname -sr`.strip
11
+ rescue Exception => ex
12
+ @os_description = RbConfig::CONFIG["host_os"]
13
+ end
14
+
15
+ def self.user
16
+ Etc.getlogin
17
+ end
18
+
19
+ def self.ruby
20
+ RUBY_DESCRIPTION
21
+ end
22
+
23
+ def self.rails
24
+ Rails.version if defined?(Rails)
25
+ end
26
+
27
+ def self.name
28
+ @name ||= if gae_instance = ENV["GAE_INSTANCE"] || ENV["CLOUD_RUN_EXECUTION"]
29
+ gae_instance
30
+ elsif dyno = ENV["DYNO"] # Heroku
31
+ dyno.start_with?("run.") ? "run.*" :
32
+ dyno.start_with?("release.") ? "release.*" : dyno
33
+ else
34
+ Socket.gethostname
35
+ end
36
+ end
37
+
38
+ def self.pid
39
+ Process.pid
40
+ end
41
+
42
+ def self.cwd
43
+ Dir.pwd
44
+ end
45
+
46
+ def self.revision
47
+ Deployment.revision
48
+ end
49
+
50
+ def self.revision_description
51
+ Deployment.description
52
+ end
53
+
54
+ def self.to_h
55
+ @to_h ||= {os: os, user: user, host: name, ruby: ruby, rails: rails, pid: pid, cwd: cwd, revision: revision}.compact
56
+ end
57
+ end
58
+ end
@@ -4,7 +4,7 @@ module RorVsWild
4
4
 
5
5
  def self.create_rails_config(api_key)
6
6
  if File.directory?("config")
7
- if !File.exists?(PATH)
7
+ if !File.exist?(PATH)
8
8
  File.write(PATH, template(api_key))
9
9
  puts "File #{PATH} has been created. Restart / deploy your app to start collecting data."
10
10
  else
@@ -19,26 +19,34 @@ module RorVsWild
19
19
  <<YAML
20
20
  production:
21
21
  api_key: #{api_key}
22
- # ignore_requests: # Do not monitor the following actions
23
- # - SecretController#index
24
- # ignore_jobs: # Do not monitor the following jobs
25
- # - SecretJob
26
- # ignore_exceptions: # Do not record the following exceptions
27
- # - ActionController::RoutingError # By default to ignore 404
28
- # ignore_plugins:
29
- # - ActionController
30
- # - ActionMailer
31
- # - ActionView
32
- # - ActiveJob
33
- # - ActiveRecord
34
- # - DelayedJob
35
- # - Elasticsearch
36
- # - Mongo
37
- # - NetHttp
38
- # - Redis
39
- # - Resque
40
- # - Sidekiq
41
- # logger: log/rorvswild.log # By default it uses Rails.logger or Logger.new(STDOUT)
22
+ # ignore_requests: # Do not monitor the following actions
23
+ # - SecretController#index
24
+ # ignore_jobs: # Do not monitor the following jobs
25
+ # - SecretJob
26
+ # ignore_exceptions: # Do not record the following exceptions
27
+ # - ActionController::RoutingError # By default to ignore 404
28
+ # ignore_plugins:
29
+ # - ActionController
30
+ # - ActionMailer
31
+ # - ActionView
32
+ # - ActiveJob
33
+ # - ActiveRecord
34
+ # - DelayedJob
35
+ # - Elasticsearch
36
+ # - Mongo
37
+ # - NetHttp
38
+ # - Redis
39
+ # - Resque
40
+ # - Sidekiq
41
+ # logger: log/rorvswild.log # By default it uses Rails.logger or Logger.new(STDOUT)
42
+ # # Deployment tracking is working without any actions from your part if the Rails app
43
+ # # is inside a Git repositoriy, is deployed via Capistrano.
44
+ # # In the other cases, you can provide the following details.
45
+ # deployment:
46
+ # revision: <%= "Anything that will return the deployment version" %> # Mandatory
47
+ # description: <%= "Eventually if you have a description such as a Git message" %>
48
+ # author: <%= "Author's name of the deployment" %>
49
+ # email: <%= "emailOf@theAuthor.com" %>
42
50
  YAML
43
51
  end
44
52
  end
@@ -77,9 +77,9 @@ RorVsWild.Local.prototype.goToHistory = function(event) {
77
77
  this.render()
78
78
  }
79
79
 
80
- RorVsWild.Local.prototype.containerStyle = function() {
80
+ RorVsWild.Local.prototype.containerClass = function() {
81
81
  if (!this.active)
82
- return 'display: none !important;'
82
+ return "is-hidden"
83
83
  }
84
84
 
85
85
  RorVsWild.Local.kindToLanguage = function(kind) {
@@ -4,7 +4,7 @@
4
4
  </div>
5
5
 
6
6
  <script type="x-tmpl-mustache" data-partial="RorVsWild.Local">
7
- <div id="rorvswild-local-requests" class="rorvswild-local-panel" style="{{containerStyle}}">
7
+ <div id="rorvswild-local-requests" class="rorvswild-local-panel {{containerClass}}">
8
8
 
9
9
  <div class="rorvswild-local-panel__header">
10
10
  <a href="https://www.rorvswild.com" class="rorvswild-local-panel__logo">
@@ -76,6 +76,10 @@
76
76
  flex-direction: column !important;
77
77
  }
78
78
 
79
+ .rorvswild-local-panel.is-hidden {
80
+ display: none !important;
81
+ }
82
+
79
83
  .rorvswild-local-panel * {
80
84
  font-family: inherit !important;
81
85
  font-size: inherit !important;
@@ -1,30 +1,61 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module RorVsWild
2
4
  class Metrics
3
5
  class Cpu
4
6
  attr_reader :user, :system, :idle, :waiting, :stolen
5
7
  attr_reader :load_average, :count
6
8
 
9
+ def initialize
10
+ @old_stat = Stat.read
11
+ end
12
+
7
13
  def update
8
- if vmstat = execute(:vmstat)
9
- vmstat = vmstat.split("\n").last.split
10
- @user = vmstat[12].to_i
11
- @system = vmstat[13].to_i
12
- @idle = vmstat[14].to_i
13
- @waiting = vmstat[15].to_i
14
- @stolen = vmstat[16].to_i
14
+ if @old_stat && (new_stat = Stat.read)
15
+ if (total = new_stat.total - @old_stat.total) > 0
16
+ @user = (new_stat.user - @old_stat.user) * 100 / total
17
+ @system = (new_stat.system - @old_stat.system) * 100 / total
18
+ @idle = (new_stat.idle - @old_stat.idle) * 100 / total
19
+ @waiting = (new_stat.iowait - @old_stat.iowait) * 100 / total
20
+ @stolen = (new_stat.steal - @old_stat.steal) * 100 / total
21
+ @old_stat = new_stat
22
+ end
15
23
  end
16
- if uptime = execute(:uptime)
17
- @load_average = uptime.split[-3].to_f
24
+ @load_average = File.read("/proc/loadavg").to_f if File.readable?("/proc/loadavg")
25
+ @count = `nproc`.to_i rescue nil
26
+ end
27
+
28
+ class Stat
29
+ attr_reader :user, :nice, :system, :idle, :iowait, :irq, :softirq, :steal, :guest, :guest_nice, :total
30
+
31
+ def initialize(user, nice, system, idle, iowait, irq, softirq, steal, guest, guest_nice)
32
+ @user = user
33
+ @nice = nice
34
+ @system = system
35
+ @idle = idle
36
+ @iowait = iowait
37
+ @irq = irq
38
+ @softirq = softirq
39
+ @steal = steal
40
+ @guest = guest
41
+ @guest_nice = guest_nice
42
+ @total = user + nice + system + idle + iowait + irq + softirq + steal + guest + guest_nice
18
43
  end
19
- if nproc = execute(:nproc)
20
- @count = nproc.to_i
44
+
45
+ def self.parse(string)
46
+ for row in string.lines
47
+ if row.start_with?("cpu ")
48
+ array = row.split[1..-1].map(&:to_i)[0,10]
49
+ array.fill(0, array.size, 10 - array.size) if array.size < 10
50
+ return new(*array)
51
+ end
52
+ end
53
+ nil
21
54
  end
22
- end
23
55
 
24
- def execute(command)
25
- `#{command}`
26
- rescue => ex
27
- nil
56
+ def self.read
57
+ parse(File.read("/proc/stat")) if File.readable?("/proc/stat")
58
+ end
28
59
  end
29
60
  end
30
61
  end
@@ -23,7 +23,7 @@ module RorVsWild
23
23
  SWAP_FREE = "SwapFree" # Amount of swap space that is currently unused.
24
24
 
25
25
  def update
26
- info = read_meminfo
26
+ return unless info = read_meminfo
27
27
  @ram_total = convert_to_bytes(info[MEM_TOTAL])
28
28
  @ram_free = convert_to_bytes(info[MEM_FREE])
29
29
  @ram_available = convert_to_bytes(info[MEM_AVAILABLE])
@@ -1,7 +1,5 @@
1
1
  module RorVsWild
2
2
  class Metrics
3
- UPDATE_INTERVAL_MS = 60_000 # One metric every minute
4
-
5
3
  attr_reader :cpu, :memory, :storage, :updated_at
6
4
 
7
5
  def initialize
@@ -11,22 +9,23 @@ module RorVsWild
11
9
  end
12
10
 
13
11
  def update
14
- if staled?
15
- cpu.update
16
- memory.update
17
- storage.update
18
- @updated_at = RorVsWild.clock_milliseconds
19
- end
12
+ cpu.update
13
+ memory.update
14
+ storage.update
20
15
  end
21
16
 
22
- def staled?
23
- !updated_at || RorVsWild.clock_milliseconds - updated_at > UPDATE_INTERVAL_MS
17
+ def update_every_minute
18
+ return unless Host.os.include?("Linux")
19
+ if !@updated_at || @updated_at.min != Time.now.min
20
+ @updated_at = Time.now
21
+ update
22
+ end
24
23
  end
25
24
 
26
25
  def to_h
27
26
  {
28
- hostname: RorVsWild.agent.hostname,
29
- os: RorVsWild.agent.os_description,
27
+ hostname: Host.name,
28
+ os: Host.os,
30
29
  cpu_user: cpu.user,
31
30
  cpu_system: cpu.system,
32
31
  cpu_idle: cpu.idle,
@@ -19,7 +19,7 @@ module RorVsWild
19
19
  end
20
20
 
21
21
  def request_with_rorvswild(req, body = nil, &block)
22
- return request_without_rorvswild(req, body, &block) if request_called_twice?
22
+ return request_without_rorvswild(req, body, &block) if !RorVsWild.agent || request_called_twice?
23
23
  RorVsWild.agent.measure_section("#{req.method} #{address}", kind: HTTP) do
24
24
  request_without_rorvswild(req, body, &block)
25
25
  end
@@ -1,6 +1,6 @@
1
1
  module RorVsWild
2
2
  class Queue
3
- SLEEP_TIME = 30
3
+ SLEEP_TIME = 10
4
4
  FLUSH_TRESHOLD = 10
5
5
 
6
6
  attr_reader :mutex, :thread, :client
@@ -52,7 +52,7 @@ module RorVsWild
52
52
  end
53
53
 
54
54
  def pull_server_metrics
55
- @metrics && @metrics.update && @metrics.to_h
55
+ @metrics && @metrics.update_every_minute && @metrics.to_h
56
56
  end
57
57
 
58
58
  def flush_indefinetely
@@ -1,3 +1,3 @@
1
1
  module RorVsWild
2
- VERSION = "1.5.17".freeze
2
+ VERSION = "1.6.1".freeze
3
3
  end
data/lib/rorvswild.rb CHANGED
@@ -1,4 +1,7 @@
1
1
  require "rorvswild/version"
2
+ require "rorvswild/host"
3
+ require "rorvswild/metrics"
4
+ require "rorvswild/deployment"
2
5
  require "rorvswild/locator"
3
6
  require "rorvswild/section"
4
7
  require "rorvswild/client"
metadata CHANGED
@@ -1,15 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rorvswild
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.5.17
4
+ version: 1.6.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Alexis Bernard
8
8
  - Antoine Marguerie
9
- autorequire:
9
+ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2022-10-25 00:00:00.000000000 Z
12
+ date: 2023-02-07 00:00:00.000000000 Z
13
13
  dependencies: []
14
14
  description: Performances and errors insights for rails developers.
15
15
  email:
@@ -27,6 +27,8 @@ files:
27
27
  - lib/rorvswild.rb
28
28
  - lib/rorvswild/agent.rb
29
29
  - lib/rorvswild/client.rb
30
+ - lib/rorvswild/deployment.rb
31
+ - lib/rorvswild/host.rb
30
32
  - lib/rorvswild/installer.rb
31
33
  - lib/rorvswild/local.rb
32
34
  - lib/rorvswild/local/javascript/application.js
@@ -69,7 +71,7 @@ licenses:
69
71
  metadata:
70
72
  source_code_uri: https://github.com/BaseSecrete/rorvswild
71
73
  changelog_uri: https://github.com/BaseSecrete/rorvswild/blob/master/CHANGELOG.md
72
- post_install_message:
74
+ post_install_message:
73
75
  rdoc_options: []
74
76
  require_paths:
75
77
  - lib
@@ -85,7 +87,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
85
87
  version: '0'
86
88
  requirements: []
87
89
  rubygems_version: 3.2.22
88
- signing_key:
90
+ signing_key:
89
91
  specification_version: 4
90
92
  summary: Ruby on Rails applications monitoring
91
93
  test_files: []