Skip to content

Commit 14ad082

Browse files
committed
Utils package
1 parent 8a946b5 commit 14ad082

File tree

27 files changed

+500
-177
lines changed

27 files changed

+500
-177
lines changed

eachdist.ini

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ sortfirst=
55
opentelemetry-api
66
opentelemetry-sdk
77
opentelemetry-auto-instrumentation
8+
ext/opentelemetry-ext-utils
89
ext/opentelemetry-ext-wsgi
910
ext/opentelemetry-ext-dbapi
1011
ext/*

ext/opentelemetry-ext-aiohttp-client/setup.cfg

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ package_dir=
4040
packages=find_namespace:
4141
install_requires =
4242
opentelemetry-api >= 0.8.dev0
43+
opentelemetry-ext-utils == 0.8.dev0
4344
aiohttp ~= 3.0
4445

4546
[options.packages.find]

ext/opentelemetry-ext-aiohttp-client/src/opentelemetry/ext/aiohttp_client/__init__.py

Lines changed: 1 addition & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -52,38 +52,11 @@ def strip_query_params(url: yarl.URL) -> str:
5252
from opentelemetry import context as context_api
5353
from opentelemetry import propagators, trace
5454
from opentelemetry.ext.aiohttp_client.version import __version__
55+
from opentelemetry.ext.utils import http_status_to_canonical_code
5556
from opentelemetry.trace import SpanKind
5657
from opentelemetry.trace.status import Status, StatusCanonicalCode
5758

5859

59-
# TODO: refactor this code to some common utility
60-
def http_status_to_canonical_code(status: int) -> StatusCanonicalCode:
61-
# pylint:disable=too-many-branches,too-many-return-statements
62-
if status < 100:
63-
return StatusCanonicalCode.UNKNOWN
64-
if status <= 399:
65-
return StatusCanonicalCode.OK
66-
if status <= 499:
67-
if status == 401: # HTTPStatus.UNAUTHORIZED:
68-
return StatusCanonicalCode.UNAUTHENTICATED
69-
if status == 403: # HTTPStatus.FORBIDDEN:
70-
return StatusCanonicalCode.PERMISSION_DENIED
71-
if status == 404: # HTTPStatus.NOT_FOUND:
72-
return StatusCanonicalCode.NOT_FOUND
73-
if status == 429: # HTTPStatus.TOO_MANY_REQUESTS:
74-
return StatusCanonicalCode.RESOURCE_EXHAUSTED
75-
return StatusCanonicalCode.INVALID_ARGUMENT
76-
if status <= 599:
77-
if status == 501: # HTTPStatus.NOT_IMPLEMENTED:
78-
return StatusCanonicalCode.UNIMPLEMENTED
79-
if status == 503: # HTTPStatus.SERVICE_UNAVAILABLE:
80-
return StatusCanonicalCode.UNAVAILABLE
81-
if status == 504: # HTTPStatus.GATEWAY_TIMEOUT:
82-
return StatusCanonicalCode.DEADLINE_EXCEEDED
83-
return StatusCanonicalCode.INTERNAL
84-
return StatusCanonicalCode.UNKNOWN
85-
86-
8760
def url_path_span_name(params: aiohttp.TraceRequestStartParams) -> str:
8861
"""Extract a span name from the request URL path.
8962

ext/opentelemetry-ext-aiohttp-client/tests/test_aiohttp_client_integration.py

Lines changed: 0 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -98,43 +98,6 @@ async def default_handler(request):
9898
loop = asyncio.get_event_loop()
9999
return loop.run_until_complete(do_request())
100100

101-
def test_http_status_to_canonical_code(self):
102-
for status_code, expected in (
103-
(HTTPStatus.OK, StatusCanonicalCode.OK),
104-
(HTTPStatus.ACCEPTED, StatusCanonicalCode.OK),
105-
(HTTPStatus.IM_USED, StatusCanonicalCode.OK),
106-
(HTTPStatus.MULTIPLE_CHOICES, StatusCanonicalCode.OK),
107-
(HTTPStatus.BAD_REQUEST, StatusCanonicalCode.INVALID_ARGUMENT),
108-
(HTTPStatus.UNAUTHORIZED, StatusCanonicalCode.UNAUTHENTICATED),
109-
(HTTPStatus.FORBIDDEN, StatusCanonicalCode.PERMISSION_DENIED),
110-
(HTTPStatus.NOT_FOUND, StatusCanonicalCode.NOT_FOUND),
111-
(
112-
HTTPStatus.UNPROCESSABLE_ENTITY,
113-
StatusCanonicalCode.INVALID_ARGUMENT,
114-
),
115-
(
116-
HTTPStatus.TOO_MANY_REQUESTS,
117-
StatusCanonicalCode.RESOURCE_EXHAUSTED,
118-
),
119-
(HTTPStatus.NOT_IMPLEMENTED, StatusCanonicalCode.UNIMPLEMENTED),
120-
(HTTPStatus.SERVICE_UNAVAILABLE, StatusCanonicalCode.UNAVAILABLE),
121-
(
122-
HTTPStatus.GATEWAY_TIMEOUT,
123-
StatusCanonicalCode.DEADLINE_EXCEEDED,
124-
),
125-
(
126-
HTTPStatus.HTTP_VERSION_NOT_SUPPORTED,
127-
StatusCanonicalCode.INTERNAL,
128-
),
129-
(600, StatusCanonicalCode.UNKNOWN),
130-
(99, StatusCanonicalCode.UNKNOWN),
131-
):
132-
with self.subTest(status_code=status_code):
133-
actual = opentelemetry.ext.aiohttp_client.http_status_to_canonical_code(
134-
int(status_code)
135-
)
136-
self.assertEqual(actual, expected, status_code)
137-
138101
def test_status_codes(self):
139102
for status_code, span_status in (
140103
(HTTPStatus.OK, StatusCanonicalCode.OK),

ext/opentelemetry-ext-dbapi/setup.cfg

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ package_dir=
4141
packages=find_namespace:
4242
install_requires =
4343
opentelemetry-api == 0.8.dev0
44+
opentelemetry-ext-utils == 0.8.dev0
4445
wrapt >= 1.0.0, < 2.0.0
4546

4647
[options.extras_require]

ext/opentelemetry-ext-dbapi/src/opentelemetry/ext/dbapi/__init__.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@
4747
import wrapt
4848

4949
from opentelemetry.ext.dbapi.version import __version__
50+
from opentelemetry.ext.utils import unwrap
5051
from opentelemetry.trace import SpanKind, Tracer, TracerProvider, get_tracer
5152
from opentelemetry.trace.status import Status, StatusCanonicalCode
5253

@@ -141,9 +142,7 @@ def unwrap_connect(
141142
connect_module: Module name where the connect method is available.
142143
connect_method_name: The connect method name.
143144
"""
144-
conn = getattr(connect_module, connect_method_name, None)
145-
if isinstance(conn, wrapt.ObjectProxy):
146-
setattr(connect_module, connect_method_name, conn.__wrapped__)
145+
unwrap(connect_module, connect_method_name)
147146

148147

149148
def instrument_connection(

ext/opentelemetry-ext-jinja2/setup.cfg

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ packages=find_namespace:
4141
install_requires =
4242
opentelemetry-api == 0.8.dev0
4343
opentelemetry-auto-instrumentation == 0.8.dev0
44+
opentelemetry-ext-utils == 0.8.dev0
4445
jinja2~=2.7
4546
wrapt >= 1.0.0, < 2.0.0
4647

ext/opentelemetry-ext-jinja2/src/opentelemetry/ext/jinja2/__init__.py

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@
5050

5151
from opentelemetry.auto_instrumentation.instrumentor import BaseInstrumentor
5252
from opentelemetry.ext.jinja2.version import __version__
53+
from opentelemetry.ext.utils import unwrap
5354
from opentelemetry.trace import SpanKind, get_tracer
5455
from opentelemetry.trace.status import Status, StatusCanonicalCode
5556

@@ -115,12 +116,6 @@ def _wrap_load_template(tracer, wrapped, _, args, kwargs):
115116
)
116117

117118

118-
def _unwrap(obj, attr):
119-
func = getattr(obj, attr, None)
120-
if func and isinstance(func, ObjectProxy) and hasattr(func, "__wrapped__"):
121-
setattr(obj, attr, func.__wrapped__)
122-
123-
124119
class Jinja2Instrumentor(BaseInstrumentor):
125120
"""An instrumentor for jinja2
126121
@@ -141,7 +136,7 @@ def _instrument(self, **kwargs):
141136
)
142137

143138
def _uninstrument(self, **kwargs):
144-
_unwrap(jinja2.Template, "render")
145-
_unwrap(jinja2.Template, "generate")
146-
_unwrap(jinja2.Environment, "compile")
147-
_unwrap(jinja2.Environment, "_load_template")
139+
unwrap(jinja2.Template, "render")
140+
unwrap(jinja2.Template, "generate")
141+
unwrap(jinja2.Environment, "compile")
142+
unwrap(jinja2.Environment, "_load_template")

ext/opentelemetry-ext-redis/setup.cfg

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ package_dir=
4141
packages=find_namespace:
4242
install_requires =
4343
opentelemetry-api == 0.8.dev0
44+
opentelemetry-ext-utils == 0.8.dev0
4445
opentelemetry-auto-instrumentation == 0.8.dev0
4546
redis >= 2.6
4647
wrapt >= 1.12.1

ext/opentelemetry-ext-redis/src/opentelemetry/ext/redis/__init__.py

Lines changed: 10 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@
5555
_format_command_args,
5656
)
5757
from opentelemetry.ext.redis.version import __version__
58+
from opentelemetry.ext.utils import unwrap
5859

5960
_DEFAULT_SERVICE = "redis"
6061
_RAWCMD = "db.statement"
@@ -68,12 +69,6 @@ def _set_connection_attributes(span, conn):
6869
span.set_attribute(key, value)
6970

7071

71-
def _unwrap(obj, attr):
72-
func = getattr(obj, attr, None)
73-
if isinstance(func, ObjectProxy) and hasattr(func, "__wrapped__"):
74-
setattr(obj, attr, func.__wrapped__)
75-
76-
7772
def _traced_execute_command(func, instance, args, kwargs):
7873
tracer = getattr(redis, "_opentelemetry_tracer")
7974
query = _format_command_args(args)
@@ -145,19 +140,19 @@ def _instrument(self, **kwargs):
145140

146141
def _uninstrument(self, **kwargs):
147142
if redis.VERSION < (3, 0, 0):
148-
_unwrap(redis.StrictRedis, "execute_command")
149-
_unwrap(redis.StrictRedis, "pipeline")
150-
_unwrap(redis.Redis, "pipeline")
151-
_unwrap(
143+
unwrap(redis.StrictRedis, "execute_command")
144+
unwrap(redis.StrictRedis, "pipeline")
145+
unwrap(redis.Redis, "pipeline")
146+
unwrap(
152147
redis.client.BasePipeline, # pylint:disable=no-member
153148
"execute",
154149
)
155-
_unwrap(
150+
unwrap(
156151
redis.client.BasePipeline, # pylint:disable=no-member
157152
"immediate_execute_command",
158153
)
159154
else:
160-
_unwrap(redis.Redis, "execute_command")
161-
_unwrap(redis.Redis, "pipeline")
162-
_unwrap(redis.client.Pipeline, "execute")
163-
_unwrap(redis.client.Pipeline, "immediate_execute_command")
155+
unwrap(redis.Redis, "execute_command")
156+
unwrap(redis.Redis, "pipeline")
157+
unwrap(redis.client.Pipeline, "execute")
158+
unwrap(redis.client.Pipeline, "immediate_execute_command")

ext/opentelemetry-ext-requests/setup.cfg

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,11 +42,13 @@ packages=find_namespace:
4242
install_requires =
4343
opentelemetry-api == 0.8.dev0
4444
opentelemetry-auto-instrumentation == 0.8.dev0
45+
opentelemetry-ext-utils == 0.8.dev0
4546
requests ~= 2.0
4647

4748
[options.extras_require]
4849
test =
4950
opentelemetry-test == 0.8.dev0
51+
opentelemetry-ext-utils == 0.8.dev0
5052
httpretty ~= 1.0
5153

5254
[options.packages.find]

ext/opentelemetry-ext-requests/src/opentelemetry/ext/requests/__init__.py

Lines changed: 3 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -50,8 +50,9 @@
5050
from opentelemetry import context, propagators, trace
5151
from opentelemetry.auto_instrumentation.instrumentor import BaseInstrumentor
5252
from opentelemetry.ext.requests.version import __version__
53+
from opentelemetry.ext.utils import http_status_to_canonical_code
5354
from opentelemetry.trace import SpanKind, get_tracer
54-
from opentelemetry.trace.status import Status, StatusCanonicalCode
55+
from opentelemetry.trace.status import Status
5556

5657

5758
# pylint: disable=unused-argument
@@ -99,7 +100,7 @@ def instrumented_request(self, method, url, *args, **kwargs):
99100
span.set_attribute("http.status_code", result.status_code)
100101
span.set_attribute("http.status_text", result.reason)
101102
span.set_status(
102-
Status(_http_status_to_canonical_code(result.status_code))
103+
Status(http_status_to_canonical_code(result.status_code))
103104
)
104105
if span_callback is not None:
105106
span_callback(span, result)
@@ -126,37 +127,6 @@ def _uninstrument():
126127
Session.request = original
127128

128129

129-
def _http_status_to_canonical_code(code: int, allow_redirect: bool = True):
130-
# pylint:disable=too-many-branches,too-many-return-statements
131-
if code < 100:
132-
return StatusCanonicalCode.UNKNOWN
133-
if code <= 299:
134-
return StatusCanonicalCode.OK
135-
if code <= 399:
136-
if allow_redirect:
137-
return StatusCanonicalCode.OK
138-
return StatusCanonicalCode.DEADLINE_EXCEEDED
139-
if code <= 499:
140-
if code == 401: # HTTPStatus.UNAUTHORIZED:
141-
return StatusCanonicalCode.UNAUTHENTICATED
142-
if code == 403: # HTTPStatus.FORBIDDEN:
143-
return StatusCanonicalCode.PERMISSION_DENIED
144-
if code == 404: # HTTPStatus.NOT_FOUND:
145-
return StatusCanonicalCode.NOT_FOUND
146-
if code == 429: # HTTPStatus.TOO_MANY_REQUESTS:
147-
return StatusCanonicalCode.RESOURCE_EXHAUSTED
148-
return StatusCanonicalCode.INVALID_ARGUMENT
149-
if code <= 599:
150-
if code == 501: # HTTPStatus.NOT_IMPLEMENTED:
151-
return StatusCanonicalCode.UNIMPLEMENTED
152-
if code == 503: # HTTPStatus.SERVICE_UNAVAILABLE:
153-
return StatusCanonicalCode.UNAVAILABLE
154-
if code == 504: # HTTPStatus.GATEWAY_TIMEOUT:
155-
return StatusCanonicalCode.DEADLINE_EXCEEDED
156-
return StatusCanonicalCode.INTERNAL
157-
return StatusCanonicalCode.UNKNOWN
158-
159-
160130
class RequestsInstrumentor(BaseInstrumentor):
161131
"""An instrumentor for requests
162132
See `BaseInstrumentor`

ext/opentelemetry-ext-sqlalchemy/setup.cfg

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ packages=find_namespace:
4242
install_requires =
4343
opentelemetry-api == 0.8.dev0
4444
opentelemetry-auto-instrumentation == 0.8.dev0
45+
opentelemetry-ext-utils == 0.8.dev0
4546
wrapt >= 1.11.2
4647
sqlalchemy
4748

ext/opentelemetry-ext-sqlalchemy/src/opentelemetry/ext/sqlalchemy/__init__.py

Lines changed: 3 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -53,16 +53,7 @@
5353
_get_tracer,
5454
_wrap_create_engine,
5555
)
56-
57-
58-
def _unwrap(obj, attr):
59-
func = getattr(obj, attr, None)
60-
if (
61-
func
62-
and isinstance(func, wrapt.ObjectProxy)
63-
and hasattr(func, "__wrapped__")
64-
):
65-
setattr(obj, attr, func.__wrapped__)
56+
from opentelemetry.ext.utils import unwrap
6657

6758

6859
class SQLAlchemyInstrumentor(BaseInstrumentor):
@@ -96,5 +87,5 @@ def _instrument(self, **kwargs):
9687
return None
9788

9889
def _uninstrument(self, **kwargs):
99-
_unwrap(sqlalchemy, "create_engine")
100-
_unwrap(sqlalchemy.engine, "create_engine")
90+
unwrap(sqlalchemy, "create_engine")
91+
unwrap(sqlalchemy.engine, "create_engine")
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
# Changelog
2+
3+
## Unreleased
4+
5+
- Initial release

0 commit comments

Comments
 (0)