Skip to content

Commit eab1b36

Browse files
authored
Merge branch 'main' into uv
2 parents ca72ada + e6c27e0 commit eab1b36

File tree

23 files changed

+217
-1431
lines changed

23 files changed

+217
-1431
lines changed

.github/workflows/instrumentations_0.yml

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,6 @@ jobs:
6666
- "redis"
6767
- "remoulade"
6868
- "requests"
69-
- "sklearn"
7069
- "sqlalchemy"
7170
- "sqlite3"
7271
- "starlette"
@@ -75,14 +74,6 @@ jobs:
7574
- "tortoiseorm"
7675
os: [ubuntu-20.04]
7776
exclude:
78-
- python-version: py39
79-
package: "sklearn"
80-
- python-version: py310
81-
package: "sklearn"
82-
- python-version: py311
83-
package: "sklearn"
84-
- python-version: py312
85-
package: "sklearn"
8677
- python-version: py312
8778
package: "boto"
8879
- python-version: py312
@@ -103,8 +94,6 @@ jobs:
10394
package: "remoulade"
10495
- python-version: pypy3
10596
package: "requests"
106-
- python-version: pypy3
107-
package: "sklearn"
10897
- python-version: pypy3
10998
package: "confluent-kafka"
11099
- python-version: pypy3

.github/workflows/lint.yml

Lines changed: 0 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -93,31 +93,3 @@ jobs:
9393
key: v7-build-tox-cache-${{ matrix.package }}-${{ hashFiles('tox.ini', 'gen-requirements.txt', 'dev-requirements.txt') }}
9494
- name: run tox
9595
run: tox -e lint-${{ matrix.package }}
96-
97-
lint-3_8:
98-
strategy:
99-
fail-fast: false # ensures the entire test matrix is run, even if one permutation fails
100-
matrix:
101-
package:
102-
- "instrumentation-sklearn"
103-
os: [ubuntu-20.04]
104-
runs-on: ubuntu-20.04
105-
steps:
106-
- name: Checkout Contrib Repo @ SHA - ${{ github.sha }}
107-
uses: actions/checkout@v4
108-
- name: Set up Python 3.8
109-
uses: actions/setup-python@v5
110-
with:
111-
python-version: 3.8
112-
- name: Install tox
113-
run: pip install tox
114-
- name: Cache tox environment
115-
# Preserves .tox directory between runs for faster installs
116-
uses: actions/cache@v4
117-
with:
118-
path: |
119-
.tox
120-
~/.cache/pip
121-
key: v7-build-tox-cache-${{ matrix.package }}-${{ hashFiles('tox.ini', 'gen-requirements.txt', 'dev-requirements.txt') }}
122-
- name: run tox
123-
run: tox -e lint-${{ matrix.package }}

CHANGELOG.md

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
99

1010
### Added
1111

