class GitLab::Exporter::GitProcessProber

A special prober for git processes

Public Class Methods

extract_subcommand(cmd) click to toggle source
# File lib/gitlab_exporter/git.rb, line 138
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(metrics: PrometheusMetrics.new, quantiles: nil, **opts) click to toggle source
# File lib/gitlab_exporter/git.rb, line 90
def initialize(metrics: PrometheusMetrics.new, quantiles: nil, **opts) # rubocop:disable Lint/UnusedMethodArgument
  @metrics = metrics
  @quantiles = quantiles
end

Public Instance Methods

probe_git() click to toggle source
# File lib/gitlab_exporter/git.rb, line 95
def probe_git # rubocop:disable Metrics/MethodLength
  puts "[DEPRECATED] probe_git and GitProcessProber are now considered obsolete"\
    " and will be removed in future major versions,"\
    " please use git metrics produced by Gitaly instead"

  counts = Hash.new(0)

  Utils.pgrep("^git ").each do |pid|
    process_cmd = begin
                    File.read("/proc/#{pid}/cmdline")
                  rescue StandardError
                    "" # 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: @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_exporter/git.rb, line 134
def write_to(target)
  target.write(@metrics.to_s)
end