Implemente Prometheus:AdapterService
This commit is contained in:
parent
273e414256
commit
5ceec83a01
5 changed files with 84 additions and 30 deletions
|
@ -1,8 +1,6 @@
|
|||
module Projects
|
||||
module Prometheus
|
||||
class MetricsController < Projects::ApplicationController
|
||||
include PrometheusAdapterLocator
|
||||
|
||||
before_action :authorize_admin_project!
|
||||
before_action :require_prometheus_metrics!
|
||||
|
||||
|
@ -22,6 +20,10 @@ module Projects
|
|||
|
||||
private
|
||||
|
||||
def prometheus_adapter
|
||||
@prometheus_adapter ||= Prometheus::AdapterService.new(project).prometheus_adapter
|
||||
end
|
||||
|
||||
def require_prometheus_metrics!
|
||||
render_404 unless prometheus_adapter.can_query?
|
||||
end
|
||||
|
|
|
@ -1,26 +0,0 @@
|
|||
module PrometheusAdapterLocator
|
||||
def deployment_platform
|
||||
project.deployment_platform
|
||||
end
|
||||
|
||||
def prometheus_adapter
|
||||
@prometheus_adapter ||= if service_prometheus_adapter.can_query?
|
||||
service_prometheus_adapter
|
||||
else
|
||||
cluster_prometheus_adapter
|
||||
end
|
||||
end
|
||||
|
||||
def service_prometheus_adapter
|
||||
project.find_or_initialize_service('prometheus')
|
||||
end
|
||||
|
||||
def cluster_prometheus_adapter
|
||||
return unless deployment_platform.respond_to?(:cluster)
|
||||
|
||||
cluster = deployment_platform.cluster
|
||||
return unless cluster.application_prometheus&.installed?
|
||||
|
||||
cluster.application_prometheus
|
||||
end
|
||||
end
|
|
@ -1,6 +1,4 @@
|
|||
class Environment < ActiveRecord::Base
|
||||
include PrometheusAdapterLocator
|
||||
|
||||
# Used to generate random suffixes for the slug
|
||||
LETTERS = 'a'..'z'
|
||||
NUMBERS = '0'..'9'
|
||||
|
@ -159,6 +157,10 @@ class Environment < ActiveRecord::Base
|
|||
prometheus_adapter.query(:additional_metrics_environment, self) if has_metrics?
|
||||
end
|
||||
|
||||
def prometheus_adapter
|
||||
@prometheus_adapter ||= Prometheus::AdapterService.new(project, deployment_platform).prometheus_adapter
|
||||
end
|
||||
|
||||
def slug
|
||||
super.presence || generate_slug
|
||||
end
|
||||
|
|
36
app/services/prometheus/adapter_service.rb
Normal file
36
app/services/prometheus/adapter_service.rb
Normal file
|
@ -0,0 +1,36 @@
|
|||
module Prometheus
|
||||
class AdapterService
|
||||
def initialize(project, deployment_platform = nil)
|
||||
@project = project
|
||||
|
||||
@deployment_platform = if deployment_platform
|
||||
deployment_platform
|
||||
else
|
||||
project.deployment_platform
|
||||
end
|
||||
end
|
||||
|
||||
attr_reader :deployment_platform, :project
|
||||
|
||||
def prometheus_adapter
|
||||
@prometheus_adapter ||= if service_prometheus_adapter.can_query?
|
||||
service_prometheus_adapter
|
||||
else
|
||||
cluster_prometheus_adapter
|
||||
end
|
||||
end
|
||||
|
||||
def service_prometheus_adapter
|
||||
project.find_or_initialize_service('prometheus')
|
||||
end
|
||||
|
||||
def cluster_prometheus_adapter
|
||||
return unless deployment_platform.respond_to?(:cluster)
|
||||
|
||||
cluster = deployment_platform.cluster
|
||||
return unless cluster.application_prometheus&.installed?
|
||||
|
||||
cluster.application_prometheus
|
||||
end
|
||||
end
|
||||
end
|
40
spec/services/prometheus/adapter_service_spec.rb
Normal file
40
spec/services/prometheus/adapter_service_spec.rb
Normal file
|
@ -0,0 +1,40 @@
|
|||
require 'spec_helper'
|
||||
|
||||
describe Prometheus::AdapterService do
|
||||
let(:project) { create(:project) }
|
||||
subject { described_class.new(project) }
|
||||
|
||||
describe '#prometheus_adapter' do
|
||||
let(:cluster) { create(:cluster, :provided_by_user, environment_scope: '*', projects: [project]) }
|
||||
|
||||
context 'prometheus service can execute queries' do
|
||||
let(:prometheus_service) { double(:prometheus_service, can_query?: true) }
|
||||
|
||||
before do
|
||||
allow(project).to receive(:find_or_initialize_service).with('prometheus').and_return prometheus_service
|
||||
end
|
||||
|
||||
it 'return prometheus service as prometheus adapter' do
|
||||
expect(subject.prometheus_adapter).to eq(prometheus_service)
|
||||
end
|
||||
end
|
||||
|
||||
context "prometheus service can't execute queries" do
|
||||
let(:prometheus_service) { double(:prometheus_service, can_query?: false) }
|
||||
|
||||
context 'with cluster with prometheus installed' do
|
||||
let!(:prometheus) { create(:clusters_applications_prometheus, :installed, cluster: cluster) }
|
||||
|
||||
it 'returns application handling all environments' do
|
||||
expect(subject.prometheus_adapter).to eq(prometheus)
|
||||
end
|
||||
end
|
||||
|
||||
context 'with cluster without prometheus installed' do
|
||||
it 'returns nil' do
|
||||
expect(subject.prometheus_adapter).to be_nil
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
Loading…
Reference in a new issue