summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--app/models/clusters/applications/prometheus.rb15
-rw-r--r--app/models/project_services/prometheus_service.rb37
-rw-r--r--lib/gitlab/prometheus_client.rb14
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