diff --git a/instrumentation/opentelemetry-instrumentation-urllib3/src/opentelemetry/instrumentation/urllib3/__init__.py b/instrumentation/opentelemetry-instrumentation-urllib3/src/opentelemetry/instrumentation/urllib3/__init__.py index e3f092796b..31f61e6aab 100644 --- a/instrumentation/opentelemetry-instrumentation-urllib3/src/opentelemetry/instrumentation/urllib3/__init__.py +++ b/instrumentation/opentelemetry-instrumentation-urllib3/src/opentelemetry/instrumentation/urllib3/__init__.py @@ -211,30 +211,20 @@ def instrumented_urlopen(wrapped, instance, args, kwargs): if callable(response_hook): response_hook(span, instance, response) - metric_labels = { - SpanAttributes.HTTP_METHOD: method, - SpanAttributes.HTTP_HOST: instance.host, - SpanAttributes.HTTP_SCHEME: instance.scheme, - SpanAttributes.HTTP_STATUS_CODE: response.status, - SpanAttributes.NET_PEER_NAME: instance.host, - SpanAttributes.NET_PEER_PORT: instance.port, - } - - version = getattr(response, "version") - if version: - metric_labels[SpanAttributes.HTTP_FLAVOR] = ( - "1.1" if version == 11 else "1.0" - ) - request_size = 0 if body is None else len(body) response_size = int(response.headers.get("Content-Length", 0)) + metric_attributes = create_metric_attributes( + instance, response, method + ) - duration_histogram.record(elapsed_time, attributes=metric_labels) + duration_histogram.record( + elapsed_time, attributes=metric_attributes + ) request_size_histogram.record( - request_size, attributes=metric_labels + request_size, attributes=metric_attributes ) response_size_histogram.record( - response_size, attributes=metric_labels + response_size, attributes=metric_attributes ) return response @@ -311,6 +301,29 @@ def _is_instrumentation_suppressed() -> bool: ) +def create_metric_attributes( + instance: urllib3.connectionpool.HTTPConnectionPool, + response: urllib3.response.HTTPResponse, + method: str, +) -> dict: + metric_attributes = { + SpanAttributes.HTTP_METHOD: method, + SpanAttributes.HTTP_HOST: instance.host, + SpanAttributes.HTTP_SCHEME: instance.scheme, + SpanAttributes.HTTP_STATUS_CODE: response.status, + SpanAttributes.NET_PEER_NAME: instance.host, + SpanAttributes.NET_PEER_PORT: instance.port, + } + + version = getattr(response, "version") + if version: + metric_attributes[SpanAttributes.HTTP_FLAVOR] = ( + "1.1" if version == 11 else "1.0" + ) + + return metric_attributes + + @contextlib.contextmanager def _suppress_further_instrumentation(): token = context.attach( diff --git a/instrumentation/opentelemetry-instrumentation-urllib3/tests/test_urllib3_ip_support.py b/instrumentation/opentelemetry-instrumentation-urllib3/tests/test_urllib3_ip_support.py index 5493e2c7ae..44351c1295 100644 --- a/instrumentation/opentelemetry-instrumentation-urllib3/tests/test_urllib3_ip_support.py +++ b/instrumentation/opentelemetry-instrumentation-urllib3/tests/test_urllib3_ip_support.py @@ -183,7 +183,7 @@ def test_basic_metric_check_client_size_post(self): "net.peer.port": self.assert_port, } - body, content_type = encode_multipart_formdata(data_fields) + body = encode_multipart_formdata(data_fields)[0] expected_data = { "http.client.request.size": len(body),