o
    i                  	   @   s  d dl Z d dlmZ d dlm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
Zedd ejjddd D ZdZdad!ddZdefddZdee fddZde e de!de!de e fddZ"dd Z#dd  Z$dS )"    N)Any)Optional)config)get_hostname)
get_logger)otel_config)telemetry_writer)TELEMETRY_NAMESPACE)      r   c                 c       | ]}t |V  qd S Nint.0x r   W/home/ubuntu/.local/lib/python3.10/site-packages/ddtrace/internal/opentelemetry/logs.py	<genexpr>       r   .   grpcFreturnc                  C   sV   t  sdS t } | du rdS tjj}t|}|du rdS t||| s$dS dadt_	dS )zASet up the OpenTelemetry Logs exporter if not already configured.NTF)
_should_configure_logs_exporter_build_resourcer   exporterLOGS_PROTOCOL_import_exporter_initialize_loggingDD_LOGS_PROVIDER_CONFIGUREDr   _logs_injection)resourceprotocolexporter_classr   r   r   set_otel_logs_provider   s   
r&   c               
   C   s   t r	td dS ttk r&tdddd tD ddd tD  dS zdd	lm}  | d
ur9td W dS W n tyU } ztdt	| W Y d
}~dS d
}~ww t
d dS )z>Check if the OpenTelemetry Logs exporter should be configured.zNOpenTelemetry Logs exporter was already configured by ddtrace, skipping setup.FzOpenTelemetry API requires version %s or higher to enable logs collection. Found version %s. Please upgrade the opentelemetry-api package before enabling ddtrace OpenTelemetry Logs support.r   c                 s   r   r   strr   r   r   r   r   :   r   z2_should_configure_logs_exporter.<locals>.<genexpr>c                 s   r   r   r'   r   r   r   r   r   ;   r   r   )_LOGGER_PROVIDERNzfOpenTelemetry Logs provider was configured before ddtrace instrumentation was applied, skipping setup.z0OpenTelemetry Logs support is not available: %s.zMOpenTelemetry Logs exporter is not configured, proceeding with ddtrace setup.T)r!   logwarningAPI_VERSIONMINIMUM_SUPPORTED_VERSIONjoinopentelemetry._logs._internalr)   ImportErrorr(   debug)logger_providerer   r   r   r   0   s8   

r   c                  C   s~   z/ddl m}  i tjtjtjtjd}tjr!d|vr!t |d< dd |	 D }| 
|W S  ty>   td Y dS w )	zKBuild an OpenTelemetry Resource using DD_TAGS and OTEL_RESOURCE_ATTRIBUTES.r   )Resource)zservice.namezservice.versionzdeployment.environmentz	host.namec                 S   s&   i | ]\}}||d urt |ndqS )N r'   )r   kvr   r   r   
<dictcomp>a   s   & z#_build_resource.<locals>.<dictcomp>zOpenTelemetry SDK is not installed, opentelemetry logs will not be enabled. Please install the OpenTelemetry SDK before enabling ddtrace OpenTelemetry Logs support.N)opentelemetry.sdk.resourcesr4   r   tagsserviceversionenv_report_hostnamer   itemscreater0   r*   r+   )r4   resource_attributesr   r   r   r   R   s&   
r   otel_exporterr$   encodingc                    s   G  fddd| }|S )zWCreate a custom OpenTelemetry Logs exporter that adds telemetry metrics and debug logs.c                       s6   e Zd ZdZdedededef fddZ  ZS )z)_dd_logs_exporter.<locals>.DDLogsExporterzPA custom OpenTelemetry Logs exporter that adds telemetry metrics and debug logs.batchargskwargsr   c                    sP   t tjdt|dfdff tdt| t j|g|R i |S )z)Export logs and queues telemetry metrics.zotel.log_recordsr$   rC   z@Exporting %d OpenTelemetry Logs with %s protocol and %s encoding)	r   add_count_metricr	   TRACERSlenr*   r1   superexport)selfrD   rE   rF   )	__class__rC   r$   r   r   rK   r   s   	z0_dd_logs_exporter.<locals>.DDLogsExporter.export)__name__
__module____qualname____doc__r   rK   __classcell__r   rC   r$   )rM   r   DDLogsExportero   s    *rT   r   )rB   r$   rC   rT   r   rS   r   _dd_logs_exporterl   s   rU   c              
   C   s   zT| dkrddl m} ddlm} n| dkr#ddlm} ddlm} n	td|  W dS tdd	 |	d
dd D t
k rItd| t
| W dS t|| 	dd dW S  tyw } ztd| | dkrfdndt| W Y d}~dS d}~ww )zLImport the appropriate OpenTelemetry Logs exporter based on the set protocolr   r   )OTLPLogExporter)__version__zhttp/protobufzZOpenTelemetry Logs exporter protocol '%s' is not supported. Use 'grpc' or 'http/protobuf'.Nc                 s   r   r   r   r   r   r   r   r      r   z#_import_exporter.<locals>.<genexpr>r   r   zOpenTelemetry Logs exporter for %s requires version %r or higher, but found version %r. Please upgrade the appropriate opentelemetry-exporter package./protobufzOpenTelemetry Logs exporter for %s is not available. Please install a supported package (ex: opentelemetry-exporter-otlp-proto-%s): %shttp)4opentelemetry.exporter.otlp.proto.grpc._log_exporterrV   .opentelemetry.exporter.otlp.proto.grpc.versionrW   4opentelemetry.exporter.otlp.proto.http._log_exporter.opentelemetry.exporter.otlp.proto.http.versionr*   r+   tuplesplitr-   rU   r0   r(   )r$   rV   exporter_versionr3   r   r   r   r      s>   $r   c              
   C   s|   z"ddl m} dtjvrdtjvrtjjtjd< ||| i|d W dS  ty= } zt	dt
| W Y d}~d	S d}~ww )
z7Configures and sets up the OpenTelemetry Logs exporter.r   )_init_loggingOTEL_EXPORTER_OTLP_ENDPOINT OTEL_EXPORTER_OTLP_LOGS_ENDPOINT)r#   TzThe installed OpenTelemetry SDK is missing required components: %s. Logging exporter not initialized. Please file an issue at github.com/Datadog/dd-trace-py.NF) opentelemetry.sdk._configurationrb   osenvironr   r   LOGS_ENDPOINTr0   r*   r+   r(   )r%   r$   r#   rb   r3   r   r   r   r       s   r    )r   N)%rf   typingr   r   opentelemetry.versionopentelemetryddtracer   ddtrace.internal.hostnamer   ddtrace.internal.loggerr   (ddtrace.internal.settings._opentelemetryr   ddtrace.internal.telemetryr   $ddtrace.internal.telemetry.constantsr	   rN   r*   r-   r_   r<   rW   r`   r,   DEFAULT_PROTOCOLr!   r&   boolr   r   typer(   rU   r   r    r   r   r   r   <module>   s*    $
""'