class GitLab::Monitor::GitProcessProber

A special prober for git processes

Public Class Methods

extract_subcommand(cmd) click to toggle source
# File lib/gitlab_monitor/git.rb, line 132
def self.extract_subcommand(cmd)
  return if cmd.empty?
  cmd_splitted = cmd.split("\u0000") # cmdline does not return it space-separated

  cmd_splitted.shift # Because it's "git"
  cmd_splitted.shift while cmd_splitted.first &&
                           (cmd_splitted.first.empty? || cmd_splitted.first !~ /^[^-][a-z\-]*$/)

  cmd_splitted[0]
end
new(opts, metrics: PrometheusMetrics.new) click to toggle source
# File lib/gitlab_monitor/git.rb, line 88
def initialize(opts, metrics: PrometheusMetrics.new)
  @opts    = opts
  @metrics = metrics
end

Public Instance Methods

probe_git() click to toggle source
# File lib/gitlab_monitor/git.rb, line 93
def probe_git # rubocop:disable Metrics/MethodLength
  counts = Hash.new(0)

  Utils.pgrep("^git ").each do |pid|
    process_cmd = begin
                    File.read("/proc/#{pid}/cmdline")
                  rescue
                    "" # Process file is gone (race condition)
                  end
    subcommand  = self.class.extract_subcommand(process_cmd)
    next unless subcommand # Unlikely, but just to be safe

    name = "git #{subcommand}"
    counts[name] += 1

    prober = ProcessProber.new(
      {
        name: name,
        pid_or_pattern: pid,
        quantiles: @opts[:quantiles]
      },
      metrics: @metrics
    )

    prober
      .probe_stat
  end

  counts.each do |name, count|
    @metrics.add("process_count", count, name: name)
  end

  self
end
write_to(target) click to toggle source
# File lib/gitlab_monitor/git.rb, line 128
def write_to(target)
  target.write(@metrics.to_s)
end