Welcome to mirror list, hosted at ThFree Co, Russian Federation.

stats.rb « performance_bar « gitlab « lib - gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: d1504d8831553fd65f59319499b5570bdb4bbfa5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
# frozen_string_literal: true

module Gitlab
  module PerformanceBar
    # This class fetches Peek stats stored in redis and logs them in a
    # structured log (so these can be then analyzed in Kibana)
    class Stats
      def initialize(redis)
        @redis = redis
      end

      def process(id)
        data = request(id)
        return unless data

        log_sql_queries(id, data)
      rescue => err
        logger.error(message: "failed to process request id #{id}: #{err.message}")
      end

      private

      def request(id)
        # Peek gem stores request data under peek:requests:request_id key
        json_data = @redis.get("peek:requests:#{id}")
        Gitlab::Json.parse(json_data)
      end

      def log_sql_queries(id, data)
        return [] unless queries = data.dig('data', 'active-record', 'details')

        queries.each do |query|
          next unless location = parse_backtrace(query['backtrace'])

          log_info = location.merge(
            type: :sql,
            request_id: id,
            duration_ms: query['duration'].to_f
          )

          logger.info(log_info)
        end
      end

      def parse_backtrace(backtrace)
        return unless match = /(?<filename>.*):(?<filenum>\d+):in `(?<method>.*)'/.match(backtrace.first)

        {
          filename: match[:filename],
          filenum: match[:filenum].to_i,
          method: match[:method]
        }
      end

      def logger
        @logger ||= Gitlab::PerformanceBar::Logger.build
      end
    end
  end
end