Class: NdrError::Log
- Inherits:
-
Object
- Object
- NdrError::Log
- Includes:
- BacktraceCompression, Fuzzing, UuidBuilder
- Defined in:
- app/models/ndr_error/log.rb
Overview
Stores instances of logs. Child of NdrError::Fingerprint. Log records may be purged, whereas fingerprints are designed to be eternally persisted.
Class Method Summary collapse
- .filter_by_keywords(keywords) ⇒ Object
-
.perform_cleanup! ⇒ Object
Deletes all those errors that have been flagged for deletion and whose soft-delete grace period has ended.
- .text_columns ⇒ Object
Instance Method Summary collapse
-
#clock_drift? ⇒ Boolean
Returns true if clock drift of more than 3 seconds was present at the time of the error.
-
#error_string ⇒ Object
Formats error to be like the ruby error.
-
#flag_as_deleted!(time = Time.current) ⇒ Object
Performs a soft-delete of this log.
-
#md5_digest ⇒ Object
Creates (and caches) the md5 of this error, which is used to match to similar errors.
-
#md5_digest=(digest) ⇒ Object
Allow the digest to be set manually if so desired.
-
#next ⇒ Object
Returns the next historical occurence, or nil if there hasn’t been one.
-
#parameters ⇒ Object
Returns the params hash associated with the request.
-
#parameters_yml=(params) ⇒ Object
(also: #set_parameters_yml)
Store as much of ‘params’ as possible in the YAML parameters column.
-
#previous ⇒ Object
Returns the previous historical occurence, or nil if there wasn’t one.
-
#register_exception(exception) ⇒ Object
Copy across attributes from the exception object.
-
#register_parent(parent_print) ⇒ Object
If we have more details about a parent error, track that too so it can be mixed in to the MD5 digest.
-
#register_request(request) ⇒ Object
Stores parameters from the given request object as YAML.
-
#similar_errors ⇒ Object
returns all sibling occurences, including self.
Methods included from UuidBuilder
Methods included from Fuzzing
Methods included from BacktraceCompression
#application_trace, #backtrace, #backtrace=
Class Method Details
.filter_by_keywords(keywords) ⇒ Object
45 46 47 48 49 50 |
# File 'app/models/ndr_error/log.rb', line 45 def self.filter_by_keywords(keywords) fragment = text_columns.map { |column| "lower(#{column}) LIKE lower(:key)" }.join(' OR ') name_match = keywords.map { |part| sanitize_sql([fragment, key: "%#{part}%"]) }.join(' OR ') where(name_match) end |
.perform_cleanup! ⇒ Object
Deletes all those errors that have been flagged for deletion and whose soft-delete grace period has ended.
Returns true if any records were deleted.
56 57 58 59 60 61 62 63 |
# File 'app/models/ndr_error/log.rb', line 56 def self.perform_cleanup! destroys = deleted.map do |record| stamp_string = record.status.sub(/^[^\d]+/, '') record.destroy if Time.zone.parse(stamp_string) < NdrError.log_grace_period.ago end destroys.any? end |
.text_columns ⇒ Object
33 34 35 36 37 38 39 40 41 42 43 |
# File 'app/models/ndr_error/log.rb', line 33 def self.text_columns whitelist = %w[error_class description] column_name = NdrError.user_column.to_s user_column = columns_hash[column_name] raise SecurityError, 'User column missing!' unless user_column # allow the user column to be searched if it is textual: whitelist << column_name if user_column.type == :string whitelist end |
Instance Method Details
#clock_drift? ⇒ Boolean
Returns true if clock drift of more than 3 seconds was present at the time of the error.
147 148 149 |
# File 'app/models/ndr_error/log.rb', line 147 def clock_drift? clock_drift && clock_drift >= 3.0 end |
#error_string ⇒ Object
Formats error to be like the ruby error.
141 142 143 |
# File 'app/models/ndr_error/log.rb', line 141 def error_string [error_class, description].compact.join(': ') end |
#flag_as_deleted!(time = Time.current) ⇒ Object
Performs a soft-delete of this log.
87 88 89 |
# File 'app/models/ndr_error/log.rb', line 87 def flag_as_deleted!(time = Time.current) update_attribute(:status, "deleted at #{time.to_formatted_s(:db)}") end |
#md5_digest ⇒ Object
Creates (and caches) the md5 of this error, which is used to match to similar errors.
153 154 155 |
# File 'app/models/ndr_error/log.rb', line 153 def md5_digest @_digest ||= fuzz(description, backtrace, parent_print) end |
#md5_digest=(digest) ⇒ Object
Allow the digest to be set manually if so desired.
158 159 160 |
# File 'app/models/ndr_error/log.rb', line 158 def md5_digest=(digest) @_digest = digest end |
#next ⇒ Object
Returns the next historical occurence, or nil if there hasn’t been one.
80 81 82 83 84 |
# File 'app/models/ndr_error/log.rb', line 80 def next lookup = similar_errors.to_a index = lookup.index(self) lookup[0...index].last end |
#parameters ⇒ Object
Returns the params hash associated with the request.
136 137 138 |
# File 'app/models/ndr_error/log.rb', line 136 def parameters YAML.load(parameters_yml) end |
#parameters_yml=(params) ⇒ Object Also known as: set_parameters_yml
Store as much of ‘params’ as possible in the YAML parameters column.
114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 |
# File 'app/models/ndr_error/log.rb', line 114 def parameters_yml=(params) yml_dump = {}.to_yaml parts = params.sort_by { |_k, v| v.inspect.length } # `parts' was sorted by length so that we # can capture as many different parameters # as possible in the given column space: (1..parts.length).each do |length| sub_hash = Hash[parts.first(length)] sub_yml = sub_hash.to_yaml break if sub_yml.length >= 4000 yml_dump = sub_yml end self[:parameters_yml] = yml_dump end |
#previous ⇒ Object
Returns the previous historical occurence, or nil if there wasn’t one.
72 73 74 75 76 |
# File 'app/models/ndr_error/log.rb', line 72 def previous lookup = similar_errors.reverse index = lookup.index(self) lookup[0...index].last end |
#register_exception(exception) ⇒ Object
Copy across attributes from the exception object.
92 93 94 95 96 |
# File 'app/models/ndr_error/log.rb', line 92 def register_exception(exception) self.error_class = exception.class.to_s self.backtrace = exception.backtrace self.description = description_from(exception.) end |
#register_parent(parent_print) ⇒ Object
If we have more details about a parent error, track that too so it can be mixed in to the MD5 digest.
108 109 110 |
# File 'app/models/ndr_error/log.rb', line 108 def register_parent(parent_print) @parent_print = parent_print.id if parent_print end |
#register_request(request) ⇒ Object
Stores parameters from the given request object as YAML. Will attempt to store as many as possible of the parameters in the available 4000 chars.
101 102 103 104 |
# File 'app/models/ndr_error/log.rb', line 101 def register_request(request) extract_request_params(request) extract_request_attributes(request) end |
#similar_errors ⇒ Object
returns all sibling occurences, including self
66 67 68 |
# File 'app/models/ndr_error/log.rb', line 66 def similar_errors error_fingerprint.error_logs.not_deleted end |