rails_mini_profiler 0 → 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.
Files changed (134) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +29 -111
  3. data/Rakefile +18 -0
  4. data/app/{javascript/images → assets/images/rails_mini_profiler}/bookmark.svg +0 -0
  5. data/app/{javascript/images → assets/images/rails_mini_profiler}/chart.svg +0 -0
  6. data/app/{javascript/images → assets/images/rails_mini_profiler}/delete.svg +0 -0
  7. data/app/{javascript/images → assets/images/rails_mini_profiler}/graph.svg +0 -0
  8. data/app/{javascript/images → assets/images/rails_mini_profiler}/logo.svg +0 -0
  9. data/app/{javascript/images → assets/images/rails_mini_profiler}/logo_variant.svg +2 -2
  10. data/app/assets/images/rails_mini_profiler/search.svg +10 -0
  11. data/app/{javascript/images → assets/images/rails_mini_profiler}/setting.svg +0 -0
  12. data/app/{javascript/images → assets/images/rails_mini_profiler}/show.svg +0 -0
  13. data/app/assets/javascripts/rails_mini_profiler.js +76 -1
  14. data/app/assets/stylesheets/rails_mini_profiler/application.css +149 -1
  15. data/app/assets/stylesheets/rails_mini_profiler/flamegraph.css +14 -0
  16. data/app/{javascript/stylesheets/flashes.scss → assets/stylesheets/rails_mini_profiler/flashes.css} +5 -3
  17. data/app/{javascript/stylesheets/navbar.scss → assets/stylesheets/rails_mini_profiler/navbar.css} +14 -8
  18. data/app/assets/stylesheets/rails_mini_profiler/profiled_requests.css +180 -0
  19. data/app/{javascript/stylesheets/traces.scss → assets/stylesheets/rails_mini_profiler/traces.css} +22 -17
  20. data/app/controllers/rails_mini_profiler/application_controller.rb +4 -9
  21. data/app/controllers/rails_mini_profiler/profiled_requests_controller.rb +10 -23
  22. data/app/helpers/rails_mini_profiler/application_helper.rb +0 -11
  23. data/app/models/rails_mini_profiler/application_record.rb +1 -1
  24. data/app/models/rails_mini_profiler/controller_trace.rb +3 -7
  25. data/app/models/rails_mini_profiler/flamegraph.rb +0 -4
  26. data/app/models/rails_mini_profiler/instantiation_trace.rb +3 -7
  27. data/app/models/rails_mini_profiler/profiled_request.rb +15 -21
  28. data/app/models/rails_mini_profiler/render_partial_trace.rb +3 -7
  29. data/app/models/rails_mini_profiler/render_template_trace.rb +3 -7
  30. data/app/models/rails_mini_profiler/rmp_trace.rb +3 -7
  31. data/app/models/rails_mini_profiler/sequel_trace.rb +3 -7
  32. data/app/models/rails_mini_profiler/trace.rb +3 -7
  33. data/app/presenters/rails_mini_profiler/profiled_request_presenter.rb +15 -8
  34. data/app/views/layouts/rails_mini_profiler/application.html.erb +12 -1
  35. data/app/views/layouts/rails_mini_profiler/flamegraph.html.erb +8 -1
  36. data/app/views/rails_mini_profiler/badge.html.erb +2 -2
  37. data/app/views/rails_mini_profiler/profiled_requests/index.html.erb +58 -8
  38. data/app/views/rails_mini_profiler/profiled_requests/show.html.erb +1 -1
  39. data/app/views/rails_mini_profiler/shared/_navbar.html.erb +1 -1
  40. data/db/migrate/20210621185018_create_rmp.rb +6 -8
  41. data/lib/generators/rails_mini_profiler/install_generator.rb +0 -24
  42. data/lib/generators/rails_mini_profiler/templates/rails_mini_profiler.rb.erb +7 -23
  43. data/lib/rails_mini_profiler/badge.rb +1 -23
  44. data/lib/rails_mini_profiler/configuration.rb +4 -28
  45. data/lib/rails_mini_profiler/engine.rb +4 -15
  46. data/lib/rails_mini_profiler/errors.rb +8 -0
  47. data/lib/rails_mini_profiler/guard.rb +7 -18
  48. data/lib/rails_mini_profiler/logger.rb +0 -5
  49. data/lib/rails_mini_profiler/middleware.rb +4 -4
  50. data/lib/rails_mini_profiler/models/base_model.rb +0 -5
  51. data/lib/rails_mini_profiler/models/trace.rb +9 -0
  52. data/lib/rails_mini_profiler/redirect.rb +1 -9
  53. data/lib/rails_mini_profiler/request_context.rb +7 -31
  54. data/lib/rails_mini_profiler/request_wrapper.rb +8 -44
  55. data/lib/rails_mini_profiler/storage.rb +29 -0
  56. data/lib/rails_mini_profiler/tracers.rb +85 -0
  57. data/lib/rails_mini_profiler/version.rb +1 -1
  58. data/lib/rails_mini_profiler.rb +9 -33
  59. metadata +30 -127
  60. data/LICENSE +0 -20
  61. data/app/javascript/images/check.svg +0 -3
  62. data/app/javascript/images/chevron.svg +0 -3
  63. data/app/javascript/images/filter.svg +0 -1
  64. data/app/javascript/images/search.svg +0 -9
  65. data/app/javascript/js/checklist_controller.js +0 -48
  66. data/app/javascript/js/enable_controller.js +0 -24
  67. data/app/javascript/js/filter_controller.js +0 -44
  68. data/app/javascript/js/search_controller.js +0 -18
  69. data/app/javascript/js/select_controller.js +0 -47
  70. data/app/javascript/packs/rails-mini-profiler.js +0 -88
  71. data/app/javascript/stylesheets/components/page_header/page_header.scss +0 -3
  72. data/app/javascript/stylesheets/components/pagination.scss +0 -55
  73. data/app/javascript/stylesheets/components/profiled_request_table/placeholder.scss +0 -33
  74. data/app/javascript/stylesheets/components/profiled_request_table/profiled_request_table.scss +0 -179
  75. data/app/javascript/stylesheets/flamegraph.scss +0 -10
  76. data/app/javascript/stylesheets/profiled_requests.scss +0 -89
  77. data/app/javascript/stylesheets/rails-mini-profiler.scss +0 -205
  78. data/app/search/rails_mini_profiler/base_search.rb +0 -67
  79. data/app/search/rails_mini_profiler/profiled_request_search.rb +0 -34
  80. data/app/views/models/_flamegraph.json.jb +0 -3
  81. data/app/views/models/_profiled_request.jb +0 -3
  82. data/app/views/models/_trace.jb +0 -3
  83. data/app/views/rails_mini_profiler/flamegraphs/show.json.jb +0 -3
  84. data/app/views/rails_mini_profiler/profiled_requests/index.json.jb +0 -3
  85. data/app/views/rails_mini_profiler/profiled_requests/shared/header/_header.erb +0 -20
  86. data/app/views/rails_mini_profiler/profiled_requests/shared/table/_placeholder.erb +0 -12
  87. data/app/views/rails_mini_profiler/profiled_requests/shared/table/_table.erb +0 -14
  88. data/app/views/rails_mini_profiler/profiled_requests/shared/table/_table_head.erb +0 -125
  89. data/app/views/rails_mini_profiler/profiled_requests/shared/table/_table_row.erb +0 -21
  90. data/app/views/rails_mini_profiler/profiled_requests/show.json.jb +0 -5
  91. data/app/views/rails_mini_profiler/shared/_head.erb +0 -13
  92. data/lib/generators/rails_mini_profiler/templates/rails_mini_profiler.js.erb +0 -13
  93. data/lib/rails_mini_profiler/configuration/storage.rb +0 -47
  94. data/lib/rails_mini_profiler/configuration/user_interface.rb +0 -48
  95. data/lib/rails_mini_profiler/tracing/controller_tracer.rb +0 -15
  96. data/lib/rails_mini_profiler/tracing/null_trace.rb +0 -7
  97. data/lib/rails_mini_profiler/tracing/sequel_tracer.rb +0 -37
  98. data/lib/rails_mini_profiler/tracing/sequel_tracker.rb +0 -37
  99. data/lib/rails_mini_profiler/tracing/subscriptions.rb +0 -34
  100. data/lib/rails_mini_profiler/tracing/trace.rb +0 -45
  101. data/lib/rails_mini_profiler/tracing/trace_factory.rb +0 -37
  102. data/lib/rails_mini_profiler/tracing/tracer.rb +0 -31
  103. data/lib/rails_mini_profiler/tracing/view_tracer.rb +0 -12
  104. data/lib/rails_mini_profiler/tracing.rb +0 -11
  105. data/public/rails_mini_profiler/speedscope/LICENSE +0 -21
  106. data/public/rails_mini_profiler/speedscope/demangle-cpp.1768f4cc.js +0 -4
  107. data/public/rails_mini_profiler/speedscope/demangle-cpp.1768f4cc.js.map +0 -1
  108. data/public/rails_mini_profiler/speedscope/favicon-16x16.f74b3187.png +0 -0
  109. data/public/rails_mini_profiler/speedscope/favicon-32x32.bc503437.png +0 -0
  110. data/public/rails_mini_profiler/speedscope/file-format-schema.json +0 -324
  111. data/public/rails_mini_profiler/speedscope/import.e3a73ef4.js +0 -117
  112. data/public/rails_mini_profiler/speedscope/import.e3a73ef4.js.map +0 -1
  113. data/public/rails_mini_profiler/speedscope/index.html +0 -2
  114. data/public/rails_mini_profiler/speedscope/release.txt +0 -3
  115. data/public/rails_mini_profiler/speedscope/reset.8c46b7a1.css +0 -2
  116. data/public/rails_mini_profiler/speedscope/reset.8c46b7a1.css.map +0 -1
  117. data/public/rails_mini_profiler/speedscope/source-map.438fa06b.js +0 -24
  118. data/public/rails_mini_profiler/speedscope/source-map.438fa06b.js.map +0 -1
  119. data/public/rails_mini_profiler/speedscope/speedscope.026f36b0.js +0 -200
  120. data/public/rails_mini_profiler/speedscope/speedscope.026f36b0.js.map +0 -1
  121. data/vendor/assets/images/bookmark.svg +0 -10
  122. data/vendor/assets/images/chart.svg +0 -12
  123. data/vendor/assets/images/check.svg +0 -3
  124. data/vendor/assets/images/chevron.svg +0 -3
  125. data/vendor/assets/images/delete.svg +0 -9
  126. data/vendor/assets/images/filter.svg +0 -1
  127. data/vendor/assets/images/graph.svg +0 -11
  128. data/vendor/assets/images/logo.svg +0 -18
  129. data/vendor/assets/images/logo_variant.svg +0 -32
  130. data/vendor/assets/images/search.svg +0 -9
  131. data/vendor/assets/images/setting.svg +0 -10
  132. data/vendor/assets/images/show.svg +0 -11
  133. data/vendor/assets/javascripts/rails-mini-profiler.css +0 -1
  134. data/vendor/assets/javascripts/rails-mini-profiler.js +0 -1
@@ -0,0 +1,180 @@
1
+ /*
2
+ Place all the styles related to the matching controller here.
3
+ They will automatically be included in application.css.
4
+ */
5
+
6
+
7
+ main {
8
+ width: 100%;
9
+
10
+ display: flex;
11
+ justify-content: center;
12
+ }
13
+
14
+ .main-section {
15
+ width: var(--main-width);
16
+ }
17
+
18
+ .placeholder {
19
+ display: flex;
20
+ flex-direction: column;
21
+ justify-content: center;
22
+ align-items: center;
23
+ width: 100%;
24
+ height: 450px;
25
+ }
26
+
27
+ .placeholder-image {
28
+ height: 30%;
29
+ width: 30%;
30
+ -webkit-filter: grayscale(1) brightness(2.5);
31
+ }
32
+
33
+ .placeholder-text {
34
+ text-align: center;
35
+ color: var(--grey-400);
36
+ }
37
+
38
+ .profiled-requests-actions {
39
+ display: flex;
40
+ padding: 1rem 0;
41
+ justify-content: space-between;
42
+ align-items: center;
43
+ }
44
+
45
+ .search-field {
46
+ padding: 0.5rem .5rem;
47
+ border-radius: .25em;
48
+
49
+ border: 1px solid var(--grey-400);
50
+ color: var(--grey-700) ;
51
+ }
52
+
53
+ .clear-action button {
54
+ background: var(--red-500);
55
+ color: white;
56
+ }
57
+
58
+ .table {
59
+ width: 100%;
60
+ /* Hack to get table row borders, see https://stackoverflow.com/a/2586780/2553104 */
61
+ border-collapse: collapse;
62
+ border-radius: 5px;
63
+ border: hidden 1px var(--border-color);
64
+ box-shadow: 0 0 0 1px var(--border-color);
65
+ }
66
+
67
+ .table thead tr {
68
+ color: var(--grey-400);
69
+ }
70
+
71
+ .table thead th {
72
+ font-weight: 400;
73
+ }
74
+
75
+ .table tr {
76
+ border: solid 1px var(--border-color);
77
+ color: var(--grey-700);
78
+ cursor: pointer;
79
+ }
80
+
81
+ .table tr:nth-child(even) {
82
+ background: var(--grey-50);
83
+ }
84
+
85
+ .table tbody tr:hover {
86
+ background: var(--grey-100);
87
+ }
88
+
89
+ .table th,
90
+ .table td {
91
+ padding: 0.5rem 1rem;
92
+ }
93
+
94
+ .request-path {
95
+ max-width: 300px;
96
+
97
+ white-space: nowrap;
98
+ overflow: hidden;
99
+ text-overflow: ellipsis;
100
+ }
101
+
102
+ .request-buttons {
103
+ z-index: 1;
104
+ text-align: right;
105
+ }
106
+
107
+ .request-buttons a {
108
+ text-decoration: none;
109
+ padding: 0 .25rem;
110
+ color: var(--grey-700);
111
+ }
112
+
113
+ .request-buttons a:active,
114
+ .request-buttons a:focus-visible,
115
+ .request-buttons a:hover {
116
+ color: var(--blue-500);
117
+ }
118
+
119
+ .request-buttons a.link-disabled {
120
+ cursor: default;
121
+ pointer-events: none;
122
+ text-decoration: none;
123
+ color: var(--grey-200);
124
+ }
125
+
126
+ .request-details-data {
127
+ display: flex;
128
+
129
+ margin: 0;
130
+ padding: 0;
131
+ }
132
+
133
+ .data-item {
134
+ display: flex;
135
+ flex-direction: column;
136
+ align-items: start;
137
+ list-style: none;
138
+
139
+ margin-right: 3rem;
140
+ padding: 0;
141
+ }
142
+
143
+ .data-item small {
144
+ color: var(--grey-400);
145
+ }
146
+
147
+ .data-item span {
148
+ margin: .25rem 0;
149
+ }
150
+
151
+ [class*='request-status-2'],
152
+ [class*='request-method-get'] {
153
+ color: white;
154
+ background: var(--green-400) !important;
155
+ }
156
+
157
+ [class*='request-status-4'],
158
+ [class*='request-method-put'],
159
+ [class*='request-method-patch'] {
160
+ color: white;
161
+ background: var(--yellow-400) !important;
162
+ }
163
+
164
+ [class*='request-status-5'],
165
+ [class*='request-method-delete'] {
166
+ color: white;
167
+ background: var(--red-500) !important;
168
+ }
169
+
170
+ .request-details-actions {
171
+ margin: 0;
172
+ padding: 2em 0;
173
+ display: flex;
174
+ align-items: center;
175
+ justify-content: space-between;
176
+ }
177
+
178
+ .flamegraph-button button {
179
+ background: var(--grey-200);
180
+ }
@@ -1,14 +1,19 @@
1
+ /*
2
+ Place all the styles related to the matching controller here.
3
+ They will automatically be included in application.css.
4
+ */
5
+
1
6
  .trace-list {
2
- padding: 0;
3
7
  margin: 0;
8
+ padding: 0;
4
9
  }
