Beispiel #1
0
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
    )
Beispiel #2
0
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)
Beispiel #3
0
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)
Beispiel #4
0
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)
Beispiel #5
0
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)
Beispiel #6
0
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)
Beispiel #7
0
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)
Beispiel #8
0
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)
Beispiel #9
0
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)
Beispiel #11
0
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)
Beispiel #12
0
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)