def test_invalid(self): tracer, schema = get_traced_schema() result = traced_graphql(schema, '{ hello world }') span = tracer.writer.pop()[0] assert span.get_metric(INVALID) == int(result.invalid) result = traced_graphql(schema, '{ hello }') span = tracer.writer.pop()[0] assert span.get_metric(INVALID) == int(result.invalid)
def test_invalid(self): tracer, schema = get_traced_schema() result = traced_graphql(schema, '{ hello world }') span = tracer.writer.pop()[0] assert span.get_metric(INVALID) == result.invalid == 1 assert span.get_metric(DATA_EMPTY) == 1 assert span.error == 0 result = traced_graphql(schema, '{ hello }') span = tracer.writer.pop()[0] assert span.get_metric(INVALID) == result.invalid == 0 assert span.error == 0
def test_query_tag(): query = '{ hello }' tracer, schema = get_traced_schema() traced_graphql(schema, query) span = tracer.writer.pop()[0] assert span.get_tag(QUERY) == query # test query also for error span, just in case query = '{ hello world }' tracer, schema = get_traced_schema() traced_graphql(schema, query) span = tracer.writer.pop()[0] assert span.get_tag(QUERY) == query
def test_service_from_env(): query = '{ hello }' tracer, schema = get_traced_schema() global traced_graphql traced_graphql(schema, query) span = tracer.writer.pop()[0] assert span.service == SERVICE os.environ['DDTRACE_GRAPHQL_SERVICE'] = 'test.test' traced_graphql(schema, query) span = tracer.writer.pop()[0] assert span.service == 'test.test'
def test_request_string_resolve(self): query = '{ hello }' # string as args[1] tracer, schema = get_traced_schema() traced_graphql(schema, query) span = tracer.writer.pop()[0] assert span.get_tag(QUERY) == query # string as kwargs.get('request_string') tracer, schema = get_traced_schema() traced_graphql(schema, request_string=query) span = tracer.writer.pop()[0] assert span.get_tag(QUERY) == query # ast as args[1] tracer, schema = get_traced_schema() ast_query = graphql_parse(GraphQLSource(query, 'Test Request')) traced_graphql(schema, ast_query) span = tracer.writer.pop()[0] assert span.get_tag(QUERY) == query # ast as kwargs.get('request_string') tracer, schema = get_traced_schema() ast_query = graphql_parse(GraphQLSource(query, 'Test Request')) traced_graphql(schema, request_string=ast_query) span = tracer.writer.pop()[0] assert span.get_tag(QUERY) == query
def test_errors_tag(): query = '{ hello world }' tracer, schema = get_traced_schema() result = traced_graphql(schema, query) span = tracer.writer.pop()[0] assert span.get_tag(ERRORS) assert str(result.errors) == span.get_tag(ERRORS)
def test_span_kwargs_overrides(): query = '{ hello }' tracer, schema = get_traced_schema() traced_graphql(schema, query, span_kwargs={'resource': 'test'}) span = tracer.writer.pop()[0] assert span.resource == 'test' traced_graphql(schema, query, span_kwargs={ 'service': 'test', 'name': 'test', }) span = tracer.writer.pop()[0] assert span.service == 'test' assert span.name == 'test' assert span.resource == '{ hello }'
def test_errors_tag(): query = '{ hello }' tracer, schema = get_traced_schema() result = traced_graphql(schema, query) span = tracer.writer.pop()[0] assert not span.get_tag(ERRORS) assert result.errors is span.get_tag(ERRORS) is None query = '{ hello world }' result = traced_graphql(schema, query) span = tracer.writer.pop()[0] span_errors = span.get_tag(ERRORS) assert span_errors _se = json.loads(span_errors) assert len(_se) == len(result.errors) == 1 assert 'message' in _se[0] assert 'line' in _se[0]['locations'][0] assert 'column' in _se[0]['locations'][0]
def test_span_callback(): cb_args = {} def test_cb(result, span): cb_args.update(dict(result=result, span=span)) query = '{ hello world }' tracer, schema = get_traced_schema() result = traced_graphql(schema, query, span_callback=test_cb) span = tracer.writer.pop()[0] assert cb_args['span'] is span assert cb_args['result'] is result
def test_unhandled_exception(self): def exc_resolver(*args): raise Exception('Testing stuff') tracer, schema = get_traced_schema(resolver=exc_resolver) result = traced_graphql(schema, '{ hello }') span = tracer.writer.pop()[0] assert span.get_metric(INVALID) == 0 assert span.error == 1 assert span.get_metric(CLIENT_ERROR) == 0 assert span.get_metric(DATA_EMPTY) == 0 error_stack = span.get_tag(ddtrace_errors.ERROR_STACK) assert 'Testing stuff' in error_stack assert 'Traceback' in error_stack error_msg = span.get_tag(ddtrace_errors.ERROR_MSG) assert 'Testing stuff' in error_msg error_type = span.get_tag(ddtrace_errors.ERROR_TYPE) assert 'Exception' in error_type try: raise Exception('Testing stuff') except Exception as exc: _error = exc if not hasattr(exc, '__traceback__'): _error.stack = sys.exc_info()[2] def _tg(*args, **kwargs): def func(*args, **kwargs): return ExecutionResult( errors=[_error], invalid=True, ) return traced_graphql_wrapped(func, args, kwargs) tracer, schema = get_traced_schema(resolver=exc_resolver) result = _tg(schema, '{ hello }') span = tracer.writer.pop()[0] assert span.get_metric(INVALID) == 1 assert span.error == 1 assert span.get_metric(DATA_EMPTY) == 1 error_stack = span.get_tag(ddtrace_errors.ERROR_STACK) assert 'Testing stuff' in error_stack assert 'Traceback' in error_stack
def test_not_server_error(self): class TestException(Exception): pass def exc_resolver(*args): raise TestException('Testing stuff') tracer, schema = get_traced_schema(resolver=exc_resolver) result = traced_graphql( schema, '{ hello }', ignore_exceptions=(TestException), ) span = tracer.writer.pop()[0] assert span.get_metric(INVALID) == 0 assert span.error == 0 assert span.get_metric(DATA_EMPTY) == 0 assert span.get_metric(CLIENT_ERROR) == 1
def test_resource(): query = '{ hello world }' tracer, schema = get_traced_schema() traced_graphql(schema, query) span = tracer.writer.pop()[0] assert span.resource == query query = 'mutation fnCall(args: Args) { }' traced_graphql(schema, query) span = tracer.writer.pop()[0] assert span.resource == 'mutation fnCall' query = 'mutation fnCall { }' traced_graphql(schema, query) span = tracer.writer.pop()[0] assert span.resource == 'mutation fnCall' query = 'mutation fnCall { }' traced_graphql(schema, query, span_kwargs={'resource': 'test'}) span = tracer.writer.pop()[0] assert span.resource == 'test'
def test_tracer_disabled(): query = '{ hello world }' tracer, schema = get_traced_schema() tracer.enabled = False traced_graphql(schema, query) assert not tracer.writer.pop()