opentelemetry-instrumentation-requests 0.51b0__tar.gz → 0.52b1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {opentelemetry_instrumentation_requests-0.51b0 → opentelemetry_instrumentation_requests-0.52b1}/PKG-INFO +4 -4
- {opentelemetry_instrumentation_requests-0.51b0 → opentelemetry_instrumentation_requests-0.52b1}/pyproject.toml +3 -3
- {opentelemetry_instrumentation_requests-0.51b0 → opentelemetry_instrumentation_requests-0.52b1}/src/opentelemetry/instrumentation/requests/__init__.py +38 -25
- {opentelemetry_instrumentation_requests-0.51b0 → opentelemetry_instrumentation_requests-0.52b1}/src/opentelemetry/instrumentation/requests/version.py +1 -1
- {opentelemetry_instrumentation_requests-0.51b0 → opentelemetry_instrumentation_requests-0.52b1}/tests/test_requests_integration.py +31 -0
- {opentelemetry_instrumentation_requests-0.51b0 → opentelemetry_instrumentation_requests-0.52b1}/.gitignore +0 -0
- {opentelemetry_instrumentation_requests-0.51b0 → opentelemetry_instrumentation_requests-0.52b1}/LICENSE +0 -0
- {opentelemetry_instrumentation_requests-0.51b0 → opentelemetry_instrumentation_requests-0.52b1}/README.rst +0 -0
- {opentelemetry_instrumentation_requests-0.51b0 → opentelemetry_instrumentation_requests-0.52b1}/src/opentelemetry/instrumentation/requests/package.py +0 -0
- {opentelemetry_instrumentation_requests-0.51b0 → opentelemetry_instrumentation_requests-0.52b1}/src/opentelemetry/instrumentation/requests/py.typed +0 -0
- {opentelemetry_instrumentation_requests-0.51b0 → opentelemetry_instrumentation_requests-0.52b1}/tests/__init__.py +0 -0
- {opentelemetry_instrumentation_requests-0.51b0 → opentelemetry_instrumentation_requests-0.52b1}/tests/test_requests_ip_support.py +0 -0
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: opentelemetry-instrumentation-requests
|
3
|
-
Version: 0.
|
3
|
+
Version: 0.52b1
|
4
4
|
Summary: OpenTelemetry requests instrumentation
|
5
5
|
Project-URL: Homepage, https://github.com/open-telemetry/opentelemetry-python-contrib/tree/main/instrumentation/opentelemetry-instrumentation-requests
|
6
6
|
Project-URL: Repository, https://github.com/open-telemetry/opentelemetry-python-contrib
|
@@ -20,9 +20,9 @@ Classifier: Programming Language :: Python :: 3.12
|
|
20
20
|
Classifier: Programming Language :: Python :: 3.13
|
21
21
|
Requires-Python: >=3.8
|
22
22
|
Requires-Dist: opentelemetry-api~=1.12
|
23
|
-
Requires-Dist: opentelemetry-instrumentation==0.
|
24
|
-
Requires-Dist: opentelemetry-semantic-conventions==0.
|
25
|
-
Requires-Dist: opentelemetry-util-http==0.
|
23
|
+
Requires-Dist: opentelemetry-instrumentation==0.52b1
|
24
|
+
Requires-Dist: opentelemetry-semantic-conventions==0.52b1
|
25
|
+
Requires-Dist: opentelemetry-util-http==0.52b1
|
26
26
|
Provides-Extra: instruments
|
27
27
|
Requires-Dist: requests~=2.0; extra == 'instruments'
|
28
28
|
Description-Content-Type: text/x-rst
|
@@ -27,9 +27,9 @@ classifiers = [
|
|
27
27
|
]
|
28
28
|
dependencies = [
|
29
29
|
"opentelemetry-api ~= 1.12",
|
30
|
-
"opentelemetry-instrumentation == 0.
|
31
|
-
"opentelemetry-semantic-conventions == 0.
|
32
|
-
"opentelemetry-util-http == 0.
|
30
|
+
"opentelemetry-instrumentation == 0.52b1",
|
31
|
+
"opentelemetry-semantic-conventions == 0.52b1",
|
32
|
+
"opentelemetry-util-http == 0.52b1",
|
33
33
|
]
|
34
34
|
|
35
35
|
[project.optional-dependencies]
|
@@ -41,20 +41,22 @@ The hooks can be configured as follows:
|
|
41
41
|
|
42
42
|
.. code:: python
|
43
43
|
|
44
|
+
import requests
|
45
|
+
from opentelemetry.instrumentation.requests import RequestsInstrumentor
|
46
|
+
|
44
47
|
# `request_obj` is an instance of requests.PreparedRequest
|
45
48
|
def request_hook(span, request_obj):
|
46
49
|
pass
|
47
50
|
|
48
51
|
# `request_obj` is an instance of requests.PreparedRequest
|
49
52
|
# `response` is an instance of requests.Response
|
50
|
-
def response_hook(span, request_obj, response)
|
53
|
+
def response_hook(span, request_obj, response):
|
51
54
|
pass
|
52
55
|
|
53
56
|
RequestsInstrumentor().instrument(
|
54
|
-
request_hook=request_hook, response_hook=response_hook
|
57
|
+
request_hook=request_hook, response_hook=response_hook
|
55
58
|
)
|
56
59
|
|
57
|
-
|
58
60
|
Exclude lists
|
59
61
|
*************
|
60
62
|
To exclude certain URLs from being tracked, set the environment variable ``OTEL_PYTHON_REQUESTS_EXCLUDED_URLS``
|
@@ -99,15 +101,14 @@ from opentelemetry.instrumentation._semconv import (
|
|
99
101
|
_set_http_network_protocol_version,
|
100
102
|
_set_http_peer_port_client,
|
101
103
|
_set_http_scheme,
|
102
|
-
_set_http_status_code,
|
103
104
|
_set_http_url,
|
105
|
+
_set_status,
|
104
106
|
_StabilityMode,
|
105
107
|
)
|
106
108
|
from opentelemetry.instrumentation.instrumentor import BaseInstrumentor
|
107
109
|
from opentelemetry.instrumentation.requests.package import _instruments
|
108
110
|
from opentelemetry.instrumentation.requests.version import __version__
|
109
111
|
from opentelemetry.instrumentation.utils import (
|
110
|
-
http_status_to_status_code,
|
111
112
|
is_http_instrumentation_enabled,
|
112
113
|
suppress_http_instrumentation,
|
113
114
|
)
|
@@ -124,7 +125,6 @@ from opentelemetry.semconv.metrics.http_metrics import (
|
|
124
125
|
)
|
125
126
|
from opentelemetry.trace import SpanKind, Tracer, get_tracer
|
126
127
|
from opentelemetry.trace.span import Span
|
127
|
-
from opentelemetry.trace.status import StatusCode
|
128
128
|
from opentelemetry.util.http import (
|
129
129
|
ExcludeList,
|
130
130
|
get_excluded_urls,
|
@@ -140,6 +140,32 @@ _RequestHookT = Optional[Callable[[Span, PreparedRequest], None]]
|
|
140
140
|
_ResponseHookT = Optional[Callable[[Span, PreparedRequest, Response], None]]
|
141
141
|
|
142
142
|
|
143
|
+
def _set_http_status_code_attribute(
|
144
|
+
span,
|
145
|
+
status_code,
|
146
|
+
metric_attributes=None,
|
147
|
+
sem_conv_opt_in_mode=_StabilityMode.DEFAULT,
|
148
|
+
):
|
149
|
+
status_code_str = str(status_code)
|
150
|
+
try:
|
151
|
+
status_code = int(status_code)
|
152
|
+
except ValueError:
|
153
|
+
status_code = -1
|
154
|
+
if metric_attributes is None:
|
155
|
+
metric_attributes = {}
|
156
|
+
# When we have durations we should set metrics only once
|
157
|
+
# Also the decision to include status code on a histogram should
|
158
|
+
# not be dependent on tracing decisions.
|
159
|
+
_set_status(
|
160
|
+
span,
|
161
|
+
metric_attributes,
|
162
|
+
status_code,
|
163
|
+
status_code_str,
|
164
|
+
server_span=False,
|
165
|
+
sem_conv_opt_in_mode=sem_conv_opt_in_mode,
|
166
|
+
)
|
167
|
+
|
168
|
+
|
143
169
|
# pylint: disable=unused-argument
|
144
170
|
# pylint: disable=R0915
|
145
171
|
def _instrument(
|
@@ -267,25 +293,12 @@ def _instrument(
|
|
267
293
|
|
268
294
|
if isinstance(result, Response):
|
269
295
|
span_attributes = {}
|
270
|
-
|
271
|
-
|
272
|
-
|
273
|
-
|
274
|
-
|
275
|
-
|
276
|
-
_set_http_status_code(
|
277
|
-
metric_labels, result.status_code, sem_conv_opt_in_mode
|
278
|
-
)
|
279
|
-
status_code = http_status_to_status_code(
|
280
|
-
result.status_code
|
281
|
-
)
|
282
|
-
span.set_status(status_code)
|
283
|
-
if (
|
284
|
-
_report_new(sem_conv_opt_in_mode)
|
285
|
-
and status_code is StatusCode.ERROR
|
286
|
-
):
|
287
|
-
span_attributes[ERROR_TYPE] = str(result.status_code)
|
288
|
-
metric_labels[ERROR_TYPE] = str(result.status_code)
|
296
|
+
_set_http_status_code_attribute(
|
297
|
+
span,
|
298
|
+
result.status_code,
|
299
|
+
metric_labels,
|
300
|
+
sem_conv_opt_in_mode,
|
301
|
+
)
|
289
302
|
|
290
303
|
if result.raw is not None:
|
291
304
|
version = getattr(result.raw, "version", None)
|
@@ -832,3 +832,34 @@ class TestRequestsIntergrationMetric(TestBase):
|
|
832
832
|
dict(data_point.attributes),
|
833
833
|
)
|
834
834
|
self.assertEqual(data_point.count, 1)
|
835
|
+
|
836
|
+
def test_basic_metric_non_recording_span(self):
|
837
|
+
expected_attributes = {
|
838
|
+
SpanAttributes.HTTP_STATUS_CODE: 200,
|
839
|
+
SpanAttributes.HTTP_HOST: "examplehost",
|
840
|
+
SpanAttributes.NET_PEER_PORT: 8000,
|
841
|
+
SpanAttributes.NET_PEER_NAME: "examplehost",
|
842
|
+
SpanAttributes.HTTP_METHOD: "GET",
|
843
|
+
SpanAttributes.HTTP_FLAVOR: "1.1",
|
844
|
+
SpanAttributes.HTTP_SCHEME: "http",
|
845
|
+
}
|
846
|
+
|
847
|
+
with mock.patch("opentelemetry.trace.INVALID_SPAN") as mock_span:
|
848
|
+
RequestsInstrumentor().uninstrument()
|
849
|
+
RequestsInstrumentor().instrument(
|
850
|
+
tracer_provider=trace.NoOpTracerProvider()
|
851
|
+
)
|
852
|
+
mock_span.is_recording.return_value = False
|
853
|
+
result = self.perform_request(self.URL)
|
854
|
+
self.assertEqual(result.text, "Hello!")
|
855
|
+
self.assertFalse(mock_span.is_recording())
|
856
|
+
self.assertTrue(mock_span.is_recording.called)
|
857
|
+
self.assertFalse(mock_span.set_attribute.called)
|
858
|
+
self.assertFalse(mock_span.set_status.called)
|
859
|
+
metrics = self.get_sorted_metrics()
|
860
|
+
self.assertEqual(len(metrics), 1)
|
861
|
+
duration_data_point = metrics[0].data.data_points[0]
|
862
|
+
self.assertDictEqual(
|
863
|
+
expected_attributes, dict(duration_data_point.attributes)
|
864
|
+
)
|
865
|
+
self.assertEqual(duration_data_point.count, 1)
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|