From 16cc4656e70d7f253c027b8465c849327c4dcfc4 Mon Sep 17 00:00:00 2001 From: rahmukhe Date: Mon, 12 Sep 2022 13:58:37 +0530 Subject: [PATCH 1/7] added metrics implemetation for starlette --- .../instrumentation/starlette/__init__.py | 13 +++++++++++++ .../instrumentation/starlette/package.py | 2 ++ 2 files changed, 15 insertions(+) diff --git a/instrumentation/opentelemetry-instrumentation-starlette/src/opentelemetry/instrumentation/starlette/__init__.py b/instrumentation/opentelemetry-instrumentation-starlette/src/opentelemetry/instrumentation/starlette/__init__.py index 110644cfb3..01d184a67d 100644 --- a/instrumentation/opentelemetry-instrumentation-starlette/src/opentelemetry/instrumentation/starlette/__init__.py +++ b/instrumentation/opentelemetry-instrumentation-starlette/src/opentelemetry/instrumentation/starlette/__init__.py @@ -130,7 +130,9 @@ def client_response_hook(span: Span, message: dict): from opentelemetry.instrumentation.asgi import OpenTelemetryMiddleware from opentelemetry.instrumentation.asgi.package import _instruments +from opentelemetry.instrumentation.starlette.version import __version__ from opentelemetry.instrumentation.instrumentor import BaseInstrumentor +from opentelemetry.metrics import get_meter from opentelemetry.semconv.trace import SpanAttributes from opentelemetry.trace import Span from opentelemetry.util.http import get_excluded_urls @@ -156,9 +158,11 @@ def instrument_app( server_request_hook: _ServerRequestHookT = None, client_request_hook: _ClientRequestHookT = None, client_response_hook: _ClientResponseHookT = None, + meter_provider=None, tracer_provider=None, ): """Instrument an uninstrumented Starlette application.""" + meter = get_meter(__name__, __version__, meter_provider) if not getattr(app, "is_instrumented_by_opentelemetry", False): app.add_middleware( OpenTelemetryMiddleware, @@ -168,6 +172,7 @@ def instrument_app( client_request_hook=client_request_hook, client_response_hook=client_response_hook, tracer_provider=tracer_provider, + meter=meter, ) app.is_instrumented_by_opentelemetry = True @@ -186,6 +191,9 @@ def _instrument(self, **kwargs): _InstrumentedStarlette._client_response_hook = kwargs.get( "client_response_hook" ) + _InstrumentedStarlette._meter_provider = kwargs.get( + "_meter_provider" + ) applications.Starlette = _InstrumentedStarlette def _uninstrument(self, **kwargs): @@ -194,12 +202,16 @@ def _uninstrument(self, **kwargs): class _InstrumentedStarlette(applications.Starlette): _tracer_provider = None + _meter_provider = None _server_request_hook: _ServerRequestHookT = None _client_request_hook: _ClientRequestHookT = None _client_response_hook: _ClientResponseHookT = None def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) + meter = get_meter( + __name__, __version__, _InstrumentedStarlette._meter_provider + ) self.add_middleware( OpenTelemetryMiddleware, excluded_urls=_excluded_urls, @@ -208,6 +220,7 @@ def __init__(self, *args, **kwargs): client_request_hook=_InstrumentedStarlette._client_request_hook, client_response_hook=_InstrumentedStarlette._client_response_hook, tracer_provider=_InstrumentedStarlette._tracer_provider, + meter=meter, ) diff --git a/instrumentation/opentelemetry-instrumentation-starlette/src/opentelemetry/instrumentation/starlette/package.py b/instrumentation/opentelemetry-instrumentation-starlette/src/opentelemetry/instrumentation/starlette/package.py index 3a9b5948d2..6436604dd5 100644 --- a/instrumentation/opentelemetry-instrumentation-starlette/src/opentelemetry/instrumentation/starlette/package.py +++ b/instrumentation/opentelemetry-instrumentation-starlette/src/opentelemetry/instrumentation/starlette/package.py @@ -14,3 +14,5 @@ _instruments = ("starlette ~= 0.13.0",) + +_supports_metrics = True \ No newline at end of file From c7bf4be5a8692d3446b9b07404f780688be94761 Mon Sep 17 00:00:00 2001 From: rahmukhe Date: Tue, 13 Sep 2022 10:27:45 +0530 Subject: [PATCH 2/7] added testcase for basic metric check --- .../instrumentation/starlette/__init__.py | 4 +- .../tests/test_starlette_instrumentation.py | 46 +++++++++++++++++++ 2 files changed, 48 insertions(+), 2 deletions(-) diff --git a/instrumentation/opentelemetry-instrumentation-starlette/src/opentelemetry/instrumentation/starlette/__init__.py b/instrumentation/opentelemetry-instrumentation-starlette/src/opentelemetry/instrumentation/starlette/__init__.py index 01d184a67d..397d22ee01 100644 --- a/instrumentation/opentelemetry-instrumentation-starlette/src/opentelemetry/instrumentation/starlette/__init__.py +++ b/instrumentation/opentelemetry-instrumentation-starlette/src/opentelemetry/instrumentation/starlette/__init__.py @@ -172,7 +172,7 @@ def instrument_app( client_request_hook=client_request_hook, client_response_hook=client_response_hook, tracer_provider=tracer_provider, - meter=meter, + meter=meter ) app.is_instrumented_by_opentelemetry = True @@ -220,7 +220,7 @@ def __init__(self, *args, **kwargs): client_request_hook=_InstrumentedStarlette._client_request_hook, client_response_hook=_InstrumentedStarlette._client_response_hook, tracer_provider=_InstrumentedStarlette._tracer_provider, - meter=meter, + meter=meter ) diff --git a/instrumentation/opentelemetry-instrumentation-starlette/tests/test_starlette_instrumentation.py b/instrumentation/opentelemetry-instrumentation-starlette/tests/test_starlette_instrumentation.py index 6f9a509450..12a5fd5a95 100644 --- a/instrumentation/opentelemetry-instrumentation-starlette/tests/test_starlette_instrumentation.py +++ b/instrumentation/opentelemetry-instrumentation-starlette/tests/test_starlette_instrumentation.py @@ -13,6 +13,7 @@ # limitations under the License. import unittest +from timeit import default_timer from unittest.mock import patch from starlette import applications @@ -36,7 +37,24 @@ OTEL_INSTRUMENTATION_HTTP_CAPTURE_HEADERS_SERVER_REQUEST, OTEL_INSTRUMENTATION_HTTP_CAPTURE_HEADERS_SERVER_RESPONSE, get_excluded_urls, + _active_requests_count_attrs, + _duration_attrs, ) +from opentelemetry.sdk.metrics.export import ( + HistogramDataPoint, + NumberDataPoint, +) + + +_expected_metric_names = [ + "http.server.active_requests", + "http.server.duration", +] +_recommended_attrs = { + "http.server.active_requests": _active_requests_count_attrs, + "http.server.duration": _duration_attrs, +} + class TestStarletteManualInstrumentation(TestBase): @@ -99,6 +117,34 @@ def test_starlette_excluded_urls(self): self._client.get("/healthzz") spans = self.memory_exporter.get_finished_spans() self.assertEqual(len(spans), 0) + + def test_starlette_metrics(self): + self._client.get("/foobar") + self._client.get("/foobar") + self._client.get("/foobar") + metrics_list = self.memory_metrics_reader.get_metrics_data() + number_data_point_seen = False + histogram_data_point_seen = False + self.assertTrue(len(metrics_list.resource_metrics) == 1) + for resource_metric in metrics_list.resource_metrics: + self.assertTrue(len(resource_metric.scope_metrics) == 1) + for scope_metric in resource_metric.scope_metrics: + self.assertTrue(len(scope_metric.metrics) == 2) + for metric in scope_metric.metrics: + self.assertIn(metric.name, _expected_metric_names) + data_points = list(metric.data.data_points) + self.assertEqual(len(data_points), 1) + for point in data_points: + if isinstance(point, HistogramDataPoint): + self.assertEqual(point.count, 3) + histogram_data_point_seen = True + if isinstance(point, NumberDataPoint): + number_data_point_seen = True + for attr in point.attributes: + self.assertIn( + attr, _recommended_attrs[metric.name] + ) + self.assertTrue(number_data_point_seen and histogram_data_point_seen) @staticmethod def _create_starlette_app(): From 38df3cc2c50a673a96d4caee236a9ee022bc185c Mon Sep 17 00:00:00 2001 From: rahmukhe Date: Tue, 13 Sep 2022 12:06:32 +0530 Subject: [PATCH 3/7] added testcases for uninstrumentation for starlette with metrics --- .../tests/test_starlette_instrumentation.py | 37 +++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/instrumentation/opentelemetry-instrumentation-starlette/tests/test_starlette_instrumentation.py b/instrumentation/opentelemetry-instrumentation-starlette/tests/test_starlette_instrumentation.py index 12a5fd5a95..e2cb043aed 100644 --- a/instrumentation/opentelemetry-instrumentation-starlette/tests/test_starlette_instrumentation.py +++ b/instrumentation/opentelemetry-instrumentation-starlette/tests/test_starlette_instrumentation.py @@ -145,6 +145,43 @@ def test_starlette_metrics(self): attr, _recommended_attrs[metric.name] ) self.assertTrue(number_data_point_seen and histogram_data_point_seen) + + def test_basic_post_request_metric_success(self): + start = default_timer() + self._client.post("/foobar") + duration = max(round((default_timer() - start) * 1000), 0) + metrics_list = self.memory_metrics_reader.get_metrics_data() + for metric in ( + metrics_list.resource_metrics[0].scope_metrics[0].metrics + ): + for point in list(metric.data.data_points): + if isinstance(point, HistogramDataPoint): + self.assertEqual(point.count, 1) + self.assertAlmostEqual(duration, point.sum, delta=30) + if isinstance(point, NumberDataPoint): + self.assertEqual(point.value, 0) + + def test_metric_uninstrument(self): + # instrumenting class and creating app to send request + self._instrumentor.instrument() + app = self._create_starlette_app() + client = TestClient(app) + client.get("/foobar") + # uninstrumenting class and creating the app again + self._instrumentor.uninstrument() + app = self._create_starlette_app() + client = TestClient(app) + client.get("/foobar") + + metrics_list = self.memory_metrics_reader.get_metrics_data() + for metric in ( + metrics_list.resource_metrics[0].scope_metrics[0].metrics + ): + for point in list(metric.data.data_points): + if isinstance(point, HistogramDataPoint): + self.assertEqual(point.count, 1) + if isinstance(point, NumberDataPoint): + self.assertEqual(point.value, 0) @staticmethod def _create_starlette_app(): From 3280111bc040e30cdf24d65a8244c12569c32f24 Mon Sep 17 00:00:00 2001 From: rahmukhe Date: Tue, 13 Sep 2022 14:56:03 +0530 Subject: [PATCH 4/7] added changelog and reformarted with tox generate --- CHANGELOG.md | 2 ++ instrumentation/README.md | 2 +- .../instrumentation/starlette/__init__.py | 10 ++++------ .../instrumentation/starlette/package.py | 2 +- .../tests/test_starlette_instrumentation.py | 16 +++++++--------- 5 files changed, 15 insertions(+), 17 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1c27d4e846..4d73afa326 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ([#1199](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/1199)) - Add metric instrumentation in Pyramid ([#1242](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/1242)) +- Add metric instrumentation in starlette + ([#1327](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/1327)) ### Fixed diff --git a/instrumentation/README.md b/instrumentation/README.md index d7dd93c3a3..962cfd591e 100644 --- a/instrumentation/README.md +++ b/instrumentation/README.md @@ -36,7 +36,7 @@ | [opentelemetry-instrumentation-sklearn](./opentelemetry-instrumentation-sklearn) | scikit-learn ~= 0.24.0 | No | [opentelemetry-instrumentation-sqlalchemy](./opentelemetry-instrumentation-sqlalchemy) | sqlalchemy | No | [opentelemetry-instrumentation-sqlite3](./opentelemetry-instrumentation-sqlite3) | sqlite3 | No -| [opentelemetry-instrumentation-starlette](./opentelemetry-instrumentation-starlette) | starlette ~= 0.13.0 | No +| [opentelemetry-instrumentation-starlette](./opentelemetry-instrumentation-starlette) | starlette ~= 0.13.0 | Yes | [opentelemetry-instrumentation-system-metrics](./opentelemetry-instrumentation-system-metrics) | psutil >= 5 | No | [opentelemetry-instrumentation-tornado](./opentelemetry-instrumentation-tornado) | tornado >= 5.1.1 | No | [opentelemetry-instrumentation-urllib](./opentelemetry-instrumentation-urllib) | urllib | No diff --git a/instrumentation/opentelemetry-instrumentation-starlette/src/opentelemetry/instrumentation/starlette/__init__.py b/instrumentation/opentelemetry-instrumentation-starlette/src/opentelemetry/instrumentation/starlette/__init__.py index 397d22ee01..6d12c75af0 100644 --- a/instrumentation/opentelemetry-instrumentation-starlette/src/opentelemetry/instrumentation/starlette/__init__.py +++ b/instrumentation/opentelemetry-instrumentation-starlette/src/opentelemetry/instrumentation/starlette/__init__.py @@ -130,8 +130,8 @@ def client_response_hook(span: Span, message: dict): from opentelemetry.instrumentation.asgi import OpenTelemetryMiddleware from opentelemetry.instrumentation.asgi.package import _instruments -from opentelemetry.instrumentation.starlette.version import __version__ from opentelemetry.instrumentation.instrumentor import BaseInstrumentor +from opentelemetry.instrumentation.starlette.version import __version__ from opentelemetry.metrics import get_meter from opentelemetry.semconv.trace import SpanAttributes from opentelemetry.trace import Span @@ -172,7 +172,7 @@ def instrument_app( client_request_hook=client_request_hook, client_response_hook=client_response_hook, tracer_provider=tracer_provider, - meter=meter + meter=meter, ) app.is_instrumented_by_opentelemetry = True @@ -191,9 +191,7 @@ def _instrument(self, **kwargs): _InstrumentedStarlette._client_response_hook = kwargs.get( "client_response_hook" ) - _InstrumentedStarlette._meter_provider = kwargs.get( - "_meter_provider" - ) + _InstrumentedStarlette._meter_provider = kwargs.get("_meter_provider") applications.Starlette = _InstrumentedStarlette def _uninstrument(self, **kwargs): @@ -220,7 +218,7 @@ def __init__(self, *args, **kwargs): client_request_hook=_InstrumentedStarlette._client_request_hook, client_response_hook=_InstrumentedStarlette._client_response_hook, tracer_provider=_InstrumentedStarlette._tracer_provider, - meter=meter + meter=meter, ) diff --git a/instrumentation/opentelemetry-instrumentation-starlette/src/opentelemetry/instrumentation/starlette/package.py b/instrumentation/opentelemetry-instrumentation-starlette/src/opentelemetry/instrumentation/starlette/package.py index 6436604dd5..11c3ed2e7b 100644 --- a/instrumentation/opentelemetry-instrumentation-starlette/src/opentelemetry/instrumentation/starlette/package.py +++ b/instrumentation/opentelemetry-instrumentation-starlette/src/opentelemetry/instrumentation/starlette/package.py @@ -15,4 +15,4 @@ _instruments = ("starlette ~= 0.13.0",) -_supports_metrics = True \ No newline at end of file +_supports_metrics = True diff --git a/instrumentation/opentelemetry-instrumentation-starlette/tests/test_starlette_instrumentation.py b/instrumentation/opentelemetry-instrumentation-starlette/tests/test_starlette_instrumentation.py index e2cb043aed..cf95bcfbec 100644 --- a/instrumentation/opentelemetry-instrumentation-starlette/tests/test_starlette_instrumentation.py +++ b/instrumentation/opentelemetry-instrumentation-starlette/tests/test_starlette_instrumentation.py @@ -23,6 +23,10 @@ from starlette.websockets import WebSocket import opentelemetry.instrumentation.starlette as otel_starlette +from opentelemetry.sdk.metrics.export import ( + HistogramDataPoint, + NumberDataPoint, +) from opentelemetry.sdk.resources import Resource from opentelemetry.semconv.trace import SpanAttributes from opentelemetry.test.globals_test import reset_trace_globals @@ -36,15 +40,10 @@ from opentelemetry.util.http import ( OTEL_INSTRUMENTATION_HTTP_CAPTURE_HEADERS_SERVER_REQUEST, OTEL_INSTRUMENTATION_HTTP_CAPTURE_HEADERS_SERVER_RESPONSE, - get_excluded_urls, _active_requests_count_attrs, _duration_attrs, + get_excluded_urls, ) -from opentelemetry.sdk.metrics.export import ( - HistogramDataPoint, - NumberDataPoint, -) - _expected_metric_names = [ "http.server.active_requests", @@ -56,7 +55,6 @@ } - class TestStarletteManualInstrumentation(TestBase): def _create_app(self): app = self._create_starlette_app() @@ -117,7 +115,7 @@ def test_starlette_excluded_urls(self): self._client.get("/healthzz") spans = self.memory_exporter.get_finished_spans() self.assertEqual(len(spans), 0) - + def test_starlette_metrics(self): self._client.get("/foobar") self._client.get("/foobar") @@ -145,7 +143,7 @@ def test_starlette_metrics(self): attr, _recommended_attrs[metric.name] ) self.assertTrue(number_data_point_seen and histogram_data_point_seen) - + def test_basic_post_request_metric_success(self): start = default_timer() self._client.post("/foobar") From 5d1035edfa3f4e2baef502fdf933ea51964ad27c Mon Sep 17 00:00:00 2001 From: rahmukhe Date: Wed, 14 Sep 2022 17:10:20 +0530 Subject: [PATCH 5/7] added uninstrumentation logic for apps and made changes as per review comments --- .../instrumentation/starlette/__init__.py | 41 ++++++++++++++++ .../tests/test_starlette_instrumentation.py | 48 +++++++++++++++++-- 2 files changed, 84 insertions(+), 5 deletions(-) diff --git a/instrumentation/opentelemetry-instrumentation-starlette/src/opentelemetry/instrumentation/starlette/__init__.py b/instrumentation/opentelemetry-instrumentation-starlette/src/opentelemetry/instrumentation/starlette/__init__.py index 6d12c75af0..cfadcc6635 100644 --- a/instrumentation/opentelemetry-instrumentation-starlette/src/opentelemetry/instrumentation/starlette/__init__.py +++ b/instrumentation/opentelemetry-instrumentation-starlette/src/opentelemetry/instrumentation/starlette/__init__.py @@ -176,6 +176,20 @@ def instrument_app( ) app.is_instrumented_by_opentelemetry = True + # adding apps to set for uninstrumenting + if app not in _InstrumentedStarlette._instrumented_starlette_apps: + _InstrumentedStarlette._instrumented_starlette_apps.add(app) + + @staticmethod + def uninstrument_app(app: applications.Starlette): + app.user_middleware = [ + x + for x in app.user_middleware + if x.cls is not OpenTelemetryMiddleware + ] + app.middleware_stack = app.build_middleware_stack() + app._is_instrumented_by_opentelemetry = False + def instrumentation_dependencies(self) -> Collection[str]: return _instruments @@ -192,9 +206,29 @@ def _instrument(self, **kwargs): "client_response_hook" ) _InstrumentedStarlette._meter_provider = kwargs.get("_meter_provider") + applications.Starlette = _InstrumentedStarlette + for instance in _InstrumentedStarlette._instrumented_starlette_apps: + self.instrument_app( + instance, + server_request_hook=_InstrumentedStarlette._server_request_hook, + client_request_hook=_InstrumentedStarlette._client_request_hook, + client_response_hook=_InstrumentedStarlette._client_response_hook, + tracer_provider=_InstrumentedStarlette._tracer_provider, + ) + def _uninstrument(self, **kwargs): + + """uninstrumenting all created apps by user""" + for instance in _InstrumentedStarlette._instrumented_starlette_apps: + self.uninstrument_app(instance) + + _InstrumentedStarlette._instrumented_starlette_apps = { + instance + for instance in _InstrumentedStarlette._instrumented_starlette_apps + if isinstance(instance, _InstrumentedStarlette) + } applications.Starlette = self._original_starlette @@ -204,6 +238,7 @@ class _InstrumentedStarlette(applications.Starlette): _server_request_hook: _ServerRequestHookT = None _client_request_hook: _ClientRequestHookT = None _client_response_hook: _ClientResponseHookT = None + _instrumented_starlette_apps = set() def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) @@ -220,6 +255,12 @@ def __init__(self, *args, **kwargs): tracer_provider=_InstrumentedStarlette._tracer_provider, meter=meter, ) + self._is_instrumented_by_opentelemetry = True + # adding apps to set for uninstrumenting + _InstrumentedStarlette._instrumented_starlette_apps.add(self) + + def __del__(self): + _InstrumentedStarlette._instrumented_starlette_apps.remove(self) def _get_route_details(scope): diff --git a/instrumentation/opentelemetry-instrumentation-starlette/tests/test_starlette_instrumentation.py b/instrumentation/opentelemetry-instrumentation-starlette/tests/test_starlette_instrumentation.py index cf95bcfbec..b168643211 100644 --- a/instrumentation/opentelemetry-instrumentation-starlette/tests/test_starlette_instrumentation.py +++ b/instrumentation/opentelemetry-instrumentation-starlette/tests/test_starlette_instrumentation.py @@ -146,6 +146,22 @@ def test_starlette_metrics(self): def test_basic_post_request_metric_success(self): start = default_timer() + expected_duration_attributes = { + "http.flavor": "1.1", + "http.host": "testserver", + "http.method": "POST", + "http.scheme": "http", + "http.server_name": "testserver", + "http.status_code": 405, + "net.host.port": 80, + } + expected_requests_count_attributes = { + "http.flavor": "1.1", + "http.host": "testserver", + "http.method": "POST", + "http.scheme": "http", + "http.server_name": "testserver", + } self._client.post("/foobar") duration = max(round((default_timer() - start) * 1000), 0) metrics_list = self.memory_metrics_reader.get_metrics_data() @@ -156,21 +172,43 @@ def test_basic_post_request_metric_success(self): if isinstance(point, HistogramDataPoint): self.assertEqual(point.count, 1) self.assertAlmostEqual(duration, point.sum, delta=30) + self.assertDictEqual( + dict(point.attributes), expected_duration_attributes + ) + if isinstance(point, NumberDataPoint): + self.assertDictEqual( + expected_requests_count_attributes, + dict(point.attributes), + ) + self.assertEqual(point.value, 0) + + def test_metric_for_uninstrment_app_method(self): + self._client.get("/foobar") + # uninstrumenting the existing client app + self._instrumentor.uninstrument_app(self._app) + self._client.get("/foobar") + self._client.get("/foobar") + metrics_list = self.memory_metrics_reader.get_metrics_data() + for metric in ( + metrics_list.resource_metrics[0].scope_metrics[0].metrics + ): + for point in list(metric.data.data_points): + if isinstance(point, HistogramDataPoint): + self.assertEqual(point.count, 1) if isinstance(point, NumberDataPoint): self.assertEqual(point.value, 0) - def test_metric_uninstrument(self): + def test_metric_uninstrument_inherited_by_base(self): # instrumenting class and creating app to send request self._instrumentor.instrument() app = self._create_starlette_app() client = TestClient(app) client.get("/foobar") - # uninstrumenting class and creating the app again + # calling uninstrument and checking for telemetry data self._instrumentor.uninstrument() - app = self._create_starlette_app() - client = TestClient(app) client.get("/foobar") - + client.get("/foobar") + client.get("/foobar") metrics_list = self.memory_metrics_reader.get_metrics_data() for metric in ( metrics_list.resource_metrics[0].scope_metrics[0].metrics From 4aeb100075f74daec87f6744866b3f719e07045f Mon Sep 17 00:00:00 2001 From: rahmukhe Date: Thu, 22 Sep 2022 14:33:54 +0530 Subject: [PATCH 6/7] added changes as per review comments --- .../opentelemetry/instrumentation/starlette/__init__.py | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/instrumentation/opentelemetry-instrumentation-starlette/src/opentelemetry/instrumentation/starlette/__init__.py b/instrumentation/opentelemetry-instrumentation-starlette/src/opentelemetry/instrumentation/starlette/__init__.py index cfadcc6635..5d9c474f9f 100644 --- a/instrumentation/opentelemetry-instrumentation-starlette/src/opentelemetry/instrumentation/starlette/__init__.py +++ b/instrumentation/opentelemetry-instrumentation-starlette/src/opentelemetry/instrumentation/starlette/__init__.py @@ -216,6 +216,7 @@ def _instrument(self, **kwargs): client_request_hook=_InstrumentedStarlette._client_request_hook, client_response_hook=_InstrumentedStarlette._client_response_hook, tracer_provider=_InstrumentedStarlette._tracer_provider, + meter=_InstrumentedStarlette._meter_provider ) def _uninstrument(self, **kwargs): @@ -223,12 +224,7 @@ def _uninstrument(self, **kwargs): """uninstrumenting all created apps by user""" for instance in _InstrumentedStarlette._instrumented_starlette_apps: self.uninstrument_app(instance) - - _InstrumentedStarlette._instrumented_starlette_apps = { - instance - for instance in _InstrumentedStarlette._instrumented_starlette_apps - if isinstance(instance, _InstrumentedStarlette) - } + _InstrumentedStarlette._instrumented_starlette_apps.clear() applications.Starlette = self._original_starlette From de2db2fb3e081a5cc7f3b1786849860221818d04 Mon Sep 17 00:00:00 2001 From: rahmukhe Date: Thu, 22 Sep 2022 14:55:53 +0530 Subject: [PATCH 7/7] removed re-instrumentaion of _instrument --- .../instrumentation/starlette/__init__.py | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/instrumentation/opentelemetry-instrumentation-starlette/src/opentelemetry/instrumentation/starlette/__init__.py b/instrumentation/opentelemetry-instrumentation-starlette/src/opentelemetry/instrumentation/starlette/__init__.py index 5d9c474f9f..65e97e9a65 100644 --- a/instrumentation/opentelemetry-instrumentation-starlette/src/opentelemetry/instrumentation/starlette/__init__.py +++ b/instrumentation/opentelemetry-instrumentation-starlette/src/opentelemetry/instrumentation/starlette/__init__.py @@ -209,16 +209,6 @@ def _instrument(self, **kwargs): applications.Starlette = _InstrumentedStarlette - for instance in _InstrumentedStarlette._instrumented_starlette_apps: - self.instrument_app( - instance, - server_request_hook=_InstrumentedStarlette._server_request_hook, - client_request_hook=_InstrumentedStarlette._client_request_hook, - client_response_hook=_InstrumentedStarlette._client_response_hook, - tracer_provider=_InstrumentedStarlette._tracer_provider, - meter=_InstrumentedStarlette._meter_provider - ) - def _uninstrument(self, **kwargs): """uninstrumenting all created apps by user"""