exception-track 0.5.2 → 1.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
  SHA256:
3
- metadata.gz: f4e53ae1240f7be104a8b3616737f5927b3a350a27555e15b8ac9b016c9b5300
4
- data.tar.gz: 96536183c297c9c861d195f1c0720d1abf3a72ba81a9344f223930d2cb026f04
3
+ metadata.gz: 204adb921c2d193136a838e4b3612e80162b59eda35b0e6c245c529038d98d88
4
+ data.tar.gz: eb21c43240e595356f99c4790112120f337625d4ba9da0359fe30dbb6f9fc774
5
5
  SHA512:
6
- metadata.gz: 861a62df66eb3e662550deb9e0a73b7e4cef0bce0b33e46008ea18477df20532ec4967b3b7c708eda73cf7dab4ed995ee4f7c82269f297288e67037eb02ea3f8
7
- data.tar.gz: 3bef483c5f518d65fb836dd2dc196ec8a649a8b58db309925778f3b1dec6ca296a4700da16b92f8ec1f60984eeef8f0c18f5b4fbd25f2868653bf16e26d7b2b2
6
+ metadata.gz: 350a1ba8b5ec9836b93c38cb40f68083fbb484a7c7435a39025068cafb50eeb6def491f187c3c29cba24f0fd5ead757c3f435fcad896c2ce49e2c05420657675
7
+ data.tar.gz: c602e2dd3ba3bd8f5bef4bee20c4910c72733e8557d14831751a46b55ecbcaf918de7a96c7d492c7dcc144147a474758105cd715c95ce2c4ce4900ab963e746d
@@ -1,2 +0,0 @@
1
- //= link_directory ../javascripts/exception-track.js
2
- //= link_directory ../stylesheets/exception-track.css
@@ -6,7 +6,7 @@ body {
6
6
  }
7
7
 
