def test_traces_match_query(http_helper, exporter): response = yield http_helper.get(url_string(query=QUERY), headers=GRAPHQL_HEADER) assert response.code == 200 assert "data" in response_json(response) parent = exporter.spans.pop()[0] assert parent.name == "gql[b5c7307ba564]" assert parent.parent_span_id is None assert parent.attributes.get("signature", None) == default_engine_reporting_signature( parse(QUERY), "") spans = [span for span_list in exporter.spans for span in span_list] expected = [ "gql_parsing", "gql_validation", "author", "aBoolean", "author.name", "author.posts", "author.posts.0.id", "author.posts.1.id", ] for span, exp in zip(spans, expected): assert span.name == exp assert span.parent_span_id == parent.span_id
def test_basic_signature_with_full_test(): operation = "Foo" doc = parse(""" query Foo($b: Int, $a: Boolean) { user(name: "hello", age: 5) { ...Bar ... on User { hello bee } tz aliased: name } } fragment Baz on User { asd } fragment Bar on User { age @skip(if: $a) ...Nested } fragment Nested on User { blah } """) assert ( "fragment Bar on User{age@skip(if:$a)...Nested}fragment Nested on User{blah}query Foo($a:Boolean,$b:Int)" '{user(age:0,name:""){name tz...Bar...on User{bee hello}}}' == default_engine_reporting_signature(doc, operation))
def test_traces_match_query(http_helper, exporter): response = yield http_helper.get(url_string(query=QUERY), headers=GRAPHQL_HEADER) assert response.code == 200 assert 'data' in response_json(response) # OpenCensus is quite ready for Python3+Tornado yet if six.PY3: return spans = exporter.spans assert spans[0][0].name == 'author' assert spans[0][0].parent_span_id == spans[6][0].span_id assert spans[1][0].name == 'aBoolean' assert spans[1][0].parent_span_id == spans[6][0].span_id assert spans[2][0].name == 'author.name' assert spans[2][0].parent_span_id == spans[6][0].span_id assert spans[3][0].name == 'author.posts' assert spans[3][0].parent_span_id == spans[6][0].span_id assert spans[4][0].name == 'author.posts.0.id' assert spans[4][0].parent_span_id == spans[6][0].span_id assert spans[5][0].name == 'author.posts.1.id' assert spans[5][0].parent_span_id == spans[6][0].span_id assert spans[6][0].name == 'gql[b5c7307ba564]' assert spans[6][0].parent_span_id is None assert spans[6][0].attributes.get( 'signature', None) == default_engine_reporting_signature(parse(QUERY), '')
def test_basic_signature(): operation = "" doc = parse(""" { user { name } } """) assert "{user{name}}" == default_engine_reporting_signature(doc, operation)
def test_basic_signature_with_operation_name(): operation = "OpName" doc = parse(""" query OpName { user { name } } """) assert "query OpName{user{name}}" == default_engine_reporting_signature( doc, operation)
def test_basic_signature_with_inline_types(): operation = "OpName" doc = parse(""" query OpName { user { name(apple: [[10]], cat: ENUM_VALUE, bag: { input: "value" }) } } """) assert ("query OpName{user{name(apple:[],bag:{},cat:ENUM_VALUE)}}" == default_engine_reporting_signature(doc, operation))
def test_basic_signature_with_various_argument_types(): operation = "OpName" doc = parse(""" query OpName($c: Int!, $a: [[Boolean!]!], $b: EnumType) { user { name(apple: $a, cat: $c, bag: $b) } } """) assert "query OpName($a:[[Boolean!]!],$b:EnumType,$c:Int!){user{name(apple:$a,bag:$b,cat:$c)}}" \ == default_engine_reporting_signature(doc, operation)
def test_basic_signature_with_fragments_in_various_order(): operation = "" doc = parse(""" fragment Bar on User { asd } { user { name ...Bar } } fragment Baz on User { jkl } """) assert ("fragment Bar on User{asd}{user{name...Bar}}" == default_engine_reporting_signature(doc, operation))
def test_can_send_report_to_engine(http_helper): response = yield http_helper.get(url_string(query=QUERY), headers=GRAPHQL_HEADER) report = _deserialize(agent.data[0]) assert report.header.hostname == SERVICE_HEADER_DEFAULTS.get('hostname') assert report.header.agent_version == SERVICE_HEADER_DEFAULTS.get('agentVersion') assert report.header.runtime_version == SERVICE_HEADER_DEFAULTS.get('runtimeVersion') assert report.header.uname == SERVICE_HEADER_DEFAULTS.get('uname') assert len(report.traces_per_query) == 1 key = next(iter(report.traces_per_query)) query_key = '# -\n' + default_engine_reporting_signature(parse(QUERY), '') assert query_key == key assert report.traces_per_query[query_key].trace.pop() assert response.code == 200 assert 'data' in response_json(response)
def _get_trace_signature(operation_name, document, query_string): if not document: return query_string else: return default_engine_reporting_signature(document, operation_name)