U
    >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"eeedddZeeeZeeZzddlmZ dZW n" ek
r   ed d
ZY nX 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__)ConditionalRetryPolicyZ$ENABLE_GCS_PYTHON_CLIENT_OTEL_TRACESF)namedefaultreturnc                 C   s.   t j| d }|d kr|S t|  dkS )N>   ontrue1yes)osenvirongetstrstriplower)r   r	   val r   O/tmp/pip-unpacked-wheel-yqpfpfam/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.ZCloudStoragehttpzgcloud-python/)zrpc.servicez
rpc.systemzuser_agent.originalZ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V}z
|V  W nD t	j
k
r } z$|ttjj ||  W 5 d}~X Y nX W 5 Q R X 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   Z
get_tracer__name___get_final_attributesZstart_as_current_spanZSpanKindZCLIENTapi_exceptionsZGoogleAPICallErrorZ
set_statusZStatusZ
StatusCodeERRORZrecord_exception)	r   r   clientapi_requestr   Ztracerfinal_attributesspanerrorr   r   r   create_trace_spanH   s"    
  

r(   c                 C   s   t  }|t |r&|t|| t|tjr@|t| t|t	r^|t|j
|j | rl||  dd | D }|S )Nc                 S   s   i | ]\}}|d k	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   Zretry_policyconditional_predicateitems)r   r#   r$   r   Zcollected_attrr%   r   r   r   r    ^   s    


r    c                 C   sh   i }|  dr|  d|d< |  drJ|j|  d}|t|dd d| krdt|  d|d< |S )Nmethodzhttp.request.methodpathT)strip_querytimeoutzconnect_timeout,read_timeout)r   _connectionZbuild_api_urlr/   &_get_opentelemetry_attributes_from_urlr   )requestr#   attrfull_urlr   r   r   r1   o   s    

r1   c              
   C   s@   |r|n| j }d| j d| j d| j d| j d| 
}d|iS )NZ
multiplierz	/deadlinez/maxz/initialz
/predicater   )Z
_predicateZ_multiplierZ	_deadlineZ_maximumZ_initial)r   r6   	predicateZ
retry_infor   r   r   r5   {   s    *r5   c                 C   sn   t | }|j}d|kr&|ddd }d|krH|dsH|ddd }||j|j|jd}|sj|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schemer9   query)urlr:   urF   r   r   r   r   r=      s    
r=   )F)NNNN)NNNN)N)T)%__doc__loggingr   
contextlibr   urllib.parser   Zgoogle.api_corer   r!   r   r3   Zgoogle.cloud.storager   Zgoogle.cloud.storage.retryr   ZENABLE_OTEL_TRACES_ENV_VARZ!_DEFAULT_ENABLE_OTEL_TRACES_VALUEr   boolr   r   	getLoggerr   loggerZopentelemetryr   r   ImportErrordebugr-   r0   r(   r    r1   r5   r=   r   r   r   r   <module>   sL    



