Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorrpereira2 <rpereira@gitlab.com>2019-04-02 09:26:09 +0300
committerrpereira2 <rpereira@gitlab.com>2019-04-04 23:42:33 +0300
commite1a167ee234fbb8886ac1a882002b76adeb67edf (patch)
treed7bd9ce87625fe792ea912641fe844b667459568 /app/controllers/projects/environments
parent5dd6e752c0c3d572c645ac56a79c6c5a3fbd5157 (diff)
Add a Prometheus API per environment
The api will proxy requests to the environment's prometheus server. The Prometheus::ProxyService class can be reused when we add support for group prometheus servers.
Diffstat (limited to 'app/controllers/projects/environments')
-rw-r--r--app/controllers/projects/environments/prometheus_api_controller.rb47
1 files changed, 47 insertions, 0 deletions
diff --git a/app/controllers/projects/environments/prometheus_api_controller.rb b/app/controllers/projects/environments/prometheus_api_controller.rb
new file mode 100644
index 00000000000..337b7fdf65d
--- /dev/null
+++ b/app/controllers/projects/environments/prometheus_api_controller.rb
@@ -0,0 +1,47 @@
+# frozen_string_literal: true
+
+class Projects::Environments::PrometheusApiController < Projects::ApplicationController
+ before_action :authorize_read_prometheus!
+ before_action :environment
+
+ def proxy
+ permitted = permit_params
+
+ result = Prometheus::ProxyService.new(
+ environment,
+ request.method,
+ permitted[:proxy_path],
+ permitted.except(:proxy_path) # rubocop: disable CodeReuse/ActiveRecord
+ ).execute
+
+ if result.nil?
+ render status: :accepted, json: {
+ status: 'processing',
+ message: 'Not ready yet. Try again later.'
+ }
+ return
+ end
+
+ if result[:status] == :success
+ render status: result[:http_status], json: result[:body]
+ else
+ render status: result[:http_status] || :bad_request, json: {
+ status: result[:status],
+ message: result[:message]
+ }
+ end
+ end
+
+ private
+
+ def permit_params
+ params.permit([
+ :proxy_path, :query, :time, :timeout, :start, :end, :step, { match: [] },
+ :match_target, :metric, :limit
+ ])
+ end
+
+ def environment
+ @environment ||= project.environments.find(params[:id])
+ end
+end