Skip to content

Commit

Permalink
fix: update GraphQL span name to follow semantic conventions
Browse files Browse the repository at this point in the history
The semantic convention for GraphQL spans is specified here: https://opentelemetry.io/docs/specs/semconv/graphql/graphql-spans/. This will also resolve open-telemetry#560.
  • Loading branch information
karmingc committed May 8, 2024
1 parent 92277bd commit 370af56
Show file tree
Hide file tree
Showing 4 changed files with 26 additions and 10 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -98,11 +98,15 @@ def analyze_query(query:, &block)

def execute_query(query:, &block)
attributes = {}
attributes['graphql.operation.name'] = query.selected_operation_name if query.selected_operation_name
attributes['graphql.operation.type'] = query.selected_operation.operation_type
operation_type = query.selected_operation.operation_type
operation_name = query.selected_operation_name

attributes['graphql.operation.name'] = operation_name if operation_name
attributes['graphql.operation.type'] = operation_type
attributes['graphql.document'] = query.query_string

tracer.in_span('graphql.execute_query', attributes: attributes, &block)
span_name = operation_name ? "#{operation_type} #{operation_name}" : operation_type
tracer.in_span(span_name, attributes: attributes, &block)
end

def execute_query_lazy(query:, multiplex:, &block)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ class GraphQLTracer < ::GraphQL::Tracing::PlatformTracing
def platform_trace(platform_key, key, data)
return yield if platform_key.nil?

tracer.in_span(platform_key, attributes: attributes_for(key, data)) do |span|
tracer.in_span(span_name(platform_key, data), attributes: attributes_for(key, data)) do |span|
yield.tap do |response|
next unless key == 'validate'

Expand Down Expand Up @@ -143,6 +143,18 @@ def attr_cache
cache_h.compare_by_identity
cache_h
end

def span_name(key, data)
case key
when @platform_keys['execute_query']
operation_type = data[:query].selected_operation.operation_type
operation_name = data[:query].selected_operation_name

operation_name ? "#{operation_type} #{operation_name}" : operation_type
else
key
end
end
end
end
end
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@
'graphql.validate',
'graphql.analyze_query',
'graphql.analyze_multiplex',
'graphql.execute_query',
'query',
'graphql.execute_query_lazy',
'graphql.execute_multiplex'
]
Expand All @@ -76,7 +76,7 @@

SomeGraphQLAppSchema.execute('query SimpleQuery{ simpleField }')

span = spans.find { |s| s.name == 'graphql.execute_query' }
span = spans.find { |s| s.name == 'query SimpleQuery' }
_(span).wont_be_nil
_(span.attributes.to_h).must_equal(expected_attributes)
end
Expand All @@ -89,7 +89,7 @@

SomeGraphQLAppSchema.execute('{ simpleField }')

span = spans.find { |s| s.name == 'graphql.execute_query' }
span = spans.find { |s| s.name == 'query' }
_(span).wont_be_nil
_(span.attributes.to_h).must_equal(expected_attributes)
end
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@
'graphql.validate',
'graphql.analyze_query',
'graphql.analyze_multiplex',
'graphql.execute_query',
'query',
'graphql.execute_query_lazy',
'graphql.execute_multiplex'
]
Expand All @@ -75,7 +75,7 @@

SomeGraphQLAppSchema.execute('query SimpleQuery{ simpleField }')

span = spans.find { |s| s.name == 'graphql.execute_query' }
span = spans.find { |s| s.name == 'query SimpleQuery' }
_(span).wont_be_nil
_(span.attributes.to_h).must_equal(expected_attributes)
end
Expand All @@ -89,7 +89,7 @@

SomeGraphQLAppSchema.execute('{ simpleField }')

span = spans.find { |s| s.name == 'graphql.execute_query' }
span = spans.find { |s| s.name == 'query' }
_(span).wont_be_nil
_(span.attributes.to_h).must_equal(expected_attributes)
end
Expand Down

0 comments on commit 370af56

Please sign in to comment.