def dynamic_wrapper(wrapped, instance, args, kwargs): transaction = current_transaction() if transaction is None: return wrapped(*args, **kwargs) if callable(url): if instance is not None: _url = url(instance, *args, **kwargs) else: _url = url(*args, **kwargs) else: _url = url if callable(method): if instance is not None: _method = method(instance, *args, **kwargs) else: _method = method(*args, **kwargs) else: _method = method trace = ExternalTrace(transaction, library, _url, _method) proxy = async_proxy(wrapped) if proxy: return proxy(wrapped(*args, **kwargs), TraceContext(trace)) with trace: return wrapped(*args, **kwargs)
def _nr_aiohttp_request_wrapper_(wrapped, instance, args, kwargs): transaction = current_transaction() if transaction is None: return wrapped(*args, **kwargs) method, url = _bind_request(*args, **kwargs) trace = ExternalTrace(transaction, 'aiohttp', url, method) @asyncio.coroutine def _coro(): try: response = yield from wrapped(*args, **kwargs) try: trace.process_response_headers(response.headers.items()) except: pass return response except Exception as e: try: trace.process_response_headers(e.headers.items()) except: pass raise return async_proxy(_coro)(_coro(), TraceContext(trace))
def dynamic_wrapper(wrapped, instance, args, kwargs): transaction = current_transaction() if transaction is None: return wrapped(*args, **kwargs) if callable(name): if instance is not None: _name = name(instance, *args, **kwargs) else: _name = name(*args, **kwargs) elif name is None: _name = callable_name(wrapped) else: _name = name if callable(group): if instance is not None: _group = group(instance, *args, **kwargs) else: _group = group(*args, **kwargs) else: _group = group if callable(label): if instance is not None: _label = label(instance, *args, **kwargs) else: _label = label(*args, **kwargs) else: _label = label if callable(params): if instance is not None: _params = params(instance, *args, **kwargs) else: _params = params(*args, **kwargs) else: _params = params trace = FunctionTrace(transaction, _name, _group, _label, _params, terminal, rollup) proxy = async_proxy(wrapped) if proxy: return proxy(wrapped(*args, **kwargs), TraceContext(trace)) with trace: return wrapped(*args, **kwargs)
def literal_wrapper(wrapped, instance, args, kwargs): transaction = current_transaction() if transaction is None: return wrapped(*args, **kwargs) trace = ExternalTrace(transaction, library, url, method) proxy = async_proxy(wrapped) if proxy: return proxy(wrapped(*args, **kwargs), TraceContext(trace)) with trace: return wrapped(*args, **kwargs)
def literal_wrapper(wrapped, instance, args, kwargs): transaction = current_transaction() if transaction is None: return wrapped(*args, **kwargs) _name = name or callable_name(wrapped) trace = FunctionTrace(transaction, _name, group, label, params, terminal, rollup) proxy = async_proxy(wrapped) if proxy: return proxy(wrapped(*args, **kwargs), TraceContext(trace)) with trace: return wrapped(*args, **kwargs)
def _nr_database_trace_wrapper_(wrapped, instance, args, kwargs): transaction = current_transaction() if transaction is None: return wrapped(*args, **kwargs) if callable(sql): if instance is not None: _sql = sql(instance, *args, **kwargs) else: _sql = sql(*args, **kwargs) else: _sql = sql trace = DatabaseTrace(transaction, _sql, dbapi2_module) proxy = async_proxy(wrapped) if proxy: return proxy(wrapped(*args, **kwargs), TraceContext(trace)) with trace: return wrapped(*args, **kwargs)
def _nr_wrapper_memcache_trace_(wrapped, instance, args, kwargs): transaction = current_transaction() if transaction is None: return wrapped(*args, **kwargs) if callable(command): if instance is not None: _command = command(instance, *args, **kwargs) else: _command = command(*args, **kwargs) else: _command = command trace = MemcacheTrace(transaction, _command) proxy = async_proxy(wrapped) if proxy: return proxy(wrapped(*args, **kwargs), TraceContext(trace)) with trace: return wrapped(*args, **kwargs)
def _nr_datastore_trace_wrapper_(wrapped, instance, args, kwargs): transaction = current_transaction() if transaction is None: return wrapped(*args, **kwargs) if callable(product): if instance is not None: _product = product(instance, *args, **kwargs) else: _product = product(*args, **kwargs) else: _product = product if callable(target): if instance is not None: _target = target(instance, *args, **kwargs) else: _target = target(*args, **kwargs) else: _target = target if callable(operation): if instance is not None: _operation = operation(instance, *args, **kwargs) else: _operation = operation(*args, **kwargs) else: _operation = operation trace = DatastoreTrace(transaction, _product, _target, _operation) proxy = async_proxy(wrapped) if proxy: return proxy(wrapped(*args, **kwargs), TraceContext(trace)) with trace: return wrapped(*args, **kwargs)
def wrapper(wrapped, instance, args, kwargs): if callable(library): if instance is not None: _library = library(instance, *args, **kwargs) else: _library = library(*args, **kwargs) else: _library = library if callable(destination_type): if instance is not None: _destination_type = destination_type(instance, *args, **kwargs) else: _destination_type = destination_type(*args, **kwargs) else: _destination_type = destination_type if callable(destination_name): if instance is not None: _destination_name = destination_name(instance, *args, **kwargs) else: _destination_name = destination_name(*args, **kwargs) else: _destination_name = destination_name if callable(routing_key): if instance is not None: _routing_key = routing_key(instance, *args, **kwargs) else: _routing_key = routing_key(*args, **kwargs) else: _routing_key = routing_key if callable(exchange_type): if instance is not None: _exchange_type = exchange_type(instance, *args, **kwargs) else: _exchange_type = exchange_type(*args, **kwargs) else: _exchange_type = exchange_type if callable(headers): if instance is not None: _headers = headers(instance, *args, **kwargs) else: _headers = headers(*args, **kwargs) else: _headers = headers if callable(queue_name): if instance is not None: _queue_name = queue_name(instance, *args, **kwargs) else: _queue_name = queue_name(*args, **kwargs) else: _queue_name = queue_name if callable(reply_to): if instance is not None: _reply_to = reply_to(instance, *args, **kwargs) else: _reply_to = reply_to(*args, **kwargs) else: _reply_to = reply_to if callable(correlation_id): if instance is not None: _correlation_id = correlation_id(instance, *args, **kwargs) else: _correlation_id = correlation_id(*args, **kwargs) else: _correlation_id = correlation_id # Check to see if any transaction is present, even an inactive # one which has been marked to be ignored or which has been # stopped already. transaction = current_transaction(active_only=False) if transaction: # If there is any active transaction we will return without # applying a new WSGI application wrapper context. In the # case of a transaction which is being ignored or which has # been stopped, we do that without doing anything further. if transaction.ignore_transaction or transaction.stopped: return wrapped(*args, **kwargs) # Check to see if we are being called within the context of # a web transaction. If we are, then we will just flag the # current web transaction as a background task if not # already marked as such and name the web transaction as # well. if type(transaction) == WebTransaction: if not transaction.background_task: transaction.background_task = True transaction.set_transaction_name( *MessageTransaction.get_transaction_name( _library, _destination_type, _destination_name)) return wrapped(*args, **kwargs) # Otherwise treat it as top level transaction. if type(application) != Application: _application = application_instance(application) else: _application = application manager = MessageTransaction(library=_library, destination_type=_destination_type, destination_name=_destination_name, application=_application, routing_key=_routing_key, exchange_type=_exchange_type, headers=_headers, queue_name=_queue_name, reply_to=_reply_to, correlation_id=_correlation_id) proxy = async_proxy(wrapped) if proxy: context_manager = TransactionContext(manager) return proxy(wrapped(*args, **kwargs), context_manager) success = True try: manager.__enter__() try: return wrapped(*args, **kwargs) except: # Catch all success = False if not manager.__exit__(*sys.exc_info()): raise finally: if success and manager._ref_count == 0: manager._is_finalized = True manager.__exit__(None, None, None) else: manager._request_handler_finalize = True manager._server_adapter_finalize = True old_transaction = current_transaction() if old_transaction is not None: old_transaction.drop_transaction()
def wrapper(wrapped, instance, args, kwargs): if callable(name): if instance is not None: _name = name(instance, *args, **kwargs) else: _name = name(*args, **kwargs) elif name is None: _name = callable_name(wrapped) else: _name = name if callable(group): if instance is not None: _group = group(instance, *args, **kwargs) else: _group = group(*args, **kwargs) else: _group = group # Check to see if any transaction is present, even an inactive # one which has been marked to be ignored or which has been # stopped already. transaction = current_transaction(active_only=False) if transaction: # If there is any active transaction we will return without # applying a new WSGI application wrapper context. In the # case of a transaction which is being ignored or which has # been stopped, we do that without doing anything further. if transaction.ignore_transaction or transaction.stopped: return wrapped(*args, **kwargs) # Check to see if we are being called within the context of # a web transaction. If we are, then we will just flag the # current web transaction as a background task if not # already marked as such and name the web transaction as # well. if type(transaction) == WebTransaction: if not transaction.background_task: transaction.background_task = True transaction.set_transaction_name(_name, _group) return wrapped(*args, **kwargs) # Otherwise treat it as top level transaction. if type(application) != Application: _application = application_instance(application) else: _application = application manager = BackgroundTask(_application, _name, _group) proxy = async_proxy(wrapped) if proxy: context_manager = TransactionContext(manager) return proxy(wrapped(*args, **kwargs), context_manager) success = True try: manager.__enter__() try: return wrapped(*args, **kwargs) except: success = False if not manager.__exit__(*sys.exc_info()): raise finally: if success and manager._ref_count == 0: manager._is_finalized = True manager.__exit__(None, None, None) else: manager._request_handler_finalize = True manager._server_adapter_finalize = True old_transaction = current_transaction() if old_transaction is not None: old_transaction.drop_transaction()