diff options
-rw-r--r-- | app/models/clusters/applications/prometheus.rb | 15 | ||||
-rw-r--r-- | app/models/project_services/prometheus_service.rb | 37 | ||||
-rw-r--r-- | lib/gitlab/prometheus_client.rb | 14 |
3 files changed, 22 insertions, 44 deletions
diff --git a/app/models/clusters/applications/prometheus.rb b/app/models/clusters/applications/prometheus.rb index 72651a92e54..94cac9277a5 100644 --- a/app/models/clusters/applications/prometheus.rb +++ b/app/models/clusters/applications/prometheus.rb @@ -14,10 +14,6 @@ module Clusters 'stable/prometheus' end - def namespace - Gitlab::Kubernetes::Helm::NAMESPACE - end - def service_name 'prometheus-prometheus-server' end @@ -33,6 +29,17 @@ module Clusters def install_command Gitlab::Kubernetes::Helm::InstallCommand.new(name, chart: chart, chart_values_file: chart_values_file) end + + def proxy_client + return unless cluster.kubeclient + + kube_client = cluster.kubeclient + proxy_url = kube_client.proxy_url('service', service_name, service_port, Gitlab::Kubernetes::Helm::NAMESPACE) + + # ensures headers containing auth data are appended to original k8s client options + options = kube_client.rest_client.options.merge(headers: kube_client.headers) + RestClient::Resource.new(proxy_url, options) + end end end end diff --git a/app/models/project_services/prometheus_service.rb b/app/models/project_services/prometheus_service.rb index bcb19eb8909..5e5aa92fd1a 100644 --- a/app/models/project_services/prometheus_service.rb +++ b/app/models/project_services/prometheus_service.rb @@ -86,7 +86,7 @@ class PrometheusService < MonitoringService # Cache metrics for specific environment def calculate_reactive_cache(query_class_name, environment_id, *args) return unless active? && project && !project.pending_delete? - client = client_for_environment(environment_id) + client = client(environment_id) data = Kernel.const_get(query_class_name).new(client).query(environment_id, *args) @@ -101,12 +101,16 @@ class PrometheusService < MonitoringService def client(environment_id) if manual_mode? - Gitlab::PrometheusClient.new(api_url: api_url) + Gitlab::PrometheusClient.new(RestClient::Resource.new(api_url)) else - cluster(environment_id) + cluster = find_cluster_with_prometheus(environment_id) + + Gitlab::PrometheusClient.new(cluster.application_prometheus.proxy_client) if cluster end end + private + def find_cluster_with_prometheus(environment_id) clusters = if environment_id ::Environment.find_by(id: environment_id).try(:enabled_clusters) || [] @@ -117,33 +121,6 @@ class PrometheusService < MonitoringService clusters.detect { |cluster| cluster.application_prometheus.installed? } end - private - - def client_for_environment(environment_id) - cluster = find_cluster_with_prometheus(environment_id) - return unless cluster - - prometheus = cluster.application_prometheus - - client_through_kube_proxy(cluster.kubeclient, - 'service', - prometheus.service_name, - prometheus.service_port, - prometheus.namespace) if cluster.kubeclient - end - - def client_through_kube_proxy(kube_client, kind, name, port, namespace = '') - rest_client = kube_client.rest_client - base_url = rest_client.url - proxy_url = kube_client.proxy_url(kind, name, port, namespace) - - Rails.logger.warn rest_client[proxy_url.sub(base_url, '')] - Rails.logger.warn proxy_url.sub(base_url, '') - - Gitlab::PrometheusClient.new(api_url: api_url, rest_client: rest_client[proxy_url.sub(base_url, '')], headers: kube_client.headers) - end - - def rename_data_to_metrics(metrics) metrics[:metrics] = metrics.delete :data metrics diff --git a/lib/gitlab/prometheus_client.rb b/lib/gitlab/prometheus_client.rb index 8ec4515fb12..d1875dd1042 100644 --- a/lib/gitlab/prometheus_client.rb +++ b/lib/gitlab/prometheus_client.rb @@ -3,12 +3,10 @@ module Gitlab # Helper methods to interact with Prometheus network services & resources class PrometheusClient - attr_reader :api_url, :rest_client, :headers + attr_reader :rest_client, :headers - def initialize(api_url:, rest_client: nil, headers: nil) - @api_url = api_url + def initialize(rest_client) @rest_client = rest_client || RestClient::Resource.new(api_url) - @headers = headers || {} end def ping @@ -49,7 +47,7 @@ module Gitlab end def get(path, args) - response = rest_client[path].get(headers.merge(params: args)) + response = rest_client[path].get(params: args) handle_response(response) rescue SocketError raise PrometheusError, "Can't connect to #{url}" @@ -60,7 +58,7 @@ module Gitlab end def handle_response(response) - json_data = json_response(response) + json_data = JSON.parse(response.body) if response.code == 200 && json_data['status'] == 'success' json_data['data'] || {} elsif response.code == 400 @@ -70,10 +68,6 @@ module Gitlab end end - def json_response(response) - JSON.parse(response.body) - end - def get_result(expected_type) data = yield data['result'] if data['resultType'] == expected_type |