def _wrapper(wrapped, instance, args, kwargs): """ General wrapper for AsyncHTTPClient instrumentation. :param wrapped: wrapt's wrapped :param instance: wrapt's instance :param args: wrapt's args :param kwargs: wrapt's kwargs :return: None """ print_debug('AsyncHTTPClient init') try: request, raise_error = _prepare_http_request(*args, **kwargs) except Exception: # pylint: disable=W0703 return wrapped(*args, **kwargs) print_debug('AsyncHTTPClient setting header') trace_header = get_epsagon_http_trace_id() if isinstance(request.headers, HTTPHeaders): if not request.headers.get(EPSAGON_HEADER): request.headers.add(EPSAGON_HEADER, trace_header) elif isinstance(request.headers, dict): if EPSAGON_HEADER not in request.headers: request.headers[EPSAGON_HEADER] = trace_header print_debug('AsyncHTTPClient running wrapper') return wrapper( TornadoClientEventFactory, wrapped, instance, (request, ), # new args {'raise_error': raise_error} # new kwargs )
def _single_wrapper(wrapped, instance, args, kwargs): """ Single execution wrapper for Redis instrumentation. :param wrapped: wrapt's wrapped :param instance: wrapt's instance :param args: wrapt's args :param kwargs: wrapt's kwargs :return: None """ return wrapper(RedisSingleEventFactory, wrapped, instance, args, kwargs)
def _wrapper(wrapped, instance, args, kwargs): """ General wrapper for Azure sdk instrumentation. :param wrapped: wrapt's wrapped :param instance: wrapt's instance :param args: wrapt's args :param kwargs: wrapt's kwargs :return: None """ return wrapper(AzureEventFactory, wrapped, instance, args, kwargs)
def _wrapper(wrapped, instance, args, kwargs): """ General wrapper for sqlalchemy instrumentation. :param wrapped: wrapt's wrapped :param instance: wrapt's instance :param args: wrapt's args :param kwargs: wrapt's kwargs :return: None """ return wrapper(SqlAlchemyEventFactory, wrapped, instance, args, kwargs)
def _wrapper(wrapped, instance, args, kwargs): """ Cloud Object Storage wrapper for Tencent instrumentation. :param wrapped: wrapt's wrapped :param instance: wrapt's instance :param args: wrapt's args :param kwargs: wrapt's kwargs :return: None """ return wrapper(COSEventFactory, wrapped, instance, args, kwargs)
def _multi_wrapper(wrapped, instance, args, kwargs): """ Multi-execution wrapper for Redis instrumentation. :param wrapped: wrapt's wrapped :param instance: wrapt's instance :param args: wrapt's args :param kwargs: wrapt's kwargs :return: None """ RedisMultiEventFactory.LAST_STACK = copy.deepcopy(instance.command_stack) return wrapper(RedisMultiEventFactory, wrapped, instance, args, kwargs)
def _wrapper(wrapped, instance, args, kwargs): """KafkaProducer.send wrapper""" new_args, new_kwargs = _parse_args(*args, **kwargs) # Adds epsagon header if not new_kwargs.get('headers'): new_kwargs['headers'] = [] new_kwargs['headers'].append( (EPSAGON_HEADER, get_epsagon_http_trace_id().encode()) ) return wrapper(KafkaEventFactory, wrapped, instance, new_args, new_kwargs)
def _wrapper(wrapped, instance, args, kwargs): """KafkaProducer.send wrapper""" new_args, new_kwargs = _parse_args(*args, **kwargs) # Adds epsagon header only on Kafka record V2. V0/V1 don't support it # pylint: disable=protected-access if instance._max_usable_produce_magic() == 2: if not new_kwargs.get('headers'): new_kwargs['headers'] = [] new_kwargs['headers'].append( (EPSAGON_HEADER, get_epsagon_http_trace_id().encode())) return wrapper(KafkaEventFactory, wrapped, instance, new_args, new_kwargs)
def _wrapper(wrapped, instance, args, kwargs): """ General wrapper for botocore instrumentation. :param wrapped: wrapt's wrapped :param instance: wrapt's instance :param args: wrapt's args :param kwargs: wrapt's kwargs :return: None """ instance_type = instance.__class__.__name__.lower() if instance_type == BotocoreStepFunctionEvent.RESOURCE_TYPE: handle_stepfunc_args(args) return wrapper(BotocoreEventFactory, wrapped, instance, args, kwargs)
def _wrapper(wrapped, instance, args, kwargs): """ General wrapper for PynamoDB instrumentation. :param wrapped: wrapt's wrapped :param instance: wrapt's instance :param args: wrapt's args :param kwargs: wrapt's kwargs :return: None """ # Skip non DynamoDB requests if 'https://dynamodb.' not in args[0].url: return wrapped(*args, **kwargs) return wrapper(PynamoDBEventAdapter, wrapped, instance, args, kwargs)
def _wrapper(wrapped, instance, args, kwargs): """ General wrapper for requests instrumentation. :param wrapped: wrapt's wrapped :param instance: wrapt's instance :param args: wrapt's args :param kwargs: wrapt's kwargs :return: None """ # Marking connection pool so requests won't be captured in urllib3 as well try: for adapter in instance.adapters.values(): connection_pool = adapter.poolmanager.connection_from_url( args[0].url) setattr(connection_pool, EPSAGON_MARKER, True) except Exception as exception: # pylint: disable=broad-except print_debug( 'Could not add marker to requests adapter: {}'.format(exception)) return wrapper(RequestsEventFactory, wrapped, instance, args, kwargs)
def _wrapper(wrapped, instance, args, kwargs): """ General wrapper for requests instrumentation. :param wrapped: wrapt's wrapped :param instance: wrapt's instance :param args: wrapt's args :param kwargs: wrapt's kwargs :return: None """ # Inject header to support tracing over HTTP requests to # opentracing monitored code trace_id = uuid.uuid4().hex span_id = uuid.uuid4().hex[16:] parent_span_id = uuid.uuid4().hex[16:] host_url = '{}://{}'.format(instance.scheme, instance.host) # Detect if URL is blacklisted, and ignore. if not is_blacklisted_url(host_url): headers = _get_headers_from_args(*args, **kwargs) if headers is None: # explicitly checking None to not catch {} if len(args) >= 4: # we got None headers as in args[3] args = list(args) headers = args[3] = {} args = tuple(args) else: # either kwargs['headers'] == None or it doesn't exist headers = kwargs['headers'] = {} headers['epsagon-trace-id'] = ( '{trace_id}:{span_id}:{parent_span_id}:1'.format( trace_id=trace_id, span_id=span_id, parent_span_id=parent_span_id ) ) return wrapper(Urllib3EventFactory, wrapped, instance, args, kwargs)