Sha256: 2cd211bbf3c6d40bf66305f27ef634f208f9c83d8f0706e27d45ebb4d46a1a30

Contents?: true

Size: 1.98 KB

Versions: 1

Compression:

Stored size: 1.98 KB

Contents

# frozen_string_literal: true

module ElasticAPM
  # @api private
  module GraphQL
    TYPE = 'app'
    SUBTYPE = 'graphql'

    PREFIX = 'GraphQL: '
    UNNAMED = '[unnamed]'
    MULTIPLE_QUERIES = '[multiple-queries]'
    CONCATENATOR = '+'
    MAX_NUMBER_OF_QUERIES_FOR_NAME = 5

    KEYS_TO_NAME = {
      'lex' => 'graphql.lex',
      'parse' => 'graphql.parse',
      'validate' => 'graphql.validate',
      'analyze_multiplex' => 'graphql.analyze_multiplex',
      'analyze_query' => 'graphql.analyze_query',
      'execute_multiplex' => 'graphql.execute_multiplex',
      'execute_query' => 'graphql.execute_query',
      'execute_query_lazy' => 'graphql.execute_query_lazy',
      'authorized_lazy' => 'graphql.authorized_lazy',
      'resolve_type' => 'graphql.resolve_type',
      'resolve_type_lazy' => 'graphql.resolve_type_lazy'

      # These are available but deliberately left out as they are mostly noise.
      # "execute_field" => "graphql.execute_field",
      # "execute_field_lazy" => "graphql.execute_field_lazy",
      # "authorized" => "graphql.authorized",
    }.freeze

    def self.trace(key, data)
      return yield unless KEYS_TO_NAME.key?(key)
      return yield unless (transaction = ElasticAPM.current_transaction)

      if key == 'execute_query'
        transaction.name =
          "#{PREFIX}#{query_name(data[:query])}"
      end

      results =
        ElasticAPM.with_span(
          KEYS_TO_NAME.fetch(key, key),
          TYPE, subtype: SUBTYPE, action: key
        ) { yield }

      if key == 'execute_multiplex'
        transaction.name = "#{PREFIX}#{concat_names(results)}"
      end

      results
    end

    class << self
      private

      def query_name(query)
        query.operation_name || UNNAMED
      end

      def concat_names(results)
        if results.length > MAX_NUMBER_OF_QUERIES_FOR_NAME
          return MULTIPLE_QUERIES
        end

        results.map do |result|
          query_name(result.query)
        end.join(CONCATENATOR)
      end
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
elastic-apm-3.6.0 lib/elastic_apm/graphql.rb