cruft_tracker 0.2.0 → 0.2.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +30 -2
- data/app/controllers/cruft_tracker/methods_controller.rb +0 -2
- data/app/helpers/cruft_tracker/application_helper.rb +17 -15
- data/app/models/cruft_tracker/render_metadata.rb +1 -1
- data/app/models/cruft_tracker/view.rb +3 -1
- data/app/services/cruft_tracker/cleanup_untracked_views.rb +3 -3
- data/app/services/cruft_tracker/record_arguments.rb +13 -1
- data/app/services/cruft_tracker/record_backtrace.rb +13 -1
- data/app/services/cruft_tracker/record_render_metadata.rb +15 -2
- data/app/services/cruft_tracker/record_view_render.rb +20 -5
- data/app/services/cruft_tracker/track_view.rb +11 -15
- data/config/routes.rb +1 -3
- data/lib/cruft_tracker/engine.rb +0 -1
- data/lib/cruft_tracker/version.rb +1 -1
- data/lib/cruft_tracker.rb +32 -8
- metadata +16 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c9a8291697321237133216a66cb9d58b1e526fe537dddd05644c1fafeaaafb36
|
4
|
+
data.tar.gz: 4ff9fe36c9efd852b03dfc45b7511a74f08f6d92687582ca1316dd8a992031e2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7151e6f098431af83070f860877bf3a7e7446b3b13ba0116c56cf5b6b77bf023282c602bf78e1cca181e5cef25ac3e27fac6b2a95ca45d9c1e69b01652efea5b
|
7
|
+
data.tar.gz: bebf3b0e9acbaaf3f4b60753903f48cd548b9e935061c6a28333e8b53eaff8f2099e0d5ff34234864c257c7110b8ce6a7ad75d3e0cae84bd23e264118ee652d8
|
data/README.md
CHANGED
@@ -59,7 +59,7 @@ class SomeOldClass
|
|
59
59
|
end
|
60
60
|
```
|
61
61
|
|
62
|
-
You're unsure if the `some_old_method` method is actually being used. All you need to do is add an instance of the `is_this_method_used?
|
62
|
+
You're unsure if the `some_old_method` method is actually being used. All you need to do is add an instance of the `is_this_method_used? ` to the CruftTracker initializer. This method requires you to pass the class constant and a symbol to identify the name of the method to track. For example:
|
63
63
|
|
64
64
|
```ruby
|
65
65
|
# config/initializers/cruft_tracker.rb
|
@@ -445,7 +445,7 @@ When the view is actually rendered, CruftTracker will collect information about
|
|
445
445
|
| ---- | ------- | -------------------------------- | -------------- | ------------ | ---------------------- | ------------ | ----------- | ------------------- | ------------------- |
|
446
446
|
| 1 | 1 | 98cc3bd79cf6f3606c5afe3b9faf925b | SomeController | do_something | /foo/:id/bar(.:format) | [{...}] | 1 | 2022-07-06 15:29:06 | 2022-07-06 15:29:06 |
|
447
447
|
|
448
|
-
This record is represented by the `CruftTracker::ViewRender`
|
448
|
+
This record is represented by the `CruftTracker::ViewRender` model and can be loaded in the usual ways. You can also access it from a specific view record. EG: `CruftTracker::View.find(1).view_renders`, which will return an association of unique renders.
|
449
449
|
|
450
450
|
There's a lot packed into that record. Let's disect it:
|
451
451
|
|
@@ -531,6 +531,34 @@ A word of caution: don't track ever variable. Variables are, by definition, vari
|
|
531
531
|
|
532
532
|
CruftTacker automatically cleans up after itself. ✨🧹 If you remove any configured tracking, CruftTracker will recognize this when your application starts up and mark the associated `cruft_tracker_methods` record as deleted.
|
533
533
|
|
534
|
+
## Configuration
|
535
|
+
|
536
|
+
Imagine a scenario where you have a method or view that is used in many places, or maybe as a result of metaprogramming. Perhaps you have some logic that is user-configurable and might lead to a tracked method being called with any number of backtraces. It's not super helpful to track all possible backtraces and it's actively bad, since it wastes space in your database and slows down queries. Besides, it's no fun drinking from the firehose.
|
537
|
+
|
538
|
+
CruftTracker provides a few configurable settings to control the amount of data recorded in some of its tables.
|
539
|
+
|
540
|
+
| Name | Default | Description |
|
541
|
+
| ------------------------------------------------ | ------- | ------------------------------------------------------------ |
|
542
|
+
| `max_argument_variations_per_tracked_method` | 50 | Sets the maximum number of distinct arguments that can be recorded for any tracked method. |
|
543
|
+
| `max_backtrace_variations_per_tracked_method` | 50 | Sets the maximum number of distinct backtraces that can be recorded for any tracked method. |
|
544
|
+
| `max_view_renders_per_view` | 50 | Sets the maximum number of distinct renders that can be recorded for any tracked view. |
|
545
|
+
| `max_render_metadata_variations_per_view_render` | 50 | Sets the maximum number of distinct render metadata records that can be recorded for any specific render of a view. |
|
546
|
+
|
547
|
+
These configuration values can be set within the CruftTracker initializer like this:
|
548
|
+
|
549
|
+
```ruby
|
550
|
+
# config/initializers/cruft_tracker.rb
|
551
|
+
|
552
|
+
CruftTracker.init do
|
553
|
+
config.max_argument_variations_per_tracked_method = 20
|
554
|
+
config.max_backtrace_variations_per_tracked_method = 25
|
555
|
+
config.max_view_renders_per_view = 30
|
556
|
+
config.max_render_metadata_variations_per_view_render = 35
|
557
|
+
|
558
|
+
# ... your configuration for tracking methods or views ...
|
559
|
+
end
|
560
|
+
```
|
561
|
+
|
534
562
|
## API Docs
|
535
563
|
|
536
564
|
### `CruftTracker` module methods
|
@@ -17,7 +17,7 @@ module CruftTracker
|
|
17
17
|
private
|
18
18
|
|
19
19
|
def cruft_tracker_view
|
20
|
-
path = render_stack.first[:path].gsub(
|
20
|
+
path = render_stack.first[:path].gsub(%r{#{Rails.root}/}, '')
|
21
21
|
view = CruftTracker::View.find_by(view: path)
|
22
22
|
|
23
23
|
return view if view.present?
|
@@ -26,9 +26,9 @@ module CruftTracker
|
|
26
26
|
end
|
27
27
|
|
28
28
|
def route_path
|
29
|
-
_routes
|
30
|
-
|
31
|
-
|
29
|
+
_routes
|
30
|
+
.router
|
31
|
+
.recognize(request) { |route, _| return route.path.spec.to_s }
|
32
32
|
|
33
33
|
nil
|
34
34
|
end
|
@@ -38,18 +38,20 @@ module CruftTracker
|
|
38
38
|
end
|
39
39
|
|
40
40
|
def render_stack
|
41
|
-
caller_locations
|
42
|
-
|
43
|
-
|
41
|
+
caller_locations
|
42
|
+
.select do |caller_location|
|
43
|
+
paths_to_views.any? do |path_for_view|
|
44
|
+
caller_location.path.match?(%r{^#{path_for_view}/})
|
45
|
+
end
|
46
|
+
end
|
47
|
+
.map do |location|
|
48
|
+
{
|
49
|
+
path: location.path,
|
50
|
+
label: location.label,
|
51
|
+
base_label: location.base_label,
|
52
|
+
lineno: location.lineno
|
53
|
+
}
|
44
54
|
end
|
45
|
-
end.map do |location|
|
46
|
-
{
|
47
|
-
path: location.path,
|
48
|
-
label: location.label,
|
49
|
-
base_label: location.base_label,
|
50
|
-
lineno: location.lineno
|
51
|
-
}
|
52
|
-
end
|
53
55
|
end
|
54
56
|
end
|
55
57
|
end
|
@@ -11,7 +11,9 @@ module CruftTracker
|
|
11
11
|
|
12
12
|
def still_tracked?
|
13
13
|
return true if CruftTracker::Registry.include?(self)
|
14
|
-
|
14
|
+
if File.read(absolute_path).match?(/record_cruft_tracker_view_render/)
|
15
|
+
return true
|
16
|
+
end
|
15
17
|
|
16
18
|
false
|
17
19
|
end
|
@@ -9,10 +9,10 @@ module CruftTracker
|
|
9
9
|
CruftTracker::View
|
10
10
|
.where(deleted_at: nil)
|
11
11
|
.each do |view|
|
12
|
-
|
13
|
-
|
12
|
+
unless view.still_exists? && view.still_tracked?
|
13
|
+
view.update(deleted_at: Time.current)
|
14
|
+
end
|
14
15
|
end
|
15
|
-
end
|
16
16
|
end
|
17
17
|
rescue StandardError
|
18
18
|
# I'm actively ignoring all errors. Chances are, these are due to something like running rake
|
@@ -9,6 +9,8 @@ module CruftTracker
|
|
9
9
|
private
|
10
10
|
|
11
11
|
def execute
|
12
|
+
return unless arguments_record.present?
|
13
|
+
|
12
14
|
CruftTracker::LogSuppressor.suppress_logging do
|
13
15
|
arguments_record.with_lock do
|
14
16
|
arguments_record.reload
|
@@ -22,16 +24,22 @@ module CruftTracker
|
|
22
24
|
def arguments_record
|
23
25
|
@arguments_record ||=
|
24
26
|
begin
|
27
|
+
return find_existing_arguments_record if max_records_reached?
|
28
|
+
|
25
29
|
CruftTracker::Argument.create(
|
26
30
|
method: method,
|
27
31
|
arguments_hash: arguments_hash,
|
28
32
|
arguments: transformed_arguments
|
29
33
|
)
|
30
34
|
rescue ActiveRecord::RecordNotUnique
|
31
|
-
|
35
|
+
find_existing_arguments_record
|
32
36
|
end
|
33
37
|
end
|
34
38
|
|
39
|
+
def find_existing_arguments_record
|
40
|
+
CruftTracker::Argument.find_by(arguments_hash: arguments_hash)
|
41
|
+
end
|
42
|
+
|
35
43
|
def arguments_hash
|
36
44
|
Digest::MD5.hexdigest(transformed_arguments.to_json)
|
37
45
|
end
|
@@ -39,5 +47,9 @@ module CruftTracker
|
|
39
47
|
def transformed_arguments
|
40
48
|
@transformed_arguments ||= transformer.call(arguments)
|
41
49
|
end
|
50
|
+
|
51
|
+
def max_records_reached?
|
52
|
+
CruftTracker::Argument.where(method: method).count >= CruftTracker.config.max_argument_variations_per_tracked_method
|
53
|
+
end
|
42
54
|
end
|
43
55
|
end
|
@@ -7,6 +7,8 @@ module CruftTracker
|
|
7
7
|
private
|
8
8
|
|
9
9
|
def execute
|
10
|
+
return unless backtrace_record.present?
|
11
|
+
|
10
12
|
CruftTracker::LogSuppressor.suppress_logging do
|
11
13
|
backtrace_record.with_lock do
|
12
14
|
backtrace_record.reload
|
@@ -20,16 +22,22 @@ module CruftTracker
|
|
20
22
|
def backtrace_record
|
21
23
|
@backtrace_record ||=
|
22
24
|
begin
|
25
|
+
return find_existing_backtrace_record if max_records_reached?
|
26
|
+
|
23
27
|
CruftTracker::Backtrace.create(
|
24
28
|
traceable: method,
|
25
29
|
trace_hash: backtrace_hash,
|
26
30
|
trace: filtered_backtrace
|
27
31
|
)
|
28
32
|
rescue ActiveRecord::RecordNotUnique
|
29
|
-
|
33
|
+
find_existing_backtrace_record
|
30
34
|
end
|
31
35
|
end
|
32
36
|
|
37
|
+
def find_existing_backtrace_record
|
38
|
+
CruftTracker::Backtrace.find_by(trace_hash: backtrace_hash)
|
39
|
+
end
|
40
|
+
|
33
41
|
def backtrace_hash
|
34
42
|
Digest::MD5.hexdigest(filtered_backtrace.to_json)
|
35
43
|
end
|
@@ -51,5 +59,9 @@ module CruftTracker
|
|
51
59
|
}
|
52
60
|
end
|
53
61
|
end
|
62
|
+
|
63
|
+
def max_records_reached?
|
64
|
+
CruftTracker::Backtrace.where(traceable: method).count >= CruftTracker.config.max_backtrace_variations_per_tracked_method
|
65
|
+
end
|
54
66
|
end
|
55
67
|
end
|
@@ -10,11 +10,14 @@ module CruftTracker
|
|
10
10
|
|
11
11
|
def execute
|
12
12
|
return unless metadata.present?
|
13
|
+
return unless render_metadata_record.present?
|
13
14
|
|
14
15
|
CruftTracker::LogSuppressor.suppress_logging do
|
15
16
|
render_metadata_record.with_lock do
|
16
17
|
render_metadata_record.reload
|
17
|
-
render_metadata_record.update(
|
18
|
+
render_metadata_record.update(
|
19
|
+
occurrences: render_metadata_record.occurrences + 1
|
20
|
+
)
|
18
21
|
end
|
19
22
|
end
|
20
23
|
end
|
@@ -22,18 +25,28 @@ module CruftTracker
|
|
22
25
|
def render_metadata_record
|
23
26
|
@render_metadata_record ||=
|
24
27
|
begin
|
28
|
+
return find_existing_render_metadata_record if max_records_reached?
|
29
|
+
|
25
30
|
CruftTracker::RenderMetadata.create(
|
26
31
|
view_render: view_render,
|
27
32
|
metadata_hash: metadata_hash,
|
28
33
|
metadata: metadata
|
29
34
|
)
|
30
35
|
rescue ActiveRecord::RecordNotUnique
|
31
|
-
|
36
|
+
find_existing_render_metadata_record
|
32
37
|
end
|
33
38
|
end
|
34
39
|
|
40
|
+
def find_existing_render_metadata_record
|
41
|
+
CruftTracker::RenderMetadata.find_by(metadata_hash: metadata_hash)
|
42
|
+
end
|
43
|
+
|
35
44
|
def metadata_hash
|
36
45
|
Digest::MD5.hexdigest([view_render.render_hash, metadata].to_json)
|
37
46
|
end
|
47
|
+
|
48
|
+
def max_records_reached?
|
49
|
+
CruftTracker::RenderMetadata.where(view_render: view_render).count >= CruftTracker.config.max_render_metadata_variations_per_view_render
|
50
|
+
end
|
38
51
|
end
|
39
52
|
end
|
@@ -20,6 +20,8 @@ module CruftTracker
|
|
20
20
|
private
|
21
21
|
|
22
22
|
def execute
|
23
|
+
return unless view_render_record.present?
|
24
|
+
|
23
25
|
CruftTracker::LogSuppressor.suppress_logging do
|
24
26
|
view.with_lock do
|
25
27
|
view.reload
|
@@ -28,7 +30,9 @@ module CruftTracker
|
|
28
30
|
|
29
31
|
view_render_record.with_lock do
|
30
32
|
view_render_record.reload
|
31
|
-
view_render_record.update(
|
33
|
+
view_render_record.update(
|
34
|
+
occurrences: view_render_record.occurrences + 1
|
35
|
+
)
|
32
36
|
|
33
37
|
record_render_metadata(view_render_record)
|
34
38
|
|
@@ -38,14 +42,18 @@ module CruftTracker
|
|
38
42
|
end
|
39
43
|
|
40
44
|
def record_render_metadata(view_render_record)
|
41
|
-
compose(
|
42
|
-
|
43
|
-
|
45
|
+
compose(
|
46
|
+
CruftTracker::RecordRenderMetadata,
|
47
|
+
view_render: view_render_record,
|
48
|
+
metadata: metadata
|
49
|
+
)
|
44
50
|
end
|
45
51
|
|
46
52
|
def view_render_record
|
47
53
|
@view_render_record ||=
|
48
54
|
begin
|
55
|
+
return find_existing_view_render_record if max_records_reached?
|
56
|
+
|
49
57
|
CruftTracker::ViewRender.create(
|
50
58
|
view: view,
|
51
59
|
render_hash: render_hash,
|
@@ -56,10 +64,14 @@ module CruftTracker
|
|
56
64
|
render_stack: render_stack
|
57
65
|
)
|
58
66
|
rescue ActiveRecord::RecordNotUnique
|
59
|
-
|
67
|
+
find_existing_view_render_record
|
60
68
|
end
|
61
69
|
end
|
62
70
|
|
71
|
+
def find_existing_view_render_record
|
72
|
+
CruftTracker::ViewRender.find_by(render_hash: render_hash)
|
73
|
+
end
|
74
|
+
|
63
75
|
def render_hash
|
64
76
|
Digest::MD5.hexdigest(
|
65
77
|
{
|
@@ -72,5 +84,8 @@ module CruftTracker
|
|
72
84
|
)
|
73
85
|
end
|
74
86
|
|
87
|
+
def max_records_reached?
|
88
|
+
CruftTracker::ViewRender.where(view: view).count >= CruftTracker.config.max_view_renders_per_view
|
89
|
+
end
|
75
90
|
end
|
76
91
|
end
|
@@ -9,13 +9,14 @@ module CruftTracker
|
|
9
9
|
interface :comment, methods: %i[to_json], default: nil
|
10
10
|
|
11
11
|
def execute
|
12
|
-
view_record =
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
12
|
+
view_record =
|
13
|
+
CruftTracker::LogSuppressor.suppress_logging do
|
14
|
+
view_record = create_or_find_view_record
|
15
|
+
view_record.deleted_at = nil
|
16
|
+
view_record.comment = comment if comment != view_record.comment
|
17
|
+
view_record.save
|
18
|
+
view_record
|
19
|
+
end
|
19
20
|
|
20
21
|
listen_for_render(view_record)
|
21
22
|
|
@@ -33,7 +34,7 @@ module CruftTracker
|
|
33
34
|
'CruftTracker was unable to record a view. Have migrations been run?'
|
34
35
|
)
|
35
36
|
rescue Mysql2::Error::ConnectionError,
|
36
|
-
|
37
|
+
ActiveRecord::ConnectionNotEstablished
|
37
38
|
Rails.logger.warn(
|
38
39
|
'CruftTracker was unable to record a view due to being unable to connect to the database. This may be a non-issue in cases where the database is intentionally not available.'
|
39
40
|
)
|
@@ -51,14 +52,9 @@ module CruftTracker
|
|
51
52
|
end
|
52
53
|
|
53
54
|
def create_or_find_view_record
|
54
|
-
CruftTracker::View.create(
|
55
|
-
view: view,
|
56
|
-
comment: comment
|
57
|
-
)
|
55
|
+
CruftTracker::View.create(view: view, comment: comment)
|
58
56
|
rescue ActiveRecord::RecordNotUnique
|
59
|
-
CruftTracker::View.find_by(
|
60
|
-
view: view
|
61
|
-
)
|
57
|
+
CruftTracker::View.find_by(view: view)
|
62
58
|
end
|
63
59
|
end
|
64
60
|
end
|
data/config/routes.rb
CHANGED
data/lib/cruft_tracker/engine.rb
CHANGED
data/lib/cruft_tracker.rb
CHANGED
@@ -4,18 +4,18 @@ require 'cruft_tracker/registry'
|
|
4
4
|
require 'cruft_tracker/log_suppressor'
|
5
5
|
|
6
6
|
module CruftTracker
|
7
|
+
class << self
|
8
|
+
attr_accessor :config
|
9
|
+
end
|
10
|
+
|
7
11
|
def self.init(&block)
|
12
|
+
self.config = Config.instance
|
13
|
+
|
8
14
|
self.instance_eval(&block)
|
9
15
|
end
|
10
16
|
|
11
|
-
def self.is_this_view_used?(
|
12
|
-
view,
|
13
|
-
comment: nil
|
14
|
-
)
|
15
|
-
CruftTracker::TrackView.run!(
|
16
|
-
view: view,
|
17
|
-
comment: comment
|
18
|
-
)
|
17
|
+
def self.is_this_view_used?(view, comment: nil)
|
18
|
+
CruftTracker::TrackView.run!(view: view, comment: comment)
|
19
19
|
end
|
20
20
|
|
21
21
|
def self.is_this_method_used?(
|
@@ -37,4 +37,28 @@ module CruftTracker
|
|
37
37
|
def self.are_any_of_these_methods_being_used?(owner, comment: nil)
|
38
38
|
CruftTracker::TrackAllMethods.run!(owner: owner, comment: comment)
|
39
39
|
end
|
40
|
+
|
41
|
+
class Config
|
42
|
+
include Singleton
|
43
|
+
|
44
|
+
DEFAULT_MAX_ARGUMENTS_VARIATIONS_PER_TRACKED_METHOD = 50
|
45
|
+
DEFAULT_MAX_BACKTRACE_VARIATIONS_PER_TRACKED_METHOD = 50
|
46
|
+
DEFAULT_MAX_VIEW_RENDERS_PER_VIEW = 50
|
47
|
+
DEFAULT_MAX_RENDER_METADATA_VARIATIONS_PER_VIEW_RENDER = 50
|
48
|
+
|
49
|
+
attr_accessor :max_argument_variations_per_tracked_method,
|
50
|
+
:max_backtrace_variations_per_tracked_method,
|
51
|
+
:max_view_renders_per_view,
|
52
|
+
:max_render_metadata_variations_per_view_render
|
53
|
+
|
54
|
+
def initialize
|
55
|
+
@max_argument_variations_per_tracked_method =
|
56
|
+
DEFAULT_MAX_ARGUMENTS_VARIATIONS_PER_TRACKED_METHOD
|
57
|
+
@max_backtrace_variations_per_tracked_method =
|
58
|
+
DEFAULT_MAX_BACKTRACE_VARIATIONS_PER_TRACKED_METHOD
|
59
|
+
@max_view_renders_per_view = DEFAULT_MAX_VIEW_RENDERS_PER_VIEW
|
60
|
+
@max_render_metadata_variations_per_view_render =
|
61
|
+
DEFAULT_MAX_RENDER_METADATA_VARIATIONS_PER_VIEW_RENDER
|
62
|
+
end
|
63
|
+
end
|
40
64
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: cruft_tracker
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Adwerx Inc.
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2022-07-
|
12
|
+
date: 2022-07-07 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: active_interaction
|
@@ -235,6 +235,20 @@ dependencies:
|
|
235
235
|
- - "~>"
|
236
236
|
- !ruby/object:Gem::Version
|
237
237
|
version: 2.5.0
|
238
|
+
- !ruby/object:Gem::Dependency
|
239
|
+
name: prettier
|
240
|
+
requirement: !ruby/object:Gem::Requirement
|
241
|
+
requirements:
|
242
|
+
- - ">="
|
243
|
+
- !ruby/object:Gem::Version
|
244
|
+
version: '0'
|
245
|
+
type: :development
|
246
|
+
prerelease: false
|
247
|
+
version_requirements: !ruby/object:Gem::Requirement
|
248
|
+
requirements:
|
249
|
+
- - ">="
|
250
|
+
- !ruby/object:Gem::Version
|
251
|
+
version: '0'
|
238
252
|
description: |
|
239
253
|
Have you ever asked yourself, "Is this method even being used?!" Or, "What the heck is this method receiving?" Does your application use Rails? If the answers these questions are yes, this gem may be of use to you!
|
240
254
|
|