Module: Tinymon::Scrub

Defined in:
lib/tinymon/scrub.rb

Constant Summary collapse

SENSITIVE_TAG_KEY =
/password|token|secret|auth|card|cvv|ssn/i.freeze
DEFAULT_PATTERNS =
[
  /\b[A-Za-z0-9._%+\-]+@[A-Za-z0-9.\-]+\.[A-Za-z]{2,}\b/,            # email
  /\b(?:\d[ \-]?){12,15}\d\b/,                                        # card-like
  /\b[Bb]earer\s+[A-Za-z0-9._\-]+/,                                   # bearer
  /\bAuthorization\s*:\s*\S+/                                          # auth header
].freeze

Class Method Summary collapse

Class Method Details

.scrub_event(event, scrub_url_query: true, scrub_patterns: nil) ⇒ Object

Mutate the event hash in place. Returns it for chaining.



31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
# File 'lib/tinymon/scrub.rb', line 31

def scrub_event(event, scrub_url_query: true, scrub_patterns: nil)
  patterns = DEFAULT_PATTERNS + Array(scrub_patterns)

  if scrub_url_query && (req = event[:request] || event["request"])
    url_key = req.key?(:url) ? :url : "url"
    req[url_key] = strip_url_query(req[url_key]) if req[url_key]
  end

  if (exc = event[:exception] || event["exception"])
    val_key = exc.key?(:value) ? :value : "value"
    exc[val_key] = scrub_string(exc[val_key], patterns) if exc[val_key]
  end

  Array(event[:breadcrumbs] || event["breadcrumbs"]).each do |b|
    msg_key = b.key?(:message) ? :message : "message"
    b[msg_key] = scrub_string(b[msg_key], patterns) if b[msg_key]
  end

  tags = event[:tags] || event["tags"]
  if tags
    cleaned = {}
    tags.each { |k, v| cleaned[k] = SENSITIVE_TAG_KEY.match?(k.to_s) ? "[redacted]" : v }
    if event.key?(:tags)
      event[:tags] = cleaned
    else
      event["tags"] = cleaned
    end
  end

  event
end

.scrub_string(s, patterns) ⇒ Object



18
19
20
21
22
# File 'lib/tinymon/scrub.rb', line 18

def scrub_string(s, patterns)
  out = s.to_s.dup
  patterns.each { |re| out.gsub!(re, "[redacted]") }
  out
end

.strip_url_query(url) ⇒ Object



24
25
26
27
28
# File 'lib/tinymon/scrub.rb', line 24

def strip_url_query(url)
  return url if url.nil? || url.empty?
  i = url.index(/[?#]/)
  i.nil? ? url : url[0...i]
end