/
subscriber.rb
102 lines (85 loc) · 2.92 KB
/
subscriber.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
module Flipper
module Instrumentation
class Subscriber
# Public: Use this as the subscribed block.
def self.call(name, start, ending, transaction_id, payload)
new(name, start, ending, transaction_id, payload).update
end
# Private: Initializes a new event processing instance.
def initialize(name, start, ending, transaction_id, payload)
@name = name
@start = start
@ending = ending
@payload = payload
@duration = ending - start
@transaction_id = transaction_id
end
# Internal: Override in subclass.
def update_timer(metric)
raise 'not implemented'
end
# Internal: Override in subclass.
def update_counter(metric)
raise 'not implemented'
end
# Private
def update
operation_type = @name.split('.').first
method_name = "update_#{operation_type}_metrics"
if respond_to?(method_name)
send(method_name)
else
puts "Could not update #{operation_type} metrics as #{self.class} did not respond to `#{method_name}`"
end
end
# Private
def update_feature_operation_metrics
feature_name = @payload[:feature_name]
gate_name = @payload[:gate_name]
operation = strip_trailing_question_mark(@payload[:operation])
result = @payload[:result]
thing = @payload[:thing]
update_timer "flipper.feature_operation.#{operation}"
if @payload[:operation] == :enabled?
metric_name = if result
"flipper.feature.#{feature_name}.enabled"
else
"flipper.feature.#{feature_name}.disabled"
end
update_counter metric_name
end
end
# Private
def update_adapter_operation_metrics
adapter_name = @payload[:adapter_name]
operation = @payload[:operation]
result = @payload[:result]
value = @payload[:value]
key = @payload[:key]
update_timer "flipper.adapter.#{adapter_name}.#{operation}"
end
# Private
def update_gate_operation_metrics
feature_name = @payload[:feature_name]
gate_name = @payload[:gate_name]
operation = strip_trailing_question_mark(@payload[:operation])
result = @payload[:result]
thing = @payload[:thing]
update_timer "flipper.gate_operation.#{gate_name}.#{operation}"
update_timer "flipper.feature.#{feature_name}.gate_operation.#{gate_name}.#{operation}"
if @payload[:operation] == :open?
metric_name = if result
"flipper.feature.#{feature_name}.gate.#{gate_name}.open"
else
"flipper.feature.#{feature_name}.gate.#{gate_name}.closed"
end
update_counter metric_name
end
end
# Private
def strip_trailing_question_mark(operation)
operation.to_s.gsub(/\?$/, '')
end
end
end
end