Skip to content

Commit e2ba6d4

Browse files
MattiasDCemdnetoxrmx
authored
starlette: Remove maximum version constraint (#3456)
* ISSUE-3317: Remove maximum version constraint on starlette, by fixing unit tests. Fixed some warnings in unit tests. * Updae changelog * Implement code review remarks: update starlette dependencies in bootstrap/test-requirements. Use setUp/tearDown iso decorator on test class * Increase minimal version of starlette to 0.37.2 to have functional 'oldest' tests. * add uv.lock * Revert "add uv.lock" This reverts commit 08df2be. * Prevent massive changes of uv.lock due to newer uv which adds upload-time keyword * Update test-requirements.in file of starlette instrumentation * fixes Signed-off-by: emdneto <[email protected]> * fix tests Signed-off-by: emdneto <[email protected]> * increase delta Signed-off-by: emdneto <[email protected]> * using same delta as fastapi Signed-off-by: emdneto <[email protected]> * commit uv.lock back Signed-off-by: emdneto <[email protected]> * Update CHANGELOG.md Co-authored-by: Riccardo Magliocchetti <[email protected]> * Update CHANGELOG.md --------- Signed-off-by: emdneto <[email protected]> Co-authored-by: emdneto <[email protected]> Co-authored-by: Riccardo Magliocchetti <[email protected]>
1 parent 4e42ed6 commit e2ba6d4

File tree

9 files changed

+2436
-1212
lines changed

9 files changed

+2436
-1212
lines changed

CHANGELOG.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
1717
([#3533](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/3533))
1818
- `opentelemetry-instrumentation-fastapi`: fix wrapping of middlewares
1919
([#3012](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/3012))
20+
- `opentelemetry-instrumentation-starlette` Remove max version constraint on starlette
21+
([#3456](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/3456))
2022
- `opentelemetry-instrumentation-urllib3`: proper bucket boundaries in stable semconv http duration metrics
2123
([#3518](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/3518))
2224
- `opentelemetry-instrumentation-urllib`: proper bucket boundaries in stable semconv http duration metrics
@@ -70,7 +72,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7072
- `opentelemetry-instrumentation-botocore` Capture server attributes for botocore API calls
7173
([#3448](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/3448))
7274

73-
7475
## Version 1.32.0/0.53b0 (2025-04-10)
7576

7677
### Added

instrumentation/README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@
4444
| [opentelemetry-instrumentation-requests](./opentelemetry-instrumentation-requests) | requests ~= 2.0 | Yes | migration
4545
| [opentelemetry-instrumentation-sqlalchemy](./opentelemetry-instrumentation-sqlalchemy) | sqlalchemy >= 1.0.0, < 2.1.0 | Yes | development
4646
| [opentelemetry-instrumentation-sqlite3](./opentelemetry-instrumentation-sqlite3) | sqlite3 | No | development
47-
| [opentelemetry-instrumentation-starlette](./opentelemetry-instrumentation-starlette) | starlette >= 0.13, <0.15 | Yes | development
47+
| [opentelemetry-instrumentation-starlette](./opentelemetry-instrumentation-starlette) | starlette >= 0.13 | Yes | development
4848
| [opentelemetry-instrumentation-system-metrics](./opentelemetry-instrumentation-system-metrics) | psutil >= 5 | No | development
4949
| [opentelemetry-instrumentation-threading](./opentelemetry-instrumentation-threading) | threading | No | development
5050
| [opentelemetry-instrumentation-tornado](./opentelemetry-instrumentation-tornado) | tornado >= 5.1.1 | Yes | development

instrumentation/opentelemetry-instrumentation-starlette/pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ dependencies = [
3434
]
3535

3636
[project.optional-dependencies]
37-
instruments = ["starlette >= 0.13, <0.15"]
37+
instruments = ["starlette >= 0.13"]
3838

3939
[project.entry-points.opentelemetry_instrumentor]
4040
starlette = "opentelemetry.instrumentation.starlette:StarletteInstrumentor"

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -332,7 +332,7 @@ def __init__(self, *args: Any, **kwargs: Any):
332332
_InstrumentedStarlette._instrumented_starlette_apps.add(self)
333333

334334
def __del__(self):
335-
_InstrumentedStarlette._instrumented_starlette_apps.remove(self)
335+
_InstrumentedStarlette._instrumented_starlette_apps.discard(self)
336336

337337

338338
def _get_route_details(scope: dict[str, Any]) -> str | None:

instrumentation/opentelemetry-instrumentation-starlette/src/opentelemetry/instrumentation/starlette/package.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,6 @@
1313
# limitations under the License.
1414

1515

16-
_instruments = ("starlette >= 0.13, <0.15",)
16+
_instruments = ("starlette >= 0.13",)
1717

1818
_supports_metrics = True

instrumentation/opentelemetry-instrumentation-starlette/test-requirements.latest.txt

Lines changed: 15 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,13 @@
1717
# opentelemetry-instrumentation-asgi
1818
# opentelemetry-instrumentation-starlette
1919
anyio==4.5.2 ; python_full_version < '3.9'
20-
# via httpx
20+
# via
21+
# httpx
22+
# starlette
2123
anyio==4.8.0 ; python_full_version >= '3.9'
22-
# via httpx
24+
# via
25+
# httpx
26+
# starlette
2327
asgiref==3.8.1
2428
# via opentelemetry-instrumentation-asgi
2529
certifi==2025.1.31
@@ -31,10 +35,6 @@ charset-normalizer==3.4.1
3135
# via requests
3236
colorama==0.4.6 ; sys_platform == 'win32'
3337
# via pytest
34-
deprecated==1.2.18
35-
# via
36-
# opentelemetry-api
37-
# opentelemetry-semantic-conventions
3838
exceptiongroup==1.2.2 ; python_full_version < '3.11'
3939
# via
4040
# anyio
@@ -72,22 +72,25 @@ requests==2.32.3
7272
# -r instrumentation/opentelemetry-instrumentation-starlette/test-requirements.in
7373
sniffio==1.3.1
7474
# via anyio
75-
starlette==0.14.2
75+
starlette==0.44.0 ; python_full_version < '3.9'
76+
# via opentelemetry-instrumentation-starlette
77+
starlette==0.46.2 ; python_full_version >= '3.9'
7678
# via opentelemetry-instrumentation-starlette
7779
tomli==2.2.1 ; python_full_version < '3.11'
7880
# via pytest
79-
typing-extensions==4.12.2 ; python_full_version < '3.13'
81+
typing-extensions==4.12.2
8082
# via
8183
# anyio
8284
# asgiref
85+
# opentelemetry-api
86+
# opentelemetry-semantic-conventions
87+
# starlette
8388
urllib3==2.2.3 ; python_full_version < '3.9'
8489
# via requests
8590
urllib3==2.3.0 ; python_full_version >= '3.9'
8691
# via requests
87-
wrapt==1.17.2
88-
# via
89-
# deprecated
90-
# opentelemetry-instrumentation
92+
wrapt==1.14.1
93+
# via opentelemetry-instrumentation
9194
zipp==3.20.2 ; python_full_version < '3.9'
9295
# via importlib-metadata
9396
zipp==3.21.0 ; python_full_version >= '3.9'

instrumentation/opentelemetry-instrumentation-starlette/tests/test_starlette_instrumentation.py

Lines changed: 43 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -230,7 +230,7 @@ def test_basic_post_request_metric_success(self):
230230
dict(point.attributes), expected_duration_attributes
231231
)
232232
if metric.name == "http.server.duration":
233-
self.assertAlmostEqual(duration, point.sum, delta=30)
233+
self.assertAlmostEqual(duration, point.sum, delta=350)
234234
elif metric.name == "http.server.response.size":
235235
self.assertEqual(response_size, point.sum)
236236
elif metric.name == "http.server.request.size":
@@ -667,17 +667,22 @@ async def _(websocket: WebSocket) -> None:
667667

668668

669669
class TestHTTPAppWithCustomHeaders(TestBaseWithCustomHeaders):
670-
@patch.dict(
671-
"os.environ",
672-
{
673-
OTEL_INSTRUMENTATION_HTTP_CAPTURE_HEADERS_SANITIZE_FIELDS: ".*my-secret.*",
674-
OTEL_INSTRUMENTATION_HTTP_CAPTURE_HEADERS_SERVER_REQUEST: "Custom-Test-Header-1,Custom-Test-Header-2,Custom-Test-Header-3,Regex-Test-Header-.*,Regex-Invalid-Test-Header-.*,.*my-secret.*",
675-
OTEL_INSTRUMENTATION_HTTP_CAPTURE_HEADERS_SERVER_RESPONSE: "Custom-Test-Header-1,Custom-Test-Header-2,Custom-Test-Header-3,my-custom-regex-header-.*,invalid-regex-header-.*,.*my-secret.*",
676-
},
677-
)
678-
def setUp(self) -> None:
670+
def setUp(self):
671+
self.test_env_patch = patch.dict(
672+
"os.environ",
673+
{
674+
OTEL_INSTRUMENTATION_HTTP_CAPTURE_HEADERS_SANITIZE_FIELDS: ".*my-secret.*",
675+
OTEL_INSTRUMENTATION_HTTP_CAPTURE_HEADERS_SERVER_REQUEST: "Custom-Test-Header-1,Custom-Test-Header-2,Custom-Test-Header-3,Regex-Test-Header-.*,Regex-Invalid-Test-Header-.*,.*my-secret.*",
676+
OTEL_INSTRUMENTATION_HTTP_CAPTURE_HEADERS_SERVER_RESPONSE: "Custom-Test-Header-1,Custom-Test-Header-2,Custom-Test-Header-3,my-custom-regex-header-.*,invalid-regex-header-.*,.*my-secret.*",
677+
},
678+
)
679+
self.test_env_patch.start()
679680
super().setUp()
680681

682+
def tearDown(self):
683+
self.test_env_patch.stop()
684+
super().tearDown()
685+
681686
def test_custom_request_headers_in_span_attributes(self):
682687
expected = {
683688
"http.request.header.custom_test_header_1": (
@@ -793,17 +798,22 @@ def test_custom_response_headers_not_in_span_attributes(self):
793798

794799

795800
class TestWebSocketAppWithCustomHeaders(TestBaseWithCustomHeaders):
796-
@patch.dict(
797-
"os.environ",
798-
{
799-
OTEL_INSTRUMENTATION_HTTP_CAPTURE_HEADERS_SANITIZE_FIELDS: ".*my-secret.*",
800-
OTEL_INSTRUMENTATION_HTTP_CAPTURE_HEADERS_SERVER_REQUEST: "Custom-Test-Header-1,Custom-Test-Header-2,Custom-Test-Header-3,Regex-Test-Header-.*,Regex-Invalid-Test-Header-.*,.*my-secret.*",
801-
OTEL_INSTRUMENTATION_HTTP_CAPTURE_HEADERS_SERVER_RESPONSE: "Custom-Test-Header-1,Custom-Test-Header-2,Custom-Test-Header-3,my-custom-regex-header-.*,invalid-regex-header-.*,.*my-secret.*",
802-
},
803-
)
804-
def setUp(self) -> None:
801+
def setUp(self):
802+
self.test_env_patch = patch.dict(
803+
"os.environ",
804+
{
805+
OTEL_INSTRUMENTATION_HTTP_CAPTURE_HEADERS_SANITIZE_FIELDS: ".*my-secret.*",
806+
OTEL_INSTRUMENTATION_HTTP_CAPTURE_HEADERS_SERVER_REQUEST: "Custom-Test-Header-1,Custom-Test-Header-2,Custom-Test-Header-3,Regex-Test-Header-.*,Regex-Invalid-Test-Header-.*,.*my-secret.*",
807+
OTEL_INSTRUMENTATION_HTTP_CAPTURE_HEADERS_SERVER_RESPONSE: "Custom-Test-Header-1,Custom-Test-Header-2,Custom-Test-Header-3,my-custom-regex-header-.*,invalid-regex-header-.*,.*my-secret.*",
808+
},
809+
)
810+
self.test_env_patch.start()
805811
super().setUp()
806812

813+
def tearDown(self):
814+
self.test_env_patch.stop()
815+
super().tearDown()
816+
807817
def test_custom_request_headers_in_span_attributes(self):
808818
expected = {
809819
"http.request.header.custom_test_header_1": (
@@ -918,23 +928,29 @@ def test_custom_response_headers_not_in_span_attributes(self):
918928
self.assertNotIn(key, server_span.attributes)
919929

920930

921-
@patch.dict(
922-
"os.environ",
923-
{
924-
OTEL_INSTRUMENTATION_HTTP_CAPTURE_HEADERS_SANITIZE_FIELDS: ".*my-secret.*",
925-
OTEL_INSTRUMENTATION_HTTP_CAPTURE_HEADERS_SERVER_REQUEST: "Custom-Test-Header-1,Custom-Test-Header-2,Custom-Test-Header-3,Regex-Test-Header-.*,Regex-Invalid-Test-Header-.*,.*my-secret.*",
926-
OTEL_INSTRUMENTATION_HTTP_CAPTURE_HEADERS_SERVER_RESPONSE: "Custom-Test-Header-1,Custom-Test-Header-2,Custom-Test-Header-3,my-custom-regex-header-.*,invalid-regex-header-.*,.*my-secret.*",
927-
},
928-
)
929931
class TestNonRecordingSpanWithCustomHeaders(TestBaseWithCustomHeaders):
930932
def setUp(self):
931933
super().setUp()
934+
self.test_env_patch = patch.dict(
935+
"os.environ",
936+
{
937+
OTEL_INSTRUMENTATION_HTTP_CAPTURE_HEADERS_SANITIZE_FIELDS: ".*my-secret.*",
938+
OTEL_INSTRUMENTATION_HTTP_CAPTURE_HEADERS_SERVER_REQUEST: "Custom-Test-Header-1,Custom-Test-Header-2,Custom-Test-Header-3,Regex-Test-Header-.*,Regex-Invalid-Test-Header-.*,.*my-secret.*",
939+
OTEL_INSTRUMENTATION_HTTP_CAPTURE_HEADERS_SERVER_RESPONSE: "Custom-Test-Header-1,Custom-Test-Header-2,Custom-Test-Header-3,my-custom-regex-header-.*,invalid-regex-header-.*,.*my-secret.*",
940+
},
941+
)
942+
self.test_env_patch.start()
943+
932944
reset_trace_globals()
933945
set_tracer_provider(tracer_provider=NoOpTracerProvider())
934946

935947
self._app = self.create_app()
936948
self._client = TestClient(self._app)
937949

950+
def tearDown(self):
951+
self.test_env_patch.stop()
952+
super().tearDown()
953+
938954
def test_custom_header_not_present_in_non_recording_span(self):
939955
resp = self._client.get(
940956
"/foobar",

opentelemetry-instrumentation/src/opentelemetry/instrumentation/bootstrap_gen.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -189,7 +189,7 @@
189189
"instrumentation": "opentelemetry-instrumentation-sqlalchemy==0.55b0.dev",
190190
},
191191
{
192-
"library": "starlette >= 0.13, <0.15",
192+
"library": "starlette >= 0.13",
193193
"instrumentation": "opentelemetry-instrumentation-starlette==0.55b0.dev",
194194
},
195195
{

0 commit comments

Comments
 (0)