summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPawel Chojnacki <pawel@chojnacki.ws>2018-01-30 01:37:06 +0100
committerPawel Chojnacki <pawel@chojnacki.ws>2018-01-30 01:37:06 +0100
commitdbe629614b8eecda47998d9abc9518cfaeb26551 (patch)
tree20be1347329dbbc19b230507111804be7de44fbb
parent4fe4a0546de9236a599565d4e0ddf1a83fdaf107 (diff)
downloadgitlab-ce-30480-refactor_prometheus_query_flow.tar.gz
-rw-r--r--app/controllers/projects/prometheus_controller.rb2
-rw-r--r--app/models/clusters/applications/prometheus.rb3
-rw-r--r--app/models/environment.rb2
-rw-r--r--app/models/project.rb1
-rw-r--r--app/models/project_services/prometheus_service.rb57
-rw-r--r--lib/gitlab/prometheus/query_dispatch.rb50
-rw-r--r--lib/gitlab/prometheus/querying_adapter.rb2
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)