debian-mirror-gitlab/lib/gitlab/graphql/generic_tracing.rb

68 lines
1.9 KiB
Ruby
Raw Normal View History

2019-07-07 11:18:12 +05:30
# frozen_string_literal: true
2019-07-31 22:56:46 +05:30
# This class is used as a hook to observe graphql runtime events. From this
# hook both gitlab metrics and opentracking measurements are generated
2019-07-07 11:18:12 +05:30
module Gitlab
module Graphql
2019-07-31 22:56:46 +05:30
class GenericTracing < GraphQL::Tracing::PlatformTracing
2019-07-07 11:18:12 +05:30
self.platform_keys = {
'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',
'execute_field' => 'graphql.execute',
'execute_field_lazy' => 'graphql.execute'
}
def platform_field_key(type, field)
"#{type.name}.#{field.name}"
end
2022-07-23 23:45:48 +05:30
def platform_authorized_key(type)
"#{type.graphql_name}.authorized"
end
def platform_resolve_type_key(type)
"#{type.graphql_name}.resolve_type"
end
2019-07-07 11:18:12 +05:30
def platform_trace(platform_key, key, data, &block)
2019-07-31 22:56:46 +05:30
tags = { platform_key: platform_key, key: key }
2019-07-07 11:18:12 +05:30
start = Gitlab::Metrics::System.monotonic_time
2019-07-31 22:56:46 +05:30
with_labkit_tracing(tags, &block)
2019-07-07 11:18:12 +05:30
ensure
duration = Gitlab::Metrics::System.monotonic_time - start
2019-07-31 22:56:46 +05:30
graphql_duration_seconds.observe(tags, duration)
2019-07-07 11:18:12 +05:30
end
private
2019-07-31 22:56:46 +05:30
def with_labkit_tracing(tags, &block)
return yield unless Labkit::Tracing.enabled?
name = "#{tags[:platform_key]}.#{tags[:key]}"
span_tags = {
'component' => 'web',
'span.kind' => 'server'
}.merge(tags.stringify_keys)
Labkit::Tracing.with_tracing(operation_name: name, tags: span_tags, &block)
end
2019-07-07 11:18:12 +05:30
def graphql_duration_seconds
@graphql_duration_seconds ||= Gitlab::Metrics.histogram(
:graphql_duration_seconds,
'GraphQL execution time'
)
end
end
end
end