logster 0.0.13 → 0.1.0

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: 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