summaryrefslogtreecommitdiff
path: root/lib/gitlab/metrics
diff options
context:
space:
mode:
authorGitLab Bot <gitlab-bot@gitlab.com>2022-05-19 07:33:21 +0000
committerGitLab Bot <gitlab-bot@gitlab.com>2022-05-19 07:33:21 +0000
commit36a59d088eca61b834191dacea009677a96c052f (patch)
treee4f33972dab5d8ef79e3944a9f403035fceea43f /lib/gitlab/metrics
parenta1761f15ec2cae7c7f7bbda39a75494add0dfd6f (diff)
downloadgitlab-ce-36a59d088eca61b834191dacea009677a96c052f.tar.gz
Add latest changes from gitlab-org/gitlab@15-0-stable-eev15.0.0-rc42
Diffstat (limited to 'lib/gitlab/metrics')
-rw-r--r--lib/gitlab/metrics/dashboard/importers/prometheus_metrics.rb31
-rw-r--r--lib/gitlab/metrics/exporter/base_exporter.rb11
-rw-r--r--lib/gitlab/metrics/exporter/health_checks_middleware.rb35
-rw-r--r--lib/gitlab/metrics/methods.rb3
-rw-r--r--lib/gitlab/metrics/rails_slis.rb8
-rw-r--r--lib/gitlab/metrics/sli.rb59
-rw-r--r--lib/gitlab/metrics/subscribers/active_record.rb8
-rw-r--r--lib/gitlab/metrics/subscribers/rack_attack.rb28
8 files changed, 61 insertions, 122 deletions
diff --git a/lib/gitlab/metrics/dashboard/importers/prometheus_metrics.rb b/lib/gitlab/metrics/dashboard/importers/prometheus_metrics.rb
index 8a176be30a2..e2b43798b22 100644
--- a/lib/gitlab/metrics/dashboard/importers/prometheus_metrics.rb
+++ b/lib/gitlab/metrics/dashboard/importers/prometheus_metrics.rb
@@ -33,7 +33,6 @@ module Gitlab
def import
delete_stale_metrics
create_or_update_metrics
- update_prometheus_environments
end
# rubocop: disable CodeReuse/ActiveRecord
@@ -47,8 +46,6 @@ module Gitlab
affected_metric_ids << prometheus_metric.id
end
-
- @affected_environment_ids += find_alerts(affected_metric_ids).get_environment_id
end
# rubocop: enable CodeReuse/ActiveRecord
@@ -62,24 +59,9 @@ module Gitlab
return unless stale_metrics.exists?
- delete_stale_alerts(stale_metrics)
stale_metrics.each_batch { |batch| batch.delete_all }
end
- def delete_stale_alerts(stale_metrics)
- stale_alerts = find_alerts(stale_metrics)
-
- affected_environment_ids = stale_alerts.get_environment_id
- return unless affected_environment_ids.present?
-
- @affected_environment_ids += affected_environment_ids
- stale_alerts.each_batch { |batch| batch.delete_all }
- end
-
- def find_alerts(metrics)
- Projects::Prometheus::AlertsFinder.new(project: project, metric: metrics).execute
- end
-
def prometheus_metrics_attributes
@prometheus_metrics_attributes ||= begin
Dashboard::Transformers::Yml::V1::PrometheusMetrics.new(
@@ -89,19 +71,6 @@ module Gitlab
).execute
end
end
-
- def update_prometheus_environments
- affected_environments = ::Environment.for_id(@affected_environment_ids.flatten.uniq).for_project(project)
-
- return unless affected_environments.exists?
-
- affected_environments.each do |affected_environment|
- ::Clusters::Applications::ScheduleUpdateService.new(
- affected_environment.cluster_prometheus_adapter,
- project
- ).execute
- end
- end
end
end
end
diff --git a/lib/gitlab/metrics/exporter/base_exporter.rb b/lib/gitlab/metrics/exporter/base_exporter.rb
index 2aea8d655fa..ba2eb729d7b 100644
--- a/lib/gitlab/metrics/exporter/base_exporter.rb
+++ b/lib/gitlab/metrics/exporter/base_exporter.rb
@@ -71,28 +71,17 @@ module Gitlab
end
def rack_app
- readiness = readiness_probe
- liveness = liveness_probe
pid = thread_name
gc_requests = @gc_requests
Rack::Builder.app do
use Rack::Deflater
use Gitlab::Metrics::Exporter::MetricsMiddleware, pid
- use Gitlab::Metrics::Exporter::HealthChecksMiddleware, readiness, liveness
use Gitlab::Metrics::Exporter::GcRequestMiddleware if gc_requests
use ::Prometheus::Client::Rack::Exporter if ::Gitlab::Metrics.metrics_folder_present?
run -> (env) { [404, {}, ['']] }
end
end
-
- def readiness_probe
- ::Gitlab::HealthChecks::Probes::Collection.new
- end
-
- def liveness_probe
- ::Gitlab::HealthChecks::Probes::Collection.new
- end
end
end
end
diff --git a/lib/gitlab/metrics/exporter/health_checks_middleware.rb b/lib/gitlab/metrics/exporter/health_checks_middleware.rb
deleted file mode 100644
index c43b8004b72..00000000000
--- a/lib/gitlab/metrics/exporter/health_checks_middleware.rb
+++ /dev/null
@@ -1,35 +0,0 @@
-# frozen_string_literal: true
-
-module Gitlab
- module Metrics
- module Exporter
- class HealthChecksMiddleware
- def initialize(app, readiness_probe, liveness_probe)
- @app = app
- @readiness_probe = readiness_probe
- @liveness_probe = liveness_probe
- end
-
- def call(env)
- case env['PATH_INFO']
- when '/readiness' then render_probe(@readiness_probe)
- when '/liveness' then render_probe(@liveness_probe)
- else @app.call(env)
- end
- end
-
- private
-
- def render_probe(probe)
- result = probe.execute
-
- [
- result.http_status,
- { 'Content-Type' => 'application/json; charset=utf-8' },
- [result.json.to_json]
- ]
- end
- end
- end
- end
-end
diff --git a/lib/gitlab/metrics/methods.rb b/lib/gitlab/metrics/methods.rb
index dc9a7ed1312..0aad865085b 100644
--- a/lib/gitlab/metrics/methods.rb
+++ b/lib/gitlab/metrics/methods.rb
@@ -56,7 +56,8 @@ module Gitlab
end
def disabled_by_feature(options)
- options.with_feature && !::Feature.enabled?(options.with_feature, type: :ops)
+ options.with_feature && !::Feature.enabled?(options.with_feature,
+ type: :undefined, default_enabled_if_undefined: false)
end
def build_metric!(type, name, options)
diff --git a/lib/gitlab/metrics/rails_slis.rb b/lib/gitlab/metrics/rails_slis.rb
index c4f305dbdc4..71da0085c8c 100644
--- a/lib/gitlab/metrics/rails_slis.rb
+++ b/lib/gitlab/metrics/rails_slis.rb
@@ -5,16 +5,16 @@ module Gitlab
module RailsSlis
class << self
def initialize_request_slis!
- Gitlab::Metrics::Sli.initialize_sli(:rails_request_apdex, possible_request_labels) unless Gitlab::Metrics::Sli.initialized?(:rails_request_apdex)
- Gitlab::Metrics::Sli.initialize_sli(:graphql_query_apdex, possible_graphql_query_labels) unless Gitlab::Metrics::Sli.initialized?(:graphql_query_apdex)
+ Gitlab::Metrics::Sli::Apdex.initialize_sli(:rails_request, possible_request_labels)
+ Gitlab::Metrics::Sli::Apdex.initialize_sli(:graphql_query, possible_graphql_query_labels)
end
def request_apdex
- Gitlab::Metrics::Sli[:rails_request_apdex]
+ Gitlab::Metrics::Sli::Apdex[:rails_request]
end
def graphql_query_apdex
- Gitlab::Metrics::Sli[:graphql_query_apdex]
+ Gitlab::Metrics::Sli::Apdex[:graphql_query]
end
private
diff --git a/lib/gitlab/metrics/sli.rb b/lib/gitlab/metrics/sli.rb
index de73db0755d..fcd893b675f 100644
--- a/lib/gitlab/metrics/sli.rb
+++ b/lib/gitlab/metrics/sli.rb
@@ -2,12 +2,10 @@
module Gitlab
module Metrics
- class Sli
- SliNotInitializedError = Class.new(StandardError)
-
+ module Sli
COUNTER_PREFIX = 'gitlab_sli'
- class << self
+ module ClassMethods
INITIALIZATION_MUTEX = Mutex.new
def [](name)
@@ -16,6 +14,8 @@ module Gitlab
def initialize_sli(name, possible_label_combinations)
INITIALIZATION_MUTEX.synchronize do
+ next known_slis[name] if initialized?(name)
+
sli = new(name)
sli.initialize_counters(possible_label_combinations)
known_slis[name] = sli
@@ -33,6 +33,10 @@ module Gitlab
end
end
+ def self.included(mod)
+ mod.extend(ClassMethods)
+ end
+
attr_reader :name
def initialize(name)
@@ -41,16 +45,17 @@ module Gitlab
end
def initialize_counters(possible_label_combinations)
- @initialized_with_combinations = possible_label_combinations.any?
+ # This module is effectively an abstract class
+ @initialized_with_combinations = possible_label_combinations.any? # rubocop:disable Gitlab/ModuleWithInstanceVariables
possible_label_combinations.each do |label_combination|
total_counter.get(label_combination)
- success_counter.get(label_combination)
+ numerator_counter.get(label_combination)
end
end
- def increment(labels:, success:)
+ def increment(labels:, increment_numerator:)
total_counter.increment(labels)
- success_counter.increment(labels) if success
+ numerator_counter.increment(labels) if increment_numerator
end
def initialized?
@@ -60,23 +65,43 @@ module Gitlab
private
def total_counter
- prometheus.counter(total_counter_name.to_sym, "Total number of measurements for #{name}")
+ prometheus.counter(counter_name('total'), "Total number of measurements for #{name}")
end
- def success_counter
- prometheus.counter(success_counter_name.to_sym, "Number of successful measurements for #{name}")
+ def counter_name(suffix)
+ :"#{COUNTER_PREFIX}:#{name}_#{self.class.name.demodulize.underscore}:#{suffix}"
end
- def total_counter_name
- "#{COUNTER_PREFIX}:#{name}:total"
+ def prometheus
+ Gitlab::Metrics
end
- def success_counter_name
- "#{COUNTER_PREFIX}:#{name}:success_total"
+ class Apdex
+ include Sli
+
+ def increment(labels:, success:)
+ super(labels: labels, increment_numerator: success)
+ end
+
+ private
+
+ def numerator_counter
+ prometheus.counter(counter_name('success_total'), "Number of successful measurements for #{name}")
+ end
end
- def prometheus
- Gitlab::Metrics
+ class ErrorRate
+ include Sli
+
+ def increment(labels:, error:)
+ super(labels: labels, increment_numerator: error)
+ end
+
+ private
+
+ def numerator_counter
+ prometheus.counter(counter_name('error_total'), "Number of error measurements for #{name}")
+ end
end
end
end
diff --git a/lib/gitlab/metrics/subscribers/active_record.rb b/lib/gitlab/metrics/subscribers/active_record.rb
index 12576cabb19..7c22ce64ea2 100644
--- a/lib/gitlab/metrics/subscribers/active_record.rb
+++ b/lib/gitlab/metrics/subscribers/active_record.rb
@@ -185,15 +185,17 @@ module Gitlab
counters << compose_metric_key(metric, role)
end
- ::Gitlab::Database.db_config_names.each do |config_name|
- counters << compose_metric_key(metric, nil, config_name) # main
- counters << compose_metric_key(metric, nil, config_name + ::Gitlab::Database::LoadBalancing::LoadBalancer::REPLICA_SUFFIX) # main_replica
+ ::Gitlab::Database.database_base_models.keys.each do |config_name|
+ counters << compose_metric_key(metric, nil, config_name) # main / ci
+ counters << compose_metric_key(metric, nil, config_name + ::Gitlab::Database::LoadBalancing::LoadBalancer::REPLICA_SUFFIX) # main_replica / ci_replica
end
end
counters
end
+ private_class_method :load_balancing_metric_keys
+
def compose_metric_key(metric, db_role = nil, db_config_name = nil)
self.class.compose_metric_key(metric, db_role, db_config_name)
end
diff --git a/lib/gitlab/metrics/subscribers/rack_attack.rb b/lib/gitlab/metrics/subscribers/rack_attack.rb
index 70dcc6fad90..e6cf14a6c8c 100644
--- a/lib/gitlab/metrics/subscribers/rack_attack.rb
+++ b/lib/gitlab/metrics/subscribers/rack_attack.rb
@@ -15,22 +15,6 @@ module Gitlab
INSTRUMENTATION_STORE_KEY = :rack_attack_instrumentation
- THROTTLES_WITH_USER_INFORMATION = [
- :throttle_authenticated_api,
- :throttle_authenticated_web,
- :throttle_authenticated_protected_paths_api,
- :throttle_authenticated_protected_paths_web,
- :throttle_authenticated_packages_api,
- :throttle_authenticated_git_lfs,
- :throttle_authenticated_files_api,
- :throttle_authenticated_deprecated_api
- ].freeze
-
- PAYLOAD_KEYS = [
- :rack_attack_redis_count,
- :rack_attack_redis_duration_s
- ].freeze
-
def self.payload
Gitlab::SafeRequestStore[INSTRUMENTATION_STORE_KEY] ||= {
rack_attack_redis_count: 0,
@@ -49,20 +33,20 @@ module Gitlab
end
def throttle(event)
- log_into_auth_logger(event)
+ log_into_auth_logger(event, status: 429)
end
def blocklist(event)
- log_into_auth_logger(event)
+ log_into_auth_logger(event, status: 403)
end
def track(event)
- log_into_auth_logger(event)
+ log_into_auth_logger(event, status: nil)
end
private
- def log_into_auth_logger(event)
+ def log_into_auth_logger(event, status:)
req = event.payload[:request]
rack_attack_info = {
message: 'Rack_Attack',
@@ -73,6 +57,10 @@ module Gitlab
matched: req.env['rack.attack.matched']
}
+ if status
+ rack_attack_info[:status] = status
+ end
+
discriminator = req.env['rack.attack.match_discriminator'].to_s
discriminator_id = discriminator.split(':').last