o
    i
                     @   s   d dl 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 eeZdd	 Zd
d Zdd Zdd Zdd ZdedefddZdS )    N)parse)config)	constants)net)USER_AGENT_HEADER)OTLP_EXPORTER_HEADER_IDENTIFIERc                 C   sR   |  ddd\}}|dd}t|dkr!||d |d |fS |d|d |fS )zRReturns (package_service, package, service, method) tuple from parsing method path/   .   r   N)lstriprsplitlen)method_pathpackage_servicemethod_namepackage_service_split r   W/home/ubuntu/.local/lib/python3.10/site-packages/ddtrace/contrib/internal/grpc/utils.pyparse_method_path   s
   r   c                 C   s   |}t |\}}}}|d ur| tj| |d ur | tj| |d ur+| tj| |d ur6| tj| |d urA| tj| |d urN| tj| d S d S N)	r   _set_tag_strr   GRPC_METHOD_PACKAGE_SERVICE_KEYGRPC_METHOD_PATH_KEYGRPC_METHOD_PACKAGE_KEYGRPC_METHOD_SERVICE_KEYGRPC_METHOD_NAME_KEYGRPC_METHOD_KIND_KEY)spanmethodmethod_kindr   method_package_servicemethod_packagemethod_servicer   r   r   r   set_grpc_method_meta   s   r$   c                 C   sz   |r(|  tj| zt| W n ty    |  tj| Y nw |  tj| |r3|  tj	t
| |  tjtj d S r   )r   r   GRPC_HOST_KEY	ipaddress
ip_address
ValueErrorr   PEER_HOSTNAME	TARGET_IPTARGET_PORTstrGRPC_SPAN_KIND_KEYGRPC_SPAN_KIND_VALUE_CLIENT)r   hostportr   r   r   set_grpc_client_meta/   s   r1   c                 C   s   d|v r	|d }n| d }zB|d u rW d S t |ds d| n|}d }z|j}W n ty9   td| Y nw |jd urIt|jdkrI|jnd }||fW S  ty_   td| Y d S w )Ntargetr   z//zNon-integer port in target '%s'zMalformed target '%s'.)	r   urlsplit
startswithr0   r(   logwarninghostnamer   )argskwargsr2   parsedr0   r7   r   r   r   _parse_target_from_args=   s$   

"
r;   c           	      C   sz   d}d}t || }t || }|r|std|d}|d}z
|j| }W ||fS  ty<   d }td| w )Nzstatus\s*=\s*StatusCode\.(\w+)zdetails\s*=\s*"([^"]*)"z2Unable to parse grpc status or details repr stringr	   zInvalid grpc status code: )researchr(   group
StatusCodeKeyError)	
rpc_stringmodulestatus_patterndetails_patternstatus_matchdetails_match
status_strdetailscoder   r   r   _parse_rpc_repr_stringY   s   

rJ   metadatareturnc                 C   sH   t jst jsdS | D ]\}}|tkr!| dd}t|v r! dS q
dS )z\
    Determine if a gRPC channel is submitting data to the OpenTelemetry OTLP exporter.
    F -T)r   _otel_logs_enabled_otel_metrics_enabledr   lowerreplacer   )rK   keyvaluenormalized_valuer   r   r   is_otlp_exportt   s   rV   )r&   loggingr<   urllibr   ddtracer   ddtrace.contrib.internal.grpcr   ddtrace.extr   ddtrace.internal.constantsr   (ddtrace.internal.opentelemetry.constantsr   	getLogger__name__r5   r   r$   r1   r;   rJ   tupleboolrV   r   r   r   r   <module>   s     
