logster 0.0.13 → 0.1.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
  SHA1:
3
- metadata.gz: c232a36182ddcf075324915beeb9be8be77acb4c
4
- data.tar.gz: d761886b1f2ad2942fc1a49b2a17d9fb6069263e
3
+ metadata.gz: 2cfda323f9ee2749181b885b462d4e6b6398f03b
4
+ data.tar.gz: d9cf1b6ce77e9c7d74745c253047d39c992a1855
5
5
  SHA512:
6
- metadata.gz: 35f5c15dc4a5b5f1e71f1d9c088d31e37c42bb7fceb545f44e6d059291dddfae45a5bed19b70edfbc3078bb8dfd0cd51eab050e743ef42718ae036f49c261064
7
- data.tar.gz: f49ec022a79e6fab55ea4b0fdbcdd54d6778fa0059193ab325dc88e0b6585b64cb798733612ee2a8846cc6d99d461f3fb8c13248e5b0f28adbf6bf4ad43a0803
6
+ metadata.gz: bef73cfac1f6232793744b1fcb1807da74088a271bba04b0ad7ad6bca95de46a9d39ed73e23371970afd0c7e045a93c8d538c056b4434fddbed44946fb37064f
7
+ data.tar.gz: 8bcab70e33821609e020ad951e2453394eafbe2fb11607d3cdb63563898656e0b48aa8227b1edb97e0eef471ef09f4f93a6c802db745676bffd714d7ca6eb2ac
@@ -1,21 +1,15 @@
1
1
  <div class="message-info">
