From 784bb029fe34a947e94e9ff506dae6b30a2e5d19 Mon Sep 17 00:00:00 2001 From: Ashutosh Goel Date: Tue, 31 May 2022 17:13:48 +0530 Subject: [PATCH 01/17] Restoring metrics in requests --- .../instrumentation/requests/__init__.py | 45 ++++++++++++++++++- .../tests/test_requests_integration.py | 42 +++++++++++++++++ 2 files changed, 86 insertions(+), 1 deletion(-) diff --git a/instrumentation/opentelemetry-instrumentation-requests/src/opentelemetry/instrumentation/requests/__init__.py b/instrumentation/opentelemetry-instrumentation-requests/src/opentelemetry/instrumentation/requests/__init__.py index bd14c504e6..68b45b7aa9 100644 --- a/instrumentation/opentelemetry-instrumentation-requests/src/opentelemetry/instrumentation/requests/__init__.py +++ b/instrumentation/opentelemetry-instrumentation-requests/src/opentelemetry/instrumentation/requests/__init__.py @@ -50,7 +50,9 @@ import functools import types +from time import time from typing import Collection +from urllib.parse import urlparse from requests.models import Response from requests.sessions import Session @@ -64,6 +66,7 @@ _SUPPRESS_INSTRUMENTATION_KEY, http_status_to_status_code, ) +from opentelemetry.metrics import get_meter from opentelemetry.propagate import inject from opentelemetry.semconv.trace import SpanAttributes from opentelemetry.trace import SpanKind, get_tracer @@ -87,7 +90,11 @@ # pylint: disable=unused-argument # pylint: disable=R0915 def _instrument( - tracer, span_callback=None, name_callback=None, excluded_urls=None + tracer, + span_callback=None, + name_callback=None, + excluded_urls=None, + metric_recorder=None, ): """Enables tracing of all requests calls that go through :code:`requests.session.Session.request` (this includes @@ -166,6 +173,7 @@ def _instrumented_requests_call( SpanAttributes.HTTP_METHOD: method, SpanAttributes.HTTP_URL: url, } + parsed_url = urlparse(url) with tracer.start_as_current_span( span_name, kind=SpanKind.CLIENT, attributes=span_attributes @@ -178,6 +186,8 @@ def _instrumented_requests_call( token = context.attach( context.set_value(_SUPPRESS_HTTP_INSTRUMENTATION_KEY, True) ) + start_time = time() + metric_labels = {} try: result = call_wrapped() # *** PROCEED except Exception as exc: # pylint: disable=W0703 @@ -194,9 +204,30 @@ def _instrumented_requests_call( span.set_status( Status(http_status_to_status_code(result.status_code)) ) + + metric_labels["http.status_code"] = result.status_code + metric_labels["http.flavor"] = ( + "1.1" if result.raw.version == 11 else "1.0" + ) + if span_callback is not None: span_callback(span, result) + elapsed_time = time() - start_time + + metric_labels.update( + { + "http.method": method, + "http.host": parsed_url.hostname, + "http.scheme": parsed_url.scheme, + "http.url": url, + } + ) + + metric_recorder.record( + elapsed_time * 1000, attributes=metric_labels + ) + if exception is not None: raise exception.with_traceback(exception.__traceback__) @@ -261,6 +292,17 @@ def _instrument(self, **kwargs): tracer_provider = kwargs.get("tracer_provider") tracer = get_tracer(__name__, __version__, tracer_provider) excluded_urls = kwargs.get("excluded_urls") + meter_provider = kwargs.get("meter_provider") + self._meter = get_meter( + __name__, + __version__, + meter_provider, + ) + self._metric_recorder = self._meter.create_histogram( + name="http.client.duration", + unit="ms", + description="measures the duration of the outbound HTTP request", + ) _instrument( tracer, span_callback=kwargs.get("span_callback"), @@ -268,6 +310,7 @@ def _instrument(self, **kwargs): excluded_urls=_excluded_urls_from_env if excluded_urls is None else parse_excluded_urls(excluded_urls), + metric_recorder=self._metric_recorder, ) def _uninstrument(self, **kwargs): diff --git a/instrumentation/opentelemetry-instrumentation-requests/tests/test_requests_integration.py b/instrumentation/opentelemetry-instrumentation-requests/tests/test_requests_integration.py index 1375333b67..10914d39d4 100644 --- a/instrumentation/opentelemetry-instrumentation-requests/tests/test_requests_integration.py +++ b/instrumentation/opentelemetry-instrumentation-requests/tests/test_requests_integration.py @@ -26,6 +26,8 @@ from opentelemetry.instrumentation.utils import _SUPPRESS_INSTRUMENTATION_KEY from opentelemetry.propagate import get_global_textmap, set_global_textmap from opentelemetry.sdk import resources +from opentelemetry.sdk.metrics import MeterProvider +from opentelemetry.sdk.metrics.export import InMemoryMetricReader from opentelemetry.semconv.trace import SpanAttributes from opentelemetry.test.mock_textmap import MockTextMapPropagator from opentelemetry.test.test_base import TestBase @@ -472,3 +474,43 @@ def perform_request(url: str, session: requests.Session = None): request = requests.Request("GET", url) prepared_request = session.prepare_request(request) return session.send(prepared_request) + + +class TestRequestsIntergrationMetric(TestBase): + URL = "http://httpbin.org/status/200" + + def setUp(self): + super().setUp() + self.reader = InMemoryMetricReader() + self.meter_provider = MeterProvider(metric_readers=[self.reader]) + RequestsInstrumentor().instrument(meter_provider=self.meter_provider) + + httpretty.enable() + httpretty.register_uri(httpretty.GET, self.URL, body="Hello!") + + @staticmethod + def perform_request(url: str) -> requests.Response: + return requests.get(url) + + def test_basic_http_success(self): + response = self.perform_request(self.URL) + + expected_attributes = { + "http.status_code": 200, + "http.flavor": "1.1", + "http.method": "GET", + "http.host": "httpbin.org", + "http.scheme": "http", + "http.url": self.URL, + } + + for ( + resource_metrics + ) in self.reader.get_metrics_data().resource_metrics: + for scope_metrics in resource_metrics.scope_metrics: + for metric in scope_metrics.metrics: + for data_point in metric.data.data_points: + self.assertDictEqual( + expected_attributes, dict(data_point.attributes) + ) + self.assertEqual(data_point.count, 1) From feb34d8a0ab2341041884761454fb56bdd2632fc Mon Sep 17 00:00:00 2001 From: Ashutosh Goel Date: Tue, 31 May 2022 18:32:02 +0530 Subject: [PATCH 02/17] Updating CHANGELOG.md --- CHANGELOG.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index c4b9d1705e..1de3da8555 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - cleanup type hints for textmap `Getter` and `Setter` classes ([1106](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/1106)) +## Added +- `opentelemetry-instrumentation-requests` Restoring metrics in requests + ([1110](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/1110)) ## [1.12.0rc1-0.31b0](https://github.com/open-telemetry/opentelemetry-python/releases/tag/v1.12.0rc1-0.31b0) - 2022-05-17 From 0d58aaa3413718a1595093bfd1f7b3c93f5b1b11 Mon Sep 17 00:00:00 2001 From: Ashutosh Goel Date: Thu, 2 Jun 2022 13:03:50 +0530 Subject: [PATCH 03/17] Fixing build errors --- .../instrumentation/requests/__init__.py | 35 +++++++++++-------- .../tests/test_requests_integration.py | 7 ++-- 2 files changed, 25 insertions(+), 17 deletions(-) diff --git a/instrumentation/opentelemetry-instrumentation-requests/src/opentelemetry/instrumentation/requests/__init__.py b/instrumentation/opentelemetry-instrumentation-requests/src/opentelemetry/instrumentation/requests/__init__.py index 68b45b7aa9..7e53f369c7 100644 --- a/instrumentation/opentelemetry-instrumentation-requests/src/opentelemetry/instrumentation/requests/__init__.py +++ b/instrumentation/opentelemetry-instrumentation-requests/src/opentelemetry/instrumentation/requests/__init__.py @@ -173,7 +173,18 @@ def _instrumented_requests_call( SpanAttributes.HTTP_METHOD: method, SpanAttributes.HTTP_URL: url, } - parsed_url = urlparse(url) + + metric_labels = { + "http.method": method, + "http.url": url, + } + + try: + parsed_url = urlparse(url) + metric_labels["http.host"] = parsed_url.hostname + metric_labels["http.scheme"] = parsed_url.scheme + except ValueError: + pass with tracer.start_as_current_span( span_name, kind=SpanKind.CLIENT, attributes=span_attributes @@ -186,8 +197,9 @@ def _instrumented_requests_call( token = context.attach( context.set_value(_SUPPRESS_HTTP_INSTRUMENTATION_KEY, True) ) + start_time = time() - metric_labels = {} + try: result = call_wrapped() # *** PROCEED except Exception as exc: # pylint: disable=W0703 @@ -206,24 +218,19 @@ def _instrumented_requests_call( ) metric_labels["http.status_code"] = result.status_code - metric_labels["http.flavor"] = ( - "1.1" if result.raw.version == 11 else "1.0" - ) + + if result.raw is not None: + version = getattr(result.raw, "version", None) + if version: + metric_labels["http.flavor"] = ( + "1.1" if version == 11 else "1.0" + ) if span_callback is not None: span_callback(span, result) elapsed_time = time() - start_time - metric_labels.update( - { - "http.method": method, - "http.host": parsed_url.hostname, - "http.scheme": parsed_url.scheme, - "http.url": url, - } - ) - metric_recorder.record( elapsed_time * 1000, attributes=metric_labels ) diff --git a/instrumentation/opentelemetry-instrumentation-requests/tests/test_requests_integration.py b/instrumentation/opentelemetry-instrumentation-requests/tests/test_requests_integration.py index 10914d39d4..31f4eac7a3 100644 --- a/instrumentation/opentelemetry-instrumentation-requests/tests/test_requests_integration.py +++ b/instrumentation/opentelemetry-instrumentation-requests/tests/test_requests_integration.py @@ -497,11 +497,11 @@ def test_basic_http_success(self): expected_attributes = { "http.status_code": 200, - "http.flavor": "1.1", - "http.method": "GET", + "http.url": self.URL, "http.host": "httpbin.org", + "http.method": "GET", + "http.flavor": "1.1", "http.scheme": "http", - "http.url": self.URL, } for ( @@ -510,6 +510,7 @@ def test_basic_http_success(self): for scope_metrics in resource_metrics.scope_metrics: for metric in scope_metrics.metrics: for data_point in metric.data.data_points: + print(dict(data_point.attributes)) self.assertDictEqual( expected_attributes, dict(data_point.attributes) ) From cc33431fe267d441764a95ef3e9d38f05aa6a654 Mon Sep 17 00:00:00 2001 From: Ashutosh Goel Date: Mon, 6 Jun 2022 11:19:27 +0530 Subject: [PATCH 04/17] Fixing unit tests --- .../tests/test_requests_integration.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/instrumentation/opentelemetry-instrumentation-requests/tests/test_requests_integration.py b/instrumentation/opentelemetry-instrumentation-requests/tests/test_requests_integration.py index 31f4eac7a3..884ad8ba56 100644 --- a/instrumentation/opentelemetry-instrumentation-requests/tests/test_requests_integration.py +++ b/instrumentation/opentelemetry-instrumentation-requests/tests/test_requests_integration.py @@ -488,6 +488,11 @@ def setUp(self): httpretty.enable() httpretty.register_uri(httpretty.GET, self.URL, body="Hello!") + def tearDown(self): + super().tearDown() + RequestsInstrumentor().uninstrument() + httpretty.disable() + @staticmethod def perform_request(url: str) -> requests.Response: return requests.get(url) From c5224fce4ac72f2493863e280c0d8987ac18b3ff Mon Sep 17 00:00:00 2001 From: Ashutosh Goel Date: Mon, 6 Jun 2022 11:19:53 +0530 Subject: [PATCH 05/17] Fixing unit tests --- .../tests/test_requests_integration.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/instrumentation/opentelemetry-instrumentation-requests/tests/test_requests_integration.py b/instrumentation/opentelemetry-instrumentation-requests/tests/test_requests_integration.py index 884ad8ba56..c363c0abe4 100644 --- a/instrumentation/opentelemetry-instrumentation-requests/tests/test_requests_integration.py +++ b/instrumentation/opentelemetry-instrumentation-requests/tests/test_requests_integration.py @@ -498,7 +498,7 @@ def perform_request(url: str) -> requests.Response: return requests.get(url) def test_basic_http_success(self): - response = self.perform_request(self.URL) + self.perform_request(self.URL) expected_attributes = { "http.status_code": 200, From f4971010b51669839a9faad8f5aa49edf0cc8df3 Mon Sep 17 00:00:00 2001 From: Ashutosh Goel Date: Mon, 6 Jun 2022 13:30:06 +0530 Subject: [PATCH 06/17] Fixing lint errors --- .../src/opentelemetry/instrumentation/requests/__init__.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/instrumentation/opentelemetry-instrumentation-requests/src/opentelemetry/instrumentation/requests/__init__.py b/instrumentation/opentelemetry-instrumentation-requests/src/opentelemetry/instrumentation/requests/__init__.py index 7e53f369c7..072166b38a 100644 --- a/instrumentation/opentelemetry-instrumentation-requests/src/opentelemetry/instrumentation/requests/__init__.py +++ b/instrumentation/opentelemetry-instrumentation-requests/src/opentelemetry/instrumentation/requests/__init__.py @@ -150,6 +150,7 @@ def call_wrapped(): request.method, request.url, call_wrapped, get_or_create_headers ) + # pylint: disable-msg=too-many-locals,too-many-branches def _instrumented_requests_call( method: str, url: str, call_wrapped, get_or_create_headers ): @@ -300,12 +301,12 @@ def _instrument(self, **kwargs): tracer = get_tracer(__name__, __version__, tracer_provider) excluded_urls = kwargs.get("excluded_urls") meter_provider = kwargs.get("meter_provider") - self._meter = get_meter( + meter = get_meter( __name__, __version__, meter_provider, ) - self._metric_recorder = self._meter.create_histogram( + metric_recorder = meter.create_histogram( name="http.client.duration", unit="ms", description="measures the duration of the outbound HTTP request", @@ -317,7 +318,7 @@ def _instrument(self, **kwargs): excluded_urls=_excluded_urls_from_env if excluded_urls is None else parse_excluded_urls(excluded_urls), - metric_recorder=self._metric_recorder, + metric_recorder=metric_recorder, ) def _uninstrument(self, **kwargs): From 4cca5474193c6582351f50225aa15b2b3a646b86 Mon Sep 17 00:00:00 2001 From: Ashutosh Goel Date: Tue, 7 Jun 2022 11:53:03 +0530 Subject: [PATCH 07/17] Using memory_metrics_reader in unit tests --- .../tests/test_requests_integration.py | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/instrumentation/opentelemetry-instrumentation-requests/tests/test_requests_integration.py b/instrumentation/opentelemetry-instrumentation-requests/tests/test_requests_integration.py index c363c0abe4..d3cf81836a 100644 --- a/instrumentation/opentelemetry-instrumentation-requests/tests/test_requests_integration.py +++ b/instrumentation/opentelemetry-instrumentation-requests/tests/test_requests_integration.py @@ -481,8 +481,6 @@ class TestRequestsIntergrationMetric(TestBase): def setUp(self): super().setUp() - self.reader = InMemoryMetricReader() - self.meter_provider = MeterProvider(metric_readers=[self.reader]) RequestsInstrumentor().instrument(meter_provider=self.meter_provider) httpretty.enable() @@ -497,7 +495,7 @@ def tearDown(self): def perform_request(url: str) -> requests.Response: return requests.get(url) - def test_basic_http_success(self): + def test_basic_metric_success(self): self.perform_request(self.URL) expected_attributes = { @@ -511,11 +509,10 @@ def test_basic_http_success(self): for ( resource_metrics - ) in self.reader.get_metrics_data().resource_metrics: + ) in self.memory_metrics_reader.get_metrics_data().resource_metrics: for scope_metrics in resource_metrics.scope_metrics: for metric in scope_metrics.metrics: for data_point in metric.data.data_points: - print(dict(data_point.attributes)) self.assertDictEqual( expected_attributes, dict(data_point.attributes) ) From b872adab94d7f1bb6e0c32a69c6b55c8e4daf109 Mon Sep 17 00:00:00 2001 From: Ashutosh Goel Date: Tue, 14 Jun 2022 15:45:11 +0530 Subject: [PATCH 08/17] Changed docstring to remove errors --- .../src/opentelemetry/instrumentation/requests/__init__.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/instrumentation/opentelemetry-instrumentation-requests/src/opentelemetry/instrumentation/requests/__init__.py b/instrumentation/opentelemetry-instrumentation-requests/src/opentelemetry/instrumentation/requests/__init__.py index 433c1b7808..546fddde2a 100644 --- a/instrumentation/opentelemetry-instrumentation-requests/src/opentelemetry/instrumentation/requests/__init__.py +++ b/instrumentation/opentelemetry-instrumentation-requests/src/opentelemetry/instrumentation/requests/__init__.py @@ -20,7 +20,7 @@ ----- Capturing traces -********** +**************** .. code-block:: python @@ -32,7 +32,7 @@ response = requests.get(url="https://www.example.org/") Capturing metrics -*********** +***************** .. code:: python @@ -45,6 +45,7 @@ exporter = ConsoleMetricExporter() set_meter_provider(MeterProvider([PeriodicExportingMetricReader(exporter)])) RequestsInstrumentor().instrument() + response = requests.get(url="https://www.example.org/") Configuration ------------- From 5c8cacbee07cd1e8e383463c2f25bd7982f962df Mon Sep 17 00:00:00 2001 From: Ashutosh Goel Date: Tue, 14 Jun 2022 16:34:22 +0530 Subject: [PATCH 09/17] Fixing lint errors --- .../tests/test_requests_integration.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/instrumentation/opentelemetry-instrumentation-requests/tests/test_requests_integration.py b/instrumentation/opentelemetry-instrumentation-requests/tests/test_requests_integration.py index d3cf81836a..3443308f2a 100644 --- a/instrumentation/opentelemetry-instrumentation-requests/tests/test_requests_integration.py +++ b/instrumentation/opentelemetry-instrumentation-requests/tests/test_requests_integration.py @@ -26,8 +26,6 @@ from opentelemetry.instrumentation.utils import _SUPPRESS_INSTRUMENTATION_KEY from opentelemetry.propagate import get_global_textmap, set_global_textmap from opentelemetry.sdk import resources -from opentelemetry.sdk.metrics import MeterProvider -from opentelemetry.sdk.metrics.export import InMemoryMetricReader from opentelemetry.semconv.trace import SpanAttributes from opentelemetry.test.mock_textmap import MockTextMapPropagator from opentelemetry.test.test_base import TestBase From 80bdff24740b173849c05a211cb9059d537c1ba7 Mon Sep 17 00:00:00 2001 From: Ashutosh Goel Date: Tue, 21 Jun 2022 19:05:28 +0530 Subject: [PATCH 10/17] Resolving comments: Removing url tag and adding new attributes --- .../instrumentation/requests/__init__.py | 19 +++++++++++++------ .../tests/test_requests_integration.py | 8 +++++--- 2 files changed, 18 insertions(+), 9 deletions(-) diff --git a/instrumentation/opentelemetry-instrumentation-requests/src/opentelemetry/instrumentation/requests/__init__.py b/instrumentation/opentelemetry-instrumentation-requests/src/opentelemetry/instrumentation/requests/__init__.py index 546fddde2a..bbf06ad81f 100644 --- a/instrumentation/opentelemetry-instrumentation-requests/src/opentelemetry/instrumentation/requests/__init__.py +++ b/instrumentation/opentelemetry-instrumentation-requests/src/opentelemetry/instrumentation/requests/__init__.py @@ -197,14 +197,19 @@ def _instrumented_requests_call( } metric_labels = { - "http.method": method, - "http.url": url, + SpanAttributes.HTTP_METHOD: method, } try: parsed_url = urlparse(url) - metric_labels["http.host"] = parsed_url.hostname - metric_labels["http.scheme"] = parsed_url.scheme + metric_labels[SpanAttributes.HTTP_SCHEME] = parsed_url.scheme + if parsed_url.hostname: + metric_labels[SpanAttributes.HTTP_HOST] = parsed_url.hostname + metric_labels[ + SpanAttributes.NET_PEER_NAME + ] = parsed_url.hostname + if parsed_url.port: + metric_labels[SpanAttributes.NET_PEER_PORT] = parsed_url.port except ValueError: pass @@ -240,12 +245,14 @@ def _instrumented_requests_call( Status(http_status_to_status_code(result.status_code)) ) - metric_labels["http.status_code"] = result.status_code + metric_labels[ + SpanAttributes.HTTP_STATUS_CODE + ] = result.status_code if result.raw is not None: version = getattr(result.raw, "version", None) if version: - metric_labels["http.flavor"] = ( + metric_labels[SpanAttributes.HTTP_FLAVOR] = ( "1.1" if version == 11 else "1.0" ) diff --git a/instrumentation/opentelemetry-instrumentation-requests/tests/test_requests_integration.py b/instrumentation/opentelemetry-instrumentation-requests/tests/test_requests_integration.py index 3443308f2a..5161b5f82b 100644 --- a/instrumentation/opentelemetry-instrumentation-requests/tests/test_requests_integration.py +++ b/instrumentation/opentelemetry-instrumentation-requests/tests/test_requests_integration.py @@ -475,7 +475,7 @@ def perform_request(url: str, session: requests.Session = None): class TestRequestsIntergrationMetric(TestBase): - URL = "http://httpbin.org/status/200" + URL = "http://examplehost:8000/status/200" def setUp(self): super().setUp() @@ -498,8 +498,9 @@ def test_basic_metric_success(self): expected_attributes = { "http.status_code": 200, - "http.url": self.URL, - "http.host": "httpbin.org", + "http.host": "examplehost", + "net.peer.port": 8000, + "net.peer.name": "examplehost", "http.method": "GET", "http.flavor": "1.1", "http.scheme": "http", @@ -511,6 +512,7 @@ def test_basic_metric_success(self): for scope_metrics in resource_metrics.scope_metrics: for metric in scope_metrics.metrics: for data_point in metric.data.data_points: + print(data_point.attributes) self.assertDictEqual( expected_attributes, dict(data_point.attributes) ) From 89d8f6e7978f0ff78ffbacea3ed73fa534686ee7 Mon Sep 17 00:00:00 2001 From: Ashutosh Goel Date: Tue, 21 Jun 2022 19:16:38 +0530 Subject: [PATCH 11/17] Removing unwanted changes --- CHANGELOG.md | 1 - 1 file changed, 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1bdb75de78..f75965abce 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,7 +17,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - `opentelemetry-instrumentation-grpc` narrow protobuf dependency to exclude protobuf >= 4 ([#1109](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/1109)) - cleanup type hints for textmap `Getter` and `Setter` classes - ([1106](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/1106)) - Suppressing downstream HTTP instrumentation to avoid [extra spans](https://github.com/open-telemetry/opentelemetry-python-contrib/issues/930) ([#1116](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/1116)) - fixed typo in `system.network.io` metric configuration From b27340973c0c3410f0f451347941c43941bd22bb Mon Sep 17 00:00:00 2001 From: Ashutosh Goel <39601429+ashu658@users.noreply.github.com> Date: Thu, 23 Jun 2022 00:17:16 +0530 Subject: [PATCH 12/17] Update instrumentation/opentelemetry-instrumentation-requests/tests/test_requests_integration.py Co-authored-by: Diego Hurtado --- .../tests/test_requests_integration.py | 1 - 1 file changed, 1 deletion(-) diff --git a/instrumentation/opentelemetry-instrumentation-requests/tests/test_requests_integration.py b/instrumentation/opentelemetry-instrumentation-requests/tests/test_requests_integration.py index ca366a8049..790a2a7d03 100644 --- a/instrumentation/opentelemetry-instrumentation-requests/tests/test_requests_integration.py +++ b/instrumentation/opentelemetry-instrumentation-requests/tests/test_requests_integration.py @@ -527,7 +527,6 @@ def test_basic_metric_success(self): for scope_metrics in resource_metrics.scope_metrics: for metric in scope_metrics.metrics: for data_point in metric.data.data_points: - print(data_point.attributes) self.assertDictEqual( expected_attributes, dict(data_point.attributes) ) From 52de6c31e5a33c199076dc5b75caa5c4ba51ef28 Mon Sep 17 00:00:00 2001 From: Ashutosh Goel Date: Thu, 23 Jun 2022 13:13:23 +0530 Subject: [PATCH 13/17] Resolving comments: 1) Using default_timer 2) Refactoring varibale names 3) Removing metric usage docstring --- .../instrumentation/requests/__init__.py | 36 +++++-------------- 1 file changed, 9 insertions(+), 27 deletions(-) diff --git a/instrumentation/opentelemetry-instrumentation-requests/src/opentelemetry/instrumentation/requests/__init__.py b/instrumentation/opentelemetry-instrumentation-requests/src/opentelemetry/instrumentation/requests/__init__.py index c3264a7142..a4fcf88274 100644 --- a/instrumentation/opentelemetry-instrumentation-requests/src/opentelemetry/instrumentation/requests/__init__.py +++ b/instrumentation/opentelemetry-instrumentation-requests/src/opentelemetry/instrumentation/requests/__init__.py @@ -19,9 +19,6 @@ Usage ----- -Capturing traces -**************** - .. code-block:: python import requests @@ -31,21 +28,6 @@ RequestsInstrumentor().instrument() response = requests.get(url="https://www.example.org/") -Capturing metrics -***************** - -.. code:: python - - from opentelemetry.metrics import set_meter_provider - from opentelemetry.instrumentation.requests import RequestsInstrumentor - from opentelemetry.sdk.metrics import MeterProvider - from opentelemetry.sdk.metrics.export import ConsoleMetricExporter, PeriodicExportingMetricReader - - # you can configure any other exporter here. - exporter = ConsoleMetricExporter() - set_meter_provider(MeterProvider([PeriodicExportingMetricReader(exporter)])) - RequestsInstrumentor().instrument() - response = requests.get(url="https://www.example.org/") Configuration ------------- @@ -69,7 +51,7 @@ import functools import types -from time import time +from timeit import default_timer from typing import Callable, Collection, Iterable, Optional from urllib.parse import urlparse @@ -89,7 +71,7 @@ http_status_to_status_code, ) from opentelemetry.metrics import get_meter -from opentelemetry.metrics._internal.instrument import Histogram +from opentelemetry.metrics import Histogram from opentelemetry.propagate import inject from opentelemetry.semconv.trace import SpanAttributes from opentelemetry.trace import SpanKind, Tracer, get_tracer @@ -109,7 +91,7 @@ # pylint: disable=R0915 def _instrument( tracer: Tracer, - metric_recorder: Histogram, + duration_histogram: Histogram, span_callback: Optional[Callable[[Span, Response], str]] = None, name_callback: Optional[Callable[[str, str], str]] = None, excluded_urls: Iterable[str] = None, @@ -222,7 +204,7 @@ def _instrumented_requests_call( context.set_value(_SUPPRESS_HTTP_INSTRUMENTATION_KEY, True) ) - start_time = time() + start_time = default_timer() try: result = call_wrapped() # *** PROCEED @@ -230,7 +212,7 @@ def _instrumented_requests_call( exception = exc result = getattr(exc, "response", None) finally: - elapsed_time = time() - start_time + elapsed_time = max(round((default_timer() - start_time) * 1000), 0) context.detach(token) if isinstance(result, Response): @@ -256,8 +238,8 @@ def _instrumented_requests_call( if span_callback is not None: span_callback(span, result) - metric_recorder.record( - elapsed_time * 1000, attributes=metric_labels + duration_histogram.record( + elapsed_time, attributes=metric_labels ) if exception is not None: @@ -330,14 +312,14 @@ def _instrument(self, **kwargs): __version__, meter_provider, ) - metric_recorder = meter.create_histogram( + duration_histogram = meter.create_histogram( name="http.client.duration", unit="ms", description="measures the duration of the outbound HTTP request", ) _instrument( tracer, - metric_recorder, + duration_histogram, span_callback=kwargs.get("span_callback"), name_callback=kwargs.get("name_callback"), excluded_urls=_excluded_urls_from_env From 8a0e994e5c621e04df2c79ec5b4f06b52626b31c Mon Sep 17 00:00:00 2001 From: Ashutosh Goel Date: Thu, 23 Jun 2022 13:24:41 +0530 Subject: [PATCH 14/17] Removing extra linebreak from docstring --- .../src/opentelemetry/instrumentation/requests/__init__.py | 1 - 1 file changed, 1 deletion(-) diff --git a/instrumentation/opentelemetry-instrumentation-requests/src/opentelemetry/instrumentation/requests/__init__.py b/instrumentation/opentelemetry-instrumentation-requests/src/opentelemetry/instrumentation/requests/__init__.py index a4fcf88274..5fe7d8a13d 100644 --- a/instrumentation/opentelemetry-instrumentation-requests/src/opentelemetry/instrumentation/requests/__init__.py +++ b/instrumentation/opentelemetry-instrumentation-requests/src/opentelemetry/instrumentation/requests/__init__.py @@ -28,7 +28,6 @@ RequestsInstrumentor().instrument() response = requests.get(url="https://www.example.org/") - Configuration ------------- From 7f4a49b1ac8cb08693a4a8ebd9bee2d6465e380a Mon Sep 17 00:00:00 2001 From: Ashutosh Goel Date: Thu, 23 Jun 2022 15:45:13 +0530 Subject: [PATCH 15/17] Fixing lint error --- .../instrumentation/requests/__init__.py | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/instrumentation/opentelemetry-instrumentation-requests/src/opentelemetry/instrumentation/requests/__init__.py b/instrumentation/opentelemetry-instrumentation-requests/src/opentelemetry/instrumentation/requests/__init__.py index 5fe7d8a13d..38e593a094 100644 --- a/instrumentation/opentelemetry-instrumentation-requests/src/opentelemetry/instrumentation/requests/__init__.py +++ b/instrumentation/opentelemetry-instrumentation-requests/src/opentelemetry/instrumentation/requests/__init__.py @@ -69,8 +69,7 @@ _SUPPRESS_INSTRUMENTATION_KEY, http_status_to_status_code, ) -from opentelemetry.metrics import get_meter -from opentelemetry.metrics import Histogram +from opentelemetry.metrics import Histogram, get_meter from opentelemetry.propagate import inject from opentelemetry.semconv.trace import SpanAttributes from opentelemetry.trace import SpanKind, Tracer, get_tracer @@ -211,7 +210,9 @@ def _instrumented_requests_call( exception = exc result = getattr(exc, "response", None) finally: - elapsed_time = max(round((default_timer() - start_time) * 1000), 0) + elapsed_time = max( + round((default_timer() - start_time) * 1000), 0 + ) context.detach(token) if isinstance(result, Response): @@ -237,9 +238,7 @@ def _instrumented_requests_call( if span_callback is not None: span_callback(span, result) - duration_histogram.record( - elapsed_time, attributes=metric_labels - ) + duration_histogram.record(elapsed_time, attributes=metric_labels) if exception is not None: raise exception.with_traceback(exception.__traceback__) From 32dab15c8cd9dd5bd3d936bccd564bf4af49e462 Mon Sep 17 00:00:00 2001 From: Ashutosh Goel Date: Fri, 24 Jun 2022 16:02:15 +0530 Subject: [PATCH 16/17] Adding _support_metrics variable --- .../src/opentelemetry/instrumentation/requests/package.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/instrumentation/opentelemetry-instrumentation-requests/src/opentelemetry/instrumentation/requests/package.py b/instrumentation/opentelemetry-instrumentation-requests/src/opentelemetry/instrumentation/requests/package.py index c46bd6a2bf..73e8d65d5b 100644 --- a/instrumentation/opentelemetry-instrumentation-requests/src/opentelemetry/instrumentation/requests/package.py +++ b/instrumentation/opentelemetry-instrumentation-requests/src/opentelemetry/instrumentation/requests/package.py @@ -14,3 +14,5 @@ _instruments = ("requests ~= 2.0",) + +_supports_metrics = True \ No newline at end of file From e57651bd1316447bfdd2784b2c18dc1ad6642ee0 Mon Sep 17 00:00:00 2001 From: Ashutosh Goel Date: Fri, 24 Jun 2022 16:06:20 +0530 Subject: [PATCH 17/17] Adding new line at the end of file --- instrumentation/README.md | 2 +- .../src/opentelemetry/instrumentation/requests/package.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/instrumentation/README.md b/instrumentation/README.md index 030dca937d..e51c9d42a1 100644 --- a/instrumentation/README.md +++ b/instrumentation/README.md @@ -31,7 +31,7 @@ | [opentelemetry-instrumentation-pyramid](./opentelemetry-instrumentation-pyramid) | pyramid >= 1.7 | No | [opentelemetry-instrumentation-redis](./opentelemetry-instrumentation-redis) | redis >= 2.6 | No | [opentelemetry-instrumentation-remoulade](./opentelemetry-instrumentation-remoulade) | remoulade >= 0.50 | No -| [opentelemetry-instrumentation-requests](./opentelemetry-instrumentation-requests) | requests ~= 2.0 | No +| [opentelemetry-instrumentation-requests](./opentelemetry-instrumentation-requests) | requests ~= 2.0 | Yes | [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 diff --git a/instrumentation/opentelemetry-instrumentation-requests/src/opentelemetry/instrumentation/requests/package.py b/instrumentation/opentelemetry-instrumentation-requests/src/opentelemetry/instrumentation/requests/package.py index 73e8d65d5b..8424bfeb2a 100644 --- a/instrumentation/opentelemetry-instrumentation-requests/src/opentelemetry/instrumentation/requests/package.py +++ b/instrumentation/opentelemetry-instrumentation-requests/src/opentelemetry/instrumentation/requests/package.py @@ -15,4 +15,4 @@ _instruments = ("requests ~= 2.0",) -_supports_metrics = True \ No newline at end of file +_supports_metrics = True