diff options
Diffstat (limited to 'lib/gitlab/graphql/generic_tracing.rb')
-rw-r--r-- | lib/gitlab/graphql/generic_tracing.rb | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/lib/gitlab/graphql/generic_tracing.rb b/lib/gitlab/graphql/generic_tracing.rb new file mode 100644 index 00000000000..936b22d5afa --- /dev/null +++ b/lib/gitlab/graphql/generic_tracing.rb @@ -0,0 +1,59 @@ +# frozen_string_literal: true + +# This class is used as a hook to observe graphql runtime events. From this +# hook both gitlab metrics and opentracking measurements are generated + +module Gitlab + module Graphql + class GenericTracing < GraphQL::Tracing::PlatformTracing + 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 + + def platform_trace(platform_key, key, data, &block) + tags = { platform_key: platform_key, key: key } + start = Gitlab::Metrics::System.monotonic_time + + with_labkit_tracing(tags, &block) + ensure + duration = Gitlab::Metrics::System.monotonic_time - start + + graphql_duration_seconds.observe(tags, duration) + end + + private + + 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 + + def graphql_duration_seconds + @graphql_duration_seconds ||= Gitlab::Metrics.histogram( + :graphql_duration_seconds, + 'GraphQL execution time' + ) + end + end + end +end |