Module: JsonLogging::PayloadBuilder
- Defined in:
- lib/json_logging/payload_builder.rb
Constant Summary collapse
- SYSTEM_CONTROLLED_KEYS =
[:tags, "tags", :severity, "severity", :timestamp, "timestamp", :message, "message", :context, "context"].freeze
Class Method Summary collapse
- .build_base_payload(msg, severity: nil, timestamp: nil) ⇒ Object
- .context_payload_portion(additional_context) ⇒ Object
- .empty_additional_context?(additional_context) ⇒ Boolean
- .merge_context(payload, additional_context:, tags: [], additional_context_sanitized: false, sanitize_tags: true) ⇒ Object
- .merge_context_skippable?(payload, additional_context:, tags:) ⇒ Boolean
- .merge_tags_only(payload, tags:, sanitize_tags:) ⇒ Object
- .payload_context_empty?(payload) ⇒ Boolean
- .tags_only_merge?(payload, additional_context:, tags:) ⇒ Boolean
Class Method Details
.build_base_payload(msg, severity: nil, timestamp: nil) ⇒ Object
7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
# File 'lib/json_logging/payload_builder.rb', line 7 def build_base_payload(msg, severity: nil, timestamp: nil) parsed = MessageParser.(msg) payload = {} if parsed.is_a?(Hash) payload.merge!(parsed) else payload["message"] = parsed end payload["severity"] = severity if severity payload["timestamp"] = if payload end |
.context_payload_portion(additional_context) ⇒ Object
82 83 84 85 86 87 88 |
# File 'lib/json_logging/payload_builder.rb', line 82 def context_payload_portion(additional_context) return {} unless additional_context.is_a?(Hash) additional_context.reject do |key, _| SYSTEM_CONTROLLED_KEYS.include?(key) || SYSTEM_CONTROLLED_KEYS.include?(key.to_s) end end |
.empty_additional_context?(additional_context) ⇒ Boolean
54 55 56 |
# File 'lib/json_logging/payload_builder.rb', line 54 def empty_additional_context?(additional_context) additional_context.nil? || (additional_context.respond_to?(:empty?) && additional_context.empty?) end |
.merge_context(payload, additional_context:, tags: [], additional_context_sanitized: false, sanitize_tags: true) ⇒ Object
23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
# File 'lib/json_logging/payload_builder.rb', line 23 def merge_context(payload, additional_context:, tags: [], additional_context_sanitized: false, sanitize_tags: true) return payload if merge_context_skippable?(payload, additional_context: additional_context, tags: ) return (payload, tags: , sanitize_tags: ) if (payload, additional_context: additional_context, tags: ) existing_context = payload["context"].is_a?(Hash) ? payload["context"] : {} sanitized_context = if additional_context_sanitized additional_context.is_a?(Hash) ? additional_context : {} elsif additional_context.is_a?(Hash) && !additional_context.empty? Sanitizer.sanitize_hash(additional_context) else additional_context || {} end user_context_filtered = sanitized_context.except(*SYSTEM_CONTROLLED_KEYS) deduped_additional = user_context_filtered.reject { |key, _| payload.key?(key) || payload.key?(key.to_s) } merged_context = existing_context.merge(deduped_additional) unless .empty? = Array(payload["tags"]) = ? .map { |tag| Sanitizer.sanitize_string(tag.to_s) } : payload["tags"] = ( + ).uniq end unless merged_context.empty? payload["context"] = merged_context.transform_keys(&:to_s) end payload end |
.merge_context_skippable?(payload, additional_context:, tags:) ⇒ Boolean
58 59 60 61 62 |
# File 'lib/json_logging/payload_builder.rb', line 58 def merge_context_skippable?(payload, additional_context:, tags:) .empty? && empty_additional_context?(additional_context) && payload_context_empty?(payload) end |
.merge_tags_only(payload, tags:, sanitize_tags:) ⇒ Object
75 76 77 78 79 80 |
# File 'lib/json_logging/payload_builder.rb', line 75 def (payload, tags:, sanitize_tags:) = Array(payload["tags"]) = ? .map { |tag| Sanitizer.sanitize_string(tag.to_s) } : payload["tags"] = ( + ).uniq payload end |
.payload_context_empty?(payload) ⇒ Boolean
64 65 66 67 |
# File 'lib/json_logging/payload_builder.rb', line 64 def payload_context_empty?(payload) existing_context = payload["context"] existing_context.nil? || (existing_context.respond_to?(:empty?) && existing_context.empty?) end |
.tags_only_merge?(payload, additional_context:, tags:) ⇒ Boolean
69 70 71 72 73 |
# File 'lib/json_logging/payload_builder.rb', line 69 def (payload, additional_context:, tags:) !.empty? && empty_additional_context?(additional_context) && payload_context_empty?(payload) end |