From aa43c78d72671f7f3cca4cfc222bf9513c3c649c Mon Sep 17 00:00:00 2001 From: Ahmad Sherif Date: Thu, 25 Apr 2019 17:30:05 +0200 Subject: [PATCH] Add RemoteMirrorsProber Related to https://gitlab.com/gitlab-com/gl-infra/infrastructure/issues/5313 --- Gemfile.lock | 2 +- README.md | 2 + config/gitlab-monitor.yml.example | 7 ++ lib/gitlab_monitor/database.rb | 1 + lib/gitlab_monitor/database/remote_mirrors.rb | 68 +++++++++++++++++++ lib/gitlab_monitor/version.rb | 2 +- 6 files changed, 80 insertions(+), 2 deletions(-) create mode 100644 lib/gitlab_monitor/database/remote_mirrors.rb diff --git a/Gemfile.lock b/Gemfile.lock index 7864fc7..dd9e113 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,7 +1,7 @@ PATH remote: . specs: - gitlab-monitor (3.5.0) + gitlab-monitor (3.6.0) connection_pool (~> 2.2.1) pg (~> 1.1) quantile (~> 0.2.0) diff --git a/README.md b/README.md index a4d3fd1..1557c55 100644 --- a/README.md +++ b/README.md @@ -27,6 +27,8 @@ metrics. * [Bloat](lib/gitlab_monitor/database/bloat.rb) -- `gitlab_database_bloat_$type_$key` with type `btree` (index bloat) or `table` (table bloat) and keys `bloat_ratio bloat_size extra_size real_size` (see below) + * [Remote mirrors](lib/gitlab_monitor/database/remote_mirrors.rb) -- + `project_remote_mirror_last_successful_update_time_seconds` 1. Git * [git pull/push timings](lib/gitlab_monitor/git.rb) -- `git_pull_time_milliseconds`, `git_push_time_milliseconds` diff --git a/config/gitlab-monitor.yml.example b/config/gitlab-monitor.yml.example index c1ba143..6f967a6 100644 --- a/config/gitlab-monitor.yml.example +++ b/config/gitlab-monitor.yml.example @@ -60,6 +60,13 @@ probes: - soft_deleted_projects - orphaned_projects - uploads + remote_mirrors: + class_name: Database::RemoteMirrors + <<: *db_common + opts: + <<: *db_common_opts + project_ids: + - 1 process: &process methods: diff --git a/lib/gitlab_monitor/database.rb b/lib/gitlab_monitor/database.rb index fb69998..d3e0757 100644 --- a/lib/gitlab_monitor/database.rb +++ b/lib/gitlab_monitor/database.rb @@ -7,6 +7,7 @@ module GitLab autoload :TuplesProber, "gitlab_monitor/database/tuple_stats" autoload :RowCountProber, "gitlab_monitor/database/row_count" autoload :BloatProber, "gitlab_monitor/database/bloat" + autoload :RemoteMirrorsProber, "gitlab_monitor/database/remote_mirrors" end end end diff --git a/lib/gitlab_monitor/database/remote_mirrors.rb b/lib/gitlab_monitor/database/remote_mirrors.rb new file mode 100644 index 0000000..a4ed78d --- /dev/null +++ b/lib/gitlab_monitor/database/remote_mirrors.rb @@ -0,0 +1,68 @@ +module GitLab + module Monitor + module Database + # A helper class to collect remote mirrors metrics. + class RemoteMirrorsCollector < Base + QUERY = <<~SQL.freeze + SELECT project_id, url, EXTRACT(EPOCH FROM last_successful_update_at) AS last_successful_update_at + FROM remote_mirrors WHERE project_id IN (%s) AND enabled = 't' + SQL + + def initialize(args) + super(args) + + @project_ids = args[:project_ids] + end + + def run + return if @project_ids.nil? || @project_ids.empty? + + execute(QUERY % [@project_ids.join(",")]) # rubocop:disable Style/FormatString + end + + private + + def execute(query) + with_connection_pool do |conn| + conn.exec(query) + end + rescue PG::UndefinedTable, PG::UndefinedColumn + nil + end + end + + # The prober which is called when gathering metrics + class RemoteMirrorsProber + def initialize(opts, metrics: PrometheusMetrics.new) + @metrics = metrics + @collector = RemoteMirrorsCollector.new( + connection_string: opts[:connection_string], + project_ids: opts[:project_ids] + ) + end + + def probe_db + results = @collector.run + results.to_a.each do |row| + last_successful_update_at = row.delete("last_successful_update_at").to_i + + @metrics.add( + "project_remote_mirror_last_successful_update_time_seconds", + last_successful_update_at, + project_id: row["project_id"], + url: row["url"] + ) + end + + self + rescue PG::ConnectionBad + self + end + + def write_to(target) + target.write(@metrics.to_s) + end + end + end + end +end diff --git a/lib/gitlab_monitor/version.rb b/lib/gitlab_monitor/version.rb index 82cb51c..3f6e551 100644 --- a/lib/gitlab_monitor/version.rb +++ b/lib/gitlab_monitor/version.rb @@ -1,5 +1,5 @@ module GitLab module Monitor - VERSION = "3.5.0".freeze + VERSION = "3.6.0".freeze end end -- GitLab