class NineOneOne::PagerDutyService

Constants

BASE_HOST
EVENTS_API_V2_ENDPOINT
HIGH_URGENCY_ERROR
LOW_URGENCY_ERROR
THROTTLE_HTTP_STATUS
THROTTLE_RETRIES

Attributes

api_integration_key[R]
http[R]

Public Class Methods

new(api_integration_key) click to toggle source
# File lib/nine_one_one/pager_duty_service.rb, line 10
def initialize(api_integration_key)
  @api_integration_key = api_integration_key
  @http = Http.new(BASE_HOST)
end

Public Instance Methods

resolve_event(dedup_key) click to toggle source
# File lib/nine_one_one/pager_duty_service.rb, line 20
def resolve_event(dedup_key)
  make_request(request_body('resolve', dedup_key))
end
trigger_event(description, source: Socket.gethostname, dedup_key: nil, severity: HIGH_URGENCY_ERROR, details_hash: nil) click to toggle source
# File lib/nine_one_one/pager_duty_service.rb, line 15
def trigger_event(description, source: Socket.gethostname, dedup_key: nil, severity: HIGH_URGENCY_ERROR,
                  details_hash: nil)
  make_request(request_body('trigger', dedup_key, description, source, severity, details_hash))
end

Private Instance Methods

make_request(request_body) click to toggle source
# File lib/nine_one_one/pager_duty_service.rb, line 28
def make_request(request_body)
  headers = {'Content-Type' => 'application/json'}
  response = nil

  retry_on(THROTTLE_HTTP_STATUS, THROTTLE_RETRIES) do
    response = http.post(EVENTS_API_V2_ENDPOINT, request_body, headers)
    response.code.to_i
  end

  # rubocop:disable Style/GuardClause
  unless response.is_a?(Net::HTTPSuccess)
    raise IncidentReportingError, "Failed to send an event to PagerDuty: #{response.body} #{request_body}"
  end
  # rubocop:enable Style/GuardClause
end
request_body(event_action, dedup_key, description = nil, source = nil, severity = nil, details_hash = nil) click to toggle source
# File lib/nine_one_one/pager_duty_service.rb, line 53
def request_body(event_action, dedup_key, description = nil, source = nil, severity = nil, details_hash = nil)
  {
    routing_key: api_integration_key,
    event_action: event_action,
    dedup_key: dedup_key,
    payload: {
      summary: description,
      source: source,
      severity: severity,
      custom_details: details_hash
    }.reject { |_, v| v.nil? }
  }.reject { |_, v| v.nil? || v.empty? }.to_json
end
retry_on(value, retries_number) click to toggle source
# File lib/nine_one_one/pager_duty_service.rb, line 44
def retry_on(value, retries_number)
  retry_number = 0

  while yield == value && retry_number <= retries_number
    retry_number += 1
    sleep 2**retry_number
  end
end