Class: Gitlab::Graphql::QueryAnalyzers::AST::LoggerAnalyzer

Inherits:
GraphQL::Analysis::AST::Analyzer
  • Object
show all
Defined in:
lib/gitlab/graphql/query_analyzers/ast/logger_analyzer.rb

Constant Summary collapse

COMPLEXITY_ANALYZER =
GraphQL::Analysis::AST::QueryComplexity
DEPTH_ANALYZER =
GraphQL::Analysis::AST::QueryDepth
FIELD_USAGE_ANALYZER =
GraphQL::Analysis::AST::FieldUsage
ALL_ANALYZERS =
[COMPLEXITY_ANALYZER, DEPTH_ANALYZER, FIELD_USAGE_ANALYZER].freeze
FILTER_PARAMETERS =
(::Rails.application.config.filter_parameters + [/password/i]).freeze

Instance Method Summary collapse

Constructor Details

#initialize(query) ⇒ LoggerAnalyzer

Returns a new instance of LoggerAnalyzer.



14
15
16
17
18
19
20
21
22
23
# File 'lib/gitlab/graphql/query_analyzers/ast/logger_analyzer.rb', line 14

def initialize(query)
  super

  @results = default_initial_values(query).merge({
    time_started: Gitlab::Metrics::System.monotonic_time
  })
rescue StandardError => e
  Gitlab::ErrorTracking.track_and_raise_for_dev_exception(e)
  @results = default_initial_values(query_or_multiplex)
end

Instance Method Details

#resultObject



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
61
62
63
64
65
66
67
# File 'lib/gitlab/graphql/query_analyzers/ast/logger_analyzer.rb', line 25

def result
  # In its most general form, .analyze_query returns one of the
  # following:
  #
  # - An array with one result per analyzer, in the order they were
  #   provided, but only the ones where #analyze? returned true prior
  #   to analysis.
  #
  # - [GraphQL::AnalysisError] if the analysis times out
  #
  # - [] if an authorization error is raised
  #
  # For our analyzers, #analyze? is always true, so we can assume that
  # there are always three valid results, one error, no results at all
  # (we probably always have results, but we might as well be robust
  # to that case).
  complexity_or_error, depth, field_usages =
    GraphQL::Analysis::AST.analyze_query(@subject, ALL_ANALYZERS, multiplex_analyzers: [])

  case complexity_or_error
  when Integer
    results[:complexity] = complexity_or_error
  when GraphQL::AnalysisError
    results[:analysis_error] = complexity_or_error.message
  end

  field_usages ||= {} # in the zero or one result case, field_usages needs a sensible default

  results[:depth] = depth
  # This duration is not the execution time of the
  # query but the execution time of the analyzer.
  results[:duration_s] = duration(results[:time_started])
  results[:used_fields] = field_usages[:used_fields]
  results[:used_deprecated_fields] = field_usages[:used_deprecated_fields]
  results[:used_deprecated_arguments] = field_usages[:used_deprecated_arguments]

  push_to_request_store(results)

  # This gl_analysis is included in the tracer log
  query.context[:gl_analysis] = results.except!(:time_started, :query)
rescue StandardError => e
  Gitlab::ErrorTracking.track_and_raise_for_dev_exception(e)
end