class AirbrakeClient

Constants

PROJECT_ROOT_RGX

Public Class Methods

new(config) click to toggle source
# File lib/integrations/airbrake_client.rb, line 13
def initialize(config)
  @key = config["api_key"]
  @project_id = config["project_id"]
  @environment = config["environment"]
  @errors = @key.nil? ? [] : errors()
  @deploys = @key.nil? ? [] : deploys()
end

Private Instance Methods

deploys() click to toggle source
# File lib/integrations/airbrake_client.rb, line 23
def deploys()
  fetch_deploys()["deploys"]
    .map do |deploy|
      {
        commit_id: deploy["version"].to_sym,
        environment: deploy["environment"],
        timestamp: DateTime.parse(deploy["createdAt"])
      }
    end
    .sort_by { |deploy| deploy[:timestamp] }
    .select { |deploy| deploy[:environment] == @environment }
end
errors() click to toggle source
# File lib/integrations/airbrake_client.rb, line 36
def errors()
  cached_errors = load_from_cache()

  errors = fetch_groups(cached_errors)["groups"]
    .flat_map(&method(:select_traces))
    .reject(&:nil?)
    .map do |trace|
      stack_trace = (trace["backtrace"] || [])
        .reject { |trace| trace["file"].nil? }
        .map do |trace|
          file = trace["file"].gsub(PROJECT_ROOT_RGX, "")
          line = trace["line"]
          function = trace["function"]

          {
            file: file,
            line: line,
            function: function
          }
        end

      {
        error_id: trace["id"].to_sym,
        first_time: DateTime.rfc3339(trace["createdAt"]),
        last_time: DateTime.rfc3339(trace["lastNoticeAt"]),
        link: "https://airbrake.io/projects/#{@project_id}/groups/#{trace["id"]}",
        environment: trace["context"]["environment"],
        type: trace["type"],
        message: trace["message"],
        total_occurrences: trace["noticeTotalCount"],
        stack_trace: stack_trace
      }
    end
    .concat(cached_errors)
    .select { |error| error[:environment] == @environment }
    .sort_by { |error| error[:last_time] }

  errors.each { |error| Store::Error::index(error) }
  Store::Error::cache()

  errors
end
fetch_deploys(page=1) click to toggle source
# File lib/integrations/airbrake_client.rb, line 120
def fetch_deploys(page=1)
  deploys = {"deploys" => [], "count" => 1}
  while deploys["deploys"].length < deploys["count"] do
    resp = JSON.parse(Net::HTTP.get(
      URI("https://airbrake.io/api/v4/projects/#{@project_id}/deploys?key=#{@key}&page=#{page}")
    ))

    deploys["count"] = resp["count"]
    deploys["deploys"].concat(resp["deploys"])

    page += 1
  end
  deploys
end
fetch_error(group_id) click to toggle source
# File lib/integrations/airbrake_client.rb, line 90
def fetch_error(group_id)
  JSON.parse(Net::HTTP.get(
    URI("https://airbrake.io/api/v4/projects/#{@project_id}/groups/#{group_id}/notices?key=#{@key}")
  ))
end
fetch_groups(cached_errors, page=1) click to toggle source
# File lib/integrations/airbrake_client.rb, line 96
def fetch_groups(cached_errors, page=1)
  errors = {"groups" => [], "count" => 1}
  while errors["groups"].length < errors["count"] do
    resp = JSON.parse(Net::HTTP.get(
      URI("https://airbrake.io/api/v4/projects/#{@project_id}/groups?key=#{@key}&page=#{page}")
    ))

    errors["count"] = resp["count"]

    while group = resp["groups"].shift() do
      if cached_errors.detect { |cached_item| cached_item[:error_id] == group["id"].to_sym }
        return errors
      else
        errors["groups"] << group
      end
    end

    page += 1
  end
  errors
rescue
  errors
end
select_traces(group) click to toggle source
# File lib/integrations/airbrake_client.rb, line 79
def select_traces(group)
  notices = fetch_error(group["id"])["notices"]
  error = notices.first["errors"].first
  group["backtrace"] = error["backtrace"]
  group["type"] = error["type"]
  group["message"] = error["message"]
  [group]
rescue
  []
end