From ec4abacfab8739046acf4170fd85624d63fc371e Mon Sep 17 00:00:00 2001 From: Michael Brewer Date: Sat, 18 Dec 2021 21:34:08 -0800 Subject: [PATCH 1/2] feat(tracer): Ignore tracing for certain hostname(s) or url(s) --- aws_lambda_powertools/tracing/tracer.py | 24 ++++++++++++++++++++++-- tests/unit/test_tracing.py | 6 ++++++ 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/aws_lambda_powertools/tracing/tracer.py b/aws_lambda_powertools/tracing/tracer.py index 70580663e7b..72a51c2f4d6 100644 --- a/aws_lambda_powertools/tracing/tracer.py +++ b/aws_lambda_powertools/tracing/tracer.py @@ -5,7 +5,7 @@ import logging import numbers import os -from typing import Any, Callable, Dict, Optional, Sequence, Union, cast, overload +from typing import Any, Callable, Dict, List, Optional, Sequence, Union, cast, overload from ..shared import constants from ..shared.functions import resolve_env_var_choice, resolve_truthy_env_var_choice @@ -758,7 +758,7 @@ def _patch_xray_provider(self): # Due to Lazy Import, we need to activate `core` attrib via import # we also need to include `patch`, `patch_all` methods # to ensure patch calls are done via the provider - from aws_xray_sdk.core import xray_recorder + from aws_xray_sdk.core import xray_recorder # type: ignore provider = xray_recorder provider.patch = aws_xray_sdk.core.patch @@ -778,3 +778,23 @@ def _disable_xray_trace_batching(self): def _is_xray_provider(self): return "aws_xray_sdk" in self.provider.__module__ + + @staticmethod + def ignore_endpoint(hostname: Optional[str] = None, urls: Optional[List[str]] = None): + """If you want to ignore certain httplib requests you can do so based on the hostname or URL that is being + requested. + + Documentation + -------------- + - https://github.com/aws/aws-xray-sdk-python#ignoring-httplib-requests + + Parameters + ---------- + hostname : Optional, str + The hostname is matched using the Python fnmatch library which does Unix glob style matching. + urls: Optional, List[str] + List of urls to ignore. Example `tracer.ignore_endpoint(urls=["/ignored-url"])` + """ + from aws_xray_sdk.ext.httplib import add_ignored # type: ignore + + add_ignored(hostname=hostname, urls=urls) diff --git a/tests/unit/test_tracing.py b/tests/unit/test_tracing.py index 55273b072c6..04e4fe41273 100644 --- a/tests/unit/test_tracing.py +++ b/tests/unit/test_tracing.py @@ -628,3 +628,9 @@ def handler(event, context): # THEN assert in_subsegment_mock.put_annotation.call_count == 1 assert in_subsegment_mock.put_annotation.call_args == mocker.call(key="ColdStart", value=True) + + +def test_ignore_endpoints(provider_stub, in_subsegment_mock): + provider = provider_stub(in_subsegment=in_subsegment_mock.in_subsegment) + tracer = Tracer(provider=provider) + tracer.ignore_endpoint(hostname="https://foo.com/", urls=["/bar", "/ignored"]) From 045f745c7b32c1c2ee418a20e8361c3a3c7f5642 Mon Sep 17 00:00:00 2001 From: Michael Brewer Date: Tue, 21 Dec 2021 22:16:34 -0800 Subject: [PATCH 2/2] feat: only call add_ignored when using the xray sdk --- aws_lambda_powertools/tracing/tracer.py | 8 ++++++-- tests/unit/test_tracing.py | 24 ++++++++++++++++++++---- 2 files changed, 26 insertions(+), 6 deletions(-) diff --git a/aws_lambda_powertools/tracing/tracer.py b/aws_lambda_powertools/tracing/tracer.py index 72a51c2f4d6..200325cfe9a 100644 --- a/aws_lambda_powertools/tracing/tracer.py +++ b/aws_lambda_powertools/tracing/tracer.py @@ -779,11 +779,12 @@ def _disable_xray_trace_batching(self): def _is_xray_provider(self): return "aws_xray_sdk" in self.provider.__module__ - @staticmethod - def ignore_endpoint(hostname: Optional[str] = None, urls: Optional[List[str]] = None): + def ignore_endpoint(self, hostname: Optional[str] = None, urls: Optional[List[str]] = None): """If you want to ignore certain httplib requests you can do so based on the hostname or URL that is being requested. + > NOTE: If the provider is not xray, nothing will be added to ignore list + Documentation -------------- - https://github.com/aws/aws-xray-sdk-python#ignoring-httplib-requests @@ -795,6 +796,9 @@ def ignore_endpoint(hostname: Optional[str] = None, urls: Optional[List[str]] = urls: Optional, List[str] List of urls to ignore. Example `tracer.ignore_endpoint(urls=["/ignored-url"])` """ + if not self._is_xray_provider(): + return + from aws_xray_sdk.ext.httplib import add_ignored # type: ignore add_ignored(hostname=hostname, urls=urls) diff --git a/tests/unit/test_tracing.py b/tests/unit/test_tracing.py index 04e4fe41273..2482b0177d3 100644 --- a/tests/unit/test_tracing.py +++ b/tests/unit/test_tracing.py @@ -2,6 +2,7 @@ import sys from typing import NamedTuple from unittest import mock +from unittest.mock import MagicMock import pytest @@ -630,7 +631,22 @@ def handler(event, context): assert in_subsegment_mock.put_annotation.call_args == mocker.call(key="ColdStart", value=True) -def test_ignore_endpoints(provider_stub, in_subsegment_mock): - provider = provider_stub(in_subsegment=in_subsegment_mock.in_subsegment) - tracer = Tracer(provider=provider) - tracer.ignore_endpoint(hostname="https://foo.com/", urls=["/bar", "/ignored"]) +@mock.patch("aws_xray_sdk.ext.httplib.add_ignored") +def test_ignore_endpoints_xray_sdk(mock_add_ignored: MagicMock): + # GIVEN a xray sdk provider + tracer = Tracer() + # WHEN we call ignore_endpoint + tracer.ignore_endpoint(hostname="https://www.foo.com/", urls=["/bar", "/ignored"]) + # THEN call xray add_ignored + assert mock_add_ignored.call_count == 1 + mock_add_ignored.assert_called_with(hostname="https://www.foo.com/", urls=["/bar", "/ignored"]) + + +@mock.patch("aws_xray_sdk.ext.httplib.add_ignored") +def test_ignore_endpoints_mocked_provider(mock_add_ignored: MagicMock, provider_stub, in_subsegment_mock): + # GIVEN a mock provider + tracer = Tracer(provider=provider_stub(in_subsegment=in_subsegment_mock.in_subsegment)) + # WHEN we call ignore_endpoint + tracer.ignore_endpoint(hostname="https://foo.com/") + # THEN don't call xray add_ignored + assert mock_add_ignored.call_count == 0