100 lines
3 KiB
Ruby
100 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
|