Class: GitlabExceptionNotification::Issue
- Inherits:
-
Object
- Object
- GitlabExceptionNotification::Issue
- Defined in:
- lib/gitlab_exception_notification/issue.rb
Instance Method Summary collapse
- #all ⇒ Object
- #create ⇒ Object
- #description ⇒ Object
- #exists? ⇒ Boolean
-
#initialize(env, exception, options = {}) ⇒ Issue
constructor
A new instance of Issue.
- #is_same_exception?(issue) ⇒ Boolean
- #summary ⇒ Object
-
#title ⇒ Object
The issue title.
- #update(id) ⇒ Object
Constructor Details
#initialize(env, exception, options = {}) ⇒ Issue
Returns a new instance of Issue.
5 6 7 8 9 10 11 12 13 14 15 16 |
# File 'lib/gitlab_exception_notification/issue.rb', line 5 def initialize(env, exception, ={}) @env = env @exception = exception @options = .reverse_merge(env['exception_notifier.options'] || {}) @kontroller = env['action_controller.instance'] || MissingController.new @request = ActionDispatch::Request.new(env) @data = (env['exception_notifier.exception_data'] || {}).merge([:data] || {}) @digest = digest @client = Gitlab.client(endpoint: [:gitlab_url], private_token: [:private_token]) @project_id = @client.project_search([:project_name]).first.id @issues = self.all end |
Instance Method Details
#all ⇒ Object
56 57 58 59 60 61 62 63 64 65 66 |
# File 'lib/gitlab_exception_notification/issue.rb', line 56 def all page = 1 i = @client.issues(@project_id, per_page: PER_PAGE, page: page, order_by: :updated_at, labels: [Rails.env, 'bug'].join(',')) @issues = i while i.count == PER_PAGE i = @client.issues(@project_id, per_page: PER_PAGE, page: page, order_by: :updated_at, labels: [Rails.env, 'bug'].join(',')) @issues += i page += 1 end return @issues.flatten end |
#create ⇒ Object
18 19 20 21 |
# File 'lib/gitlab_exception_notification/issue.rb', line 18 def create puts "create_issue with labels: #{[Rails.env, 'bug'].join(',').inspect}" @client.create_issue(@project_id, title, {description: description, labels: [Rails.env, 'bug'].join(',')}) end |
#description ⇒ Object
94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 |
# File 'lib/gitlab_exception_notification/issue.rb', line 94 def description # Get a 'mardowned' backtrace m_backtrace = "```#{SLINE} #{@exception.backtrace.join(SLINE)}#{SLINE}```" # Get the concerned file file = @exception.backtrace.first repo_file = file.gsub(/.*\/#{@options[:project_name]}\/([^:]*):(\d*)(:in.*)/, '\1#L\2') d = ["> (#{@exception.class}) #{@exception.} #{@kontroller ? 'in controller ' + @kontroller.controller_name + '#' + @kontroller.action_name : ''}"] d << "\n**Full path**: #{file}" d << "\n**File**: [#{repo_file}](#{repo_file})" { 'Summary': summary.map { |k, v| "- #{k}: #{v}"}.join(SLINE), 'session id': @request.ssl? ? "[FILTERED]" : (@request.session['session_id'] || (@request.env["rack.session.options"] and @request.env["rack.session.options"][:id])).inspect, 'data': @data, 'backtrace': m_backtrace, 'request headers': md_hash(@request.headers), 'environment': md_hash(@env.reject{|k, v| (REJECT_HEADERS =~ k).nil? }) }.reject{|k, v| v.nil? or v.blank?}.each do |k, v| d << "\n--------------------------------\n" d << "#### #{k.to_s.humanize}:\n" d << v.to_s end d << @digest d.join(SLINE) end |
#exists? ⇒ Boolean
48 49 50 51 52 53 54 |
# File 'lib/gitlab_exception_notification/issue.rb', line 48 def exists? # @issues = self.all rest = @issues.select do |i| is_same_exception?(i) end (rest.count > 0 ? rest.first.id : false) end |
#is_same_exception?(issue) ⇒ Boolean
43 44 45 46 |
# File 'lib/gitlab_exception_notification/issue.rb', line 43 def is_same_exception? issue return false if issue.nil? or issue.description.nil? issue.description.split(SLINE).last && issue.description.split(SLINE).last.strip == @digest end |
#summary ⇒ Object
80 81 82 83 84 85 86 87 88 89 90 91 92 |
# File 'lib/gitlab_exception_notification/issue.rb', line 80 def summary { 'URL': @request.url, 'HTTP Method': @request.request_method, 'IP address': @request.remote_ip, 'Parameters': md_hash(@request.filtered_parameters, STAB), 'Timestamp': Time.current, 'Server': Socket.gethostname, 'Rails root': (defined?(Rails) && Rails.respond_to?(:root) ? Rails.root : nil), 'Process': $$, 'session data': md_hash(@request.session.to_hash, STAB), } end |
#title ⇒ Object
The issue title
74 75 76 77 78 |
# File 'lib/gitlab_exception_notification/issue.rb', line 74 def title t = [] t << (@exception..length > 120 ? @exception.[0..120] + "..." : @exception.) t.join(' ') end |
#update(id) ⇒ Object
23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
# File 'lib/gitlab_exception_notification/issue.rb', line 23 def update(id) issue = @client.issue(@project_id, id) last = issue.updated_at.to_date if last < 1.hour.ago begin @client.edit_issue(@project_id, id, {state_event: "reopen", labels: [Rails.env, 'bug'].join(',')}) iss = @client.edit_issue(@project_id, id, {title: increment_title(issue)}) rescue Exception => e p "An error occured: #{e.inspect}" end else body = ":fire: This issue occured again #{Time.current}. \n#### Summary:\n #{summary.map { |k, v| "- #{k}: #{v}"}.join(SLINE)} " @client.reopen_issue(@project_id, id) @client.create_issue_note @project_id, id, body end end |