1# frozen_string_literal: true 2 3module Metrics::Dashboard::PrometheusApiProxy 4 extend ActiveSupport::Concern 5 include RenderServiceResults 6 7 included do 8 before_action :authorize_read_prometheus!, only: [:prometheus_proxy] 9 end 10 11 def prometheus_proxy 12 variable_substitution_result = 13 proxy_variable_substitution_service.new(proxyable, permit_params).execute 14 15 if variable_substitution_result[:status] == :error 16 return error_response(variable_substitution_result) 17 end 18 19 prometheus_result = ::Prometheus::ProxyService.new( 20 proxyable, 21 proxy_method, 22 proxy_path, 23 variable_substitution_result[:params] 24 ).execute 25 26 return continue_polling_response if prometheus_result.nil? 27 return error_response(prometheus_result) if prometheus_result[:status] == :error 28 29 success_response(prometheus_result) 30 end 31 32 private 33 34 def proxyable 35 raise NotImplementedError, "#{self.class} must implement method: #{__callee__}" 36 end 37 38 def proxy_variable_substitution_service 39 raise NotImplementedError, "#{self.class} must implement method: #{__callee__}" 40 end 41 42 def permit_params 43 params.permit! 44 end 45 46 def proxy_method 47 request.method 48 end 49 50 def proxy_path 51 params[:proxy_path] 52 end 53end 54