diff options
author | Pawel Chojnacki <pawel@chojnacki.ws> | 2018-01-30 01:37:06 +0100 |
---|---|---|
committer | Pawel Chojnacki <pawel@chojnacki.ws> | 2018-01-30 01:37:06 +0100 |
commit | dbe629614b8eecda47998d9abc9518cfaeb26551 (patch) | |
tree | 20be1347329dbbc19b230507111804be7de44fbb | |
parent | 4fe4a0546de9236a599565d4e0ddf1a83fdaf107 (diff) | |
download | gitlab-ce-30480-refactor_prometheus_query_flow.tar.gz |
wip query dispatch30480-refactor_prometheus_query_flow
-rw-r--r-- | app/controllers/projects/prometheus_controller.rb | 2 | ||||
-rw-r--r-- | app/models/clusters/applications/prometheus.rb | 3 | ||||
-rw-r--r-- | app/models/environment.rb | 2 | ||||
-rw-r--r-- | app/models/project.rb | 1 | ||||
-rw-r--r-- | app/models/project_services/prometheus_service.rb | 57 | ||||
-rw-r--r-- | lib/gitlab/prometheus/query_dispatch.rb | 50 | ||||
-rw-r--r-- | lib/gitlab/prometheus/querying_adapter.rb | 2 |
7 files changed, 59 insertions, 58 deletions
diff --git a/app/controllers/projects/prometheus_controller.rb b/app/controllers/projects/prometheus_controller.rb index 507468d7102..f5369a6b90c 100644 --- a/app/controllers/projects/prometheus_controller.rb +++ b/app/controllers/projects/prometheus_controller.rb @@ -5,7 +5,7 @@ class Projects::PrometheusController < Projects::ApplicationController def active_metrics respond_to do |format| format.json do - matched_metrics = project.prometheus_service.matched_metrics || {} + matched_metrics = project.query_prometheus.matched_metrics || {} if matched_metrics.any? render json: matched_metrics diff --git a/app/models/clusters/applications/prometheus.rb b/app/models/clusters/applications/prometheus.rb index 630f92adfcc..8067ddabd3d 100644 --- a/app/models/clusters/applications/prometheus.rb +++ b/app/models/clusters/applications/prometheus.rb @@ -7,6 +7,9 @@ module Clusters include ::Clusters::Concerns::ApplicationCore include ::Clusters::Concerns::ApplicationStatus + include ReactiveCaching + + self.reactive_cache_key = ->(app) { [app.class.model_name.singular, app.id] } default_value_for :version, VERSION diff --git a/app/models/environment.rb b/app/models/environment.rb index bf69b4c50f0..7de3af08db3 100644 --- a/app/models/environment.rb +++ b/app/models/environment.rb @@ -159,7 +159,7 @@ class Environment < ActiveRecord::Base def additional_metrics if has_additional_metrics? - project.prometheus_service.additional_environment_metrics(self) + project.query_prometheus(self).additional_environment_metrics(self) end end diff --git a/app/models/project.rb b/app/models/project.rb index d0d0fd6e093..8ac353860ba 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -20,6 +20,7 @@ class Project < ActiveRecord::Base include GroupDescendant include Gitlab::SQL::Pattern include DeploymentPlatform + include Gitlab::Prometheus::QueryDispatch include ::Gitlab::Utils::StrongMemoize extend Gitlab::ConfigHelper diff --git a/app/models/project_services/prometheus_service.rb b/app/models/project_services/prometheus_service.rb index 74f163e3911..997a13bba14 100644 --- a/app/models/project_services/prometheus_service.rb +++ b/app/models/project_services/prometheus_service.rb @@ -16,32 +16,6 @@ class PrometheusService < MonitoringService after_save :clear_reactive_cache! - def query(environment = nil) - cache_source = prometheus_application(environment) || self - - Gitlab::Prometheus::QueryingAdapter.new(cache_source) - end - - def environment_metrics(environment) - query(environment).environment_metrics(environment) - end - - def deployment_metrics(deployment) - query(deployment.environment).deployment_metrics(deployment) - end - - def additional_environment_metrics(environment) - query(environment).additional_environment_metrics(environment) - end - - def additional_deployment_metrics(deployment) - query(deployment.environment).additional_deployment_metrics(deployment) - end - - def matched_metrics - query.matched_metrics - end - def initialize_properties if properties.nil? self.properties = {} @@ -99,22 +73,8 @@ class PrometheusService < MonitoringService end def calculate_reactive_cache(query_class_name, environment_id, *args) - client = client(environment_id) - query.calculate_reactive_cache(client, query_class_name, environment_id, *args) - end - - def client(environment_id = nil) - if manual_configuration? - Gitlab::PrometheusClient.new(RestClient::Resource.new(api_url)) - else - cluster = cluster_with_prometheus(environment_id) - raise Gitlab::PrometheusError, "couldn't find cluster with Prometheus installed" unless cluster - - rest_client = client_from_cluster(cluster) - raise Gitlab::PrometheusError, "couldn't create proxy Prometheus client" unless rest_client - - Gitlab::PrometheusClient.new(rest_client) - end + client = Gitlab::PrometheusClient.new(RestClient::Resource.new(api_url)) + Gitlab::Prometheus::QueryingAdapter.calculate_reactive_cache(client, query_class_name, environment_id, *args) end def prometheus_installed? @@ -124,19 +84,6 @@ class PrometheusService < MonitoringService private - def prometheus_application(environment = nil) - clusters = if environment - # sort results by descending order based on environment_scope being longer - # thus more closely matching environment slug - project.clusters.enabled.for_environment(environment).sort_by { |c| c.environment_scope&.length }.reverse! - else - project.clusters.enabled.for_all_environments - end - - cluster = clusters&.detect { |cluster| cluster.application_prometheus&.installed? } - cluster&.application_prometheus - end - def synchronize_service_state! self.active = prometheus_installed? || self.manual_configuration? diff --git a/lib/gitlab/prometheus/query_dispatch.rb b/lib/gitlab/prometheus/query_dispatch.rb new file mode 100644 index 00000000000..df0d3f21602 --- /dev/null +++ b/lib/gitlab/prometheus/query_dispatch.rb @@ -0,0 +1,50 @@ +module Gitlab + module Prometheus + module QueryDispatch + extend ActiveSupport::Concern + + # def environment_metrics(environment) + # query(environment).environment_metrics(environment) + # end + # + # def deployment_metrics(deployment) + # query(deployment.environment).deployment_metrics(deployment) + # end + # + # def additional_environment_metrics(environment) + # query(environment).additional_environment_metrics(environment) + # end + # + # def additional_deployment_metrics(deployment) + # query(deployment.environment).additional_deployment_metrics(deployment) + # end + # + # def matched_metrics + # query.matched_metrics + # end + # + + included do + def query_prometheus(environment = false) + prometheus_application(environment) || prometheus_service + QueryingAdapter.new(prometheus_application(environment) || prometheus_service) + end + + private + + def prometheus_application(environment = nil) + clusters = if environment + # sort results by descending order based on environment_scope being longer + # thus more closely matching environment slug + project.clusters.enabled.for_environment(environment).sort_by { |c| c.environment_scope&.length }.reverse! + else + project.clusters.enabled.for_all_environments + end + + cluster = clusters&.detect { |cluster| cluster.application_prometheus&.installed? } + cluster&.application_prometheus + end + end + end + end +end diff --git a/lib/gitlab/prometheus/querying_adapter.rb b/lib/gitlab/prometheus/querying_adapter.rb index 97aaf6d319e..aaf40619f42 100644 --- a/lib/gitlab/prometheus/querying_adapter.rb +++ b/lib/gitlab/prometheus/querying_adapter.rb @@ -33,7 +33,7 @@ module Gitlab end # Cache metrics for specific environment - def calculate_reactive_cache(client, query_class_name, environment_id, *args) + def self.calculate_reactive_cache(client, query_class_name, environment_id, *args) return unless active? && project && !project.pending_delete? data = Kernel.const_get(query_class_name).new(client).query(environment_id, *args) |