5
10
 
6
11
  .trace {
12
+ list-style: none;
7
13
  display: flex;
14
+ padding: .25em 0;
8
15
  align-items: center;
9
16
  justify-content: flex-start;
10
- padding: 0.25em 0;
11
- list-style: none;
12
17
  }
13
18
 
14
19
  .trace:nth-child(odd) {
@@ -17,11 +22,11 @@
17
22
 
18
23
  .trace .trace-bar {
19
24
  position: relative;
25
+ margin: 0;
20
26
  height: 16px;
21
27
  padding: 0;
22
- margin: 0;
23
- background: linear-gradient(to top right, var(--grey-500), var(--grey-400));
24
28
  cursor: pointer;
29
+ background: linear-gradient(to top right, var(--grey-500), var(--grey-400));
25
30
  }
26
31
 
27
32
  .instantiation-trace .trace-bar {
@@ -42,14 +47,14 @@
42
47
  }
43
48
 
44
49
  .trace-name {
45
- overflow: hidden;
46
- box-sizing: border-box;
47
- padding: 0 0.5em;
48
50
  margin: 0;
49
- color: var(--grey-400);
51
+ box-sizing: border-box;
52
+ padding: 0 .5em;
53
+ overflow: hidden;
50
54
  font-size: 14px;
51
55
  text-align: right;
52
56
  text-overflow: ellipsis;
57
+ color: var(--grey-400)
53
58
  }
54
59
 
55
60
  .trace-payload {
@@ -57,26 +62,26 @@
57
62
  }
58
63
 
59
64
  .sequel-trace-query {
60
- overflow: auto;
61
- max-height: 100px;
62
65
  padding: 1em 1em;
63
66
  background: var(--grey-100);
67
+ overflow: auto;
68
+ max-height: 100px;
64
69
  white-space: pre-wrap;
65
70
  }
66
71
 
67
72
  .sequel-trace-binds {
68
- overflow: auto;
69
- max-height: 100px;
70
- padding: 0.5em 1em;
71
73
  margin: 0 0 1em 0;
72
- background: var(--grey-50);
74
+ padding: .5em 0;
73
75
  font-size: 12px;
76
+ overflow: auto;
77
+ max-height: 100px;
74
78
  white-space: pre-wrap;
79
+ background: var(--grey-50);
75
80
  }
76
81
 
77
82
  .trace-table {
78
- width: 100%;
79
- border: hidden 1px var(--border-color);
80
83
  margin-top: 1em;
84
+ width: 100%;
81
85
  border-collapse: collapse;
86
+ border: hidden 1px var(--border-color);
82
87
  }
@@ -1,10 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module RailsMiniProfiler
4
- class ApplicationController < ActionController::Base
5
- include Pagy::Backend
6
-
7
- rescue_from ActiveRecord::RecordNotFound, with: ->(error) { handle(error, 404) }
4
+ class ApplicationController < ::ApplicationController
5
+ rescue_from ActiveRecord::RecordNotFound, with: :not_found
8
6
 
9
7
  before_action :check_current_user
10
8
 
@@ -19,11 +17,8 @@ module RailsMiniProfiler
19
17
 
20
18
  private
21
19
 
22
- def handle(error, status = 500)
23
- respond_to do |format|
24
- format.html { redirect_back(fallback_location: profiled_requests_path, alert: error.to_s) }
25
- format.json { render status: status, json: { message: error.to_s } }
26
- end
20
+ def not_found(error)
21
+ redirect_back(fallback_location: profiled_requests_path, alert: error.to_s)
27
22
  end
28
23
 
29
24
  def check_current_user
@@ -7,15 +7,16 @@ module RailsMiniProfiler
7
7
  before_action :set_profiled_request, only: %i[show destroy]
8
8
 
9
9
  def index
10
- @profiled_requests = ProfiledRequest.where(user_id: user_id).order(id: :desc)
11
- search = ProfiledRequestSearch.new(index_params, scope: @profiled_requests)
12
- @pagy, @profiled_requests = pagy(search.results, items: configuration.ui.page_size)
10
+ @profiled_requests = ProfiledRequest
11
+ .includes(:flamegraph)
12
+ .where(user_id: user_id).order(id: :desc)
13
+ @profiled_requests = @profiled_requests.where('request_path LIKE ?', "%#{params[:path]}%") if params[:path]
13
14
  @profiled_requests = @profiled_requests.map { |request| present(request) }
14
15
  end
15
16
 
16
17
  def show
17
18
  @traces = @profiled_request.traces
18
- @traces = @traces.where("#{payload_column} LIKE ?", "%#{params[:search]}%") if params[:search]
19
+ @traces = @traces.where('payload LIKE ?', "%#{params[:search]}%") if params[:search]
19
20
  @traces = @traces
20
21
  .order(:start)
21
22
  .map { |trace| present(trace, profiled_request: @profiled_request) }
@@ -29,21 +30,16 @@ module RailsMiniProfiler
29
30
 
30
31
  def destroy_all
31
32
  ProfiledRequest.transaction do
32
- profiled_requests = ProfiledRequest.where(user_id: user_id)
33
- profiled_requests = ProfiledRequestSearch.new(index_params, scope: profiled_requests).results
34
- Flamegraph.joins(:profiled_request).merge(profiled_requests).delete_all
35
- Trace.joins(:profiled_request).merge(profiled_requests).delete_all
36
- profiled_requests.delete_all
33
+ requests_table_name = RailsMiniProfiler.storage_configuration.profiled_requests_table.to_sym
34
+ Flamegraph.joins(:profiled_request).where(requests_table_name => { user_id: user_id }).delete_all
35
+ Trace.joins(:profiled_request).where(requests_table_name => { user_id: user_id }).delete_all
36
+ ProfiledRequest.where(requests_table_name => { user_id: user_id }).delete_all
37
37
  end
38
- redirect_to profiled_requests_url, notice: 'Profiled requests cleared', status: :see_other
38
+ redirect_to profiled_requests_url, notice: 'Profiled Requests cleared'
39
39
  end
40
40
 
41
41
  private
42
42
 
43
- def index_params
44
- params.permit(:path, :duration, id: [], method: [], media_type: [], status: [])
45
- end
46
-
47
43
  def user_id
48
44
  @user_id ||= User.get(request.env)
49
45
  end
@@ -55,14 +51,5 @@ module RailsMiniProfiler
55
51
  def configuration
56
52
  @configuration ||= RailsMiniProfiler.configuration
57
53
  end
58
-
59
- def payload_column
60
- if ActiveRecord::Base.connection.adapter_name == 'PostgreSQL'
61
- # Cast json field to text to have access to the LIKE operator
62
- 'payload::text'
63
- else
64
- 'payload'
65
- end
66
- end
67
54
  end
68
55
  end
@@ -2,22 +2,11 @@
2
2
 
3
3
  module RailsMiniProfiler
4
4
  module ApplicationHelper
5
- include Pagy::Frontend
6
-
7
5
  def present(model, presenter_class = nil, **kwargs)
8
6
  klass = presenter_class || "#{model.class}Presenter".constantize
9
7
  presenter = klass.new(model, self, **kwargs)
10
8
  yield(presenter) if block_given?
11
9
  presenter
12
10
  end
13
-
14
- def inline_svg(path, options = {})
15
- if defined?(Webpacker::Engine)
16
- path = "media/images/#{path}"
17
- inline_svg_pack_tag(path, options)
18
- else
19
- inline_svg_tag(path, options)
20
- end
21
- end
22
11
  end
23
12
  end
@@ -3,7 +3,7 @@
3
3
  module RailsMiniProfiler
4
4
  class ApplicationRecord < ActiveRecord::Base
5
5
  if RailsMiniProfiler.storage_configuration.database.present?
6
- establish_connection(RailsMiniProfiler.storage_configuration.database)
6
+ establish_connection(RailsMiniProfiler.storage_configuration.database.present?)
7
7
  end
8
8
 
9
9
  self.abstract_class = true
@@ -7,19 +7,15 @@
7
7
  # id :integer not null, primary key
8
8
  # rmp_profiled_request_id :bigint not null
9
9
  # name :string
10
- # start :bigint
11
- # finish :bigint
10
+ # start :integer
11
+ # finish :integer
12
12
  # duration :integer
13
- # allocations :bigint
13
+ # allocations :integer
14
14
  # payload :json
15
15
  # backtrace :json
16
16
  # created_at :datetime not null
17
17
  # updated_at :datetime not null
18
18
  #
19
- # Indexes
20
- #
21
- # index_rmp_traces_on_rmp_profiled_request_id (rmp_profiled_request_id)
22
- #
23
19
  module RailsMiniProfiler
24
20
  class ControllerTrace < Trace
25
21
  store :payload, accessors: %i[view_runtime db_runtime]
@@ -10,10 +10,6 @@
10
10
  # created_at :datetime not null
11
11
  # updated_at :datetime not null
12
12
  #
13
- # Indexes
14
- #
15
- # index_rmp_flamegraphs_on_rmp_profiled_request_id (rmp_profiled_request_id)
16
- #
17
13
  module RailsMiniProfiler
18
14
  class Flamegraph < RailsMiniProfiler::ApplicationRecord
19
15
  self.table_name = RailsMiniProfiler.storage_configuration.flamegraphs_table
@@ -7,19 +7,15 @@
7
7
  # id :integer not null, primary key
8
8
  # rmp_profiled_request_id :bigint not null
9
9
  # name :string
10
- # start :bigint
11
- # finish :bigint
10
+ # start :integer
11
+ # finish :integer
12
12
  # duration :integer
13
- # allocations :bigint
13
+ # allocations :integer
14
14
  # payload :json
15
15
  # backtrace :json
16
16
  # created_at :datetime not null
17
17
  # updated_at :datetime not null
18
18
  #
19
- # Indexes
20
- #
21
- # index_rmp_traces_on_rmp_profiled_request_id (rmp_profiled_request_id)
22
- #
23
19
  module RailsMiniProfiler
24
20
  class InstantiationTrace < Trace
25
21
  store :payload, accessors: %i[record_count class_name]
@@ -4,27 +4,21 @@
4
4
  #
5
5
  # Table name: rmp_profiled_requests
6
6
  #
7
- # id :integer not null, primary key
8
- # user_id :string
9
- # start :bigint
10
- # finish :bigint
11
- # duration :integer
12
- # allocations :bigint
13
- # request_path :string
14
- # request_query_string :string
15
- # request_method :string
16
- # request_headers :json
17
- # request_body :text
18
- # response_status :integer
19
- # response_body :text
20
- # response_headers :json
21
- # response_media_type :string
22
- # created_at :datetime not null
23
- # updated_at :datetime not null
24
- #
25
- # Indexes
26
- #
27
- # index_rmp_profiled_requests_on_created_at (created_at)
7
+ # id :integer not null, primary key
8
+ # user_id :string
9
+ # start :integer
10
+ # finish :integer
11
+ # duration :integer
12
+ # allocations :integer
13
+ # request_path :string
14
+ # request_method :string
15
+ # request_headers :json
16
+ # request_body :json
17
+ # response_status :integer
18
+ # response_body :json
19
+ # response_headers :json
20
+ # created_at :datetime not null
21
+ # updated_at :datetime not null
28
22
  #
29
23
  module RailsMiniProfiler
30
24
  class ProfiledRequest < RailsMiniProfiler::ApplicationRecord
@@ -7,19 +7,15 @@
7
7
  # id :integer not null, primary key
8
8
  # rmp_profiled_request_id :bigint not null
9
9
  # name :string
10
- # start :bigint
11
- # finish :bigint
10
+ # start :integer
11
+ # finish :integer
12
12
  # duration :integer
13
- # allocations :bigint
13
+ # allocations :integer
14
14
  # payload :json
15
15
  # backtrace :json
16
16
  # created_at :datetime not null
17
17
  # updated_at :datetime not null
18
18
  #
19
- # Indexes
20
- #
21
- # index_rmp_traces_on_rmp_profiled_request_id (rmp_profiled_request_id)
22
- #
23
19
  module RailsMiniProfiler
24
20
  class RenderPartialTrace < Trace
25
21
  store :payload, accessors: %i[identifier]
@@ -7,19 +7,15 @@
7
7
  # id :integer not null, primary key
8
8
  # rmp_profiled_request_id :bigint not null
9
9
  # name :string
10
- # start :bigint
11
- # finish :bigint
10
+ # start :integer
11
+ # finish :integer
12
12
  # duration :integer
13
- # allocations :bigint
13
+ # allocations :integer
14
14
  # payload :json
15
15
  # backtrace :json
16
16
  # created_at :datetime not null
17
17
  # updated_at :datetime not null
18
18
  #
19
- # Indexes
20
- #
21
- # index_rmp_traces_on_rmp_profiled_request_id (rmp_profiled_request_id)
22
- #
23
19
  module RailsMiniProfiler
24
20
  class RenderTemplateTrace < Trace
25
21
  store :payload, accessors: %i[identifier]
@@ -7,19 +7,15 @@
7
7
  # id :integer not null, primary key
8
8
  # rmp_profiled_request_id :bigint not null
9
9
  # name :string
10
- # start :bigint
11
- # finish :bigint
10
+ # start :integer
11
+ # finish :integer
12
12
  # duration :integer
13
- # allocations :bigint
13
+ # allocations :integer
14
14
  # payload :json
15
15
  # backtrace :json
16
16
  # created_at :datetime not null
17
17
  # updated_at :datetime not null
18
18
  #
19
- # Indexes
20
- #
21
- # index_rmp_traces_on_rmp_profiled_request_id (rmp_profiled_request_id)
22
- #
23
19
  module RailsMiniProfiler
24
20
  class RmpTrace < Trace
25
21
  class << self
@@ -7,19 +7,15 @@
7
7
  # id :integer not null, primary key
8
8
  # rmp_profiled_request_id :bigint not null
9
9
  # name :string
10
- # start :bigint
11
- # finish :bigint
10
+ # start :integer
11
+ # finish :integer
12
12
  # duration :integer
13
- # allocations :bigint
13
+ # allocations :integer
14
14
  # payload :json
15
15
  # backtrace :json
16
16
  # created_at :datetime not null
17
17
  # updated_at :datetime not null
18
18
  #
19
- # Indexes
20
- #
21
- # index_rmp_traces_on_rmp_profiled_request_id (rmp_profiled_request_id)
22
- #
23
19
  module RailsMiniProfiler
24
20
  class SequelTrace < Trace
25
21
  store :payload, accessors: %i[name sql binds]
@@ -7,19 +7,15 @@
7
7
  # id :integer not null, primary key
8
8
  # rmp_profiled_request_id :bigint not null
9
9
  # name :string
10
- # start :bigint
11
- # finish :bigint
10
+ # start :integer
11
+ # finish :integer
12
12
  # duration :integer
13
- # allocations :bigint
13
+ # allocations :integer
14
14
  # payload :json
15
15
  # backtrace :json
16
16
  # created_at :datetime not null
17
17
  # updated_at :datetime not null
18
18
  #
19
- # Indexes
20
- #
21
- # index_rmp_traces_on_rmp_profiled_request_id (rmp_profiled_request_id)
22
- #
23
19
  module RailsMiniProfiler
24
20
  class Trace < RailsMiniProfiler::ApplicationRecord
25
21
  self.table_name = RailsMiniProfiler.storage_configuration.traces_table
@@ -15,14 +15,21 @@ module RailsMiniProfiler
15
15
  end
16
16
 
17
17
  def created_at
18
- from_time = Time.now
19
- created_at = model.created_at.in_time_zone(Time.zone)
20
- distance = if from_time - created_at < 5.minutes
21
- 'Now'
22
- else
23
- "#{distance_of_time_in_words(from_time, created_at)} ago"
24
- end
25
- time_tag(created_at) { content_tag('span', distance) }
18
+ time_tag(model.created_at.in_time_zone(Time.zone))
19
+ end
20
+
21
+ def flamegraph_icon
22
+ return nil unless RailsMiniProfiler.configuration.flamegraph_enabled
23
+
24
+ if model.flamegraph.present?
25
+ link_to(flamegraph_path(model.id), title: 'Show Flamegraph') do
26
+ inline_svg_tag('rails_mini_profiler/graph.svg')
27
+ end
28
+ else
29
+ link_to(flamegraph_path(model.id), title: 'No Flamegraph present for this request', class: 'link-disabled') do
30
+ inline_svg_tag('rails_mini_profiler/graph.svg')
31
+ end
32
+ end
26
33
  end
27
34
 
28
35
  def flamegraph_button
@@ -1,6 +1,17 @@
1
1
  <!DOCTYPE html>
2
2
  <html>
3
- <%= render 'rails_mini_profiler/shared/head' %>
3
+ <head>
4
+ <title>Rails Mini Profiler</title>
5
+ <%= csrf_meta_tags %>
6
+ <%= csp_meta_tag %>
7
+
8
+ <%= javascript_include_tag "rails_mini_profiler" %>
9
+ <%= stylesheet_link_tag "rails_mini_profiler/application", media: "all" %>
10
+ <link rel="preconnect" href="https://fonts.gstatic.com">
11
+ <script src="https://unpkg.com/@popperjs/core@2"></script>
12
+ <script src="https://unpkg.com/tippy.js@6"></script>
13
+ <link href="https://fonts.googleapis.com/css2?family=Open+Sans:ital,wght@0,300;0,400;0,600;0,700;0,800;1,300;1,400;1,600;1,700;1,800&display=swap" rel="stylesheet">
14
+ </head>
4
15
  <body>
5
16
 
6
17
  <%= render 'rails_mini_profiler/shared/navbar' %>
@@ -1,6 +1,13 @@
1
1
  <!DOCTYPE html>
2
2
  <html>
3
- <%= render 'rails_mini_profiler/shared/head' %>
3
+ <head>
4
+ <title>Rails Mini Profiler</title>
5
+ <%= csrf_meta_tags %>
6
+ <%= csp_meta_tag %>
7
+
8
+ <%= javascript_include_tag "rails_mini_profiler" %>
9
+ <%= stylesheet_link_tag "rails_mini_profiler/application", media: "all" %>
10
+ </head>
4
11
  <body>
5
12
 
6
13
  <main>