8
8
  body, textarea {
9
- font-family: "Helvetica Neue", Arial, Helvetica, sans-serif;
9
+ font-family: -apple-system, BlinkMacSystemFont, "Helvetica Neue", Arial, Helvetica, sans-serif;
10
10
  font-size: 14px;
11
11
  line-height: 1.4;
12
12
  color: #333;
@@ -38,7 +38,7 @@ table {
38
38
 
39
39
  th {
40
40
  text-align: left;
41
- border-bottom: solid 1px #ddd;
41
+ border-bottom: solid 1px #e0e0e0;
42
42
  }
43
43
 
44
44
  td.date { width: 150px; font-size: 12px; }
@@ -66,9 +66,9 @@ ul {
66
66
  table td, table th {
67
67
  padding: 10px 15px;
68
68
  }
69
- th { background: #f5f5f5; border-bottom: 1px solid #eee; }
69
+ th { background: #f5f5f5; border-bottom: 1px solid #e0e0e0; }
70
70
  td {
71
- border-top: solid 1px #ddd;
71
+ border-top: solid 1px #e0e0e0;
72
72
  }
73
73
 
74
74
  pre {
@@ -108,12 +108,16 @@ hr {
108
108
  user-select: none;
109
109
  border-radius: 3px;
110
110
  border: 1px solid #ccc;
111
- padding: 8px 18px;
111
+ padding: 6px 16px;
112
+ color: #555 !important;
112
113
  outline: 0 !important;
113
114
  background: #FFF;
114
115
  }
115
- .btn:hover { text-decoration: none; }
116
- .btn-danger { background: #E25517; color: #fff; border: #D44323;}
116
+ .btn:hover { text-decoration: none !important; background: #f7f7f7; }
117
+ .btn-danger { background: #fff; color: #E33F00 !important; border-color: #E33F00;}
118
+ .btn-danger:hover {
119
+ background: #FCEDEC;
120
+ }
117
121
 
118
122
  .container {
119
123
  max-width: 1000px;
@@ -121,6 +125,8 @@ hr {
121
125
  margin-right: auto;
122
126
  padding: 20px;
123
127
  background-color: #fff;
128
+ box-shadow: 0 1px 8px rgba(200, 200, 200, 0.26);
129
+ border-radius: 3px;
124
130
  }
125
131
 
126
132
  .no-record {
@@ -134,6 +140,7 @@ hr {
134
140
  height: 34px;
135
141
  line-height: 34px;
136
142
  }
143
+ .toolbar form { display: inline; }
137
144
  .toolbar .pull-right { float: right; }
138
145
 
139
146
  #notice {
@@ -145,9 +152,9 @@ hr {
145
152
  }
146
153
 
147
154
  pre {
148
- background: #f9f9f9;
149
- padding: 10px;
150
- border: 1px solid #eee;
155
+ background: #f7f7f7;
156
+ padding: 25px;
157
+ border-radius: 3px;
151
158
  font-size: 12px;
152
159
  font-family: Menlo, Monaco, Consolas, monospace;
153
160
  }
@@ -165,6 +172,11 @@ h1 { font-size: 16px; }
165
172
  display: inline-block;
166
173
  padding: 5px 10px;
167
174
  border: 1px solid #eee;
175
+ color: #555;
176
+ text-decoration: none;
177
+ }
178
+ .pagination a:hover {
179
+ background: #f7f7f7;
168
180
  }
169
181
  .pagination em,
170
182
  .pagination .current {
@@ -10,6 +10,11 @@ module ExceptionTrack
10
10
  @logs = Log.order("id desc").page(params[:page]).per(15)
11
11
  end
12
12
 
13
+ def export
14
+ @logs = Log.order("id desc").where("created_at >= ?", 3.months.ago)
15
+ send_data JSON.pretty_generate(@logs.as_json(only: %i[title body created_at updated_at])), filename: "#{Date.current}.json", disposition: "attachment"
16
+ end
17
+
13
18
  # GET /exception_logs/1
14
19
  def show; end
15
20
 
@@ -20,7 +25,6 @@ module ExceptionTrack
20
25
  end
21
26
 
22
27
  private
23
-
24
28
  # Use callbacks to share common setup or constraints between actions.
25
29
  def set_log
26
30
  @log = Log.find(params[:id])
@@ -9,6 +9,9 @@
9
9
  <%= @logs.total_count %> exceptions
10
10
 
11
11
  <div class="pull-right">
12
+ <%= form_tag(export_logs_path, method: 'post') do %>
13
+ <button type="submit" class="btn">Export last 3 months</button>
14
+ <% end %>
12
15
  <%= form_tag(all_logs_path, method: 'delete') do %>
13
16
  <button type="submit" class="btn btn-danger" onclick="return confirmDestroyAll()">Delete All</button>
14
17
  <% end %>
@@ -9,10 +9,15 @@ ExceptionTrack.configure do
9
9
  end
10
10
 
11
11
  # ExceptionNotification.configure do |config|
12
- # config.ignored_exceptions += %w(ActionView::TemplateError
13
- # ActionController::InvalidAuthenticityToken
14
- # ActionController::BadRequest
15
- # ActionView::MissingTemplate
16
- # ActionController::UrlGenerationError
17
- # ActionController::UnknownFormat)
12
+ # config.ignored_exceptions += %w[
13
+ # ActionView::TemplateError
14
+ # ActionController::InvalidAuthenticityToken
15
+ # ActionController::BadRequest
16
+ # ActionView::MissingTemplate
17
+ # ActionController::UrlGenerationError
18
+ # ActionController::UnknownFormat
19
+ # ActionController::InvalidCrossOriginRequest
20
+ # ActionController::ParameterMissing
21
+ # Mime::Type::InvalidMimeType
22
+ # ]
18
23
  # end
@@ -4,6 +4,7 @@ ExceptionTrack::Engine.routes.draw do
4
4
  resources :logs, path: "" do
5
5
  collection do
6
6
  delete :all
7
+ post :export
7
8
  end
8
9
  end
9
10
  end
@@ -1,10 +1,10 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- class CreateExceptionTrackLogs < ActiveRecord::Migration[5.0]
3
+ class CreateExceptionTrackLogs < ActiveRecord::Migration[5.2]
4
4
  def change
5
5
  create_table :exception_tracks do |t|
6
6
  t.string :title
7
- t.text :body, limit: 16777215
7
+ t.text :body, limit: 16_777_215
8
8
 
9
9
  t.timestamps
10
10
  end
@@ -2,6 +2,7 @@
2
2
 
3
3
  require "exception-track/version"
4
4
  require "exception-track/configuration"
5
+ require "exception-track/log_subscriber"
5
6
  require "exception-track/engine"
6
7
 
7
8
  require "exception_notification"
@@ -14,6 +15,7 @@ module ExceptionTrack
14
15
  class << self
15
16
  def config
16
17
  return @config if defined?(@config)
18
+
17
19
  @config = Configuration.new
18
20
  @config.environments = %i[development production]
19
21
  @config
@@ -8,6 +8,7 @@ module ExceptionTrack
8
8
 
9
9
  def enabled_env?(env)
10
10
  return false if env.blank?
11
+
11
12
  environments.include?(env.to_sym)
12
13
  end
13
14
  end
@@ -3,5 +3,11 @@
3
3
  module ExceptionTrack
4
4
  class Engine < ::Rails::Engine
5
5
  isolate_namespace ExceptionTrack
6
+
7
+ initializer "exception-track.assets.precompile", group: :all do |app|
8
+ app.config.assets.precompile += %w[exception-track/application.css]
9
+ end
10
+
11
+ ExceptionTrack::LogSubscriber.attach_to :exception_track
6
12
  end
7
13
  end
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ExceptionTrack
4
+ class LogSubscriber < ActiveSupport::LogSubscriber
5
+ # ActiveSupport::Notifications.instrument('track.exception_track', action: action)
6
+ def track(event)
7
+ prefix = color("ExceptionTrack", CYAN)
8
+ title = color(event.payload[:title], RED)
9
+ debug " #{prefix} track db (#{event.duration.round(1)}ms)"
10
+ end
11
+ end
12
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module ExceptionTrack
4
- VERSION = "0.5.2"
4
+ VERSION = "1.1.0"
5
5
  end
@@ -2,27 +2,31 @@
2
2
 
3
3
  module ExceptionNotifier
4
4
  class ExceptionTrackNotifier < ExceptionNotifier::BaseNotifier
5
- def initialize(_options); end
5
+ def initialize(_opts); end
6
6
 
7
- def call(exception, _options = {})
7
+ def call(exception, opts = {})
8
8
  return unless ExceptionTrack.config.enabled_env?(Rails.env)
9
9
 
10
10
  # send the notification
11
11
  title = exception.message || "None"
12
-
13
12
  messages = []
14
- messages << headers_for_env(_options[:env])
15
- messages << ""
16
- messages << "--------------------------------------------------"
17
- messages << ""
18
- messages << exception.inspect
19
- unless exception.backtrace.blank?
20
- messages << "\n"
21
- messages << exception.backtrace
22
- end
23
13
 
24
- ExceptionTrack::Log.create(title: title[0, 200], body: messages.join("\n"))
25
- rescue => e
14
+ ActiveSupport::Notifications.instrument("track.exception_track", title: title) do
15
+ messages << headers_for_env(opts[:env])
16
+ messages << ""
17
+ messages << "--------------------------------------------------"
18
+ messages << ""
19
+ messages << exception.inspect
20
+ unless exception.backtrace.blank?
21
+ messages << "\n"
22
+ messages << exception.backtrace
23
+ end
24
+
25
+ Rails.logger.silence do
26
+ ExceptionTrack::Log.create(title: title[0, 200], body: messages.join("\n"))
27
+ end
28
+ end
29
+ rescue StandardError => e
26
30
  errs = []
27
31
  errs << "-- [ExceptionTrack] create error ---------------------------"
28
32
  errs << e.message.indent(2)
@@ -38,11 +42,12 @@ module ExceptionNotifier
38
42
  def headers_for_env(env)
39
43
  return "" if env.blank?
40
44
 
41
- parameters = env["action_dispatch.request.parameters"] || {}
45
+ parameters = filter_parameters(env)
42
46
 
43
47
  headers = []
44
48
  headers << "Method: #{env['REQUEST_METHOD']}"
45
49
  headers << "URL: #{env['REQUEST_URI']}"
50
+ headers << "Parameters:\n#{pretty_hash(parameters.except(:controller, :action), 13)}" if env["REQUEST_METHOD"].downcase != "get"
46
51
  headers << "Controller: #{parameters['controller']}##{parameters['action']}"
47
52
  headers << "RequestId: #{env['action_dispatch.request_id']}"
48
53
  headers << "User-Agent: #{env['HTTP_USER_AGENT']}"
@@ -53,5 +58,19 @@ module ExceptionNotifier
53
58
 
54
59
  headers.join("\n")
55
60
  end
61
+
62
+ def filter_parameters(env)
63
+ parameters = env["action_dispatch.request.parameters"] || {}
64
+ parameter_filter = ActiveSupport::ParameterFilter.new(env["action_dispatch.parameter_filter"] || [])
65
+ parameter_filter.filter(parameters)
66
+ rescue StandardError => e
67
+ Rails.logger.error "filter_parameters error: #{e.inspect}"
68
+ parameters
69
+ end
70
+
71
+ def pretty_hash(params, indent = 0)
72
+ json = JSON.pretty_generate(params)
73
+ json.indent(indent)
74
+ end
56
75
  end
57
76
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: exception-track
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.2
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jason Lee
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-01-19 00:00:00.000000000 Z
11
+ date: 2020-06-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: exception_notification
@@ -44,14 +44,14 @@ dependencies:
44
44
  requirements:
45
45
  - - ">="
46
46
  - !ruby/object:Gem::Version
47
- version: '4.0'
47
+ version: '5.2'
48
48
  type: :runtime
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - ">="
53
53
  - !ruby/object:Gem::Version
54
- version: '4.0'
54
+ version: '5.2'
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: mysql2
57
57
  requirement: !ruby/object:Gem::Requirement
@@ -89,6 +89,7 @@ files:
89
89
  - lib/exception-track.rb
90
90
  - lib/exception-track/configuration.rb
91
91
  - lib/exception-track/engine.rb
92
+ - lib/exception-track/log_subscriber.rb
92
93
  - lib/exception-track/version.rb
93
94
  - lib/exception_notifier/exception_track_notifier.rb
94
95
  - lib/generators/exception_track/install_generator.rb
@@ -111,7 +112,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
111
112
  - !ruby/object:Gem::Version
112
113
  version: '0'
113
114
  requirements: []
114
- rubygems_version: 3.0.1
115
+ rubygems_version: 3.0.3
115
116
  signing_key:
116
117
  specification_version: 4
117
118
  summary: Tracking exceptions for Rails application store them in database.