class GraphQL::Analyzer::Instrumentation::ElasticSearch

Public Class Methods

new() click to toggle source
# File lib/graphql/analyzer/instrumentation/elastic_search.rb, line 5
def initialize
  @notifications = []
  ActiveSupport::Notifications.subscribe('search.elasticsearch') do |name, start, finish, id, payload|
    @notifications << {
      name: name,
      start: start,
      finish: finish,
      id: id,
      payload: payload
    }
  end
end

Private Instance Methods

adapter() click to toggle source
# File lib/graphql/analyzer/instrumentation/elastic_search.rb, line 43
def adapter
  @adapter ||= 'elasticsearch'
end
resolve_proc(type, field, method) click to toggle source
# File lib/graphql/analyzer/instrumentation/elastic_search.rb, line 20
def resolve_proc(type, field, method)
  ->(obj, args, ctx) do
    result = field.public_send(method).call(obj, args, ctx)

    if @notifications.any?
      # TODO: Merge results when a field makes two types of queries
      # e.g. path: ['user', 'name'] makes a SQL and ES Query.
      ctx['graphql-analyzer']['resolvers'] << {
        'path' => ctx.path,
        'adapter' => adapter,
        'parentType' => type.name,
        'fieldName' => field.name,
        'returnType' => field.type.to_s,
        'details' => @notifications
      }

      @notifications = []
    end

    result
  end
end