lib/graphql/tracing/prometheus_trace.rb
# frozen_string_literal: true
module GraphQL
module Tracing
module PrometheusTrace
include PlatformTrace
def initialize(client: PrometheusExporter::Client.default, keys_whitelist: ["execute_field", "execute_field_lazy"], collector_type: "graphql", **rest)
@client = client
@keys_whitelist = keys_whitelist
@collector_type = collector_type
super(**rest)
end
{
'lex' => "graphql.lex",
'parse' => "graphql.parse",
'validate' => "graphql.validate",
'analyze_query' => "graphql.analyze",
'analyze_multiplex' => "graphql.analyze",
'execute_multiplex' => "graphql.execute",
'execute_query' => "graphql.execute",
'execute_query_lazy' => "graphql.execute",
}.each do |trace_method, platform_key|
module_eval <<-RUBY, __FILE__, __LINE__
def #{trace_method}(**data, &block)
instrument_execution("#{platform_key}", "#{trace_method}", &block)
end
RUBY
end
def platform_execute_field(platform_key, &block)
instrument_execution(platform_key, "execute_field", &block)
end
def platform_execute_field_lazy(platform_key, &block)
instrument_execution(platform_key, "execute_field_lazy", &block)
end
def platform_authorized(platform_key, &block)
instrument_execution(platform_key, "authorized", &block)
end
def platform_authorized_lazy(platform_key, &block)
instrument_execution(platform_key, "authorized_lazy", &block)
end
def platform_resolve_type(platform_key, &block)
instrument_execution(platform_key, "resolve_type", &block)
end
def platform_resolve_type_lazy(platform_key, &block)
instrument_execution(platform_key, "resolve_type_lazy", &block)
end
def platform_field_key(field)
field.path
end
def platform_authorized_key(type)
"#{type.graphql_name}.authorized"
end
def platform_resolve_type_key(type)
"#{type.graphql_name}.resolve_type"
end
private
def instrument_execution(platform_key, key, &block)
if @keys_whitelist.include?(key)
start = ::Process.clock_gettime ::Process::CLOCK_MONOTONIC
result = block.call
duration = ::Process.clock_gettime(::Process::CLOCK_MONOTONIC) - start
@client.send_json(
type: @collector_type,
duration: duration,
platform_key: platform_key,
key: key
)
result
else
yield
end
end
end
end
end