sapience 1.0.5 → 1.0.6

Sign up to get free protection for your applications and to get access to all the features.
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