event_tracer 0.2.2 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 72b9ead92b130709f1d0a48bac3508af836e65467b8815aa733c4f7101308472
4
- data.tar.gz: 47dce77a79c44aa0c012f06a79f3ec3180777f107658c95d1b88d623f33efeba
3
+ metadata.gz: 16cc39532664c9eb8da45f8f90a3a76ca7f180cc81da848bdf980dba5f91bfc8
4
+ data.tar.gz: 713186d9e6d2de28d334f2a29db2be8e8619f7176080b5d9390f5225568db0af
5
5
  SHA512:
6
- metadata.gz: 2c421202ce3c265caa5db1c61d8138252b3bf4b8944de665569f3794b26ea1753e64023fda526577af4b36bb82e4c6724f89d5f823b9e2750a004830b206bafc
7
- data.tar.gz: 005d7c0b9b652e5020bce39afa4619c2774db3a4101d0981dcf48ee0d2dc9568c053b66268d403ef6ab599f7d16a1c9d4053adea3f2e618767e356344e252cf2
6
+ metadata.gz: 9a5faa6c50a2662896675686b0da3b2706ca29ec102e244be0230547e551e2da014af73954a2396870ebf20b1e55b170451e8f4863257a713776aab6dbc301d6
7
+ data.tar.gz: c2b1ce96276d8821b476a21c35528c3f1c738363d960e1c709e3a1f361228fe4d0ac09ab8f13f2c6a1daef834f35f0fe22fca8b2cc328eab54a114eaa062a039
data/lib/event_tracer.rb CHANGED
@@ -31,14 +31,10 @@ module EventTracer
31
31
  result = Result.new
32
32
 
33
33
  loggers.each do |code, logger|
34
- begin
35
- if args[:action] && args[:message]
36
- result.record code, logger.send(log_type, **filtered_log_arguments(code, args))
37
- else
38
- result.record code, LogResult.new(false, 'Fields action & message need to be populated')
39
- end
40
- rescue Exception => e
41
- result.record code, LogResult.new(false, e.message)
34
+ if args[:action] && args[:message]
35
+ result.record code, logger.send(log_type, **args)
36
+ else
37
+ result.record code, LogResult.new(false, 'Fields action & message need to be populated')
42
38
  end
43
39
  end
44
40
 
@@ -55,14 +51,6 @@ module EventTracer
55
51
  @loggers.select { |code, _logger| selected_codes.include?(code) }
56
52
  end
57
53
 
58
- def self.filtered_log_arguments(logger_code, args)
59
- blacklisted_logger_keys = registered_logger_codes - [logger_code]
60
-
61
- args.reject do |key, _value|
62
- blacklisted_logger_keys.include?(key)
63
- end
64
- end
65
-
66
54
  def self.registered_logger_codes
67
55
  @loggers.keys
68
56
  end
@@ -2,62 +2,62 @@ require_relative '../event_tracer'
2
2
  require_relative './basic_decorator'
3
3
 
4
4
  # NOTES
5
- # Appsignal interface to send our usual actions
5
+ # Appsignal interface to send our usual actions
6
6
  # BasicDecorator adds a transparent interface on top of the appsignal interface
7
7
  #
8
- # Usage: EventTracer.register :appsignal, EventTracer::AppsignalLogger.new(Appsignal)
9
- # appsignal_logger.info appsignal: { increment_counter: { counter_1: 1, counter_2: 2 }, set_gauge: { gauge_1: 1 } }
10
- # appsignal_logger.info appsignal: { set_gauge: { gauge_1: { value: 1, tags: { region: 'eu' } } } }
8
+ # Usage: EventTracer.register :appsignal,
9
+ # EventTracer::AppsignalLogger.new(Appsignal, allowed_tags: ['tag_1', 'tag_2'])
10
+ #
11
+ # appsignal_logger.info metrics: [:counter_1, :counter_2]
12
+ # appsignal_logger.info metrics: { counter_1: { type: :counter, value: 1 }, gauce_2: { type: :gauce, value: 10 } }
11
13
  module EventTracer
12
14
  class AppsignalLogger < BasicDecorator
13
15
 
14
- SUPPORTED_METRICS ||= %i(increment_counter add_distribution_value set_gauge)
16
+ SUPPORTED_METRIC_TYPES = {
17
+ counter: :increment_counter,
18
+ distribution: :add_distribution_value,
19
+ gauge: :set_gauge
20
+ }
21
+ DEFAULT_METRIC_TYPE = :increment_counter
22
+ DEFAULT_COUNTER = 1
23
+
24
+ def initialize(decoratee, allowed_tags: [])
25
+ super(decoratee)
26
+ @allowed_tags = allowed_tags
27
+ end
15
28
 