12+
- `opentelemetry-instrumentation-sklearn` Deprecated the sklearn instrumentation
13+
([#2708](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/2708))
1214
- `opentelemetry-instrumentation-pyramid` Record exceptions raised when serving a request
1315
([#2622](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/2622))
1416
- `opentelemetry-sdk-extension-aws` Add AwsXrayLambdaPropagator
@@ -29,8 +31,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
2931
([#2630](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/2630))
3032
- `opentelemetry-instrumentation-system-metrics` Add support for capture open file descriptors
3133
([#2652](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/2652))
34+
- `opentelemetry-instrumentation-httpx` Add support for instrument client with proxy
35+
([#2664](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/2664))
3236
- `opentelemetry-instrumentation-aiohttp-client` Implement new semantic convention opt-in migration
3337
([#2673](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/2673))
38+
- `opentelemetry-instrumentation-django` Add `http.target` to Django duration metric attributes
39+
([#2624](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/2624))
3440

3541
### Breaking changes
3642

@@ -59,7 +65,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
5965
- `opentelemetry-instrumentation-asgi` Fix generation of `http.target` and `http.url` attributes for ASGI apps
6066
using sub apps
6167
([#2477](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/2477))
62-
- `opentelemetry-instrumentation-aws-lambda` Bugfix: AWS Lambda event source key incorrect for SNS in instrumentation library.
68+
- `opentelemetry-instrumentation-aws-lambda` Bugfix: AWS Lambda event source key incorrect for SNS in instrumentation library.
6369
([#2612](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/2612))
6470
- `opentelemetry-instrumentation-asyncio` instrumented `asyncio.wait_for` properly raises `asyncio.TimeoutError` as expected
6571
([#2637](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/2637))

eachdist.ini

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,6 @@ packages=
5454
[lintroots]
5555
extraroots=examples/*,scripts/
5656
subglob=*.py,tests/,test/,src/*,examples/*
57-
ignore=sklearn
5857

5958
[testroots]
6059
extraroots=examples/*,tests/

instrumentation/README.md

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,6 @@
3838
| [opentelemetry-instrumentation-redis](./opentelemetry-instrumentation-redis) | redis >= 2.6 | No | experimental
3939
| [opentelemetry-instrumentation-remoulade](./opentelemetry-instrumentation-remoulade) | remoulade >= 0.50 | No | experimental
4040
| [opentelemetry-instrumentation-requests](./opentelemetry-instrumentation-requests) | requests ~= 2.0 | Yes | migration
41-
| [opentelemetry-instrumentation-sklearn](./opentelemetry-instrumentation-sklearn) | scikit-learn ~= 0.24.0 | No | experimental
4241
| [opentelemetry-instrumentation-sqlalchemy](./opentelemetry-instrumentation-sqlalchemy) | sqlalchemy | Yes | experimental
4342
| [opentelemetry-instrumentation-sqlite3](./opentelemetry-instrumentation-sqlite3) | sqlite3 | No | experimental
4443
| [opentelemetry-instrumentation-starlette](./opentelemetry-instrumentation-starlette) | starlette ~= 0.13.0 | Yes | experimental

instrumentation/opentelemetry-instrumentation-aiopg/test-requirements.txt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ async-timeout==4.0.3
44
Deprecated==1.2.14
55
importlib-metadata==6.11.0
66
iniconfig==2.0.0
7-
install==1.3.5
87
packaging==24.0
98
pluggy==1.5.0
109
psycopg2-binary==2.9.9

instrumentation/opentelemetry-instrumentation-django/src/opentelemetry/instrumentation/django/middleware/otel_middleware.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -315,6 +315,12 @@ def process_view(self, request, view_func, *args, **kwargs):
315315
route = getattr(match, "route", None)
316316
if route:
317317
span.set_attribute(SpanAttributes.HTTP_ROUTE, route)
318+
duration_attrs = request.META[
319+
self._environ_duration_attr_key
320+
]
321+
# Metrics currently use the 1.11.0 schema, which puts the route in `http.target`.
322+
# TODO: use `http.route` when the user sets `OTEL_SEMCONV_STABILITY_OPT_IN`.
323+
duration_attrs[SpanAttributes.HTTP_TARGET] = route
318324

319325
def process_exception(self, request, exception):
320326
if self._excluded_urls.url_disabled(request.build_absolute_uri("?")):

instrumentation/opentelemetry-instrumentation-django/tests/test_middleware.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -480,7 +480,8 @@ def test_wsgi_metrics(self):
480480
]
481481
_recommended_attrs = {
482482
"http.server.active_requests": _active_requests_count_attrs,
483-
"http.server.duration": _duration_attrs,
483+
"http.server.duration": _duration_attrs
484+
| {SpanAttributes.HTTP_TARGET},
484485
}
485486
start = default_timer()
486487
for _ in range(3):

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

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -640,6 +640,7 @@ def __init__(self, *args, **kwargs):
640640
super().__init__(*args, **kwargs)
641641

642642
self._original_transport = self._transport
643+
self._original_mounts = self._mounts.copy()
643644
self._is_instrumented_by_opentelemetry = True
644645

645646
self._transport = SyncOpenTelemetryTransport(
@@ -648,6 +649,21 @@ def __init__(self, *args, **kwargs):
648649
request_hook=_InstrumentedClient._request_hook,
649650
response_hook=_InstrumentedClient._response_hook,
650651
)
652+
self._mounts.update(
653+
{
654+
url_pattern: (
655+
SyncOpenTelemetryTransport(
656+
transport,
657+
tracer_provider=_InstrumentedClient._tracer_provider,
658+
request_hook=_InstrumentedClient._request_hook,
659+
response_hook=_InstrumentedClient._response_hook,
660+
)
661+
if transport is not None
662+
else transport
663+
)
664+
for url_pattern, transport in self._original_mounts.items()
665+
}
666+
)
651667

652668

653669
class _InstrumentedAsyncClient(httpx.AsyncClient):
@@ -659,6 +675,7 @@ def __init__(self, *args, **kwargs):
659675
super().__init__(*args, **kwargs)
660676

661677
self._original_transport = self._transport
678+
self._original_mounts = self._mounts.copy()
662679
self._is_instrumented_by_opentelemetry = True
663680

664681
self._transport = AsyncOpenTelemetryTransport(
@@ -668,6 +685,22 @@ def __init__(self, *args, **kwargs):
668685
response_hook=_InstrumentedAsyncClient._response_hook,
669686
)
670687

688+
self._mounts.update(
689+
{
690+
url_pattern: (
691+
AsyncOpenTelemetryTransport(
692+
transport,
693+
tracer_provider=_InstrumentedAsyncClient._tracer_provider,
694+
request_hook=_InstrumentedAsyncClient._request_hook,
695+
response_hook=_InstrumentedAsyncClient._response_hook,
696+
)
697+
if transport is not None
698+
else transport
699+
)
700+
for url_pattern, transport in self._original_mounts.items()
701+
}
702+
)
703+
671704

672705
class HTTPXClientInstrumentor(BaseInstrumentor):
673706
# pylint: disable=protected-access,attribute-defined-outside-init
@@ -752,6 +785,7 @@ def instrument_client(
752785
if not client._is_instrumented_by_opentelemetry:
753786
if isinstance(client, httpx.Client):
754787
client._original_transport = client._transport
788+
client._original_mounts = client._mounts.copy()
755789
transport = client._transport or httpx.HTTPTransport()
756790
client._transport = SyncOpenTelemetryTransport(
757791
transport,
@@ -760,15 +794,47 @@ def instrument_client(
760794
response_hook=response_hook,
761795
)
762796
client._is_instrumented_by_opentelemetry = True
797+
client._mounts.update(
798+
{
799+
url_pattern: (
800+
SyncOpenTelemetryTransport(
801+
transport,
802+
tracer_provider=tracer_provider,
803+
request_hook=request_hook,
804+
response_hook=response_hook,
805+
)
806+
if transport is not None
807+
else transport
808+
)
809+
for url_pattern, transport in client._original_mounts.items()
810+
}
811+
)
812+
763813
if isinstance(client, httpx.AsyncClient):
764814
transport = client._transport or httpx.AsyncHTTPTransport()
815+
client._original_mounts = client._mounts.copy()
765816
client._transport = AsyncOpenTelemetryTransport(
766817
transport,
767818
tracer_provider=tracer_provider,
768819
request_hook=request_hook,
769820
response_hook=response_hook,
770821
)
771822
client._is_instrumented_by_opentelemetry = True
823+
client._mounts.update(
824+
{
825+
url_pattern: (
826+
AsyncOpenTelemetryTransport(
827+
transport,
828+
tracer_provider=tracer_provider,
829+
request_hook=request_hook,
830+
response_hook=response_hook,
831+
)
832+
if transport is not None
833+
else transport
834+
)
835+
for url_pattern, transport in client._original_mounts.items()
836+
}
837+
)
772838
else:
773839
_logger.warning(
774840
"Attempting to instrument Httpx client while already instrumented"
@@ -787,6 +853,9 @@ def uninstrument_client(
787853
client._transport = client._original_transport
788854
del client._original_transport
789855
client._is_instrumented_by_opentelemetry = False
856+
if hasattr(client, "_original_mounts"):
857+
client._mounts = client._original_mounts.copy()
858+
del client._original_mounts
790859
else:
791860
_logger.warning(
792861
"Attempting to uninstrument Httpx "

0 commit comments

Comments
 (0)