Skip to content

Commit 02f4d4d

Browse files
committed
Move middlewares to instances
1 parent b51ea56 commit 02f4d4d

11 files changed

+113
-80
lines changed

lib/influxdb/rails/metric.rb

+2-10
Original file line numberDiff line numberDiff line change
@@ -4,23 +4,20 @@
44
module InfluxDB
55
module Rails
66
class Metric
7-
def initialize(configuration:, timestamp:, tags: {}, values: {}, hook_name:)
7+
def initialize(configuration:, timestamp:, tags: {}, values: {})
88
@configuration = configuration
99
@timestamp = timestamp
1010
@tags = tags
1111
@values = values
12-
@hook_name = hook_name
1312
end
1413

1514
def write
16-
return unless enabled?
17-
1815
client.write_point configuration.measurement_name, options
1916
end
2017

2118
private
2219

23-
attr_reader :configuration, :tags, :values, :timestamp, :hook_name
20+
attr_reader :configuration, :tags, :values, :timestamp
2421

2522
def options
2623
{
@@ -34,11 +31,6 @@ def timestamp_with_precision
3431
InfluxDB.convert_timestamp(timestamp.utc, configuration.client.time_precision)
3532
end
3633

37-
def enabled?
38-
!configuration.ignore_current_environment? &&
39-
!configuration.ignored_hooks.include?(hook_name)
40-
end
41-
4234
def client
4335
InfluxDB::Rails.client
4436
end

lib/influxdb/rails/middleware/active_job_subscriber.rb

+31-14
Original file line numberDiff line numberDiff line change
@@ -6,30 +6,23 @@ module Middleware
66
class ActiveJobSubscriber < Subscriber # :nodoc:
77
private
88

9-
def values(_start, duration, _payload)
10-
value = measure_performance? ? duration : 1
9+
def values
1110
{
1211
value: value,
1312
}
1413
end
1514

16-
def tags(payload)
15+
def tags
1716
{
1817
hook: short_hook_name,
19-
state: job_state(payload),
20-
job: payload[:job].class.name,
21-
queue: payload[:job].queue_name,
18+
state: job_state,
19+
job: job.class.name,
20+
queue: job.queue_name,
2221
}
2322
end
2423

25-
def short_hook_name
26-
return "enqueue" if hook_name.include?("enqueue")
27-
return "perform_start" if hook_name.include?("perform_start")
28-
return "perform" if hook_name.include?("perform")
29-
end
30-
31-
def job_state(payload)
32-
return "failed" if payload[:exception_object]
24+
def job_state
25+
return "failed" if failed?
3326

3427
case short_hook_name
3528
when "enqueue"
@@ -44,6 +37,30 @@ def job_state(payload)
4437
def measure_performance?
4538
short_hook_name == "perform"
4639
end
40+
41+
def short_hook_name
42+
@short_hook_name ||= fetch_short_hook_name
43+
end
44+
45+
def fetch_short_hook_name
46+
return "enqueue" if hook_name.include?("enqueue")
47+
return "perform_start" if hook_name.include?("perform_start")
48+
return "perform" if hook_name.include?("perform")
49+
end
50+
51+
def job
52+
@job ||= payload[:job]
53+
end
54+
55+
def value
56+
return duration if measure_performance?
57+
58+
1
59+
end
60+
61+
def failed?
62+
payload[:exception_object]
63+
end
4764
end
4865
end
4966
end

lib/influxdb/rails/middleware/active_record_subscriber.rb

+2-2
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,14 @@ module Middleware
77
class ActiveRecordSubscriber < Subscriber # :nodoc:
88
private
99

10-
def values(_start, duration, payload)
10+
def values
1111
{
1212
value: duration,
1313
record_count: payload[:record_count],
1414
}
1515
end
1616

17-
def tags(payload)
17+
def tags
1818
{
1919
hook: "instantiation",
2020
class_name: payload[:class_name],

lib/influxdb/rails/middleware/block_instrumentation_subscriber.rb

+4-2
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,15 @@ module InfluxDB
44
module Rails
55
module Middleware
66
class BlockInstrumentationSubscriber < Subscriber
7-
def values(_start, duration, payload)
7+
private
8+
9+
def values
810
{
911
value: duration,
1012
}.merge(payload[:values].to_h)
1113
end
1214

13-
def tags(payload)
15+
def tags
1416
{
1517
hook: "block_instrumentation",
1618
name: payload[:name],

lib/influxdb/rails/middleware/render_subscriber.rb

+8-8
Original file line numberDiff line numberDiff line change
@@ -4,28 +4,28 @@ module InfluxDB
44
module Rails
55
module Middleware
66
class RenderSubscriber < Subscriber # :nodoc:
7-
def short_hook_name
8-
return "render_template" if hook_name.include?("render_template")
9-
return "render_partial" if hook_name.include?("render_partial")
10-
return "render_collection" if hook_name.include?("render_collection")
11-
end
12-
137
private
148

15-
def values(_start, duration, payload)
9+
def values
1610
{
1711
value: duration,
1812
count: payload[:count],
1913
cache_hits: payload[:cache_hits],
2014
}
2115
end
2216

23-
def tags(payload)
17+
def tags
2418
{
2519
hook: short_hook_name,
2620
filename: payload[:identifier],
2721
}
2822
end
23+
24+
def short_hook_name
25+
return "render_template" if hook_name.include?("render_template")
26+
return "render_partial" if hook_name.include?("render_partial")
27+
return "render_collection" if hook_name.include?("render_collection")
28+
end
2929
end
3030
end
3131
end

lib/influxdb/rails/middleware/request_subscriber.rb

+11-7
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,15 @@ module InfluxDB
44
module Rails
55
module Middleware
66
class RequestSubscriber < Subscriber # :nodoc:
7-
def call(_name, started, finished, _unique_id, payload)
7+
def write
88
super
99
ensure
1010
InfluxDB::Rails.current.reset
1111
end
1212

1313
private
1414

15-
def tags(payload)
15+
def tags
1616
{
1717
method: "#{payload[:controller]}##{payload[:action]}",
1818
hook: "process_action",
@@ -22,17 +22,21 @@ def tags(payload)
2222
}
2323
end
2424

25-
def values(start, duration, payload)
25+
def values
2626
{
2727
controller: duration,
2828
view: (payload[:view_runtime] || 0).ceil,
2929
db: (payload[:db_runtime] || 0).ceil,
30-
started: InfluxDB.convert_timestamp(
31-
start.utc,
32-
configuration.client.time_precision
33-
),
30+
started: started,
3431
}
3532
end
33+
34+
def started
35+
InfluxDB.convert_timestamp(
36+
start.utc,
37+
configuration.client.time_precision
38+
)
39+
end
3640
end
3741
end
3842
end

lib/influxdb/rails/middleware/sql_subscriber.rb

+10-7
Original file line numberDiff line numberDiff line change
@@ -5,21 +5,16 @@ module InfluxDB
55
module Rails
66
module Middleware
77
class SqlSubscriber < Subscriber # :nodoc:
8-
def call(_name, started, finished, _unique_id, payload)
9-
super if InfluxDB::Rails::Sql::Query.new(payload).track?
10-
end
11-
128
private
139

14-
def values(_start, duration, payload)
10+
def values
1511
{
1612
value: duration,
1713
sql: InfluxDB::Rails::Sql::Normalizer.new(payload[:sql]).perform,
1814
}
1915
end
2016

21-
def tags(payload)
22-
query = InfluxDB::Rails::Sql::Query.new(payload)
17+
def tags
2318
{
2419
hook: "sql",
2520
operation: query.operation,
@@ -28,6 +23,14 @@ def tags(payload)
2823
location: :raw,
2924
}
3025
end
26+
27+
def disabled?
28+
super || !query.track?
29+
end
30+
31+
def query
32+
@query ||= InfluxDB::Rails::Sql::Query.new(payload)
33+
end
3134
end
3235
end
3336
end

lib/influxdb/rails/middleware/subscriber.rb

+35-13
Original file line numberDiff line numberDiff line change
@@ -7,39 +7,61 @@ module Middleware
77
# which are intended as ActiveSupport::Notifications.subscribe
88
# consumers.
99
class Subscriber
10-
attr_reader :configuration
11-
attr_reader :hook_name
10+
attr_reader :configuration, :hook_name, :start, :finish, :payload
1211

13-
def initialize(configuration, hook_name)
12+
def initialize(configuration:, hook_name:, start:, finish:, payload:)
1413
@configuration = configuration
1514
@hook_name = hook_name
15+
@start = start
16+
@finish = finish
17+
@payload = payload
1618
end
1719

18-
def call(_name, start, finish, _id, payload)
19-
write_metric(start, finish, payload)
20+
def self.call(name, start, finish, _id, payload)
21+
new(
22+
configuration: InfluxDB::Rails.configuration,
23+
start: start,
24+
finish: finish,
25+
payload: payload,
26+
hook_name: name
27+
).write
28+
end
29+
30+
def write
31+
return if disabled?
32+
33+
metric.write
2034
rescue StandardError => e
2135
::Rails.logger.error("[InfluxDB::Rails] Unable to write points: #{e.message}")
2236
end
2337

2438
private
2539

26-
def write_metric(start, finish, payload)
40+
def metric
2741
InfluxDB::Rails::Metric.new(
28-
values: values(start, ((finish - start) * 1000).ceil, payload),
29-
tags: tags(payload),
42+
values: values,
43+
tags: tags,
3044
configuration: configuration,
31-
timestamp: finish,
32-
hook_name: hook_name
33-
).write
45+
timestamp: finish
46+
)
3447
end
3548

36-
def tags(*)
49+
def tags
3750
raise NotImplementedError, "must be implemented in subclass"
3851
end
3952

40-
def values(*)
53+
def values
4154
raise NotImplementedError, "must be implemented in subclass"
4255
end
56+
57+
def duration
58+
((finish - start) * 1000).ceil
59+
end
60+
61+
def disabled?
62+
configuration.ignore_current_environment? ||
63+
configuration.ignored_hooks.include?(hook_name)
64+
end
4365
end
4466
end
4567
end

lib/influxdb/rails/railtie.rb

+3-4
Original file line numberDiff line numberDiff line change
@@ -35,14 +35,13 @@ class Railtie < ::Rails::Railtie # :nodoc:
3535
"perform_start.active_job" => Middleware::ActiveJobSubscriber,
3636
"perform.active_job" => Middleware::ActiveJobSubscriber,
3737
"block_instrumentation.influxdb_rails" => Middleware::BlockInstrumentationSubscriber,
38-
}.each do |hook_name, subscriber_class|
39-
subscribe_to(hook_name, subscriber_class)
38+
}.each do |hook_name, subscriber|
39+
subscribe_to(hook_name, subscriber)
4040
end
4141
end
4242
# rubocop:enable Metrics/BlockLength
4343

