@@ -101,15 +101,14 @@ def response_hook(span, request_obj, response):
101101    _set_http_network_protocol_version ,
102102    _set_http_peer_port_client ,
103103    _set_http_scheme ,
104-     _set_http_status_code ,
105104    _set_http_url ,
105+     _set_status ,
106106    _StabilityMode ,
107107)
108108from  opentelemetry .instrumentation .instrumentor  import  BaseInstrumentor 
109109from  opentelemetry .instrumentation .requests .package  import  _instruments 
110110from  opentelemetry .instrumentation .requests .version  import  __version__ 
111111from  opentelemetry .instrumentation .utils  import  (
112-     http_status_to_status_code ,
113112    is_http_instrumentation_enabled ,
114113    suppress_http_instrumentation ,
115114)
@@ -126,7 +125,6 @@ def response_hook(span, request_obj, response):
126125)
127126from  opentelemetry .trace  import  SpanKind , Tracer , get_tracer 
128127from  opentelemetry .trace .span  import  Span 
129- from  opentelemetry .trace .status  import  StatusCode 
130128from  opentelemetry .util .http  import  (
131129    ExcludeList ,
132130    get_excluded_urls ,
@@ -142,6 +140,32 @@ def response_hook(span, request_obj, response):
142140_ResponseHookT  =  Optional [Callable [[Span , PreparedRequest , Response ], None ]]
143141
144142
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+ 
145169# pylint: disable=unused-argument 
146170# pylint: disable=R0915 
147171def  _instrument (
@@ -269,25 +293,12 @@ def get_or_create_headers():
269293
270294            if  isinstance (result , Response ):
271295                span_attributes  =  {}
272-                 if  span .is_recording ():
273-                     _set_http_status_code (
274-                         span_attributes ,
275-                         result .status_code ,
276-                         sem_conv_opt_in_mode ,
277-                     )
278-                     _set_http_status_code (
279-                         metric_labels , result .status_code , sem_conv_opt_in_mode 
280-                     )
281-                     status_code  =  http_status_to_status_code (
282-                         result .status_code 
283-                     )
284-                     span .set_status (status_code )
285-                     if  (
286-                         _report_new (sem_conv_opt_in_mode )
287-                         and  status_code  is  StatusCode .ERROR 
288-                     ):
289-                         span_attributes [ERROR_TYPE ] =  str (result .status_code )
290-                         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+                 )
291302
292303                if  result .raw  is  not None :
293304                    version  =  getattr (result .raw , "version" , None )
0 commit comments