Skip to content

Commit 64a9e62

Browse files
emdnetoxrmx
authored andcommitted
consistently use of suppress_instrumentation utils (open-telemetry#2590)
1 parent cd3fbc2 commit 64a9e62

File tree

9 files changed

+125
-45
lines changed

9 files changed

+125
-45
lines changed

CHANGELOG.md

+2
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
2323
([#2538](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/2538))
2424
- Add Python 3.12 support
2525
([#2572](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/2572))
26+
- `opentelemetry-instrumentation-aiohttp-server`, `opentelemetry-instrumentation-httpx` Ensure consistently use of suppress_instrumentation utils
27+
([#2590](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/2590))
2628

2729
## Version 1.25.0/0.46b0 (2024-05-31)
2830

instrumentation/opentelemetry-instrumentation-aiohttp-server/src/opentelemetry/instrumentation/aiohttp_server/__init__.py

+7-7
Original file line numberDiff line numberDiff line change
@@ -19,12 +19,14 @@
1919
from aiohttp import web
2020
from multidict import CIMultiDictProxy
2121

22-
from opentelemetry import context, metrics, trace
23-
from opentelemetry.context import _SUPPRESS_HTTP_INSTRUMENTATION_KEY
22+
from opentelemetry import metrics, trace
2423
from opentelemetry.instrumentation.aiohttp_server.package import _instruments
2524
from opentelemetry.instrumentation.aiohttp_server.version import __version__
2625
from opentelemetry.instrumentation.instrumentor import BaseInstrumentor
27-
from opentelemetry.instrumentation.utils import http_status_to_status_code
26+
from opentelemetry.instrumentation.utils import (
27+
http_status_to_status_code,
28+
is_http_instrumentation_enabled,
29+
)
2830
from opentelemetry.propagate import extract
2931
from opentelemetry.propagators.textmap import Getter
3032
from opentelemetry.semconv.metrics import MetricInstruments
@@ -191,10 +193,8 @@ def keys(self, carrier: Dict) -> List:
191193
@web.middleware
192194
async def middleware(request, handler):
193195
"""Middleware for aiohttp implementing tracing logic"""
194-
if (
195-
context.get_value("suppress_instrumentation")
196-
or context.get_value(_SUPPRESS_HTTP_INSTRUMENTATION_KEY)
197-
or _excluded_urls.url_disabled(request.url.path)
196+
if not is_http_instrumentation_enabled() or _excluded_urls.url_disabled(
197+
request.url.path
198198
):
199199
return await handler(request)
200200

instrumentation/opentelemetry-instrumentation-aiohttp-server/tests/test_aiohttp_server_integration.py

+27-2
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
from opentelemetry.instrumentation.aiohttp_server import (
2424
AioHttpServerInstrumentor,
2525
)
26+
from opentelemetry.instrumentation.utils import suppress_http_instrumentation
2627
from opentelemetry.semconv.trace import SpanAttributes
2728
from opentelemetry.test.globals_test import reset_trace_globals
2829
from opentelemetry.test.test_base import TestBase
@@ -64,16 +65,25 @@ async def default_handler(request, status=200):
6465
return aiohttp.web.Response(status=status)
6566

6667

68+
@pytest.fixture(name="suppress")
69+
def fixture_suppress():
70+
return False
71+
72+
6773
@pytest_asyncio.fixture(name="server_fixture")
68-
async def fixture_server_fixture(tracer, aiohttp_server):
74+
async def fixture_server_fixture(tracer, aiohttp_server, suppress):
6975
_, memory_exporter = tracer
7076

7177
AioHttpServerInstrumentor().instrument()
7278

7379
app = aiohttp.web.Application()
7480
app.add_routes([aiohttp.web.get("/test-path", default_handler)])
81+
if suppress:
82+
with suppress_http_instrumentation():
83+
server = await aiohttp_server(app)
84+
else:
85+
server = await aiohttp_server(app)
7586

76-
server = await aiohttp_server(app)
7787
yield server, app
7888

7989
memory_exporter.clear()
@@ -128,3 +138,18 @@ async def test_status_code_instrumentation(
128138
f"http://{server.host}:{server.port}{url}"
129139
== span.attributes[SpanAttributes.HTTP_URL]
130140
)
141+
142+
143+
@pytest.mark.asyncio
144+
@pytest.mark.parametrize("suppress", [True])
145+
async def test_suppress_instrumentation(
146+
tracer, server_fixture, aiohttp_client
147+
):
148+
_, memory_exporter = tracer
149+
server, _ = server_fixture
150+
assert len(memory_exporter.get_finished_spans()) == 0
151+
152+
client = await aiohttp_client(server)
153+
await client.get("/test-path")
154+
155+
assert len(memory_exporter.get_finished_spans()) == 0

instrumentation/opentelemetry-instrumentation-httpx/src/opentelemetry/instrumentation/httpx/__init__.py

+6-4
Original file line numberDiff line numberDiff line change
@@ -196,11 +196,13 @@ async def async_response_hook(span, request, response):
196196

197197
import httpx
198198

199-
from opentelemetry import context
200199
from opentelemetry.instrumentation.httpx.package import _instruments
201200
from opentelemetry.instrumentation.httpx.version import __version__
202201
from opentelemetry.instrumentation.instrumentor import BaseInstrumentor
203-
from opentelemetry.instrumentation.utils import http_status_to_status_code
202+
from opentelemetry.instrumentation.utils import (
203+
http_status_to_status_code,
204+
is_http_instrumentation_enabled,
205+
)
204206
from opentelemetry.propagate import inject
205207
from opentelemetry.semconv.trace import SpanAttributes
206208
from opentelemetry.trace import SpanKind, TracerProvider, get_tracer
@@ -347,7 +349,7 @@ def handle_request(
347349
httpx.Response,
348350
]:
349351
"""Add request info to span."""
350-
if context.get_value("suppress_instrumentation"):
352+
if not is_http_instrumentation_enabled():
351353
return self._transport.handle_request(*args, **kwargs)
352354

353355
method, url, headers, stream, extensions = _extract_parameters(
@@ -438,7 +440,7 @@ async def handle_async_request(self, *args, **kwargs) -> typing.Union[
438440
httpx.Response,
439441
]:
440442
"""Add request info to span."""
441-
if context.get_value("suppress_instrumentation"):
443+
if not is_http_instrumentation_enabled():
442444
return await self._transport.handle_async_request(*args, **kwargs)
443445

444446
method, url, headers, stream, extensions = _extract_parameters(

instrumentation/opentelemetry-instrumentation-httpx/tests/test_httpx_integration.py

+4-13
Original file line numberDiff line numberDiff line change
@@ -21,12 +21,13 @@
2121
import respx
2222

2323
import opentelemetry.instrumentation.httpx
24-
from opentelemetry import context, trace
24+
from opentelemetry import trace
2525
from opentelemetry.instrumentation.httpx import (
2626
AsyncOpenTelemetryTransport,
2727
HTTPXClientInstrumentor,
2828
SyncOpenTelemetryTransport,
2929
)
30+
from opentelemetry.instrumentation.utils import suppress_http_instrumentation
3031
from opentelemetry.propagate import get_global_textmap, set_global_textmap
3132
from opentelemetry.sdk import resources
3233
from opentelemetry.semconv.trace import SpanAttributes
@@ -191,14 +192,9 @@ def test_not_foundbasic(self):
191192
)
192193

193194
def test_suppress_instrumentation(self):
194-
token = context.attach(
195-
context.set_value("suppress_instrumentation", True)
196-
)
197-
try:
195+
with suppress_http_instrumentation():
198196
result = self.perform_request(self.URL)
199197
self.assertEqual(result.text, "Hello!")
200-
finally:
201-
context.detach(token)
202198

203199
self.assert_span(num_spans=0)
204200

@@ -512,15 +508,10 @@ def test_not_recording(self):
512508

513509
def test_suppress_instrumentation_new_client(self):
514510
HTTPXClientInstrumentor().instrument()
515-
token = context.attach(
516-
context.set_value("suppress_instrumentation", True)
517-
)
518-
try:
511+
with suppress_http_instrumentation():
519512
client = self.create_client()
520513
result = self.perform_request(self.URL, client=client)
521514
self.assertEqual(result.text, "Hello!")
522-
finally:
523-
context.detach(token)
524515

525516
self.assert_span(num_spans=0)
526517
HTTPXClientInstrumentor().uninstrument()

opentelemetry-instrumentation/src/opentelemetry/instrumentation/utils.py

+11-4
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,10 @@
3737

3838
propagator = TraceContextTextMapPropagator()
3939

40+
_SUPPRESS_INSTRUMENTATION_KEY_PLAIN = (
41+
"suppress_instrumentation" # Set for backward compatibility
42+
)
43+
4044

4145
def extract_attributes_from_object(
4246
obj: any, attributes: Sequence[str], existing: Dict[str, str] = None
@@ -161,9 +165,10 @@ def _python_path_without_directory(python_path, directory, path_separator):
161165

162166

163167
def is_instrumentation_enabled() -> bool:
164-
if context.get_value(_SUPPRESS_INSTRUMENTATION_KEY):
165-
return False
166-
return True
168+
return not (
169+
context.get_value(_SUPPRESS_INSTRUMENTATION_KEY)
170+
or context.get_value(_SUPPRESS_INSTRUMENTATION_KEY_PLAIN)
171+
)
167172

168173

169174
def is_http_instrumentation_enabled() -> bool:
@@ -188,7 +193,9 @@ def _suppress_instrumentation(*keys: str) -> Iterable[None]:
188193
@contextmanager
189194
def suppress_instrumentation() -> Iterable[None]:
190195
"""Suppress instrumentation within the context."""
191-
with _suppress_instrumentation(_SUPPRESS_INSTRUMENTATION_KEY):
196+
with _suppress_instrumentation(
197+
_SUPPRESS_INSTRUMENTATION_KEY, _SUPPRESS_INSTRUMENTATION_KEY_PLAIN
198+
):
192199
yield
193200

194201

opentelemetry-instrumentation/tests/test_utils.py

+54
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,20 @@
1515
import unittest
1616
from http import HTTPStatus
1717

18+
from opentelemetry.context import (
19+
_SUPPRESS_HTTP_INSTRUMENTATION_KEY,
20+
_SUPPRESS_INSTRUMENTATION_KEY,
21+
get_current,
22+
get_value,
23+
)
1824
from opentelemetry.instrumentation.sqlcommenter_utils import _add_sql_comment
1925
from opentelemetry.instrumentation.utils import (
2026
_python_path_without_directory,
2127
http_status_to_status_code,
28+
is_http_instrumentation_enabled,
29+
is_instrumentation_enabled,
30+
suppress_http_instrumentation,
31+
suppress_instrumentation,
2232
)
2333
from opentelemetry.trace import StatusCode
2434

@@ -186,3 +196,47 @@ def test_add_sql_comments_without_comments(self):
186196
)
187197

188198
self.assertEqual(commented_sql_without_semicolon, "Select 1")
199+
200+
def test_is_instrumentation_enabled_by_default(self):
201+
self.assertTrue(is_instrumentation_enabled())
202+
self.assertTrue(is_http_instrumentation_enabled())
203+
204+
def test_suppress_instrumentation(self):
205+
with suppress_instrumentation():
206+
self.assertFalse(is_instrumentation_enabled())
207+
self.assertFalse(is_http_instrumentation_enabled())
208+
209+
self.assertTrue(is_instrumentation_enabled())
210+
self.assertTrue(is_http_instrumentation_enabled())
211+
212+
def test_suppress_http_instrumentation(self):
213+
with suppress_http_instrumentation():
214+
self.assertFalse(is_http_instrumentation_enabled())
215+
self.assertTrue(is_instrumentation_enabled())
216+
217+
self.assertTrue(is_instrumentation_enabled())
218+
self.assertTrue(is_http_instrumentation_enabled())
219+
220+
def test_suppress_instrumentation_key(self):
221+
self.assertIsNone(get_value(_SUPPRESS_INSTRUMENTATION_KEY))
222+
self.assertIsNone(get_value("suppress_instrumentation"))
223+
224+
with suppress_instrumentation():
225+
ctx = get_current()
226+
self.assertIn(_SUPPRESS_INSTRUMENTATION_KEY, ctx)
227+
self.assertIn("suppress_instrumentation", ctx)
228+
self.assertTrue(get_value(_SUPPRESS_INSTRUMENTATION_KEY))
229+
self.assertTrue(get_value("suppress_instrumentation"))
230+
231+
self.assertIsNone(get_value(_SUPPRESS_INSTRUMENTATION_KEY))
232+
self.assertIsNone(get_value("suppress_instrumentation"))
233+
234+
def test_suppress_http_instrumentation_key(self):
235+
self.assertIsNone(get_value(_SUPPRESS_HTTP_INSTRUMENTATION_KEY))
236+
237+
with suppress_http_instrumentation():
238+
ctx = get_current()
239+
self.assertIn(_SUPPRESS_HTTP_INSTRUMENTATION_KEY, ctx)
240+
self.assertTrue(get_value(_SUPPRESS_HTTP_INSTRUMENTATION_KEY))
241+
242+
self.assertIsNone(get_value(_SUPPRESS_HTTP_INSTRUMENTATION_KEY))

resource/opentelemetry-resource-detector-azure/CHANGELOG.md

+5
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,11 @@ All notable changes to this project will be documented in this file.
55
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
66
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
77

8+
## Unreleased
9+
10+
- Ensure consistently use of suppress_instrumentation utils
11+
([#2590](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/2590))
12+
813
## Version 0.1.5 (2024-05-16)
914

1015
- Ignore vm detector if already in other rps

resource/opentelemetry-resource-detector-azure/src/opentelemetry/resource/detector/azure/vm.py

+9-15
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,7 @@
1717
from urllib.error import URLError
1818
from urllib.request import Request, urlopen
1919

20-
from opentelemetry.context import (
21-
_SUPPRESS_INSTRUMENTATION_KEY,
22-
attach,
23-
detach,
24-
set_value,
25-
)
20+
from opentelemetry.instrumentation.utils import suppress_instrumentation
2621
from opentelemetry.sdk.resources import Resource, ResourceDetector
2722
from opentelemetry.semconv.resource import (
2823
CloudPlatformValues,
@@ -46,15 +41,14 @@ class AzureVMResourceDetector(ResourceDetector):
4641
def detect(self) -> "Resource":
4742
attributes = {}
4843
if not _can_ignore_vm_detect():
49-
token = attach(set_value(_SUPPRESS_INSTRUMENTATION_KEY, True))
50-
metadata_json = _get_azure_vm_metadata()
51-
if not metadata_json:
52-
return Resource(attributes)
53-
for attribute_key in _EXPECTED_AZURE_AMS_ATTRIBUTES:
54-
attributes[attribute_key] = _get_attribute_from_metadata(
55-
metadata_json, attribute_key
56-
)
57-
detach(token)
44+
with suppress_instrumentation():
45+
metadata_json = _get_azure_vm_metadata()
46+
if not metadata_json:
47+
return Resource(attributes)
48+
for attribute_key in _EXPECTED_AZURE_AMS_ATTRIBUTES:
49+
attributes[attribute_key] = _get_attribute_from_metadata(
50+
metadata_json, attribute_key
51+
)
5852
return Resource(attributes)
5953

6054

0 commit comments

Comments
 (0)