Skip to content

Commit 8ffc449

Browse files
zhihalixrmx
authored andcommitted
Teach fastapi instrumentation about fastapi-slim (open-telemetry#2702)
1 parent c025043 commit 8ffc449

File tree

9 files changed

+65
-4
lines changed

9 files changed

+65
-4
lines changed

.github/workflows/instrumentations_1.yml

+1
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ jobs:
3838
- "resource-detector-azure"
3939
- "resource-detector-container"
4040
- "util-http"
41+
- "fastapi-slim"
4142
os: [ubuntu-20.04]
4243
exclude:
4344
- python-version: pypy3

CHANGELOG.md

+3
Original file line numberDiff line numberDiff line change
@@ -55,8 +55,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
5555
- `opentelemetry-instrumentation-httpx`, `opentelemetry-instrumentation-aiohttp-client`,
5656
`opentelemetry-instrumentation-requests` Populate `{method}` as `HTTP` on `_OTHER` methods
5757
([#2726](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/2726))
58+
- `opentelemetry-instrumentation-fastapi` Add dependency support for fastapi-slim
59+
([#2702](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/2702))
5860

5961
### Fixed
62+
6063
- Handle `redis.exceptions.WatchError` as a non-error event in redis instrumentation
6164
([#2668](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/2668))
6265
- `opentelemetry-instrumentation-httpx` Ensure httpx.get or httpx.request like methods are instrumented

instrumentation/README.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
| [opentelemetry-instrumentation-django](./opentelemetry-instrumentation-django) | django >= 1.10 | Yes | experimental
2020
| [opentelemetry-instrumentation-elasticsearch](./opentelemetry-instrumentation-elasticsearch) | elasticsearch >= 6.0 | No | experimental
2121
| [opentelemetry-instrumentation-falcon](./opentelemetry-instrumentation-falcon) | falcon >= 1.4.1, < 4.0.0 | Yes | experimental
22-
| [opentelemetry-instrumentation-fastapi](./opentelemetry-instrumentation-fastapi) | fastapi ~= 0.58 | Yes | migration
22+
| [opentelemetry-instrumentation-fastapi](./opentelemetry-instrumentation-fastapi) | fastapi ~= 0.58,fastapi-slim ~= 0.111.0 | Yes | migration
2323
| [opentelemetry-instrumentation-flask](./opentelemetry-instrumentation-flask) | flask >= 1.0 | Yes | migration
2424
| [opentelemetry-instrumentation-grpc](./opentelemetry-instrumentation-grpc) | grpcio ~= 1.27 | No | experimental
2525
| [opentelemetry-instrumentation-httpx](./opentelemetry-instrumentation-httpx) | httpx >= 0.18.0 | No | migration

instrumentation/opentelemetry-instrumentation-fastapi/pyproject.toml

+2-1
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,8 @@ dependencies = [
3434

3535
[project.optional-dependencies]
3636
instruments = [
37-
"fastapi ~= 0.58",
37+
"fastapi ~= 0.58",
38+
"fastapi-slim ~= 0.111.0",
3839
]
3940

4041
[project.entry-points.opentelemetry_instrumentor]

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

+11-1
Original file line numberDiff line numberDiff line change
@@ -172,6 +172,7 @@ def client_response_hook(span: Span, scope: dict[str, Any], message: dict[str, A
172172
---
173173
"""
174174
import logging
175+
from importlib.util import find_spec
175176
from typing import Collection
176177

177178
import fastapi
@@ -189,7 +190,11 @@ def client_response_hook(span: Span, scope: dict[str, Any], message: dict[str, A
189190
ClientResponseHook,
190191
ServerRequestHook,
191192
)
192-
from opentelemetry.instrumentation.fastapi.package import _instruments
193+
from opentelemetry.instrumentation.fastapi.package import (
194+
_fastapi,
195+
_fastapi_slim,
196+
_instruments,
197+
)
193198
from opentelemetry.instrumentation.fastapi.version import __version__
194199
from opentelemetry.instrumentation.instrumentor import BaseInstrumentor
195200
from opentelemetry.metrics import get_meter
@@ -280,6 +285,11 @@ def uninstrument_app(app: fastapi.FastAPI):
280285
app._is_instrumented_by_opentelemetry = False
281286

282287
def instrumentation_dependencies(self) -> Collection[str]:
288+
if find_spec("fastapi") is not None:
289+
return (_fastapi,)
290+
if find_spec("fastapi_slim") is not None:
291+
return (_fastapi_slim,)
292+
# If neither is installed, return both as potential dependencies
283293
return _instruments
284294

285295
def _instrument(self, **kwargs):

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

+4-1
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,10 @@
1313
# limitations under the License.
1414

1515

16-
_instruments = ("fastapi ~= 0.58",)
16+
_fastapi = "fastapi ~= 0.58"
17+
_fastapi_slim = "fastapi-slim ~= 0.111.0"
18+
19+
_instruments = (_fastapi, _fastapi_slim)
1720

1821
_supports_metrics = True
1922

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
annotated-types==0.6.0
2+
anyio==4.3.0
3+
asgiref==3.7.2
4+
certifi==2024.7.4
5+
charset-normalizer==3.3.2
6+
Deprecated==1.2.14
7+
exceptiongroup==1.2.0
8+
fastapi-slim==0.111.0
9+
h11==0.14.0
10+
httpcore==1.0.4
11+
httpx==0.27.0
12+
idna==3.7
13+
importlib-metadata==6.11.0
14+
iniconfig==2.0.0
15+
packaging==24.0
16+
pluggy==1.5.0
17+
py-cpuinfo==9.0.0
18+
pydantic==2.6.2
19+
pydantic_core==2.16.3
20+
pytest==7.4.4
21+
requests==2.32.3
22+
sniffio==1.3.0
23+
starlette==0.37.2
24+
tomli==2.0.1
25+
typing_extensions==4.9.0
26+
urllib3==2.2.2
27+
wrapt==1.16.0
28+
zipp==3.19.2
29+
-e opentelemetry-instrumentation
30+
-e instrumentation/opentelemetry-instrumentation-asgi
31+
-e util/opentelemetry-util-http
32+
-e instrumentation/opentelemetry-instrumentation-fastapi

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

+4
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,10 @@
8484
"library": "fastapi ~= 0.58",
8585
"instrumentation": "opentelemetry-instrumentation-fastapi==0.47b0.dev",
8686
},
87+
{
88+
"library": "fastapi-slim ~= 0.111.0",
89+
"instrumentation": "opentelemetry-instrumentation-fastapi==0.47b0.dev",
90+
},
8791
{
8892
"library": "flask >= 1.0",
8993
"instrumentation": "opentelemetry-instrumentation-flask==0.47b0.dev",

tox.ini

+7
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,9 @@ envlist =
116116

117117
; opentelemetry-instrumentation-fastapi
118118
py3{8,9,10,11,12}-test-instrumentation-fastapi
119+
py3{8,9,10,11,12}-test-instrumentation-fastapi-slim
119120
pypy3-test-instrumentation-fastapi
121+
pypy3-test-instrumentation-fastapi-slim
120122
lint-instrumentation-fastapi
121123

122124
; opentelemetry-instrumentation-flask
@@ -544,6 +546,11 @@ commands_pre =
544546
fastapi: pip install opentelemetry-sdk@{env:CORE_REPO}\#egg=opentelemetry-sdk&subdirectory=opentelemetry-sdk
545547
fastapi: pip install opentelemetry-test-utils@{env:CORE_REPO}\#egg=opentelemetry-test-utils&subdirectory=tests/opentelemetry-test-utils
546548
fastapi: pip install -r {toxinidir}/instrumentation/opentelemetry-instrumentation-fastapi/test-requirements.txt
549+
fastapi-slim: pip install opentelemetry-api@{env:CORE_REPO}\#egg=opentelemetry-api&subdirectory=opentelemetry-api
550+
fastapi-slim: pip install opentelemetry-semantic-conventions@{env:CORE_REPO}\#egg=opentelemetry-semantic-conventions&subdirectory=opentelemetry-semantic-conventions
551+
fastapi-slim: pip install opentelemetry-sdk@{env:CORE_REPO}\#egg=opentelemetry-sdk&subdirectory=opentelemetry-sdk
552+
fastapi-slim: pip install opentelemetry-test-utils@{env:CORE_REPO}\#egg=opentelemetry-test-utils&subdirectory=tests/opentelemetry-test-utils
553+
fastapi-slim: pip install -r {toxinidir}/instrumentation/opentelemetry-instrumentation-fastapi/test-requirements-slim.txt
547554

548555
mysql: pip install opentelemetry-api@{env:CORE_REPO}\#egg=opentelemetry-api&subdirectory=opentelemetry-api
549556
mysql: pip install opentelemetry-semantic-conventions@{env:CORE_REPO}\#egg=opentelemetry-semantic-conventions&subdirectory=opentelemetry-semantic-conventions

0 commit comments

Comments
 (0)