Commit 29a53ca0 authored by Ryan Cobb's avatar Ryan Cobb

Move importers to lib folder

This moves our metric importers into the lib folder. This will allow
them to be autoloaded instead of having to explicitly require them.
parent 74bc6e1a
require_relative './common_metrics/importer'
require_relative './common_metrics/prometheus_metric'
require_relative './common_metrics/prometheus_metric_enums'
require Rails.root.join('ee', 'db', 'importers', 'common_metrics') if Gitlab.ee?
module Importers
module CommonMetrics
end
# Patch to preserve old CommonMetricsImporter api
module CommonMetricsImporter
def self.new(*args)
Importers::CommonMetrics::Importer.new(*args)
end
end
end
Importers::CommonMetrics.prepend(EE::Importers::CommonMetrics)
# frozen_string_literal: true
module Importers
module CommonMetrics
class Importer
MissingQueryId = Class.new(StandardError)
attr_reader :content
def initialize(filename = 'common_metrics.yml')
@content = YAML.load_file(Rails.root.join('config', 'prometheus', filename))
end
def execute
PrometheusMetric.reset_column_information
process_content do |id, attributes|
find_or_build_metric!(id)
.update!(**attributes)
end
end
private
def process_content(&blk)
content['panel_groups'].map do |group|
process_group(group, &blk)
end
end
def process_group(group, &blk)
attributes = {
group: find_group_title_key(group['group'])
}
group['panels'].map do |panel|
process_panel(panel, attributes, &blk)
end
end
def process_panel(panel, attributes, &blk)
attributes = attributes.merge(
title: panel['title'],
y_label: panel['y_label'])
panel['metrics'].map do |metric_details|
process_metric_details(metric_details, attributes, &blk)
end
end
def process_metric_details(metric_details, attributes, &blk)
attributes = attributes.merge(
legend: metric_details['label'],
query: metric_details['query_range'],
unit: metric_details['unit'])
yield(metric_details['id'], attributes)
end
def find_or_build_metric!(id)
raise MissingQueryId unless id
PrometheusMetric.common.find_by(identifier: id) ||
PrometheusMetric.new(common: true, identifier: id)
end
def find_group_title_key(title)
PrometheusMetricEnums.groups[find_group_title(title)]
end
def find_group_title(title)
PrometheusMetricEnums.group_titles.invert[title]
end
end
end
end
module Importers
module CommonMetrics
class PrometheusMetric < ActiveRecord::Base
enum group: PrometheusMetricEnums.groups
scope :common, -> { where(common: true) }
end
end
end
module Importers
module CommonMetrics
module PrometheusMetricEnums
def self.groups
{
# built-in groups
nginx_ingress_vts: -1,
ha_proxy: -2,
aws_elb: -3,
nginx: -4,
kubernetes: -5,
nginx_ingress: -6,
# custom groups
business: 0,
response: 1,
system: 2
}
end
def self.group_titles
{
business: _('Business metrics (Custom)'),
response: _('Response metrics (Custom)'),
system: _('System metrics (Custom)'),
nginx_ingress_vts: _('Response metrics (NGINX Ingress VTS)'),
nginx_ingress: _('Response metrics (NGINX Ingress)'),
ha_proxy: _('Response metrics (HA Proxy)'),
aws_elb: _('Response metrics (AWS ELB)'),
nginx: _('Response metrics (NGINX)'),
kubernetes: _('System metrics (Kubernetes)')
}
end
end
end
end
# This functionality has been moved to the common_metrics module. # This functionality has been moved to the lib/gitlab/importers/common_metrics module.
# This is here only to preserve existing ::Importers::CommonMetricsImporter api # This is here only to preserve existing ::Importers::CommonMetricsImporter api
require_relative './common_metrics' module Importers
module CommonMetricsImporter
def self.new(*args)
Gitlab::Importers::CommonMetrics::Importer.new(*args)
end
end
end
require_relative './common_metrics/prometheus_metric_enums'
module EE
module Importers
module CommonMetrics
# rubocop: disable Cop/InjectEnterpriseEditionModule
def self.prepended(base)
::Importers::CommonMetrics::PrometheusMetricEnums.prepend EE::Importers::CommonMetrics::PrometheusMetricEnums
end
end
end
end
module EE
module Importers
module CommonMetrics
module PrometheusMetricEnums
extend ActiveSupport::Concern
class_methods do
extend ::Gitlab::Utils::Override
override :groups
def groups
super.merge(
# Start at 100 to avoid collisions with CE values
cluster_healths: -100
)
end
override :group_titles
def group_titles
super.merge(
# keys can collide with CE values! please ensure you are not redefining a key that already exists
cluster_health: _('Cluster Health')
)
end
end
end
end
end
end
# frozen_string_literal: true
module EE
module Gitlab
module Importers
module CommonMetrics
# rubocop: disable Cop/InjectEnterpriseEditionModule
def self.prepended(base)
::Gitlab::Importers::CommonMetrics::PrometheusMetricEnums.prepend EE::Gitlab::Importers::CommonMetrics::PrometheusMetricEnums
end
end
end
end
end
# frozen_string_literal: true
module EE
module Gitlab
module Importers
module CommonMetrics
module PrometheusMetricEnums
extend ActiveSupport::Concern
class_methods do
extend ::Gitlab::Utils::Override
override :groups
def groups
super.merge(
# Start at 100 to avoid collisions with CE values
cluster_health: -100
)
end
override :group_titles
def group_titles
super.merge(
# keys can collide with CE values! please ensure you are not redefining a key that already exists
cluster_health: _('Cluster Health')
)
end
end
end
end
end
end
end
# frozen_string_literal: true
module Gitlab
module Importers
module CommonMetrics
end
end
end
Gitlab::Importers::CommonMetrics.prepend(EE::Gitlab::Importers::CommonMetrics)
# frozen_string_literal: true
module Gitlab
module Importers
module CommonMetrics
class Importer
MissingQueryId = Class.new(StandardError)
attr_reader :content
def initialize(filename = 'common_metrics.yml')
@content = YAML.load_file(Rails.root.join('config', 'prometheus', filename))
end
def execute
PrometheusMetric.reset_column_information
process_content do |id, attributes|
find_or_build_metric!(id)
.update!(**attributes)
end
end
private
def process_content(&blk)
content['panel_groups'].map do |group|
process_group(group, &blk)
end
end
def process_group(group, &blk)
attributes = {
group: find_group_title_key(group['group'])
}
group['panels'].map do |panel|
process_panel(panel, attributes, &blk)
end
end
def process_panel(panel, attributes, &blk)
attributes = attributes.merge(
title: panel['title'],
y_label: panel['y_label'])
panel['metrics'].map do |metric_details|
process_metric_details(metric_details, attributes, &blk)
end
end
def process_metric_details(metric_details, attributes, &blk)
attributes = attributes.merge(
legend: metric_details['label'],
query: metric_details['query_range'],
unit: metric_details['unit'])
yield(metric_details['id'], attributes)
end
# rubocop: disable CodeReuse/ActiveRecord
def find_or_build_metric!(id)
raise MissingQueryId unless id
PrometheusMetric.common.find_by(identifier: id) ||
PrometheusMetric.new(common: true, identifier: id)
end
# rubocop: enable CodeReuse/ActiveRecord
def find_group_title_key(title)
PrometheusMetricEnums.groups[find_group_title(title)]
end
def find_group_title(title)
PrometheusMetricEnums.group_titles.invert[title]
end
end
end
end
end
# frozen_string_literal: true
module Gitlab
module Importers
module CommonMetrics
class PrometheusMetric < ApplicationRecord
enum group: PrometheusMetricEnums.groups
scope :common, -> { where(common: true) }
end
end
end
end
# frozen_string_literal: true
module Gitlab
module Importers
module CommonMetrics
module PrometheusMetricEnums
def self.groups
{
# built-in groups
nginx_ingress_vts: -1,
ha_proxy: -2,
aws_elb: -3,
nginx: -4,
kubernetes: -5,
nginx_ingress: -6,
# custom groups
business: 0,
response: 1,
system: 2
}
end
def self.group_titles
{
business: _('Business metrics (Custom)'),
response: _('Response metrics (Custom)'),
system: _('System metrics (Custom)'),
nginx_ingress_vts: _('Response metrics (NGINX Ingress VTS)'),
nginx_ingress: _('Response metrics (NGINX Ingress)'),
ha_proxy: _('Response metrics (HA Proxy)'),
aws_elb: _('Response metrics (AWS ELB)'),
nginx: _('Response metrics (NGINX)'),
kubernetes: _('System metrics (Kubernetes)')
}
end
end
end
end
end
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
require 'rails_helper' require 'rails_helper'
require Rails.root.join("db", "importers", "common_metrics_importer.rb") require Rails.root.join("db", "importers", "common_metrics_importer.rb")
describe Importers::CommonMetrics::PrometheusMetric do describe Gitlab::Importers::CommonMetrics::PrometheusMetric do
let(:existing_group_titles) do let(:existing_group_titles) do
::PrometheusMetricEnums.group_details.each_with_object({}) do |(key, value), memo| ::PrometheusMetricEnums.group_details.each_with_object({}) do |(key, value), memo|
memo[key] = value[:group_title] memo[key] = value[:group_title]
...@@ -15,7 +15,7 @@ describe Importers::CommonMetrics::PrometheusMetric do ...@@ -15,7 +15,7 @@ describe Importers::CommonMetrics::PrometheusMetric do
end end
it 'GROUP_TITLES equals ::PrometheusMetric' do it 'GROUP_TITLES equals ::PrometheusMetric' do
expect(Importers::CommonMetrics::PrometheusMetricEnums.group_titles).to eq(existing_group_titles) expect(Gitlab::Importers::CommonMetrics::PrometheusMetricEnums.group_titles).to eq(existing_group_titles)
end end
end end
...@@ -104,7 +104,7 @@ describe Importers::CommonMetricsImporter do ...@@ -104,7 +104,7 @@ describe Importers::CommonMetricsImporter do
let(:query_identifier) { } let(:query_identifier) { }
it 'raises exception' do it 'raises exception' do
expect { subject.execute }.to raise_error(Importers::CommonMetrics::Importer::MissingQueryId) expect { subject.execute }.to raise_error(Gitlab::Importers::CommonMetrics::Importer::MissingQueryId)
end end
end end
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment