event_tracer 0.0.1 → 0.2.1
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 +5 -5
- data/lib/event_tracer.rb +50 -11
- data/lib/event_tracer/appsignal_logger.rb +33 -7
- data/lib/event_tracer/base_logger.rb +28 -0
- data/lib/event_tracer/datadog_logger.rb +75 -0
- data/lib/event_tracer/log_result.rb +4 -0
- data/lib/event_tracer/version.rb +1 -1
- metadata +11 -10
- data/lib/event_tracer/logger.rb +0 -28
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 77058f3fa969027f3d51399425d8885c60037ae6250db1cfa686fbafb8524467
|
4
|
+
data.tar.gz: 40b98f105722939c88bb364a04bfbd708c9fcfc2c76815d41d5b2318994aa9bb
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 31fb42ad32f68d2efd4b78dbfb9d55f16563bc897eaa4c4602c5855eb092bf0f03c4308c22a91ed011663c095548029155a7a795de638405588bb162a93d723b
|
7
|
+
data.tar.gz: 58c9ec65b708b9b44fb141c9da778fbc6d56fea371a8edc9e0aaf9ef4d4a2b89855e0a88afbafd0a61312c2b8023bd7c13325bc0f7c86be13ee7d87e534dc6ad
|
data/lib/event_tracer.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
|
-
require
|
1
|
+
require 'event_tracer/version'
|
2
|
+
require 'event_tracer/log_result'
|
2
3
|
|
3
4
|
module EventTracer
|
4
5
|
|
@@ -16,30 +17,68 @@ module EventTracer
|
|
16
17
|
|
17
18
|
LOG_TYPES.each do |log_type|
|
18
19
|
define_singleton_method log_type do |loggers: nil, **args|
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
rescue Exception => e
|
25
|
-
p e.message
|
26
|
-
false
|
27
|
-
end
|
20
|
+
send_log_messages(
|
21
|
+
log_type,
|
22
|
+
(selected_loggers(loggers) || @loggers),
|
23
|
+
args
|
24
|
+
)
|
28
25
|
end
|
29
26
|
end
|
30
27
|
|
31
28
|
private
|
32
29
|
|
30
|
+
def self.send_log_messages(log_type, loggers, args)
|
31
|
+
result = Result.new
|
32
|
+
|
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)
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
result
|
46
|
+
end
|
47
|
+
|
33
48
|
def self.selected_loggers(logger_codes)
|
34
49
|
return unless logger_codes.is_a?(Array)
|
35
50
|
return if logger_codes.detect { |code| !code.is_a?(Symbol) }
|
36
51
|
|
37
|
-
selected_codes = logger_codes.uniq &
|
52
|
+
selected_codes = logger_codes.uniq & registered_logger_codes
|
38
53
|
|
39
54
|
return if selected_codes.empty?
|
40
55
|
@loggers.select { |code, _logger| selected_codes.include?(code) }
|
41
56
|
end
|
42
57
|
|
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
|
+
def self.registered_logger_codes
|
67
|
+
@loggers.keys
|
68
|
+
end
|
69
|
+
|
70
|
+
class Result
|
71
|
+
attr_reader :records
|
72
|
+
|
73
|
+
def initialize
|
74
|
+
@records = {}
|
75
|
+
end
|
76
|
+
|
77
|
+
def record(logger_code, outcome)
|
78
|
+
records[logger_code] = outcome
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
43
82
|
end
|
44
83
|
|
45
84
|
project_root = File.dirname(File.absolute_path(__FILE__))
|
@@ -7,6 +7,7 @@ require_relative './basic_decorator'
|
|
7
7
|
#
|
8
8
|
# Usage: EventTracer.register :appsignal, EventTracer::AppsignalLogger.new(Appsignal)
|
9
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' } } } }
|
10
11
|
module EventTracer
|
11
12
|
class AppsignalLogger < BasicDecorator
|
12
13
|
|
@@ -14,11 +15,18 @@ module EventTracer
|
|
14
15
|
|
15
16
|
LOG_TYPES.each do |log_type|
|
16
17
|
define_method log_type do |**args|
|
17
|
-
|
18
|
-
|
19
|
-
|
18
|
+
return LogResult.new(false, "Invalid appsignal config") unless args[:appsignal] && args[:appsignal].is_a?(Hash)
|
19
|
+
|
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)
|
23
|
+
|
24
|
+
send_metric metric, metric_args
|
25
|
+
rescue InvalidTagError => e
|
26
|
+
return LogResult.new(false, e.message)
|
20
27
|
end
|
21
|
-
|
28
|
+
|
29
|
+
LogResult.new(true)
|
22
30
|
end
|
23
31
|
end
|
24
32
|
|
@@ -27,11 +35,29 @@ module EventTracer
|
|
27
35
|
attr_reader :appsignal, :decoratee
|
28
36
|
alias_method :appsignal, :decoratee
|
29
37
|
|
38
|
+
def applied_metrics(appsignal_args)
|
39
|
+
appsignal_args.keys.select { |metric| SUPPORTED_METRICS.include?(metric) }
|
40
|
+
end
|
41
|
+
|
30
42
|
def send_metric(metric, payload)
|
31
|
-
payload.each do |increment,
|
32
|
-
|
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
|
33
58
|
end
|
34
59
|
end
|
35
|
-
|
36
60
|
end
|
61
|
+
|
62
|
+
class InvalidTagError < StandardError; end
|
37
63
|
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require_relative '../event_tracer'
|
2
|
+
require_relative './basic_decorator'
|
3
|
+
require 'json'
|
4
|
+
|
5
|
+
# Usage: EventTracer.register :base, EventTracer::BaseLogger.new(Logger.new(STDOUT))
|
6
|
+
module EventTracer
|
7
|
+
class BaseLogger < BasicDecorator
|
8
|
+
|
9
|
+
LOG_TYPES.each do |log_type|
|
10
|
+
define_method log_type do |*args|
|
11
|
+
send_message(log_type, *args)
|
12
|
+
LogResult.new(true)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
private
|
17
|
+
|
18
|
+
attr_reader :logger, :decoratee
|
19
|
+
alias_method :logger, :decoratee
|
20
|
+
|
21
|
+
# EventTracer ensures action & message is always populated
|
22
|
+
def send_message(log_method, action:, message:, **args)
|
23
|
+
data = args.merge(action: action, message: message)
|
24
|
+
logger.public_send(log_method, data)
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,75 @@
|
|
1
|
+
require_relative '../event_tracer'
|
2
|
+
require_relative './basic_decorator'
|
3
|
+
# NOTES
|
4
|
+
# Datadog interface to send our usual actions
|
5
|
+
# BasicDecorator adds a transparent interface on top of the datadog interface
|
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']} } }
|
10
|
+
|
11
|
+
module EventTracer
|
12
|
+
class DatadogLogger < BasicDecorator
|
13
|
+
|
14
|
+
class InvalidTagError < StandardError; end
|
15
|
+
|
16
|
+
SUPPORTED_METRICS ||= %i[count set distribution gauge histogram].freeze
|
17
|
+
|
18
|
+
LOG_TYPES.each do |log_type|
|
19
|
+
define_method log_type do |**args|
|
20
|
+
return LogResult.new(false, 'Invalid datadog config') unless args[:datadog]&.is_a?(Hash)
|
21
|
+
|
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)
|
25
|
+
|
26
|
+
send_metric metric, metric_args
|
27
|
+
end
|
28
|
+
|
29
|
+
LogResult.new(true)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
private
|
34
|
+
|
35
|
+
attr_reader :datadog, :decoratee
|
36
|
+
alias_method :datadog, :decoratee
|
37
|
+
|
38
|
+
def applied_metrics(datadog_args)
|
39
|
+
datadog_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
|
+
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
|
58
|
+
end
|
59
|
+
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
|
+
end
|
75
|
+
end
|
data/lib/event_tracer/version.rb
CHANGED
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.
|
4
|
+
version: 0.2.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- melvrickgoh
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2020-11-15 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -16,14 +16,14 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version:
|
19
|
+
version: 2.1.4
|
20
20
|
type: :development
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version:
|
26
|
+
version: 2.1.4
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: rake
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -62,14 +62,16 @@ extra_rdoc_files: []
|
|
62
62
|
files:
|
63
63
|
- lib/event_tracer.rb
|
64
64
|
- lib/event_tracer/appsignal_logger.rb
|
65
|
+
- lib/event_tracer/base_logger.rb
|
65
66
|
- lib/event_tracer/basic_decorator.rb
|
66
|
-
- lib/event_tracer/
|
67
|
+
- lib/event_tracer/datadog_logger.rb
|
68
|
+
- lib/event_tracer/log_result.rb
|
67
69
|
- lib/event_tracer/version.rb
|
68
70
|
homepage: https://github.com/melvrickgoh/event_tracer
|
69
71
|
licenses:
|
70
72
|
- MIT
|
71
73
|
metadata: {}
|
72
|
-
post_install_message:
|
74
|
+
post_install_message:
|
73
75
|
rdoc_options: []
|
74
76
|
require_paths:
|
75
77
|
- lib/event_tracer
|
@@ -85,9 +87,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
85
87
|
- !ruby/object:Gem::Version
|
86
88
|
version: '0'
|
87
89
|
requirements: []
|
88
|
-
|
89
|
-
|
90
|
-
signing_key:
|
90
|
+
rubygems_version: 3.0.8
|
91
|
+
signing_key:
|
91
92
|
specification_version: 4
|
92
93
|
summary: Thin wrapper for formatted logging/ metric services to be used as a single
|
93
94
|
service
|
data/lib/event_tracer/logger.rb
DELETED
@@ -1,28 +0,0 @@
|
|
1
|
-
require_relative '../event_tracer'
|
2
|
-
require_relative './basic_decorator'
|
3
|
-
require 'json'
|
4
|
-
|
5
|
-
# Usage: EventTracer.register :base, EventTracer::Logger.new(Logger.new(STDOUT))
|
6
|
-
module EventTracer
|
7
|
-
class Logger < BasicDecorator
|
8
|
-
|
9
|
-
LOG_TYPES.each do |log_type|
|
10
|
-
define_method log_type do |*args|
|
11
|
-
send_message(log_type, *args)
|
12
|
-
end
|
13
|
-
end
|
14
|
-
|
15
|
-
private
|
16
|
-
|
17
|
-
attr_reader :logger, :decoratee
|
18
|
-
alias_method :logger, :decoratee
|
19
|
-
|
20
|
-
# execute only if there's a message to be logged
|
21
|
-
def send_message(log_method, action: nil, simple_message: nil, **args)
|
22
|
-
return false unless simple_message || args[:message]
|
23
|
-
message_to_send = simple_message ? simple_message : args.to_json
|
24
|
-
logger.send(log_method, "[#{action}] #{message_to_send}")
|
25
|
-
end
|
26
|
-
|
27
|
-
end
|
28
|
-
end
|