Skip to content

Commit 7cae4d3

Browse files
authored
Enable passing explicit urls to exclude in instrumentation in FastAPI (#486)
1 parent c1fbe0e commit 7cae4d3

File tree

5 files changed

+104
-9
lines changed

5 files changed

+104
-9
lines changed

CHANGELOG.md

+40-2
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
# Changelog
2+
23
All notable changes to this project will be documented in this file.
34

45
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
@@ -56,19 +57,23 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
5657
([#472](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/472))
5758
- Set the `traced_request_attrs` of FalconInstrumentor by an argument correctly.
5859
([#473](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/473))
60+
- Enable passing explicit urls to exclude in instrumentation in FastAPI
61+
([#486](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/486))
5962
- Distros can now implement `load_instrumentor(EntryPoint)` method to customize instrumentor
6063
loading behaviour.
6164
([#480](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/480))
6265
- Fix entrypoint for ottrace propagator
6366
([#492](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/492))
6467

6568
### Added
69+
6670
- Move `opentelemetry-instrumentation` from core repository
6771
([#465](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/465))
6872

6973
## [0.20b0](https://github.com/open-telemetry/opentelemetry-python-contrib/releases/tag/v0.20b0) - 2021-04-20
7074

7175
### Changed
76+
7277
- Restrict DataDog exporter's `ddtrace` dependency to known working versions.
7378
([#400](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/400))
7479
- GRPC instrumentation now correctly injects trace context into outgoing requests.
@@ -80,7 +85,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
8085
- Update instrumentations to use tracer_provider for creating tracer if given, otherwise use global tracer provider
8186
([#402](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/402))
8287
- `opentelemetry-instrumentation-wsgi` Replaced `name_callback` with `request_hook`
83-
and `response_hook` callbacks.
88+
and `response_hook` callbacks.
8489
([#424](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/424))
8590
- Update gRPC instrumentation to better wrap server context
8691
([#420](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/420))
@@ -90,6 +95,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
9095
([#265](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/265))
9196

9297
### Added
98+
9399
- `opentelemetry-instrumentation-urllib3` Add urllib3 instrumentation
94100
([#299](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/299))
95101

@@ -118,16 +124,17 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
118124
([#442](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/442))
119125

120126
### Removed
127+
121128
- Remove `http.status_text` from span attributes
122129
([#406](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/406))
123130

124-
125131
## [0.19b0](https://github.com/open-telemetry/opentelemetry-python-contrib/releases/tag/v0.19b0) - 2021-03-26
126132

127133
- Implement context methods for `_InterceptorChannel`
128134
([#363](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/363))
129135

130136
### Changed
137+
131138
- Rename `IdsGenerator` to `IdGenerator`
132139
([#350](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/350))
133140
- `opentelemetry-exporter-datadog` Fix warning when DatadogFormat encounters a request with
@@ -147,18 +154,21 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
147154
([#372](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/372))
148155

149156
### Removed
157+
150158
- Removing support for Python 3.5
151159
([#374](https://github.com/open-telemetry/opentelemetry-python/pull/374))
152160

153161
## [0.18b0](https://github.com/open-telemetry/opentelemetry-python-contrib/releases/tag/v0.18b0) - 2021-02-16
154162

155163
### Added
164+
156165
- `opentelemetry-propagator-ot-trace` Add OT Trace Propagator
157166
([#302](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/302))
158167
- `opentelemetry-instrumentation-logging` Added logging instrumentation to enable log - trace correlation.
159168
([#345](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/345))
160169

161170
### Removed
171+
162172
- Remove `component` span attribute in instrumentations.
163173
`opentelemetry-instrumentation-aiopg`, `opentelemetry-instrumentation-dbapi` Remove unused `database_type` parameter from `trace_integration` function.
164174
([#301](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/301))
@@ -176,6 +186,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
176186
## [0.17b0](https://github.com/open-telemetry/opentelemetry-python-contrib/releases/tag/v0.17b0) - 2021-01-20
177187

178188
### Added
189+
179190
- `opentelemetry-instrumentation-sqlalchemy` Ensure spans have kind set to "CLIENT"
180191
([#278](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/278))
181192
- `opentelemetry-instrumentation-celery` Add support for Celery version 5.x
@@ -210,6 +221,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
210221
([#273](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/273))
211222

212223
### Changed
224+
213225
- Fix broken links to project ([#413](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/413))
214226
- `opentelemetry-instrumentation-asgi`, `opentelemetry-instrumentation-wsgi` Return `None` for `CarrierGetter` if key not found
215227
([#233](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/233))
@@ -239,6 +251,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
239251
([#276](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/276))
240252

241253
### Removed
254+
242255
- Remove Configuration
243256
([#285](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/285))
244257

@@ -247,6 +260,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
247260
## [0.16b0](https://github.com/open-telemetry/opentelemetry-python-contrib/releases/tag/v0.16b0) - 2020-11-25
248261

249262
### Added
263+
250264
- `opentelemetry-instrumentation-flask` Add span name callback
251265
([#152](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/152))
252266
- `opentelemetry-sdk-extension-aws` Add AWS X-Ray Ids Generator Entry Point
@@ -265,6 +279,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
265279
([#181](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/181))
266280

267281
### Changed
282+
268283
- `opentelemetry-instrumentation-pymemcache` Update pymemcache instrumentation to follow semantic conventions
269284
([#183](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/183))
270285
- `opentelemetry-instrumentation-redis` Update redis instrumentation to follow semantic conventions
@@ -289,6 +304,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
289304
## [0.15b0](https://github.com/open-telemetry/opentelemetry-python-contrib/releases/tag/v0.15b0) - 2020-11-02
290305

291306
### Added
307+
292308
- `opentelemetry-instrumentation-requests` Add support for tracking http metrics
293309
([#1230](https://github.com/open-telemetry/opentelemetry-python/pull/1230))
294310
- `opentelemetry-instrumentation-django` Added capture of http.route
@@ -297,6 +313,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
297313
([#1230](https://github.com/open-telemetry/opentelemetry-python/pull/1230))
298314

299315
### Changed
316+
300317
- `opentelemetry-exporter-datadog` Make `SpanProcessor.on_start` accept parent Context
301318
([#1251](https://github.com/open-telemetry/opentelemetry-python/pull/1251))
302319
- `opentelemetry-instrumentation-flask` Use `url.rule` instead of `request.endpoint` for span name
@@ -313,6 +330,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
313330
## [0.14b0](https://github.com/open-telemetry/opentelemetry-python/releases/tag/v0.14b0) - 2020-10-13
314331

315332
### Added
333+
316334
- `opentelemetry-exporter-datadog` Add support for span resource labels and service name
317335
- `opentelemetry-instrumentation-celery` Span operation names now include the task type.
318336
([#1135](https://github.com/open-telemetry/opentelemetry-python/pull/1135))
@@ -326,6 +344,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
326344
([#1154](https://github.com/open-telemetry/opentelemetry-python/pull/1154))
327345

328346
### Changed
347+
329348
- `opentelemetry-instrumentation-pymongo` Cast PyMongo commands as strings
330349
([#1132](https://github.com/open-telemetry/opentelemetry-python/pull/1132))
331350
- `opentelemetry-instrumentation-system-metrics` Fix issue when specific metrics are not available in certain OS
@@ -338,6 +357,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
338357
## [0.13b0](https://github.com/open-telemetry/opentelemetry-python/releases/tag/v0.13b0) - 2020-09-17
339358

340359
### Added
360+
341361
- `opentelemetry-instrumentation-falcon` Initial release. Added instrumentation for Falcon 2.0+
342362
- `opentelemetry-instrumentation-tornado` Initial release. Supports Tornado 6.x on Python 3.5 and newer.
343363
- `opentelemetry-instrumentation-aiohttp-client` Add instrumentor and auto instrumentation support for aiohttp
@@ -348,18 +368,21 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
348368
([#1116](https://github.com/open-telemetry/opentelemetry-python/pull/1116))
349369

350370
### Changed
371+
351372
- `opentelemetry-instrumentation-aiohttp-client` Updating span name to match semantic conventions
352373
([#972](https://github.com/open-telemetry/opentelemetry-python/pull/972))
353374
- `opentelemetry-instrumentation-dbapi` cursors and connections now produce spans when used with context managers
354375
([#1028](https://github.com/open-telemetry/opentelemetry-python/pull/1028))
355376

356377
### Removed
378+
357379
- Drop support for Python 3.4
358380
([#1099](https://github.com/open-telemetry/opentelemetry-python/pull/1099))
359381

360382
## [0.12b0](https://github.com/open-telemetry/opentelemetry-python/releases/tag/v0.12.0) - 2020-08-14
361383

362384
### Changed
385+
363386
- `opentelemetry-ext-pymemcache` Change package name to opentelemetry-instrumentation-pymemcache
364387
([#966](https://github.com/open-telemetry/opentelemetry-python/pull/966))
365388
- `opentelemetry-ext-redis` Update default SpanKind to `SpanKind.CLIENT`
@@ -426,6 +449,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
426449
## [0.11b0](https://github.com/open-telemetry/opentelemetry-python/releases/tag/v0.11.0) - 2020-07-28
427450

428451
### Added
452+
429453
- `opentelemetry-instrumentation-aiopg` Initial release
430454
- `opentelemetry-instrumentation-fastapi` Initial release
431455
([#890](https://github.com/open-telemetry/opentelemetry-python/pull/890))
@@ -436,6 +460,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
436460
- `opentelemetry-ext-grpc` Add metric recording (bytes in/out, errors, latency) to gRPC client
437461

438462
### Changed
463+
439464
- `opentelemetry-ext-pyramid` Use one general exclude list instead of two
440465
([#872](https://github.com/open-telemetry/opentelemetry-python/pull/872))
441466
- `opentelemetry-ext-boto` fails to export spans via jaeger
@@ -456,6 +481,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
456481
## [0.10b0](https://github.com/open-telemetry/opentelemetry-python/releases/tag/v0.10.0) - 2020-06-23
457482

458483
### Added
484+
459485
- `opentelemetry-ext-pymemcache` Initial release
460486
- `opentelemetry-ext-elasticsearch` Initial release
461487
- `opentelemetry-ext-celery` Add instrumentation for Celery
@@ -468,6 +494,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
468494
## [0.9b0](https://github.com/open-telemetry/opentelemetry-python/releases/tag/v0.9.0) - 2020-06-10
469495

470496
### Added
497+
471498
- `opentelemetry-ext-pyramid` Initial release
472499
- `opentelemetry-ext-boto` Initial release
473500
- `opentelemetry-ext-botocore` Initial release
@@ -477,6 +504,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
477504
## [0.8b0](https://github.com/open-telemetry/opentelemetry-python/releases/tag/v0.8.0) - 2020-05-27
478505

479506
### Added
507+
480508
- `opentelemetry-ext-datadog` Add exporter to Datadog
481509
([#572](https://github.com/open-telemetry/opentelemetry-python/pull/572))
482510
- `opentelemetry-ext-sqlite3` Initial release
@@ -489,12 +517,14 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
489517
- `opentelemetry-ext-django` Add support for django >= 1.10 (#717)
490518

491519
### Changed
520+
492521
- `opentelemetry-ext-grpc` lint: version of grpc causes lint issues
493522
([#696](https://github.com/open-telemetry/opentelemetry-python/pull/696))
494523

495524
## [0.7b1](https://github.com/open-telemetry/opentelemetry-python/releases/tag/v0.7.1) - 2020-05-12
496525

497526
### Added
527+
498528
- `opentelemetry-ext-redis` Initial release
499529
- `opentelemetry-ext-jinja2` Add jinja2 instrumentation
500530
([#643](https://github.com/open-telemetry/opentelemetry-python/pull/643))
@@ -518,12 +548,14 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
518548
([#654](https://github.com/open-telemetry/opentelemetry-python/pull/654))
519549

520550
### Changed
551+
521552
- `opentelemetry-ext-http-requests` Rename package to opentelemetry-ext-requests
522553
([#619](https://github.com/open-telemetry/opentelemetry-python/pull/619))
523554

524555
## [0.6b0](https://github.com/open-telemetry/opentelemetry-python/releases/tag/v0.6.0) - 2020-03-30
525556

526557
### Added
558+
527559
- `opentelemetry-ext-flask` Add an entry_point to be usable in auto-instrumentation
528560
([#327](https://github.com/open-telemetry/opentelemetry-python/pull/327))
529561
- `opentelemetry-ext-grpc` Add gRPC integration
@@ -534,11 +566,13 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
534566
## [0.4a0](https://github.com/open-telemetry/opentelemetry-python/releases/tag/v0.4.0) - 2020-02-21
535567

536568
### Added
569+
537570
- `opentelemetry-ext-psycopg2` Initial release
538571
- `opentelemetry-ext-dbapi` Initial release
539572
- `opentelemetry-ext-mysql` Initial release
540573

541574
### Changed
575+
542576
- `opentelemetry-ext-pymongo` Updating network connection attribute names
543577
([#350](https://github.com/open-telemetry/opentelemetry-python/pull/350))
544578
- `opentelemetry-ext-wsgi` Updating network connection attribute names
@@ -549,22 +583,26 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
549583
## [0.3a0](https://github.com/open-telemetry/opentelemetry-python/releases/tag/v0.3.0) - 2019-12-11
550584

551585
### Added
586+
552587
- `opentelemetry-ext-flask` Initial release
553588
- `opentelemetry-ext-pymongo` Initial release
554589

555590
### Changed
591+
556592
- `opentelemetry-ext-wsgi` Support new semantic conventions
557593
([#299](https://github.com/open-telemetry/opentelemetry-python/pull/299))
558594
- `opentelemetry-ext-wsgi` Updates for core library changes
559595

560596
## [0.2a0](https://github.com/open-telemetry/opentelemetry-python/releases/tag/v0.2.0) - 2019-10-29
561597

562598
### Changed
599+
563600
- `opentelemetry-ext-wsgi` Updates for core library changes
564601
- `opentelemetry-ext-http-requests` Updates for core library changes
565602

566603
## [0.1a0](https://github.com/open-telemetry/opentelemetry-python/releases/tag/v0.1.0) - 2019-09-30
567604

568605
### Added
606+
569607
- `opentelemetry-ext-wsgi` Initial release
570608
- `opentelemetry-ext-http-requests` Initial release

instrumentation/opentelemetry-instrumentation-fastapi/README.rst

+6-1
Original file line numberDiff line numberDiff line change
@@ -51,9 +51,14 @@ Usage
5151
5252
FastAPIInstrumentor.instrument_app(app)
5353
54+
You can also pass the list of urls to exclude explicitly to the instrumentation call:
55+
56+
.. code-block:: python
57+
58+
FastAPIInstrumentor.instrument_app(app, "client/.*/info,healthcheck")
5459
5560
References
5661
----------
5762

5863
* `OpenTelemetry Project <https://opentelemetry.io/>`_
59-
* `OpenTelemetry Python Examples <https://github.com/open-telemetry/opentelemetry-python/tree/main/docs/examples>`_
64+
* `OpenTelemetry Python Examples <https://github.com/open-telemetry/opentelemetry-python/tree/main/docs/examples>`_

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

+19-5
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,9 @@
2121
from opentelemetry.instrumentation.asgi.package import _instruments
2222
from opentelemetry.instrumentation.instrumentor import BaseInstrumentor
2323
from opentelemetry.semconv.trace import SpanAttributes
24-
from opentelemetry.util.http import get_excluded_urls
24+
from opentelemetry.util.http import get_excluded_urls, parse_excluded_urls
2525

26-
_excluded_urls = get_excluded_urls("FASTAPI")
26+
_excluded_urls_from_env = get_excluded_urls("FASTAPI")
2727

2828

2929
class FastAPIInstrumentor(BaseInstrumentor):
@@ -35,12 +35,19 @@ class FastAPIInstrumentor(BaseInstrumentor):
3535
_original_fastapi = None
3636

3737
@staticmethod
38-
def instrument_app(app: fastapi.FastAPI, tracer_provider=None):
38+
def instrument_app(
39+
app: fastapi.FastAPI, tracer_provider=None, excluded_urls=None,
40+
):
3941
"""Instrument an uninstrumented FastAPI application."""
4042
if not getattr(app, "is_instrumented_by_opentelemetry", False):
43+
if excluded_urls is None:
44+
excluded_urls = _excluded_urls_from_env
45+
else:
46+
excluded_urls = parse_excluded_urls(excluded_urls)
47+
4148
app.add_middleware(
4249
OpenTelemetryMiddleware,
43-
excluded_urls=_excluded_urls,
50+
excluded_urls=excluded_urls,
4451
span_details_callback=_get_route_details,
4552
tracer_provider=tracer_provider,
4653
)
@@ -52,6 +59,12 @@ def instrumentation_dependencies(self) -> Collection[str]:
5259
def _instrument(self, **kwargs):
5360
self._original_fastapi = fastapi.FastAPI
5461
_InstrumentedFastAPI._tracer_provider = kwargs.get("tracer_provider")
62+
_excluded_urls = kwargs.get("excluded_urls")
63+
_InstrumentedFastAPI._excluded_urls = (
64+
_excluded_urls_from_env
65+
if _excluded_urls is None
66+
else parse_excluded_urls(_excluded_urls)
67+
)
5568
fastapi.FastAPI = _InstrumentedFastAPI
5669

5770
def _uninstrument(self, **kwargs):
@@ -60,12 +73,13 @@ def _uninstrument(self, **kwargs):
6073

6174
class _InstrumentedFastAPI(fastapi.FastAPI):
6275
_tracer_provider = None
76+
_excluded_urls = None
6377

6478
def __init__(self, *args, **kwargs):
6579
super().__init__(*args, **kwargs)
6680
self.add_middleware(
6781
OpenTelemetryMiddleware,
68-
excluded_urls=_excluded_urls,
82+
excluded_urls=_InstrumentedFastAPI._excluded_urls,
6983
span_details_callback=_get_route_details,
7084
tracer_provider=_InstrumentedFastAPI._tracer_provider,
7185
)

0 commit comments

Comments
 (0)