16
29
  LOG_TYPES.each do |log_type|
17
30
  define_method log_type do |**args|
18
- return LogResult.new(false, "Invalid appsignal config") unless args[:appsignal] && args[:appsignal].is_a?(Hash)
31
+ metrics = args[:metrics]
32
+
33
+ return fail_result('Invalid appsignal config') unless valid_args?(metrics)
34
+ return success_result if metrics.empty?
19
35
 
20
- applied_metrics(args[:appsignal]).each do |metric|
21
- metric_args = args[:appsignal][metric]
22
- return LogResult.new(false, "Appsignal metric #{metric} invalid") unless metric_args && metric_args.is_a?(Hash)
36
+ tags = args.slice(*allowed_tags)
23
37
 
24
- send_metric metric, metric_args
25
- rescue InvalidTagError => e
26
- return LogResult.new(false, e.message)
38
+ case metrics
39
+ when Array
40
+ metrics.each do |metric|
41
+ appsignal.public_send(DEFAULT_METRIC_TYPE, metric, DEFAULT_COUNTER, tags)
42
+ end
43
+ when Hash
44
+ metrics.each do |metric_name, metric_payload|
45
+ metric_type = SUPPORTED_METRIC_TYPES[metric_payload.fetch(:type).to_sym]
46
+ appsignal.public_send(metric_type, metric_name, metric_payload.fetch(:value), tags) if metric_type
47
+ end
27
48
  end
28
49
 
29
- LogResult.new(true)
50
+ success_result
30
51
  end
31
52
  end
32
53
 
33
54
  private
34
55
 
35
- attr_reader :appsignal, :decoratee
56
+ attr_reader :decoratee, :allowed_tags
36
57
  alias_method :appsignal, :decoratee
37
58
 
38
- def applied_metrics(appsignal_args)
39
- appsignal_args.keys.select { |metric| SUPPORTED_METRICS.include?(metric) }
40
- end
41
-
42
- def send_metric(metric, payload)
43
- payload.each do |increment, attribute|
44
- if attribute.is_a?(Hash)
45
- begin
46
- appsignal.send(
47
- metric,
48
- increment,
49
- attribute.fetch(:value),
50
- attribute.fetch(:tags)
51
- )
52
- rescue KeyError
53
- raise InvalidTagError, "Appsignal payload { #{increment}: #{attribute} } invalid"
54
- end
55
- else
56
- appsignal.send(metric, increment, attribute)
57
- end
58
- end
59
+ def valid_args?(metrics)
60
+ metrics && (metrics.is_a?(Hash) || metrics.is_a?(Array))
59
61
  end
60
62
  end
61
-
62
- class InvalidTagError < StandardError; end
63
63
  end
@@ -20,7 +20,7 @@ module EventTracer
20
20
 
21
21
  # EventTracer ensures action & message is always populated
22
22
  def send_message(log_method, action:, message:, **args)
23
- data = args.merge(action: action, message: message)
23
+ data = args.merge(action: action, message: message).except(:metrics)
24
24
  logger.public_send(log_method, data)
25
25
  end
26
26
 
@@ -16,5 +16,13 @@ module EventTracer
16
16
  @delegate_sd_obj = obj
17
17
  end
18
18
 
19
+ def success_result
20
+ LogResult.new(true)
21
+ end
22
+
23
+ def fail_result(message)
24
+ LogResult.new(false, message)
25
+ end
26
+
19
27
  end
20
28
  end
@@ -4,72 +4,68 @@ require_relative './basic_decorator'
4
4
  # Datadog interface to send our usual actions
5
5
  # BasicDecorator adds a transparent interface on top of the datadog interface
6
6
  #
7
- # Usage: EventTracer.register :datadog, EventTracer::DataDogLogger.new(DataDog)
8
- # data_dog_logger.info datadog: { count: { counter_1: 1, counter_2: 2 }, set: { gauge_1: 1 } }
9
- # data_dog_logger.info datadog: { count: { counter_1: { value: 1, tags: ['tag1, tag2']} } }
7
+ # Usage: EventTracer.register :datadog,
8
+ # EventTracer::DataDogLogger.new(DataDog, allowed_tags: ['tag_1', 'tag_2'])
9
+ #
10
+ # data_dog_logger.info metrics: [:counter_1, :counter_2]
11
+ # data_dog_logger.info metrics: { counter_1: { type: :counter, value: 1}, gauce_2: { type: :gauce, value: 10 } }
10
12
 
