snitch_reporting 1.1.4 → 1.2.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 +4 -4
- data/app/assets/stylesheets/snitch_reporting/forms.scss +50 -0
- data/app/assets/stylesheets/snitch_reporting/navigation.scss +0 -49
- data/app/controllers/snitch_reporting/snitch_reports_controller.rb +14 -2
- data/app/models/snitch_reporting/snitch_report.rb +18 -5
- data/lib/snitch_reporting/version.rb +1 -1
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 64846e2c242ccd9b84512b6089c287128f336ce364a6b771fd4d08d0a03f4676
|
4
|
+
data.tar.gz: 7fbcec2fc85da6b4c8e8690c2794a2271a0f4ba2e192458f1778ae99af59c9a9
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: fccfce35ca00431986d349ec8e5e2cc092d7c80534f9d687d41a5718ebee87bab1145fec6a425e9b8360501c39bfc4acddbed5fa4ca46e3afdf29cf4f441b5ee
|
7
|
+
data.tar.gz: ad39ef70738ab939e0bd49a62f46b30299287b82bb78ef4f07da3f672a78c9671e088a2986a75b6b46930f5f5fbc97b7908bce0e644fb90777fbef753ffe7f27
|
@@ -33,4 +33,54 @@
|
|
33
33
|
}
|
34
34
|
}
|
35
35
|
}
|
36
|
+
|
37
|
+
.snitch-search-area {
|
38
|
+
display: flex;
|
39
|
+
position: relative;
|
40
|
+
flex-direction: row-reverse;
|
41
|
+
|
42
|
+
.filters {
|
43
|
+
display: none;
|
44
|
+
position: absolute;
|
45
|
+
top: 60px;
|
46
|
+
right: 0;
|
47
|
+
left: 0;
|
48
|
+
z-index: 100;
|
49
|
+
transition: all 0.3s;
|
50
|
+
box-shadow: 2px 2px 4px $border-grey;
|
51
|
+
border: 3px solid $border-grey;
|
52
|
+
border-radius: 4px;
|
53
|
+
background: white;
|
54
|
+
padding: 20px;
|
55
|
+
}
|
56
|
+
|
57
|
+
input[name=filter_string] {
|
58
|
+
box-shadow: 2px 2px 4px $border-grey;
|
59
|
+
border: 2px solid $border-grey;
|
60
|
+
border-radius: 4px;
|
61
|
+
padding: 10px;
|
62
|
+
width: 100%;
|
63
|
+
height: auto;
|
64
|
+
font-size: 32px;
|
65
|
+
}
|
66
|
+
|
67
|
+
button[type=submit] {
|
68
|
+
cursor: pointer;
|
69
|
+
box-shadow: 2px 2px 4px $border-grey;
|
70
|
+
border: 1px solid $border-grey;
|
71
|
+
border-radius: 6px;
|
72
|
+
background: linear-gradient($snitch-blue, darken($snitch-blue, 15%));
|
73
|
+
padding: 0 12px;
|
74
|
+
color: white;
|
75
|
+
font-size: 18px;
|
76
|
+
|
77
|
+
&:hover {
|
78
|
+
background: linear-gradient(darken($snitch-blue, 15%), $snitch-blue, $snitch-blue);
|
79
|
+
}
|
80
|
+
}
|
81
|
+
|
82
|
+
.filters.open {
|
83
|
+
display: block;
|
84
|
+
}
|
85
|
+
}
|
36
86
|
}
|
@@ -33,54 +33,5 @@
|
|
33
33
|
}
|
34
34
|
}
|
35
35
|
|
36
|
-
.snitch-search-area {
|
37
|
-
display: flex;
|
38
|
-
position: relative;
|
39
|
-
flex-direction: row-reverse;
|
40
|
-
|
41
|
-
.filters {
|
42
|
-
display: none;
|
43
|
-
position: absolute;
|
44
|
-
top: 60px;
|
45
|
-
right: 0;
|
46
|
-
left: 0;
|
47
|
-
z-index: 100;
|
48
|
-
transition: all 0.3s;
|
49
|
-
box-shadow: 2px 2px 4px $border-grey;
|
50
|
-
border: 3px solid $border-grey;
|
51
|
-
border-radius: 4px;
|
52
|
-
background: white;
|
53
|
-
padding: 20px;
|
54
|
-
}
|
55
|
-
|
56
|
-
input[name=filter_string] {
|
57
|
-
box-shadow: 2px 2px 4px $border-grey;
|
58
|
-
border: 2px solid $border-grey;
|
59
|
-
border-radius: 4px;
|
60
|
-
padding: 10px;
|
61
|
-
width: 100%;
|
62
|
-
font-size: 32px;
|
63
|
-
}
|
64
|
-
|
65
|
-
button[type=submit] {
|
66
|
-
cursor: pointer;
|
67
|
-
box-shadow: 2px 2px 4px $border-grey;
|
68
|
-
border: 1px solid $border-grey;
|
69
|
-
border-radius: 6px;
|
70
|
-
background: linear-gradient($snitch-blue, darken($snitch-blue, 15%));
|
71
|
-
padding: 0 12px;
|
72
|
-
color: white;
|
73
|
-
font-size: 18px;
|
74
|
-
|
75
|
-
&:hover {
|
76
|
-
background: linear-gradient(darken($snitch-blue, 15%), $snitch-blue, $snitch-blue);
|
77
|
-
}
|
78
|
-
}
|
79
|
-
|
80
|
-
.filters.open {
|
81
|
-
display: block;
|
82
|
-
}
|
83
|
-
}
|
84
|
-
|
85
36
|
.snitch-breadcrumbs {}
|
86
37
|
}
|
@@ -148,8 +148,9 @@ class ::SnitchReporting::SnitchReportsController < ApplicationController
|
|
148
148
|
@reports = @reports.resolved if @filters[:status] == :resolved
|
149
149
|
@reports = @reports.unresolved if @filters[:status] == :unresolved
|
150
150
|
@reports = @reports.search(@filters[:search]) if @filters[:search].present?
|
151
|
-
#
|
152
151
|
@reports = @reports.by_level(@filters[:log_level]) if @filters[:log_level].present?
|
152
|
+
|
153
|
+
@reports = @reports.by_tag(*@filters[:tag]) if @filters[:tag].any?
|
153
154
|
# @reports = @reports.by_severity(@filters[:severity_tags]) if @filters[:severity_tags].present?
|
154
155
|
# @reports = @reports.by_source(@filters[:source_tags]) if @filters[:source_tags].present?
|
155
156
|
#
|
@@ -200,6 +201,7 @@ class ::SnitchReporting::SnitchReportsController < ApplicationController
|
|
200
201
|
end
|
201
202
|
|
202
203
|
search_strings = []
|
204
|
+
tag_strings = []
|
203
205
|
filter_strings = temp_filter_string.split(" ").select do |filter_string|
|
204
206
|
search_strings << filter_string unless filter_string.include?(":")
|
205
207
|
filter_string.include?(":")
|
@@ -215,15 +217,25 @@ class ::SnitchReporting::SnitchReportsController < ApplicationController
|
|
215
217
|
@filters[filter.to_sym] = value.to_sym
|
216
218
|
elsif filter == "search"
|
217
219
|
search_strings << decode_string(secret_key, value)
|
220
|
+
elsif filter == "tag" || filter == "tags"
|
221
|
+
tag_strings << decode_string(secret_key, value)
|
218
222
|
else
|
219
223
|
@unknown_strings << filter_string
|
220
224
|
end
|
221
225
|
end
|
222
226
|
|
223
227
|
@filters[:search] = "\"#{search_strings.join(' ')}\"" if search_strings.any?
|
228
|
+
@filters[:tag] = tag_strings
|
224
229
|
|
225
230
|
new_filter_strings = @filters.each_with_object([]) do |(filter_string, filter_value), filter_array|
|
226
|
-
|
231
|
+
next unless filter_value.present?
|
232
|
+
if filter_value.is_a?(Array)
|
233
|
+
filter_value.each do |filter_value_i|
|
234
|
+
filter_array << "#{filter_string}:#{filter_value_i}"
|
235
|
+
end
|
236
|
+
else
|
237
|
+
filter_array << "#{filter_string}:#{filter_value}"
|
238
|
+
end
|
227
239
|
end
|
228
240
|
|
229
241
|
@filter_string = new_filter_strings.join(" ")
|
@@ -31,6 +31,18 @@ class SnitchReporting::SnitchReport < ApplicationRecord
|
|
31
31
|
scope :unignored, -> { where(ignored_at: nil) }
|
32
32
|
scope :by_level, ->(*level_tags) { where(log_level: level_tags) }
|
33
33
|
scope :search, ->(text) { where("CONCAT(error, ' ', message) ILIKE :text", text: "%#{text}%") }
|
34
|
+
scope :by_tag, lambda { |*tags|
|
35
|
+
scopes = []
|
36
|
+
tags.each do |tag|
|
37
|
+
if tag[0] == "!"
|
38
|
+
tag[0] = ""
|
39
|
+
scopes << "tags !~* '(\\[|,).*\"#{tag}\".*(,|\\])'"
|
40
|
+
else
|
41
|
+
scopes << "tags ~* '(\\[|,).*\"#{tag}\".*(,|\\])'"
|
42
|
+
end
|
43
|
+
end
|
44
|
+
where(scopes.join(" AND "))
|
45
|
+
}
|
34
46
|
|
35
47
|
enum log_level: {
|
36
48
|
debug: 1,
|
@@ -54,7 +66,7 @@ class SnitchReporting::SnitchReport < ApplicationRecord
|
|
54
66
|
env, klass, base_exception = extract_base_variables(exceptions, arg_hash, arg_values)
|
55
67
|
always_notify = arg_hash.delete(:always_notify)
|
56
68
|
|
57
|
-
report_title = retrieve_report_title(base_exception, arg_hash)
|
69
|
+
report_title = retrieve_report_title(base_exception, arg_hash, arg_values)
|
58
70
|
report = retrieve_or_create_existing_report(log_level, santize_title(report_title), env, base_exception, arg_hash)
|
59
71
|
return SnitchReporting::SnitchReport.error("Failed to save report.", report.errors.full_messages) unless report.persisted?
|
60
72
|
|
@@ -160,13 +172,14 @@ class SnitchReporting::SnitchReport < ApplicationRecord
|
|
160
172
|
end
|
161
173
|
end
|
162
174
|
|
163
|
-
def retrieve_report_title(exception, arg_hash)
|
175
|
+
def retrieve_report_title(exception, arg_hash, arg_values)
|
164
176
|
report_title = arg_hash[:title].presence
|
165
177
|
report_title ||= exception.try(:message).presence
|
166
178
|
report_title ||= exception.try(:body).presence
|
167
|
-
report_title ||=
|
179
|
+
report_title ||= arg_values&.find { |arg_value| arg_value.is_a?(String) }
|
168
180
|
report_title ||= (arg_hash[:klass] || arg_hash[:class]).presence
|
169
181
|
report_title ||= trace_from_exception(exception).find { |row| row.include?("/app/") }
|
182
|
+
report_title ||= exception.try(:class).presence
|
170
183
|
report_title
|
171
184
|
end
|
172
185
|
|
@@ -267,7 +280,7 @@ class SnitchReporting::SnitchReport < ApplicationRecord
|
|
267
280
|
end
|
268
281
|
|
269
282
|
def tags
|
270
|
-
super || []
|
283
|
+
(super || []).uniq
|
271
284
|
end
|
272
285
|
|
273
286
|
def tags=(new_tags)
|
@@ -277,7 +290,7 @@ class SnitchReporting::SnitchReport < ApplicationRecord
|
|
277
290
|
def add_tags(new_tags)
|
278
291
|
return if new_tags.blank?
|
279
292
|
|
280
|
-
update(tags: tags + [new_tags])
|
293
|
+
update(tags: (tags + [new_tags]).compact.flatten.uniq)
|
281
294
|
end
|
282
295
|
|
283
296
|
def resolved?; resolved_at?; end
|