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),