diff --git a/CHANGELOG.md b/CHANGELOG.md index 4c60e3a3a2..bb31a5fd9d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -45,6 +45,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ([#562](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/562)) - `opentelemetry-instrumentation-django` Fix AttributeError: ResolverMatch object has no attribute route ([#581](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/581)) +- `opentelemetry-instrumentation-botocore` Suppress botocore downstream instrumentation like urllib3 + ([#563](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/563)) ### Added - `opentelemetry-instrumentation-httpx` Add `httpx` instrumentation diff --git a/instrumentation/opentelemetry-instrumentation-botocore/src/opentelemetry/instrumentation/botocore/__init__.py b/instrumentation/opentelemetry-instrumentation-botocore/src/opentelemetry/instrumentation/botocore/__init__.py index 0439490c5c..e4ac1bad21 100644 --- a/instrumentation/opentelemetry-instrumentation-botocore/src/opentelemetry/instrumentation/botocore/__init__.py +++ b/instrumentation/opentelemetry-instrumentation-botocore/src/opentelemetry/instrumentation/botocore/__init__.py @@ -68,6 +68,13 @@ logger = logging.getLogger(__name__) +# A key to a context variable to avoid creating duplicate spans when instrumenting +# both botocore.client and urllib3.connectionpool.HTTPConnectionPool.urlopen since +# botocore calls urlopen +_SUPPRESS_HTTP_INSTRUMENTATION_KEY = context_api.create_key( + "suppress_http_instrumentation" +) + # pylint: disable=unused-argument def _patched_endpoint_prepare_request(wrapped, instance, args, kwargs): @@ -161,10 +168,16 @@ def _patched_api_call(self, original_func, instance, args, kwargs): "aws.table_name", api_params["TableName"] ) + token = context_api.attach( + context_api.set_value(_SUPPRESS_HTTP_INSTRUMENTATION_KEY, True) + ) + try: result = original_func(*args, **kwargs) except ClientError as ex: error = ex + finally: + context_api.detach(token) if error: result = error.response