44-
def subscribe_to(hook_name, subscriber_class)
45-
subscriber = subscriber_class.new(InfluxDB::Rails.configuration, hook_name)
44+
def subscribe_to(hook_name, subscriber)
4645
ActiveSupport::Notifications.subscribe hook_name, subscriber
4746
end
4847
end

lib/influxdb/rails/tags.rb

+4-7
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
module InfluxDB
22
module Rails
33
class Tags
4-
def initialize(tags: {}, config:)
4+
def initialize(tags: {}, config:, additional_tags: InfluxDB::Rails.current.tags)
55
@tags = tags
66
@config = config
7+
@additional_tags = additional_tags
78
end
89

910
def to_h
@@ -14,7 +15,7 @@ def to_h
1415

1516
private
1617

17-
attr_reader :tags, :config
18+
attr_reader :additional_tags, :tags, :config
1819

1920
def expanded_tags
2021
config.tags_middleware.call(tags.merge(default_tags))
@@ -25,11 +26,7 @@ def default_tags
2526
server: Socket.gethostname,
2627
app_name: config.application_name,
2728
location: :raw,
28-
}.merge(InfluxDB::Rails.current.tags)
29-
end
30-
31-
def current
32-
@current ||= InfluxDB::Rails.current
29+
}.merge(additional_tags)
3330
end
3431
end
3532
end

0 commit comments

Comments
 (0)