2
2
  {{#tabbed-section}}
3
- {{#tab-contents name="info" hint="show info"}}
3
+ {{#tab-contents name="info" hint="show info" currentMessage=currentMessage}}
4
4
  <pre>{{currentMessage.message}}</pre>
5
- {{#if currentMessage}}
6
- <a {{bind-attr href=currentMessage.shareUrl}} class="share">Share</a>
7
- <a {{bind-attr href=currentMessage.protectUrl}} class="save">
8
- {{#if currentMessage.protected}}
9
- Unprotect
10
- {{else}}
11
- Protect
12
- {{/if}}
13
- </a>
14
- {{/if}}
15
5
  {{/tab-contents}}
16
- {{#tab-contents name="backtrace" hint="show backtrace"}}<pre>{{currentMessage.backtrace}}</pre>{{/tab-contents}}
6
+ {{#tab-contents name="backtrace" hint="show backtrace" currentMessage=currentMessage}}
7
+ <pre>{{currentMessage.backtrace}}</pre>
8
+ {{/tab-contents}}
17
9
  {{#if currentMessage.env}}
18
- {{#tab-contents name="env" hint="show environment"}}<pre>{{currentMessage.envDebug}}</pre>{{/tab-contents}}
10
+ {{#tab-contents name="env" hint="show environment" currentMessage=currentMessage}}
11
+ <pre>{{currentMessage.envDebug}}</pre>
12
+ {{/tab-contents}}
19
13
  {{/if}}
20
14
  {{/tabbed-section}}
21
15
  </div>
@@ -1 +1,11 @@
1
1
  {{yield}}
2
+ {{#if currentMessage}}
3
+ <a {{bind-attr href=currentMessage.shareUrl}} class="share">Share</a>
4
+ <a {{bind-attr href=currentMessage.protectUrl}} class="save">
5
+ {{#if currentMessage.protected}}
6
+ Unprotect
7
+ {{else}}
8
+ Protect
9
+ {{/if}}
10
+ </a>
11
+ {{/if}}
@@ -10,7 +10,7 @@
10
10
  <tbody>
11
11
  {{#if model.moreBefore}}
12
12
  <tr {{action showMoreBefore}} class="show-more">
13
- <td colspan=4>{{model.totalBefore}} more</td>
13
+ <td colspan=3>{{model.totalBefore}} more</td>
14
14
  </tr>
15
15
  {{/if}}
16
16
  {{each model.messages itemViewClass="App.MessageView"}}
@@ -0,0 +1,21 @@
1
+ class SidekiqLogsterReporter
2
+ def call(ex, context={})
3
+ # Pass context to Logster
4
+ fake_env = {}
5
+ context.each do |key, value|
6
+ Logster.add_to_env(fake_env, key, value)
7
+ end
8
+
9
+ text = "Job exception: #{ex}\n"
10
+ if ex.backtrace
11
+ Logster.add_to_env(fake_env, :backtrace, ex.backtrace)
12
+ end
13
+
14
+ Thread.current[Logster::Logger::LOGSTER_ENV] = fake_env
15
+ Logster.logger.error(text)
16
+ rescue => e
17
+ Logster.logger.fatal("Failed to log exception #{ex} #{hash}\nReason: #{e.class} #{e}\n#{e.backtrace.join("\n")}")
18
+ ensure
19
+ Thread.current[Logster::Logger::LOGSTER_ENV] = nil
20
+ end
21
+ end
@@ -85,6 +85,13 @@ module Logster
85
85
  end
86
86
  end
87
87
 
88
+ def <=>(other)
89
+ time = self.timestamp <=> other.timestamp
90
+ return time if time && time != 0
91
+
92
+ self.key <=> other.key
93
+ end
94
+
88
95
  protected
89
96
 
90
97
  def get_timestamp
@@ -39,8 +39,10 @@ module Logster
39
39
  # accl redirect is going to be trouble, ensure its bypassed
40
40
  env['sendfile.type'] = ''
41
41
  @fileserver.call(env)
42
+
42
43
  elsif resource.start_with?("/messages.json")
43
44
  serve_messages(Rack::Request.new(env))
45
+
44
46
  elsif resource =~ /\/(un)?protect\/([0-9a-f]+)$/
45
47
  off = $1 == "un"
46
48
  key = $2
@@ -88,8 +90,10 @@ module Logster
88
90
  preload = preload_json({"/show/#{key}.json" => message})
89
91
  [200, {"Content-Type" => "text/html; charset=utf-8"}, [body(preload)]]
90
92
  end
93
+
91
94
  elsif resource == "/"
92
95
  [200, {"Content-Type" => "text/html; charset=utf-8"}, [body(preload_json)]]
96
+
93
97
  else
94
98
  [404, {}, ["Not found"]]
95
99
  end
@@ -21,7 +21,7 @@ module Logster
21
21
  return if level && severity < level
22
22
  return if @ignore && @ignore.any?{|pattern| message =~ pattern}
23
23
 
24
- message = Logster::Message.new(severity, progname, message)
24
+ message = Logster::Message.new(severity, progname, message, (opts && opts[:timestamp]))
25
25
 
26
26
  if opts && backtrace = opts[:backtrace]
27
27
  message.backtrace = backtrace
@@ -109,9 +109,23 @@ module Logster
109
109
  protected = @redis.mapped_hmget(hash_key, *keys)
110
110
  @redis.del(hash_key)
111
111
  @redis.mapped_hmset(hash_key, protected)
112
+
113
+ sorted = protected
114
+ .values
115
+ .map { |string| Message.from_json(string) }
116
+ .sort
117
+ .map(&:key)
118
+
119
+ @redis.pipelined do
120
+ sorted.each do |message_key|
121
+ @redis.rpush(list_key, message_key)
122
+ end
123
+ end
112
124
  end
113
125
  end
114
126
 
127
+ # Delete everything, included protected messages
128
+ # (use in tests)
115
129
  def clear_all
116
130
  @redis.del(list_key)
117
131
  @redis.del(protected_key)
@@ -1,3 +1,3 @@
1
1
  module Logster
2
- VERSION = "0.0.13"
2
+ VERSION = "0.1.0"
3
3
  end
@@ -0,0 +1,31 @@
1
+ require_relative '../test_helper'
2
+ require 'logster/logger'
3
+ require 'logger'
4
+ require 'examples/sidekiq_logster_reporter'
5
+
6
+ class TestSidekiqReporter < MiniTest::Test
7
+
8
+ def setup
9
+ Logster.store = @store = Logster::TestStore.new
10
+ Logster.logger = @logger = Logster::Logger.new(Logster.store)
11
+ end
12
+
13
+ def test_sidekiq_handler_example
14
+ handler = SidekiqLogsterReporter.new
15
+ error = nil
16
+ begin
17
+ raise TypeError.new
18
+ rescue => e
19
+ error = e
20
+ end
21
+
22
+ handler.call(error, code: "Test", something_important: "Foo", params: { article_id: 20 })
23
+
24
+ error = Logster.store.reported[0]
25
+
26
+ assert(error.backtrace != nil)
27
+ assert_equal("Job exception: TypeError\n", error.message)
28
+ assert_equal("Test", error.env[:code])
29
+ assert_equal(20, error.env[:params][:article_id])
30
+ end
31
+ end
@@ -24,6 +24,4 @@ class TestLogger < Minitest::Test
24
24
  assert_match(/W,.*boom/, io.string)
25
25
 
26
26
  end
27
-
28
27
  end
29
-
@@ -10,7 +10,7 @@ class TestRedisStore < Minitest::Test
10
10
  end
11
11
 
12
12
  def teardown
13
- @store.clear
13
+ @store.clear_all
14
14
  end
15
15
 
16
16
  def test_latest
@@ -121,26 +121,35 @@ class TestRedisStore < Minitest::Test
121
121
  end
122
122
 
123
123
  def test_clear
124
- 10.times do
125
- @store.report(Logger::WARN, "test", "A")
124
+ @store.max_backlog = 25
125
+ a_message = @store.report(Logger::WARN, "test", "A", timestamp: Time.now - (24*60*60))
126
+ @store.protect a_message.key
127
+ 20.times do
128
+ @store.report(Logger::WARN, "test", "B")
126
129
  end
127
- # Protected messages are not deleted
128
- b_message = @store.report(Logger::WARN, "test", "B")
129
- @store.protect b_message.key
130
- c_message = @store.report(Logger::WARN, "test", "C")
130
+ c_message = @store.report(Logger::WARN, "test", "C", timestamp: Time.now + (24*60*60))
131
+ @store.protect c_message.key
132
+ d_message = @store.report(Logger::WARN, "test", "D")
131
133
  10.times do
132
- @store.report(Logger::WARN, "test", "D")
134
+ @store.report(Logger::WARN, "test", "E")
133
135
  end
134
136
 
135
137
  latest = @store.latest
136
- assert_equal(22, latest.length)
138
+ assert_equal(25, latest.length)
137
139
 
138
140
  @store.clear
139
141
 
142
+ # Protected messages are still accessible by their key
143
+ assert_equal("C", @store.get(c_message.key).message)
144
+ # Unprotected messages are gone
145
+ assert_nil(@store.get(d_message.key))
146
+
147
+ # The latest list is rebuilt with protected messages, earliest first
148
+ # Including messages that previously fell off (A)
140
149
  latest = @store.latest
141
- assert_equal(0, latest.length)
142
- assert_equal("B", @store.get(b_message.key).message)
143
- assert_nil(@store.get(c_message.key))
150
+ assert_equal(2, latest.length)
151
+ assert_equal("A", latest[0].message)
152
+ assert_equal("C", latest[1].message)
144
153
  end
145
154
 
146
155
  def test_hash_cleanup
data/test/test_helper.rb CHANGED
@@ -12,7 +12,28 @@ class Logster::TestStore
12
12
  @reported = []
13
13
  end
14
14
 
15
- def report(*args)
16
- @reported << args
15
+ def report(severity, progname, message, opts = nil)
16
+ opts ||= {}
17
+ env = opts[:env]
18
+ backtrace = opts[:backtrace]
19
+ if env && !backtrace
20
+ backtrace = env[:backtrace]
21
+ end
22
+
23
+ message = Logster::Message.new(severity, progname, message)
24
+
25
+ if backtrace
26
+ message.backtrace = backtrace
27
+ else
28
+ message.backtrace = caller.join("\n")
29
+ end
30
+
31
+ if env
32
+ message.populate_from_env(env)
33
+ end
34
+
35
+ @reported << message
36
+
37
+ message
17
38
  end
18
39
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: logster
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.13
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - UI for viewing logs in Rack
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-07-10 00:00:00.000000000 Z
11
+ date: 2014-07-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -124,6 +124,7 @@ files:
124
124
  - assets/javascript/templates/show.handlebars
125
125
  - assets/stylesheets/app.css
126
126
  - bower.json
127
+ - lib/examples/sidekiq_logster_reporter.rb
127
128
  - lib/logster.rb
128
129
  - lib/logster/configuration.rb
129
130
  - lib/logster/logger.rb
@@ -136,6 +137,7 @@ files:
136
137
  - lib/logster/version.rb
137
138
  - lib/logster/web.rb
138
139
  - logster.gemspec
140
+ - test/examples/test_sidekiq_reporter_example.rb
139
141
  - test/logster/middleware/test_reporter.rb
140
142
  - test/logster/middleware/test_viewer.rb
141
143
  - test/logster/test_logger.rb
@@ -167,6 +169,7 @@ signing_key:
167
169
  specification_version: 4
168
170
  summary: UI for viewing logs in Rack
169
171
  test_files:
172
+ - test/examples/test_sidekiq_reporter_example.rb
170
173
  - test/logster/middleware/test_reporter.rb
171
174
  - test/logster/middleware/test_viewer.rb
172
175
  - test/logster/test_logger.rb