76 lines
2.4 KiB
Ruby
76 lines
2.4 KiB
Ruby
|
# frozen_string_literal: true
|
||
|
|
||
|
module Projects
|
||
|
module Prometheus
|
||
|
module Alerts
|
||
|
# Persists a series of Prometheus alert events as list of PrometheusAlertEvent.
|
||
|
class CreateEventsService < BaseService
|
||
|
def execute
|
||
|
create_events_from(alerts)
|
||
|
end
|
||
|
|
||
|
private
|
||
|
|
||
|
def create_events_from(alerts)
|
||
|
Array.wrap(alerts).map { |alert| create_event(alert) }.compact
|
||
|
end
|
||
|
|
||
|
def create_event(payload)
|
||
|
parsed_alert = Gitlab::Alerting::Alert.new(project: project, payload: payload)
|
||
|
|
||
|
return unless parsed_alert.valid?
|
||
|
|
||
|
if parsed_alert.gitlab_managed?
|
||
|
create_managed_prometheus_alert_event(parsed_alert)
|
||
|
else
|
||
|
create_self_managed_prometheus_alert_event(parsed_alert)
|
||
|
end
|
||
|
end
|
||
|
|
||
|
def alerts
|
||
|
params['alerts']
|
||
|
end
|
||
|
|
||
|
def find_alert(metric)
|
||
|
Projects::Prometheus::AlertsFinder
|
||
|
.new(project: project, metric: metric)
|
||
|
.execute
|
||
|
.first
|
||
|
end
|
||
|
|
||
|
def create_managed_prometheus_alert_event(parsed_alert)
|
||
|
alert = find_alert(parsed_alert.metric_id)
|
||
|
payload_key = PrometheusAlertEvent.payload_key_for(parsed_alert.metric_id, parsed_alert.starts_at_raw)
|
||
|
|
||
|
event = PrometheusAlertEvent.find_or_initialize_by_payload_key(parsed_alert.project, alert, payload_key)
|
||
|
|
||
|
set_status(parsed_alert, event)
|
||
|
end
|
||
|
|
||
|
def create_self_managed_prometheus_alert_event(parsed_alert)
|
||
|
payload_key = SelfManagedPrometheusAlertEvent.payload_key_for(parsed_alert.starts_at_raw, parsed_alert.title, parsed_alert.full_query)
|
||
|
|
||
|
event = SelfManagedPrometheusAlertEvent.find_or_initialize_by_payload_key(parsed_alert.project, payload_key) do |event|
|
||
|
event.environment = parsed_alert.environment
|
||
|
event.title = parsed_alert.title
|
||
|
event.query_expression = parsed_alert.full_query
|
||
|
end
|
||
|
|
||
|
set_status(parsed_alert, event)
|
||
|
end
|
||
|
|
||
|
def set_status(parsed_alert, event)
|
||
|
persisted = case parsed_alert.status
|
||
|
when 'firing'
|
||
|
event.fire(parsed_alert.starts_at)
|
||
|
when 'resolved'
|
||
|
event.resolve(parsed_alert.ends_at)
|
||
|
end
|
||
|
|
||
|
event if persisted
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|