o
    RDi"                     @  s   d dl mZ d dlZd dlmZmZ d dlmZ d dlm	Z	m
Z
 ddlmZmZ ddlmZ dd	lmZmZ e	rDdd
lmZ ddlmZ eeZeG dd deZG dd dZG dd dZ			ddddZdS )    )annotationsN)Enumunique)Lock)TYPE_CHECKINGAny   )CLIENT_NAMESNOWFLAKE_CONNECTOR_VERSION)SecretDetector)ENABLE_TELEMETRY_LOGrt_plain_logger)SnowflakeConnection)SnowflakeRestfulc                   @  s   e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
ZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZ dZ!d Z"d!Z#d"Z$d#Z%d$Z&d%Z'd&Z(d'Z)d(Z*d)Z+d*Z,d+Z-d,Z.d-Z/d.Z0d/Z1d0Z2d1Z3d2Z4d3Z5d4Z6d5Z7d6S )7TelemetryField client_time_consume_first_resultclient_time_consume_last_resultclient_time_downloading_chunksclient_time_parsing_chunksclient_sql_exceptionclient_ocsp_exceptionclient_http_exceptionclient_get_partitions_used'client_pyformat_empty_seq_interpolationclient_fetch_pandas_allclient_fetch_pandas_batchesclient_fetch_arrow_allclient_fetch_arrow_batchesclient_write_pandasclient_imported_packagesclient_multi_statement_querytypesourcequery_id	sql_statedriver_typedriver_versionreasonvalue	exceptionErrorNumberErrorMessage
StacktracedriverversiontelemetryServerDeploymentconnectionStringexceptionMessageerrorMessageexceptionStackTrace	eventType	errorCodesqlStaterequestresponseresponseStatusLineresponseStatusCoderetryTimeout
retryCounteventSubTypesfcPeerHostcertIdocspRequestBase64ocspResponderURLinsecureModefailOpencacheEnabledcacheHitN)8__name__
__module____qualname__TIME_CONSUME_FIRST_RESULTTIME_CONSUME_LAST_RESULTTIME_DOWNLOADING_CHUNKSTIME_PARSING_CHUNKSSQL_EXCEPTIONOCSP_EXCEPTIONHTTP_EXCEPTIONGET_PARTITIONS_USEDEMPTY_SEQ_INTERPOLATIONPANDAS_FETCH_ALLPANDAS_FETCH_BATCHESARROW_FETCH_ALLARROW_FETCH_BATCHESPANDAS_WRITEIMPORTED_PACKAGESMULTI_STATEMENTKEY_TYPE
KEY_SOURCE	KEY_SFQIDKEY_SQLSTATEKEY_DRIVER_TYPEKEY_DRIVER_VERSION
KEY_REASON	KEY_VALUEKEY_EXCEPTIONKEY_ERROR_NUMBERKEY_ERROR_MESSAGEKEY_STACKTRACEKEY_OOB_DRIVERKEY_OOB_VERSION#KEY_OOB_TELEMETRY_SERVER_DEPLOYMENTKEY_OOB_CONNECTION_STRINGKEY_OOB_EXCEPTION_MESSAGEKEY_OOB_ERROR_MESSAGEKEY_OOB_EXCEPTION_STACK_TRACEKEY_OOB_EVENT_TYPEKEY_OOB_ERROR_CODEKEY_OOB_SQL_STATEKEY_OOB_REQUESTKEY_OOB_RESPONSEKEY_OOB_RESPONSE_STATUS_LINEKEY_OOB_RESPONSE_STATUS_CODEKEY_OOB_RETRY_TIMEOUTKEY_OOB_RETRY_COUNTKEY_OOB_EVENT_SUB_TYPEKEY_OOB_SFC_PEER_HOSTKEY_OOB_CERT_IDKEY_OOB_OCSP_REQUEST_BASE64KEY_OOB_OCSP_RESPONDER_URLKEY_OOB_INSECURE_MODEKEY_OOB_FAIL_OPENKEY_OOB_CACHE_ENABLEDKEY_OOB_CACHE_HIT r~   r~   V/var/www/Datamplify/venv/lib/python3.10/site-packages/snowflake/connector/telemetry.pyr      sl    r   c                   @  sJ   e Zd ZdZdZdZdddZe			ddddZdddZ	dddZ
dS )TelemetryDataz>An instance of telemetry data which can be sent to the server.r   r   returnNonec                 C  s   || _ || _d S Nmessage	timestamp)selfr   r   r~   r~   r   __init__\   s   
zTelemetryData.__init__NF	from_dictdictr   int
connectionSnowflakeConnection | Noneis_oob_telemetryboolc                 C  s   | t |pi ||d|S )ab  
        Generate telemetry data with driver info from given dict and timestamp.
        It takes an optional connection object to read data from.
        It also takes a boolean is_oob_telemetry to indicate whether it's for out-of-band telemetry, as
        naming of keys for driver and version is different from the ones of in-band telemetry.
        r   r   r   )generate_telemetry_data_dict)clsr   r   r   r   r~   r~   r   from_telemetry_data_dict`   s   z&TelemetryData.from_telemetry_data_dictdict[str, Any]c                 C  s   | j t| jdS )Nr   )r   strr   r   r~   r~   r   to_dictw   s   zTelemetryData.to_dictr   c                 C  s   t |  S r   )r   r   r   r~   r~   r   __repr__z   s   zTelemetryData.__repr__r   r   NF)r   r   r   r   r   r   r   r   )r   r   )r   r   )rF   rG   rH   __doc__TRUEFALSEr   classmethodr   r   r   r~   r~   r~   r   r   V   s    

r   c                   @  sx   e Zd ZdZdZdZd d!d	d
Zd"ddZd"ddZd#d$ddZ	e
d%ddZd#d$ddZd&ddZdd Zdd ZdS )'TelemetryClientzFClient to enqueue and send metrics to the telemetry endpoint in batch.z/telemetry/sendd   Nrestr   r   r   c                 C  s*   || _ g | _|p
tj| _t | _d| _d S )NT)_rest
_log_batchr   DEFAULT_FORCE_FLUSH_SIZE_flush_sizer   _lock_enabled)r   r   
flush_sizer~   r~   r   r      s
   
zTelemetryClient.__init__telemetry_datar   c                 C  st   | j rtd| jstd d S | j | j| W d    n1 s%w   Y  t| j| j	kr8| 
  d S d S )Nz3Attempted to add log when TelemetryClient is closedz'TelemetryClient disabled. Ignoring log.)	is_closed	Exceptionr   loggerdebugr   r   appendlenr   
send_batchr   r   r~   r~   r   add_log_to_batch   s   
z TelemetryClient.add_log_to_batchc                 C  s4   z|  | W d S  ty   tjddd Y d S w )NzFailed to add log to telemetry.Texc_info)r   r   r   warningr   r~   r~   r   try_add_log_to_batch   s
   z$TelemetryClient.try_add_log_to_batchFretryr   c                 C  s&  | j rtd| jstd d S | j | j}g | _W d    n1 s%w   Y  |s3td d S ddd |D i}tdt|t	t
|d  trVtd	|  z(| jjtj|d
d d| d}|d swtdt
| d| _W d S td W d S  ty   d| _tjddd Y d S w )Nz6Attempted to send batch when TelemetryClient is closedz+TelemetryClient disabled. Not sending logs.zNothing to send to telemetry.logsc                 S  s   g | ]}|  qS r~   )r   ).0xr~   r~   r   
<listcomp>   s    z.TelemetryClient.send_batch.<locals>.<listcomp>z)Sending %d logs to telemetry. Data is %s.r   z$Inband telemetry data being sent is post   )bodymethodclienttimeout	_no_retrysuccesszDNon-success response from telemetry server: %s. Disabling telemetry.Fz,Successfully uploading metrics to telemetry.z&Failed to upload metrics to telemetry.Tr   )r   r   r   r   r   r   r   r   r   mask_secretsr   r   r   r   r7   r   SF_PATH_TELEMETRYinfo)r   r   to_sendr   retr~   r~   r   r      sP   

zTelemetryClient.send_batchc                 C  s
   | j d u S r   )r   r   r~   r~   r   r      s   
zTelemetryClient.is_closedc                 C  s*   | j std | j|d d | _d S d S )NzClosing telemetry client.)r   )r   r   r   r   r   )r   r   r~   r~   r   close   s
   

zTelemetryClient.closec                 C  s
   d| _ d S r   r   r   r~   r~   r   disable      
zTelemetryClient.disablec                 C  s   | j S r   r   r   r~   r~   r   
is_enabled   s   zTelemetryClient.is_enabledc                 C  s
   t | jS r   )r   r   r   r~   r~   r   buffer_size   r   zTelemetryClient.buffer_sizer   )r   r   r   r   )r   r   r   r   )F)r   r   r   r   )r   r   r   )rF   rG   rH   r   r   r   r   r   r   r   propertyr   r   r   r   r   r~   r~   r~   r   r   ~   s    

.
r   Fr   dict | Noner   r   r   r   r   r   c                 C  sT   | pi } |st jjtt jjtt jj|r|ji| S ti| S t jjtt j	jti| S )a^  
    Generate telemetry data with driver info.
    The method also takes an optional dict to update from and optional connection object to read data from.
    It also takes a boolean is_oob_telemetry to indicate whether it's for out-of-band telemetry, as
    naming of keys for driver and version is different from the ones of in-band telemetry.
    )
r   r]   r(   r	   r^   r
   rZ   applicationre   rf   r   r~   r~   r   r      s,   
r   )NNF)r   r   r   r   r   r   r   r   )
__future__r   loggingenumr   r   	threadingr   typingr   r   descriptionr	   r
   secret_detectorr   	test_utilr   r   r   r   networkr   	getLoggerrF   r   r   r   r   r   r~   r~   r~   r   <module>   s(   
A(c