11
13
  module EventTracer
12
14
  class DatadogLogger < BasicDecorator
13
15
 
14
- class InvalidTagError < StandardError; end
16
+ SUPPORTED_METRIC_TYPES = {
17
+ counter: :count,
18
+ distribution: :distribution,
19
+ gauge: :gauge,
20
+ set: :set,
21
+ histogram: :histogram
22
+ }
23
+ DEFAULT_METRIC_TYPE = :count
24
+ DEFAULT_COUNTER = 1
15
25
 
16
- SUPPORTED_METRICS ||= %i[count set distribution gauge histogram].freeze
26
+ def initialize(decoratee, allowed_tags: [])
27
+ super(decoratee)
28
+ @allowed_tags = allowed_tags
29
+ end
17
30
 
18
31
  LOG_TYPES.each do |log_type|
19
32
  define_method log_type do |**args|
20
- return LogResult.new(false, 'Invalid datadog config') unless args[:datadog]&.is_a?(Hash)
33
+ metrics = args[:metrics]
34
+
35
+ return fail_result('Invalid Datadog config') unless valid_args?(metrics)
36
+ return success_result if metrics.empty?
21
37
 
22
- applied_metrics(args[:datadog]).each do |metric|
23
- metric_args = args[:datadog][metric]
24
- return LogResult.new(false, "Datadog metric #{metric} invalid") unless metric_args.is_a?(Hash)
38
+ tags = build_tags(args)
25
39
 
26
- send_metric metric, metric_args
40
+ case metrics
41
+ when Array
42
+ metrics.each do |metric|
43
+ datadog.public_send(DEFAULT_METRIC_TYPE, metric, DEFAULT_COUNTER, tags: tags)
44
+ end
45
+ when Hash
46
+ metrics.each do |metric_name, metric_payload|
47
+ metric_type = SUPPORTED_METRIC_TYPES[metric_payload.fetch(:type).to_sym]
48
+ datadog.public_send(metric_type, metric_name, metric_payload.fetch(:value), tags: tags) if metric_type
49
+ end
27
50
  end
28
51
 
29
- LogResult.new(true)
52
+ success_result
30
53
  end
31
54
  end
32
55
 
33
56
  private
34
57
 
35
- attr_reader :datadog, :decoratee
58
+ attr_reader :decoratee, :allowed_tags
36
59
  alias_method :datadog, :decoratee
37
60
 
38
- def applied_metrics(datadog_args)
39
- datadog_args.keys.select { |metric| SUPPORTED_METRICS.include?(metric) }
61
+ def valid_args?(metrics)
62
+ metrics && (metrics.is_a?(Hash) || metrics.is_a?(Array))
40
63
  end
41
64
 
42
- def send_metric(metric, payload)
43
- payload.each do |increment, attribute|
44
- if attribute.is_a?(Hash)
45
- begin
46
- datadog.public_send(
47
- metric,
48
- increment,
49
- attribute.fetch(:value),
50
- build_options(attribute[:tags])
51
- )
52
- rescue KeyError
53
- raise InvalidTagError, "Datadog payload { #{increment}: #{attribute} } invalid"
54
- end
55
- else
56
- datadog.public_send(metric, increment, attribute)
57
- end
65
+ def build_tags(args)
66
+ args.slice(*allowed_tags).map do |tag, value|
67
+ "#{tag}:#{value}"
58
68
  end
59
69
  end
60
-
61
- def build_options(tags)
62
- return {} unless tags
63
-
64
- formattted_tags =
65
- if tags.is_a?(Array)
66
- tags
67
- else
68
- tags.inject([]) do |acc, (tag, value)|
69
- acc << "#{tag}:#{value}"
70
- end
71
- end
72
- { tags: formattted_tags }
73
- end
74
70
  end
75
71
  end
@@ -1,3 +1,3 @@
1
1
  module EventTracer
2
- VERSION = '0.2.2'.freeze
2
+ VERSION = '0.3.0'.freeze
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: event_tracer
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.2
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - melvrickgoh
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2021-02-10 00:00:00.000000000 Z
11
+ date: 2021-08-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler