experimental-influxdb-rails 1.0.0.beta5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (60) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +10 -0
  3. data/.rspec +3 -0
  4. data/.rubocop.yml +78 -0
  5. data/.travis.yml +37 -0
  6. data/CHANGELOG.md +133 -0
  7. data/Gemfile +9 -0
  8. data/LICENSE.txt +22 -0
  9. data/README.md +292 -0
  10. data/Rakefile +34 -0
  11. data/config.ru +7 -0
  12. data/experimental-influxdb-rails.gemspec +35 -0
  13. data/gemfiles/Gemfile.rails-4.2.x +7 -0
  14. data/gemfiles/Gemfile.rails-5.0.x +7 -0
  15. data/gemfiles/Gemfile.rails-5.1.x +7 -0
  16. data/gemfiles/Gemfile.rails-5.2.x +7 -0
  17. data/lib/experimental-influxdb-rails.rb +123 -0
  18. data/lib/influxdb/rails/air_traffic_controller.rb +41 -0
  19. data/lib/influxdb/rails/backtrace.rb +44 -0
  20. data/lib/influxdb/rails/configuration.rb +211 -0
  21. data/lib/influxdb/rails/context.rb +51 -0
  22. data/lib/influxdb/rails/exception_presenter.rb +94 -0
  23. data/lib/influxdb/rails/instrumentation.rb +34 -0
  24. data/lib/influxdb/rails/logger.rb +16 -0
  25. data/lib/influxdb/rails/middleware/hijack_render_exception.rb +16 -0
  26. data/lib/influxdb/rails/middleware/hijack_rescue_action_everywhere.rb +31 -0
  27. data/lib/influxdb/rails/middleware/render_subscriber.rb +26 -0
  28. data/lib/influxdb/rails/middleware/request_subscriber.rb +59 -0
  29. data/lib/influxdb/rails/middleware/simple_subscriber.rb +49 -0
  30. data/lib/influxdb/rails/middleware/sql_subscriber.rb +38 -0
  31. data/lib/influxdb/rails/middleware/subscriber.rb +48 -0
  32. data/lib/influxdb/rails/rack.rb +24 -0
  33. data/lib/influxdb/rails/railtie.rb +51 -0
  34. data/lib/influxdb/rails/sql/normalizer.rb +27 -0
  35. data/lib/influxdb/rails/sql/query.rb +32 -0
  36. data/lib/influxdb/rails/version.rb +5 -0
  37. data/lib/rails/generators/influxdb/influxdb_generator.rb +15 -0
  38. data/lib/rails/generators/influxdb/templates/initializer.rb +11 -0
  39. data/spec/controllers/widgets_controller_spec.rb +15 -0
  40. data/spec/integration/exceptions_spec.rb +37 -0
  41. data/spec/integration/integration_helper.rb +1 -0
  42. data/spec/integration/metrics_spec.rb +28 -0
  43. data/spec/shared_examples/data.rb +67 -0
  44. data/spec/shared_examples/tags.rb +45 -0
  45. data/spec/spec_helper.rb +31 -0
  46. data/spec/support/rails4/app.rb +44 -0
  47. data/spec/support/rails5/app.rb +44 -0
  48. data/spec/support/views/widgets/_item.html.erb +1 -0
  49. data/spec/support/views/widgets/index.html.erb +5 -0
  50. data/spec/unit/backtrace_spec.rb +85 -0
  51. data/spec/unit/configuration_spec.rb +125 -0
  52. data/spec/unit/context_spec.rb +40 -0
  53. data/spec/unit/exception_presenter_spec.rb +23 -0
  54. data/spec/unit/influxdb_rails_spec.rb +78 -0
  55. data/spec/unit/middleware/render_subscriber_spec.rb +92 -0
  56. data/spec/unit/middleware/request_subscriber_spec.rb +94 -0
  57. data/spec/unit/middleware/sql_subscriber_spec.rb +95 -0
  58. data/spec/unit/sql/normalizer_spec.rb +15 -0
  59. data/spec/unit/sql/query_spec.rb +29 -0
  60. metadata +300 -0
@@ -0,0 +1,94 @@
1
+ require "spec_helper"
2
+ require "shared_examples/data"
3
+
4
+ RSpec.describe InfluxDB::Rails::Middleware::RequestSubscriber do
5
+ let(:config) { InfluxDB::Rails::Configuration.new }
6
+
7
+ before do
8
+ allow(config).to receive(:time_precision).and_return("ms")
9
+ end
10
+
11
+ subject { described_class.new(config) }
12
+
13
+ describe "#call" do
14
+ let(:start) { Time.at(1_517_567_368) }
15
+ let(:finish) { Time.at(1_517_567_370) }
16
+ let(:payload) { { view_runtime: 2, db_runtime: 2, controller: "MyController", action: "show", method: "GET", format: "*/*", status: 200 } }
17
+ let(:data) do
18
+ {
19
+ values: {
20
+ value: 2,
21
+ started: InfluxDB.convert_timestamp(start.utc, config.time_precision),
22
+ },
23
+ tags: {
24
+ method: "MyController#show",
25
+ status: 200,
26
+ format: "*/*",
27
+ http_method: "GET",
28
+ server: Socket.gethostname,
29
+ app_name: "my-rails-app",
30
+ },
31
+ timestamp: 1_517_567_370_000
32
+ }
33
+ end
34
+
35
+ context "application_name is set" do
36
+ before do
37
+ allow(config).to receive(:application_name).and_return("my-rails-app")
38
+ end
39
+
40
+ it "sends metrics with taggings and timestamps" do
41
+ expect_any_instance_of(InfluxDB::Client).to receive(:write_point).with(
42
+ "rails.controller", data.deep_merge(values: { value: 2000 })
43
+ )
44
+ expect_any_instance_of(InfluxDB::Client).to receive(:write_point).with("rails.view", data)
45
+ expect_any_instance_of(InfluxDB::Client).to receive(:write_point).with("rails.db", data)
46
+
47
+ subject.call("unused", start, finish, "unused", payload)
48
+ end
49
+
50
+ it_behaves_like "with additional data", ["rails.controller", "rails.view", "rails.db"]
51
+ end
52
+
53
+ context "application_name is nil" do
54
+ let(:tags) do
55
+ {
56
+ method: "MyController#show",
57
+ status: 200,
58
+ format: "*/*",
59
+ http_method: "GET",
60
+ server: Socket.gethostname,
61
+ }
62
+ end
63
+
64
+ before do
65
+ allow(config).to receive(:application_name).and_return(nil)
66
+ end
67
+
68
+ it "does not add the app_name tag to metrics" do
69
+ expect_any_instance_of(InfluxDB::Client).to receive(:write_point).with(
70
+ "rails.controller", data.merge(tags: tags).deep_merge(values: { value: 2000 })
71
+ )
72
+ expect_any_instance_of(InfluxDB::Client).to receive(:write_point).with("rails.view", data.merge(tags: tags))
73
+ expect_any_instance_of(InfluxDB::Client).to receive(:write_point).with("rails.db", data.merge(tags: tags))
74
+
75
+ subject.call("unused", start, finish, "unused", payload)
76
+ end
77
+ end
78
+
79
+ context "not successfull" do
80
+ let(:logger) { double(:logger) }
81
+
82
+ before do
83
+ allow(config).to receive(:logger).and_return(logger)
84
+ InfluxDB::Rails.configuration = config
85
+ end
86
+
87
+ it "does log an error" do
88
+ allow_any_instance_of(InfluxDB::Client).to receive(:write_point).and_raise("boom")
89
+ expect(logger).to receive(:error).with(/boom/)
90
+ subject.call("name", start, finish, "id", payload)
91
+ end
92
+ end
93
+ end
94
+ end
@@ -0,0 +1,95 @@
1
+ require "spec_helper"
2
+ require "shared_examples/data"
3
+
4
+ RSpec.describe InfluxDB::Rails::Middleware::SqlSubscriber do
5
+ let(:config) { InfluxDB::Rails::Configuration.new }
6
+ let(:logger) { double(:logger) }
7
+
8
+ before do
9
+ allow(config).to receive(:application_name).and_return("my-rails-app")
10
+ allow(config).to receive(:ignored_environments).and_return([])
11
+ allow(config).to receive(:time_precision).and_return("ms")
12
+ end
13
+
14
+ describe ".call" do
15
+ let(:start) { Time.at(1_517_567_368) }
16
+ let(:finish) { Time.at(1_517_567_370) }
17
+ let(:series_name) { "rails.sql" }
18
+ let(:payload) { { sql: "SELECT * FROM POSTS WHERE id = 1", name: "Post Load", binds: %w[1 2 3] } }
19
+ let(:data) do
20
+ {
21
+ values: {
22
+ value: 2000,
23
+ sql: "SELECT * FROM POSTS WHERE id = xxx"
24
+ },
25
+ tags: {
26
+ location: "Foo#bar",
27
+ operation: "SELECT",
28
+ class_name: "Post",
29
+ name: "Post Load",
30
+ },
31
+ timestamp: 1_517_567_370_000
32
+ }
33
+ end
34
+
35
+ subject { described_class.new(config, series_name) }
36
+
37
+ before do
38
+ InfluxDB::Rails.current.controller = "Foo"
39
+ InfluxDB::Rails.current.action = "bar"
40
+ end
41
+
42
+ after do
43
+ InfluxDB::Rails.current.reset
44
+ end
45
+
46
+ context "successfully" do
47
+ it "writes to InfluxDB" do
48
+ expect_any_instance_of(InfluxDB::Client).to receive(:write_point).with(
49
+ series_name, data
50
+ )
51
+ subject.call("name", start, finish, "id", payload)
52
+ end
53
+
54
+ context "with not relevant queries" do
55
+ before do
56
+ payload[:sql] = "SHOW FULL FIELDS FROM `users`"
57
+ end
58
+
59
+ it "does not write to InfluxDB" do
60
+ expect_any_instance_of(InfluxDB::Client).not_to receive(:write_point)
61
+ subject.call("name", start, finish, "id", payload)
62
+ end
63
+ end
64
+
65
+ it_behaves_like "with additional data", ["rails.sql"]
66
+
67
+ context "without location" do
68
+ before do
69
+ InfluxDB::Rails.current.reset
70
+ end
71
+
72
+ it "does use the default location" do
73
+ data[:tags] = data[:tags].merge(location: :raw)
74
+ expect_any_instance_of(InfluxDB::Client).to receive(:write_point).with(
75
+ series_name, data
76
+ )
77
+ subject.call("name", start, finish, "id", payload)
78
+ end
79
+ end
80
+ end
81
+
82
+ context "unsuccessfully" do
83
+ before do
84
+ allow(config).to receive(:logger).and_return(logger)
85
+ InfluxDB::Rails.configuration = config
86
+ end
87
+
88
+ it "does log exceptions" do
89
+ allow_any_instance_of(InfluxDB::Client).to receive(:write_point).and_raise("boom")
90
+ expect(logger).to receive(:error).with(/boom/)
91
+ subject.call("name", start, finish, "id", payload)
92
+ end
93
+ end
94
+ end
95
+ end
@@ -0,0 +1,15 @@
1
+ require "spec_helper"
2
+
3
+ RSpec.describe InfluxDB::Rails::Sql::Normalizer do
4
+ describe "#perform" do
5
+ it { expect(described_class.new("SELECT * FROM posts WHERE id = 1").perform).to eq("SELECT * FROM posts WHERE id = xxx") }
6
+ it { expect(described_class.new("SELECT * FROM posts WHERE id = 1".freeze).perform).to eq("SELECT * FROM posts WHERE id = xxx") }
7
+ it { expect(described_class.new("SELECT * FROM posts LIMIT 10").perform).to eq("SELECT * FROM posts LIMIT xxx") }
8
+ it { expect(described_class.new("SELECT * FROM posts OFFSET 10").perform).to eq("SELECT * FROM posts OFFSET xxx") }
9
+ it { expect(described_class.new("SELECT * FROM posts WHERE name LIKE '%foobar%'").perform).to eq("SELECT * FROM posts WHERE name LIKE xxx") }
10
+ it { expect(described_class.new("SELECT * FROM posts WHERE id IN (1,2,3)").perform).to eq("SELECT * FROM posts WHERE id IN (xxx)") }
11
+ it { expect(described_class.new("SELECT * FROM products WHERE price BETWEEN 10 AND 20").perform).to eq("SELECT * FROM products WHERE price BETWEEN xxx AND xxx") }
12
+ it { expect(described_class.new("INSERT INTO products (title, price) VALUES ('Computer', 100)").perform).to eq("INSERT INTO products (title, price) VALUES (xxx)") }
13
+ it { expect(described_class.new(" SELECT * FROM POSTS ").perform).to eq("SELECT * FROM POSTS") }
14
+ end
15
+ end
@@ -0,0 +1,29 @@
1
+ require "spec_helper"
2
+
3
+ RSpec.describe InfluxDB::Rails::Sql::Query do
4
+ let(:payload) do
5
+ {
6
+ sql: "select * from users where user_id = 42;",
7
+ name: "User Load",
8
+ }
9
+ end
10
+ subject { described_class.new(payload) }
11
+
12
+ describe "#class_name" do
13
+ it { expect(subject.class_name).to eq("User") }
14
+ end
15
+
16
+ describe "#operation" do
17
+ it { expect(subject.operation).to eq("SELECT") }
18
+ end
19
+
20
+ describe "#track?" do
21
+ it { expect(described_class.new(sql: "INSERT").track?).to be true }
22
+ it { expect(described_class.new(sql: "UPDATE").track?).to be true }
23
+ it { expect(described_class.new(sql: "SELECT").track?).to be true }
24
+ it { expect(described_class.new(sql: "DELETE").track?).to be true }
25
+ it { expect(described_class.new(sql: "SCHEMA").track?).to be false }
26
+ it { expect(described_class.new(sql: "BEGIN").track?).to be false }
27
+ it { expect(described_class.new(sql: "SELECT", name: "SCHEMA").track?).to be false }
28
+ end
29
+ end
metadata ADDED
@@ -0,0 +1,300 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: experimental-influxdb-rails
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0.beta5
5
+ platform: ruby
6
+ authors:
7
+ - Dominik Menke
8
+ - Todd Persen
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2019-01-13 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: influxdb
16
+ requirement: !ruby/object:Gem::Requirement
17
+ requirements:
18
+ - - "~>"
19
+ - !ruby/object:Gem::Version
20
+ version: '0.6'
21
+ - - ">="
22
+ - !ruby/object:Gem::Version
23
+ version: 0.6.4
24
+ type: :runtime
25
+ prerelease: false
26
+ version_requirements: !ruby/object:Gem::Requirement
27
+ requirements:
28
+ - - "~>"
29
+ - !ruby/object:Gem::Version
30
+ version: '0.6'
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: 0.6.4
34
+ - !ruby/object:Gem::Dependency
35
+ name: railties
36
+ requirement: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '4.2'
41
+ type: :runtime
42
+ prerelease: false
43
+ version_requirements: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '4.2'
48
+ - !ruby/object:Gem::Dependency
49
+ name: activerecord
50
+ requirement: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ type: :development
56
+ prerelease: false
57
+ version_requirements: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ - !ruby/object:Gem::Dependency
63
+ name: bundler
64
+ requirement: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: 1.0.0
69
+ type: :development
70
+ prerelease: false
71
+ version_requirements: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: 1.0.0
76
+ - !ruby/object:Gem::Dependency
77
+ name: fakeweb
78
+ requirement: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ type: :development
84
+ prerelease: false
85
+ version_requirements: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ - !ruby/object:Gem::Dependency
91
+ name: rake
92
+ requirement: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ type: :development
98
+ prerelease: false
99
+ version_requirements: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ - !ruby/object:Gem::Dependency
105
+ name: rdoc
106
+ requirement: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ type: :development
112
+ prerelease: false
113
+ version_requirements: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ - !ruby/object:Gem::Dependency
119
+ name: rspec
120
+ requirement: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
125
+ type: :development
126
+ prerelease: false
127
+ version_requirements: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ">="
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ - !ruby/object:Gem::Dependency
133
+ name: rspec-rails
134
+ requirement: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ">="
137
+ - !ruby/object:Gem::Version
138
+ version: 3.0.0
139
+ type: :development
140
+ prerelease: false
141
+ version_requirements: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - ">="
144
+ - !ruby/object:Gem::Version
145
+ version: 3.0.0
146
+ - !ruby/object:Gem::Dependency
147
+ name: rubocop
148
+ requirement: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - "~>"
151
+ - !ruby/object:Gem::Version
152
+ version: 0.61.1
153
+ type: :development
154
+ prerelease: false
155
+ version_requirements: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - "~>"
158
+ - !ruby/object:Gem::Version
159
+ version: 0.61.1
160
+ - !ruby/object:Gem::Dependency
161
+ name: sqlite3
162
+ requirement: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - ">="
165
+ - !ruby/object:Gem::Version
166
+ version: '0'
167
+ type: :development
168
+ prerelease: false
169
+ version_requirements: !ruby/object:Gem::Requirement
170
+ requirements:
171
+ - - ">="
172
+ - !ruby/object:Gem::Version
173
+ version: '0'
174
+ - !ruby/object:Gem::Dependency
175
+ name: tzinfo
176
+ requirement: !ruby/object:Gem::Requirement
177
+ requirements:
178
+ - - ">="
179
+ - !ruby/object:Gem::Version
180
+ version: '0'
181
+ type: :development
182
+ prerelease: false
183
+ version_requirements: !ruby/object:Gem::Requirement
184
+ requirements:
185
+ - - ">="
186
+ - !ruby/object:Gem::Version
187
+ version: '0'
188
+ description: This gem automatically instruments your Ruby on Rails 4.2/5.x applications
189
+ using InfluxDB for storage.
190
+ email:
191
+ - dominik.menke@gmail.com
192
+ - todd@influxdb.com
193
+ executables: []
194
+ extensions: []
195
+ extra_rdoc_files: []
196
+ files:
197
+ - ".gitignore"
198
+ - ".rspec"
199
+ - ".rubocop.yml"
200
+ - ".travis.yml"
201
+ - CHANGELOG.md
202
+ - Gemfile
203
+ - LICENSE.txt
204
+ - README.md
205
+ - Rakefile
206
+ - config.ru
207
+ - experimental-influxdb-rails.gemspec
208
+ - gemfiles/Gemfile.rails-4.2.x
209
+ - gemfiles/Gemfile.rails-5.0.x
210
+ - gemfiles/Gemfile.rails-5.1.x
211
+ - gemfiles/Gemfile.rails-5.2.x
212
+ - lib/experimental-influxdb-rails.rb
213
+ - lib/influxdb/rails/air_traffic_controller.rb
214
+ - lib/influxdb/rails/backtrace.rb
215
+ - lib/influxdb/rails/configuration.rb
216
+ - lib/influxdb/rails/context.rb
217
+ - lib/influxdb/rails/exception_presenter.rb
218
+ - lib/influxdb/rails/instrumentation.rb
219
+ - lib/influxdb/rails/logger.rb
220
+ - lib/influxdb/rails/middleware/hijack_render_exception.rb
221
+ - lib/influxdb/rails/middleware/hijack_rescue_action_everywhere.rb
222
+ - lib/influxdb/rails/middleware/render_subscriber.rb
223
+ - lib/influxdb/rails/middleware/request_subscriber.rb
224
+ - lib/influxdb/rails/middleware/simple_subscriber.rb
225
+ - lib/influxdb/rails/middleware/sql_subscriber.rb
226
+ - lib/influxdb/rails/middleware/subscriber.rb
227
+ - lib/influxdb/rails/rack.rb
228
+ - lib/influxdb/rails/railtie.rb
229
+ - lib/influxdb/rails/sql/normalizer.rb
230
+ - lib/influxdb/rails/sql/query.rb
231
+ - lib/influxdb/rails/version.rb
232
+ - lib/rails/generators/influxdb/influxdb_generator.rb
233
+ - lib/rails/generators/influxdb/templates/initializer.rb
234
+ - spec/controllers/widgets_controller_spec.rb
235
+ - spec/integration/exceptions_spec.rb
236
+ - spec/integration/integration_helper.rb
237
+ - spec/integration/metrics_spec.rb
238
+ - spec/shared_examples/data.rb
239
+ - spec/shared_examples/tags.rb
240
+ - spec/spec_helper.rb
241
+ - spec/support/rails4/app.rb
242
+ - spec/support/rails5/app.rb
243
+ - spec/support/views/widgets/_item.html.erb
244
+ - spec/support/views/widgets/index.html.erb
245
+ - spec/unit/backtrace_spec.rb
246
+ - spec/unit/configuration_spec.rb
247
+ - spec/unit/context_spec.rb
248
+ - spec/unit/exception_presenter_spec.rb
249
+ - spec/unit/influxdb_rails_spec.rb
250
+ - spec/unit/middleware/render_subscriber_spec.rb
251
+ - spec/unit/middleware/request_subscriber_spec.rb
252
+ - spec/unit/middleware/sql_subscriber_spec.rb
253
+ - spec/unit/sql/normalizer_spec.rb
254
+ - spec/unit/sql/query_spec.rb
255
+ homepage: https://influxdata.com
256
+ licenses:
257
+ - MIT
258
+ metadata: {}
259
+ post_install_message:
260
+ rdoc_options: []
261
+ require_paths:
262
+ - lib
263
+ required_ruby_version: !ruby/object:Gem::Requirement
264
+ requirements:
265
+ - - ">="
266
+ - !ruby/object:Gem::Version
267
+ version: 2.3.0
268
+ required_rubygems_version: !ruby/object:Gem::Requirement
269
+ requirements:
270
+ - - ">"
271
+ - !ruby/object:Gem::Version
272
+ version: 1.3.1
273
+ requirements: []
274
+ rubyforge_project:
275
+ rubygems_version: 2.7.3
276
+ signing_key:
277
+ specification_version: 4
278
+ summary: InfluxDB bindings for Ruby on Rails.
279
+ test_files:
280
+ - spec/controllers/widgets_controller_spec.rb
281
+ - spec/integration/exceptions_spec.rb
282
+ - spec/integration/integration_helper.rb
283
+ - spec/integration/metrics_spec.rb
284
+ - spec/shared_examples/data.rb
285
+ - spec/shared_examples/tags.rb
286
+ - spec/spec_helper.rb
287
+ - spec/support/rails4/app.rb
288
+ - spec/support/rails5/app.rb
289
+ - spec/support/views/widgets/_item.html.erb
290
+ - spec/support/views/widgets/index.html.erb
291
+ - spec/unit/backtrace_spec.rb
292
+ - spec/unit/configuration_spec.rb
293
+ - spec/unit/context_spec.rb
294
+ - spec/unit/exception_presenter_spec.rb
295
+ - spec/unit/influxdb_rails_spec.rb
296
+ - spec/unit/middleware/render_subscriber_spec.rb
297
+ - spec/unit/middleware/request_subscriber_spec.rb
298
+ - spec/unit/middleware/sql_subscriber_spec.rb
299
+ - spec/unit/sql/normalizer_spec.rb
300
+ - spec/unit/sql/query_spec.rb