summaryrefslogtreecommitdiff
path: root/lib/gitlab/error_tracking/error_repository.rb
diff options
context:
space:
mode:
Diffstat (limited to 'lib/gitlab/error_tracking/error_repository.rb')
-rw-r--r--lib/gitlab/error_tracking/error_repository.rb113
1 files changed, 113 insertions, 0 deletions
diff --git a/lib/gitlab/error_tracking/error_repository.rb b/lib/gitlab/error_tracking/error_repository.rb
new file mode 100644
index 00000000000..4ec636703d9
--- /dev/null
+++ b/lib/gitlab/error_tracking/error_repository.rb
@@ -0,0 +1,113 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module ErrorTracking
+ # Data access layer for errors and events related to Error Tracking feature.
+ class ErrorRepository
+ Pagination = Struct.new(:next, :prev)
+
+ # Generic database error
+ DatabaseError = Class.new(StandardError)
+ # Record was invalid
+ RecordInvalidError = Class.new(DatabaseError)
+
+ # Builds an instance of error repository backed by a strategy.
+ #
+ # @return [self]
+ def self.build(project)
+ strategy = ActiveRecordStrategy.new(project)
+
+ new(strategy)
+ end
+
+ # @private
+ def initialize(strategy)
+ @strategy = strategy
+ end
+
+ # Stores an error and the related error event.
+ #
+ # @param name [String] name of the error
+ # @param description [String] description of the error
+ # @param actor [String] culprit (class/method/function) which triggered this error
+ # @param platform [String] platform on which the error occurred
+ # @param environment [String] environment on which the error occurred
+ # @param level [String] severity of this error
+ # @param occurred_at [Time] timestamp when the error occurred
+ # @param payload [Hash] original error payload
+ #
+ # @return [void] nothing
+ #
+ # @raise [RecordInvalidError] if passed attributes were invalid to store an error or error event
+ # @raise [DatabaseError] if generic error occurred
+ def report_error(
+ name:, description:, actor:, platform:,
+ environment:, level:, occurred_at: Time.zone.now, payload: {}
+ )
+ strategy.report_error(
+ name: name,
+ description: description,
+ actor: actor,
+ platform: platform,
+ environment: environment,
+ level: level,
+ occurred_at: occurred_at,
+ payload: payload
+ )
+
+ nil
+ end
+
+ # Finds an error by +id+.
+ #
+ # @param id [Integer, String] unique error identifier
+ #
+ # @return [Gitlab::ErrorTracking::DetailedError] a detail error
+ def find_error(id)
+ strategy.find_error(id)
+ end
+
+ # Lists errors.
+ #
+ # @param sort [String] order list by 'first_seen', 'last_seen', or 'frequency'
+ # @param filters [Hash<Symbol, String>] filter list by
+ # @option filters [String] :status error status
+ # @param limit [Integer, String] limit result
+ # @param cursor [Hash] pagination information
+ #
+ # @return [Array<Array<Gitlab::ErrorTracking::Error>, Pagination>]
+ def list_errors(sort: 'last_seen', filters: {}, limit: 20, cursor: {})
+ limit = [limit.to_i, 100].min
+
+ strategy.list_errors(filters: filters, sort: sort, limit: limit, cursor: cursor)
+ end
+
+ # Fetches last event for error +id+.
+ #
+ # @param id [Integer, String] unique error identifier
+ #
+ # @return [Gitlab::ErrorTracking::ErrorEvent]
+ #
+ # @raise [DatabaseError] if generic error occurred
+ def last_event_for(id)
+ strategy.last_event_for(id)
+ end
+
+ # Updates attributes of an error.
+ #
+ # @param id [Integer, String] unique error identifier
+ # @param status [String] error status
+ #
+ # @return [true, false] if update was successful
+ #
+ # @raise [DatabaseError] if generic error occurred
+ def update_error(id, status:)
+ strategy.update_error(id, status: status)
+ end
+
+ private
+
+ attr_reader :strategy
+ end
+ end
+end