class Heavylog::Formatters::ECS

Constants

ECS_MAP

mapping from heavylog standard keys to ECS www.elastic.co/guide/en/ecs/current/ecs-reference.html

Public Instance Methods

call(data) click to toggle source
# File lib/heavylog/formatters/ecs.rb, line 31
def call(data)
  ECS_MAP.each do |original, correct|
    dig_set(data, correct.split("."), data.delete(original)) if data.key?(original)
  end

  dig_set(data, %w[event module], "heavylog")
  dig_set(data, %w[event category], "web")

  unless data.dig("event", "dataset")
    value = data.dig("heavylog", "controller") == "SidekiqLogger" ? "heavylog.sidekiq" : "heavylog.rails"
    dig_set(data, %w[event dataset], value)
  end

  if (code = data.dig("http", "response", "status_code"))
    dig_set(data, %w[event outcome], (200..399).cover?(code) ? "success" : "failure")
  end

  dig_set(data, %w[source ip], data.dig("source", "address")) unless data.dig("source", "ip")
  dig_set(data, %w[url path], data.dig("url", "original")) unless data.dig("url", "path")

  ::JSON.dump(data)
end

Private Instance Methods

dig_set(obj, keys, value) click to toggle source
# File lib/heavylog/formatters/ecs.rb, line 56
def dig_set(obj, keys, value)
  key = keys.first
  if keys.length == 1
    obj[key] = value
  else
    obj[key] = {} unless obj[key]
    dig_set(obj[key], keys.slice(1..-1), value)
  end
end