Skip to content

Commit

Permalink
chore: Add Tests for GraphQL C Parser (#773)
Browse files Browse the repository at this point in the history
Graphql 2.2 introduces an optional C implementation of the Parser as well as optimizations to the pure Ruby parser that result in changes to what is captured during instrumentation.

Users of the pure Ruby implementation will no longer see graphql.lex spans emitted as a part of their traces and will instead need to switch to using the C Parser in order to explicitly see time spent in the lexer.

This PR introduces updates to the test suite to add coverage for the C Parser and changes to the Ruby implementation.

There are no underlying changes in the instrumentation itself.
  • Loading branch information
arielvalentin authored Dec 22, 2023
1 parent 6cab34d commit 2586b75
Show file tree
Hide file tree
Showing 4 changed files with 42 additions and 9 deletions.
35 changes: 28 additions & 7 deletions instrumentation/graphql/Appraisals
Original file line number Diff line number Diff line change
Expand Up @@ -4,18 +4,39 @@
#
# SPDX-License-Identifier: Apache-2.0

appraise 'graphql-1.13' do
# Max compatible version of 1.x
appraise 'graphql-1.x' do
gem 'graphql', '~> 1.13'
end

appraise 'graphql-2.0.17' do
gem 'graphql', '2.0.17'
end

# A bug was introduced in 2.0.18 that was fixed in 2.0.19
appraise 'graphql-2.0.18' do
gem 'graphql', '2.0.18'
end

appraise 'graphql-2.x' do
gem 'graphql', '>= 2.0.18', '< 3.0.0'
# Max compatible version of 2.0.x
appraise 'graphql-2.0' do
gem 'graphql', '~> 2.0.27'
end

# Max compatible version of 2.1.x
appraise 'graphql-2.1' do
gem 'graphql', '~> 2.1.8'
end

appraise 'graphql-c_parser-2.2.x' do
gem 'graphql', '~> 2.2.1'
gem 'graphql-c_parser', '~> 1.0.7'
end

appraise 'graphql-2.2.x' do
gem 'graphql', '~> 2.2.1', '< 3.0.0'
end

appraise 'graphql-c_parser-latest' do
gem 'graphql-c_parser'
end

appraise 'graphql-latest' do
gem 'graphql'
end
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,8 @@
'graphql.execute_multiplex'
]

expected_spans.delete('graphql.lex') unless trace_lex_supported?

expected_result = {
'simpleField' => 'Hello.',
'resolvedField' => { 'originalValue' => 'testing=1', 'uppercasedValue' => 'TESTING=1' }
Expand Down Expand Up @@ -103,7 +105,7 @@
it 'traces the provided schemas' do
SomeOtherGraphQLAppSchema.execute('query SimpleQuery{ __typename }')

_(spans.size).must_equal(8)
_(spans.select { |s| s.name.start_with?('graphql.') }).wont_be(:empty?)
end

it 'does not trace all schemas' do
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,7 @@
'graphql.execute_query_lazy',
'graphql.execute_multiplex'
]
expected_spans.delete('graphql.lex') unless trace_lex_supported?

expected_result = {
'simpleField' => 'Hello.',
Expand Down Expand Up @@ -102,7 +103,7 @@

it 'traces the provided schemas' do
SomeOtherGraphQLAppSchema.execute('query SimpleQuery{ __typename }')
_(spans.size).must_equal(8)
_(spans.select { |s| s.name.start_with?('graphql.') }).wont_be(:empty?)
end

it 'does not trace all schemas' do
Expand Down
9 changes: 9 additions & 0 deletions instrumentation/graphql/test/test_helper.rb
Original file line number Diff line number Diff line change
Expand Up @@ -125,3 +125,12 @@ def uses_platform_interfaces?
def gem_version
Gem::Version.new(GraphQL::VERSION)
end

# When tracing, is the parser expected to call `lex` before `parse`
def trace_lex_supported?
return @trace_lex_supported if defined?(@trace_lex_supported)

# In GraphQL 2.2, the default parser was changed such that `lex` is no longer called
@trace_lex_supported = Gem::Requirement.new('< 2.2').satisfied_by?(Gem::Version.new(GraphQL::VERSION)) \
|| (defined?(GraphQL::CParser) == 'constant')
end

0 comments on commit 2586b75

Please sign in to comment.