o
     i                     @   s  d Z ddlZddlZddlmZ ddlmZ ddlmZ	 ddlm
Z ddlmZ ddlmZ d	Zd
Zd$dededefddZeeeZeeZz
ddlmZ dZW n eyb   ed d
ZY nw ddde dZdeddZed%ddZ d%ddZ!dd Z"d&d d!Z#d'd"d#Z$dS )(z{Manages OpenTelemetry tracing span creation and handling. This is a PREVIEW FEATURE: Coverage and functionality may change.    N)contextmanager)urlparse)
exceptions)retry)__version__)ConditionalRetryPolicy$ENABLE_GCS_PYTHON_CLIENT_OTEL_TRACESFnamedefaultreturnc                 C   s.   t j| d }|d u r|S t|  dv S )N>   1onyestrue)osenvirongetstrstriplower)r	   r
   val r   /var/www/snowflake_co_dev_github/snow_flake_back_end_deploy/env/lib/python3.10/site-packages/google/cloud/storage/_opentelemetry_tracing.py_parse_bool_env    s   r   )traceTzThis service is instrumented using OpenTelemetry. OpenTelemetry or one of its components could not be imported; please add compatible versions of opentelemetry-api and opentelemetry-instrumentation packages in order to get Storage Tracing data.CloudStoragehttpzgcloud-python/)zrpc.servicez
rpc.systemzuser_agent.originalstoragezgoogleapis/python-storage)zgcp.client.servicezgcp.client.versionzgcp.client.repoc           	      c   s    t rts
dV  dS tt}t||||}|j| tjj|d,}z|V  W n t	j
yC } z|ttjj ||  d}~ww W d   dS 1 sOw   Y  dS )zCreates a context manager for a new span and set it as the current span
    in the configured tracer. If no configuration exists yields None.N)r	   kind
attributes)HAS_OPENTELEMETRYenable_otel_tracesr   
get_tracer__name___get_final_attributesstart_as_current_spanSpanKindCLIENTapi_exceptionsGoogleAPICallError
set_statusStatus
StatusCodeERRORrecord_exception)	r	   r   clientapi_requestr   tracerfinal_attributesspanerrorr   r   r   create_trace_spanH   s(   



"r5   c                 C   s   t  }|t |r|t|| t|tjr |t| t|t	r/|t|j
|j | r6||  dd | D }|S )Nc                 S   s   i | ]\}}|d ur||qS Nr   ).0kvr   r   r   
<dictcomp>k   s    z)_get_final_attributes.<locals>.<dictcomp>)_default_attributescopyupdate_cloud_trace_adoption_attrs_set_api_request_attr
isinstance	api_retryRetry_set_retry_attrr   retry_policyconditional_predicateitems)r   r/   r0   r   collected_attrr2   r   r   r   r$   ^   s   


r$   c                 C   sh   i }|  dr|  d|d< |  dr%|j|  d}|t|dd d| v r2t|  d|d< |S )Nmethodzhttp.request.methodpathT)strip_querytimeoutzconnect_timeout,read_timeout)r   _connectionbuild_api_urlr=   &_get_opentelemetry_attributes_from_urlr   )requestr/   attrfull_urlr   r   r   r?   o   s   

r?   c              
   C   s@   |r|n| j }d| j d| j d| j d| j d| 
}d|iS )N
multiplierz	/deadlinez/maxz/initialz
/predicater   )
_predicate_multiplier	_deadline_maximum_initial)r   rE   	predicate
retry_infor   r   r   rC   {   s   *rC   c                 C   sn   t | }|j}d|v r|ddd }d|v r$|ds$|ddd }||j|j|jd}|s5|j|d< |S )z<Helper to assemble OpenTelemetry span attributes from a URL.@   :]r   )zserver.addresszserver.portz
url.schemezurl.pathz	url.query)r   netlocsplitendswithportschemerI   query)urlrJ   ur^   r   r   r   r   rN      s   
rN   )F)NNNNr6   )T)%__doc__loggingr   
contextlibr   urllib.parser   google.api_corer   r(   r   rA   google.cloud.storager   google.cloud.storage.retryr   ENABLE_OTEL_TRACES_ENV_VAR!_DEFAULT_ENABLE_OTEL_TRACES_VALUEr   boolr   r!   	getLoggerr#   loggeropentelemetryr   r    ImportErrordebugr;   r>   r5   r$   r?   rC   rN   r   r   r   r   <module>   sN   


