File: subscriber.rb

package info (click to toggle)
ruby-flipper 0.13.0-3
  • links: PTS, VCS
  • area: main
  • in suites: buster
  • size: 4,824 kB
  • sloc: ruby: 13,183; sh: 54; makefile: 14
file content (83 lines) | stat: -rw-r--r-- 2,313 bytes parent folder | download | duplicates (4)
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
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

      QUESTION_MARK = '?'.freeze

      # Private
      def strip_trailing_question_mark(operation)
        operation.to_s.chomp(QUESTION_MARK)
      end
    end
  end
end