gitlab-org--gitlab-foss/lib/gitlab/alert_management/payload/prometheus.rb

99 lines
3 KiB
Ruby

# frozen_string_literal: true
# Attribute mapping for alerts via prometheus alerting integration.
module Gitlab
module AlertManagement
module Payload
class Prometheus < Base
attribute :alert_markdown, paths: %w(annotations gitlab_incident_markdown)
attribute :annotations, paths: 'annotations'
attribute :description, paths: %w(annotations description)
attribute :ends_at, paths: 'endsAt', type: :time
attribute :environment_name, paths: %w(labels gitlab_environment_name)
attribute :generator_url, paths: %w(generatorURL)
attribute :gitlab_y_label,
paths: [%w(annotations gitlab_y_label),
%w(annotations title),
%w(annotations summary),
%w(labels alertname)]
attribute :runbook, paths: %w(annotations runbook)
attribute :starts_at,
paths: 'startsAt',
type: :time,
fallback: -> { Time.current.utc }
attribute :status, paths: 'status'
attribute :title,
paths: [%w(annotations title),
%w(annotations summary),
%w(labels alertname)]
attribute :starts_at_raw,
paths: [%w(startsAt)]
private :starts_at_raw
METRIC_TIME_WINDOW = 30.minutes
def monitoring_tool
Gitlab::AlertManagement::Payload::MONITORING_TOOLS[:prometheus]
end
# Parses `g0.expr` from `generatorURL`.
#
# Example: http://localhost:9090/graph?g0.expr=vector%281%29&g0.tab=1
def full_query
return unless generator_url
uri = URI(generator_url)
Rack::Utils.parse_query(uri.query).fetch('g0.expr')
rescue URI::InvalidURIError, KeyError
end
def metrics_dashboard_url
return unless environment && full_query && title
metrics_dashboard_project_environment_url(
project,
environment,
embed_json: dashboard_json,
embedded: true,
**alert_embed_window_params
)
end
def has_required_attributes?
project && title && starts_at_raw
end
private
def plain_gitlab_fingerprint
[starts_at_raw, title, full_query].join('/')
end
# Formatted for parsing by JS
def alert_embed_window_params
{
start: (starts_at - METRIC_TIME_WINDOW).utc.strftime('%FT%TZ'),
end: (starts_at + METRIC_TIME_WINDOW).utc.strftime('%FT%TZ')
}
end
def dashboard_json
{
panel_groups: [{
panels: [{
type: 'area-chart',
title: title,
y_label: gitlab_y_label,
metrics: [{
query_range: full_query
}]
}]
}]
}.to_json
end
end
end
end
end