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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: a40c5a391a0e2ad10aa755042de77d26d213e054
4
- data.tar.gz: 6b6a3e456552d94c7ee960a5e165a8758ad671f1
3
+ metadata.gz: a722559880d7ab264e869789ea245af17428cdc8
4
+ data.tar.gz: 0a5c1e3ef75a2dc780d8386ed9dcdef6d10bc930
5
5
  SHA512:
6
- metadata.gz: 19e50f5df3d0c2e851be3c83bffe2531f7d6307076944d074674a064bb840704645290212ac07bef382560cc39ad3228d805248b1a05933f82e6119db95123ce
7
- data.tar.gz: f657142dd62de8b75a2ae17794956a6906f2fbf784b38e29e39e7505c592489483abc1cbfef61761868ce952379820a4070b69850e1201ef036c5924729507dd
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 = options.delete(: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
- dsn_valid = options[:dsn].to_s =~ URI::DEFAULT_PARSER.regexp[:ABS_URI]
55
- fail ArgumentError, "The :dsn key (#{options[:dsn]}) is not a valid URI" unless dsn_valid
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
@@ -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
@@ -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
- validate_appender!(appender_class)
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.validate_appender!(appender)
228
- return if known_appenders.include?(appender)
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 '#{appender}'. Supported appenders are (#{known_appenders.join(", ")})"
233
+ "Unknown appender '#{appender_class}'. Supported appenders are (#{known_appenders.join(", ")})"
232
234
  end
233
235
 
234
236
  def self.known_appenders
@@ -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
@@ -1,3 +1,3 @@
1
1
  module Sapience
2
- VERSION = "1.0.5"
2
+ VERSION = "1.0.6"
3
3
  end
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: ../../..
3
3
  specs:
4
- sapience (1.0.3)
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.5)
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.1)
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.3)
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.1)
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.3)
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.5)
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.1)
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.3)
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.1)
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.5
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-09-30 00:00:00.000000000 Z
12
+ date: 2016-10-04 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: concurrent-ruby