sapience 1.0.5 → 1.0.6
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 +4 -4
- data/lib/sapience/appender/datadog.rb +16 -1
- data/lib/sapience/appender/sentry.rb +13 -3
- data/lib/sapience/appender/stream.rb +5 -1
- data/lib/sapience/appender/wrapper.rb +4 -0
- data/lib/sapience/logger.rb +17 -1
- data/lib/sapience/sapience.rb +7 -5
- data/lib/sapience/subscriber.rb +18 -0
- data/lib/sapience/version.rb +1 -1
- data/test_apps/grape/gemfiles/grape_0.16.2.gemfile.lock +5 -5
- data/test_apps/grape/gemfiles/grape_0.17.0.gemfile.lock +5 -5
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a722559880d7ab264e869789ea245af17428cdc8
|
4
|
+
data.tar.gz: 0a5c1e3ef75a2dc780d8386ed9dcdef6d10bc930
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 09475a5b6fd7e09dc0c4a0aee0104564aeb47fe871e4663c33676081dc259e68f6c1dbf2dd97e29e79bbf287ae35bf7dec6c7f6d41e7808e426305b6eca3b15c
|
7
|
+
data.tar.gz: daf34c9424b3df997775e6196b4b3d500bb56071e366c061983553aa9e491a6fbc0ba795764e73d19ad2549c36aa4437b18204e386dc1021755cba3bebb22b81
|
@@ -11,6 +11,8 @@ end
|
|
11
11
|
module Sapience
|
12
12
|
module Appender
|
13
13
|
class Datadog < Sapience::Subscriber
|
14
|
+
VALIDATION_MESSAGE = "Statsd only supports udp. Example: 'udp://localhost:8125'".freeze
|
15
|
+
|
14
16
|
# Create Appender
|
15
17
|
#
|
16
18
|
# Parameters:
|
@@ -32,7 +34,6 @@ module Sapience
|
|
32
34
|
url = options.delete(:url) || "udp://localhost:8125"
|
33
35
|
@tags = options.delete(:tags)
|
34
36
|
@uri = URI.parse(url)
|
35
|
-
fail('Statsd only supports udp. Example: "udp://localhost:8125"') if @uri.scheme != "udp"
|
36
37
|
super(options, &block)
|
37
38
|
end
|
38
39
|
|
@@ -40,8 +41,13 @@ module Sapience
|
|
40
41
|
@_provider ||= ::Datadog::Statsd.new(@uri.host, @uri.port, dog_options)
|
41
42
|
end
|
42
43
|
|
44
|
+
def valid?
|
45
|
+
@uri.scheme == "udp"
|
46
|
+
end
|
47
|
+
|
43
48
|
# Send an error notification to sentry
|
44
49
|
def log(log)
|
50
|
+
return false unless valid?
|
45
51
|
metric = log.metric
|
46
52
|
return false unless metric
|
47
53
|
|
@@ -58,33 +64,41 @@ module Sapience
|
|
58
64
|
if block_given?
|
59
65
|
start = Time.now
|
60
66
|
yield
|
67
|
+
return false unless valid?
|
61
68
|
provider.timing(metric, ((Time.now - start) * 1000).floor, options)
|
62
69
|
else
|
70
|
+
return false unless valid?
|
63
71
|
provider.timing(metric, duration, options)
|
64
72
|
end
|
65
73
|
end
|
66
74
|
|
67
75
|
def increment(metric, options = {})
|
76
|
+
return false unless valid?
|
68
77
|
provider.increment(metric, options)
|
69
78
|
end
|
70
79
|
|
71
80
|
def decrement(metric, options = {})
|
81
|
+
return false unless valid?
|
72
82
|
provider.decrement(metric, options)
|
73
83
|
end
|
74
84
|
|
75
85
|
def histogram(metric, amount, options = {})
|
86
|
+
return false unless valid?
|
76
87
|
provider.histogram(metric, amount, options)
|
77
88
|
end
|
78
89
|
|
79
90
|
def gauge(metric, amount, options = {})
|
91
|
+
return false unless valid?
|
80
92
|
provider.gauge(metric, amount, options)
|
81
93
|
end
|
82
94
|
|
83
95
|
def count(metric, amount, options = {})
|
96
|
+
return false unless valid?
|
84
97
|
provider.count(metric, amount, options)
|
85
98
|
end
|
86
99
|
|
87
100
|
def time(metric, options = {}, &block)
|
101
|
+
return false unless valid?
|
88
102
|
provider.time(metric, options, &block)
|
89
103
|
end
|
90
104
|
|
@@ -93,6 +107,7 @@ module Sapience
|
|
93
107
|
end
|
94
108
|
|
95
109
|
def event(title, text, options = {})
|
110
|
+
return false unless valid?
|
96
111
|
provider.event(title, text, options)
|
97
112
|
end
|
98
113
|
|
@@ -13,6 +13,8 @@ end
|
|
13
13
|
module Sapience
|
14
14
|
module Appender
|
15
15
|
class Sentry < Sapience::Subscriber
|
16
|
+
VALIDATION_MESSAGE = "DSN is not valid, please add appender with :dsn key or set SENTRY_DSN".freeze # rubocop:disable LineLength
|
17
|
+
URI_REGEXP = URI::DEFAULT_PARSER.regexp[:ABS_URI]
|
16
18
|
# Create Appender
|
17
19
|
#
|
18
20
|
# Parameters
|
@@ -42,8 +44,9 @@ module Sapience
|
|
42
44
|
validate_options!(options)
|
43
45
|
|
44
46
|
options[:level] ||= :error
|
47
|
+
@sentry_dsn = options.delete(:dsn)
|
45
48
|
Raven.configure do |config|
|
46
|
-
config.dsn
|
49
|
+
config.dsn = @sentry_dsn
|
47
50
|
config.tags = { environment: Sapience.environment }
|
48
51
|
end
|
49
52
|
super(options, &block)
|
@@ -51,12 +54,19 @@ module Sapience
|
|
51
54
|
|
52
55
|
def validate_options!(options = {})
|
53
56
|
fail ArgumentError, "Options should be a Hash" unless options.is_a?(Hash)
|
54
|
-
|
55
|
-
|
57
|
+
end
|
58
|
+
|
59
|
+
def valid?
|
60
|
+
(sentry_dsn =~ URI_REGEXP) != nil
|
61
|
+
end
|
62
|
+
|
63
|
+
def sentry_dsn
|
64
|
+
(@sentry_dsn || ENV["SENTRY_DSN"]).to_s
|
56
65
|
end
|
57
66
|
|
58
67
|
# Send an error notification to sentry
|
59
68
|
def log(log) # rubocop:disable AbcSize
|
69
|
+
return false unless valid?
|
60
70
|
return false unless should_log?(log)
|
61
71
|
|
62
72
|
context = formatter.call(log, self)
|
@@ -5,7 +5,7 @@
|
|
5
5
|
module Sapience
|
6
6
|
module Appender
|
7
7
|
class Stream < Sapience::Subscriber
|
8
|
-
|
8
|
+
VALIDATION_MESSAGE = "stream is not writable".freeze
|
9
9
|
# Create a Stream Logger appender instance.
|
10
10
|
#
|
11
11
|
# Parameters
|
@@ -95,6 +95,10 @@ module Sapience
|
|
95
95
|
@log
|
96
96
|
end
|
97
97
|
|
98
|
+
def valid?
|
99
|
+
!@log.closed?
|
100
|
+
end
|
101
|
+
|
98
102
|
def ensure_folder_exist
|
99
103
|
return if ::File.exist?(@file_name)
|
100
104
|
|
@@ -55,6 +55,10 @@ module Sapience
|
|
55
55
|
end
|
56
56
|
# rubocop:enable LineLength
|
57
57
|
|
58
|
+
def valid?
|
59
|
+
!@logger.nil?
|
60
|
+
end
|
61
|
+
|
58
62
|
# Pass log calls to the underlying Rails, log4j or Ruby logger
|
59
63
|
# trace entries are mapped to debug since :trace is not supported by the
|
60
64
|
# Ruby or Rails Loggers
|
data/lib/sapience/logger.rb
CHANGED
@@ -13,6 +13,7 @@ module Sapience
|
|
13
13
|
return unless appender_thread
|
14
14
|
appender_thread << lambda do
|
15
15
|
Sapience.appenders.each do |appender|
|
16
|
+
next unless appender.valid?
|
16
17
|
begin
|
17
18
|
logger.trace "Appender thread: Flushing appender: #{appender.class.name}"
|
18
19
|
appender.flush
|
@@ -30,13 +31,13 @@ module Sapience
|
|
30
31
|
return unless appender_thread
|
31
32
|
appender_thread << lambda do
|
32
33
|
Sapience.appenders.each do |appender|
|
34
|
+
next unless appender.valid?
|
33
35
|
begin
|
34
36
|
close_appender(appender)
|
35
37
|
rescue StandardError => exc
|
36
38
|
logger.error "Appender thread: Failed to close appender: #{appender.inspect}", exc
|
37
39
|
end
|
38
40
|
end
|
39
|
-
|
40
41
|
logger.trace "Appender thread: All appenders flushed"
|
41
42
|
end
|
42
43
|
end
|
@@ -70,6 +71,16 @@ module Sapience
|
|
70
71
|
true
|
71
72
|
end
|
72
73
|
|
74
|
+
def self.start_invalid_appenders_task
|
75
|
+
@@invalid_appenders_task = Concurrent::TimerTask.new(execution_interval: 120, timeout_interval: 5) do
|
76
|
+
Sapience.appenders.each do |appender|
|
77
|
+
next if appender.valid?
|
78
|
+
logger.warn { "#{appender.class} is not valid. #{appender::VALIDATION_MESSAGE}" }
|
79
|
+
end
|
80
|
+
end
|
81
|
+
invalid_appenders_task.execute
|
82
|
+
end
|
83
|
+
|
73
84
|
# Returns true if the appender_thread is active
|
74
85
|
def self.appender_thread_active?
|
75
86
|
@@appender_thread && @@appender_thread.running?
|
@@ -82,6 +93,10 @@ module Sapience
|
|
82
93
|
@@appender_thread
|
83
94
|
end
|
84
95
|
|
96
|
+
def self.invalid_appenders_task
|
97
|
+
@@invalid_appenders_task
|
98
|
+
end
|
99
|
+
|
85
100
|
# Allow the internal logger to be overridden from its default to STDERR
|
86
101
|
# Can be replaced with another Ruby logger or Rails logger, but never to
|
87
102
|
# Sapience::Logger itself since it is for reporting problems
|
@@ -122,6 +137,7 @@ module Sapience
|
|
122
137
|
return add(log, message, progname, &block) unless log.is_a?(Sapience::Log)
|
123
138
|
@@appender_thread << lambda do
|
124
139
|
Sapience.appenders.each do |appender|
|
140
|
+
next unless appender.valid?
|
125
141
|
begin
|
126
142
|
appender.log(log)
|
127
143
|
rescue StandardError => exc
|
data/lib/sapience/sapience.rb
CHANGED
@@ -208,27 +208,29 @@ module Sapience
|
|
208
208
|
# logger = Sapience['Example']
|
209
209
|
# logger.info "Hello World"
|
210
210
|
# logger.debug("Login time", user: 'Joe', duration: 100, ip_address: '127.0.0.1')
|
211
|
-
def self.add_appender(appender, options = {}, _deprecated_level = nil, &_block)
|
211
|
+
def self.add_appender(appender, options = {}, _deprecated_level = nil, &_block) # rubocop:disable AbcSize
|
212
212
|
fail ArgumentError, "options should be a hash" unless options.is_a?(Hash)
|
213
213
|
options = options.dup.deep_symbolize_keyz!
|
214
214
|
appender_class = constantize_symbol(appender)
|
215
|
-
|
215
|
+
validate_appender_class!(appender_class)
|
216
216
|
|
217
217
|
appender = appender_class.new(options)
|
218
|
+
warn "appender #{appender} with (#{options.inspect}) is not valid" unless appender.valid?
|
218
219
|
@@appenders << appender
|
219
220
|
|
220
221
|
# Start appender thread if it is not already running
|
221
222
|
Sapience::Logger.start_appender_thread
|
223
|
+
Sapience::Logger.start_invalid_appenders_task
|
222
224
|
Sapience.logger = appender if appender.is_a?(Sapience::Appender::Stream)
|
223
225
|
Sapience.metrics = appender if appender.is_a?(Sapience::Appender::Datadog)
|
224
226
|
appender
|
225
227
|
end
|
226
228
|
|
227
|
-
def self.
|
228
|
-
return if known_appenders.include?(
|
229
|
+
def self.validate_appender_class!(appender_class)
|
230
|
+
return if known_appenders.include?(appender_class)
|
229
231
|
|
230
232
|
fail NotImplementedError,
|
231
|
-
"Unknown appender '#{
|
233
|
+
"Unknown appender '#{appender_class}'. Supported appenders are (#{known_appenders.join(", ")})"
|
232
234
|
end
|
233
235
|
|
234
236
|
def self.known_appenders
|
data/lib/sapience/subscriber.rb
CHANGED
@@ -19,6 +19,24 @@ module Sapience
|
|
19
19
|
# NOOP
|
20
20
|
end
|
21
21
|
|
22
|
+
# TODO: Implement this mehtod in all appenders
|
23
|
+
# TODO: Output relevant message when appender isn't valid
|
24
|
+
# TODO: Check this valid? method before using appender, output above error message if not valid?
|
25
|
+
# TODO: Wait with adding appenders until they are needed solve this by below
|
26
|
+
# TODO: Implement possibility of finding and deleting appenders by env
|
27
|
+
def valid?
|
28
|
+
fail NotImplementedError, "needs to be implemented in appender"
|
29
|
+
end
|
30
|
+
|
31
|
+
# TODO: Implement a format string with class name and interesting values
|
32
|
+
# see:
|
33
|
+
# - https://www.rubysteps.com/articles/2015/customize-your-ruby-classes-with-to-s-and-inspect/
|
34
|
+
# - http://stackoverflow.com/questions/9524698/override-to-s-while-keeping-output-of-inspect
|
35
|
+
# - http://stackoverflow.com/questions/2625667/why-do-this-ruby-object-have-both-to-s-and-inspect-methods-that-appear-to-do-the
|
36
|
+
def to_s
|
37
|
+
name
|
38
|
+
end
|
39
|
+
|
22
40
|
def name
|
23
41
|
self.class.name
|
24
42
|
end
|
data/lib/sapience/version.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: ../../..
|
3
3
|
specs:
|
4
|
-
sapience (1.0.
|
4
|
+
sapience (1.0.5)
|
5
5
|
concurrent-ruby (~> 1.0)
|
6
6
|
|
7
7
|
GEM
|
@@ -22,7 +22,7 @@ GEM
|
|
22
22
|
ice_nine (~> 0.11.0)
|
23
23
|
thread_safe (~> 0.3, >= 0.3.1)
|
24
24
|
builder (3.2.2)
|
25
|
-
byebug (9.0.
|
25
|
+
byebug (9.0.6)
|
26
26
|
coderay (1.1.1)
|
27
27
|
coercible (1.0.0)
|
28
28
|
descendants_tracker (~> 0.0.1)
|
@@ -32,7 +32,7 @@ GEM
|
|
32
32
|
diff-lcs (1.2.5)
|
33
33
|
docile (1.1.5)
|
34
34
|
dogstatsd-ruby (2.0.0)
|
35
|
-
enumerable-lazy (0.0.
|
35
|
+
enumerable-lazy (0.0.2)
|
36
36
|
equalizer (0.0.11)
|
37
37
|
faraday (0.9.2)
|
38
38
|
multipart-post (>= 1.2, < 3)
|
@@ -81,7 +81,7 @@ GEM
|
|
81
81
|
rspec-core (~> 3.5.0)
|
82
82
|
rspec-expectations (~> 3.5.0)
|
83
83
|
rspec-mocks (~> 3.5.0)
|
84
|
-
rspec-core (3.5.
|
84
|
+
rspec-core (3.5.4)
|
85
85
|
rspec-support (~> 3.5.0)
|
86
86
|
rspec-expectations (3.5.0)
|
87
87
|
diff-lcs (>= 1.2.0, < 2.0)
|
@@ -94,7 +94,7 @@ GEM
|
|
94
94
|
rspec-support (~> 3.5.0)
|
95
95
|
rspec-support (3.5.0)
|
96
96
|
ruby-progressbar (1.8.1)
|
97
|
-
sentry-raven (2.0.
|
97
|
+
sentry-raven (2.0.2)
|
98
98
|
faraday (>= 0.7.6, < 0.10.x)
|
99
99
|
simplecov (0.12.0)
|
100
100
|
docile (~> 1.1.0)
|
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: ../../..
|
3
3
|
specs:
|
4
|
-
sapience (1.0.
|
4
|
+
sapience (1.0.5)
|
5
5
|
concurrent-ruby (~> 1.0)
|
6
6
|
|
7
7
|
GEM
|
@@ -21,7 +21,7 @@ GEM
|
|
21
21
|
ice_nine (~> 0.11.0)
|
22
22
|
thread_safe (~> 0.3, >= 0.3.1)
|
23
23
|
builder (3.2.2)
|
24
|
-
byebug (9.0.
|
24
|
+
byebug (9.0.6)
|
25
25
|
coderay (1.1.1)
|
26
26
|
coercible (1.0.0)
|
27
27
|
descendants_tracker (~> 0.0.1)
|
@@ -31,7 +31,7 @@ GEM
|
|
31
31
|
diff-lcs (1.2.5)
|
32
32
|
docile (1.1.5)
|
33
33
|
dogstatsd-ruby (2.0.0)
|
34
|
-
enumerable-lazy (0.0.
|
34
|
+
enumerable-lazy (0.0.2)
|
35
35
|
equalizer (0.0.11)
|
36
36
|
faraday (0.9.2)
|
37
37
|
multipart-post (>= 1.2, < 3)
|
@@ -80,7 +80,7 @@ GEM
|
|
80
80
|
rspec-core (~> 3.5.0)
|
81
81
|
rspec-expectations (~> 3.5.0)
|
82
82
|
rspec-mocks (~> 3.5.0)
|
83
|
-
rspec-core (3.5.
|
83
|
+
rspec-core (3.5.4)
|
84
84
|
rspec-support (~> 3.5.0)
|
85
85
|
rspec-expectations (3.5.0)
|
86
86
|
diff-lcs (>= 1.2.0, < 2.0)
|
@@ -93,7 +93,7 @@ GEM
|
|
93
93
|
rspec-support (~> 3.5.0)
|
94
94
|
rspec-support (3.5.0)
|
95
95
|
ruby-progressbar (1.8.1)
|
96
|
-
sentry-raven (2.0.
|
96
|
+
sentry-raven (2.0.2)
|
97
97
|
faraday (>= 0.7.6, < 0.10.x)
|
98
98
|
simplecov (0.12.0)
|
99
99
|
docile (~> 1.1.0)
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sapience
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Mikael Henriksson
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2016-
|
12
|
+
date: 2016-10-04 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: concurrent-ruby
|