MOON
Server: Apache
System: Linux vps.erhabenn.com.br 3.10.0-1160.119.1.el7.tuxcare.els2.x86_64 #1 SMP Mon Jul 15 12:09:18 UTC 2024 x86_64
User: sonne (1011)
PHP: 8.2.31
Disabled: NONE
Upload Files
File: //usr/lib/python2.7/site-packages/azurelinuxagent/ga/collect_telemetry_events.pyo
�
d�bc@s�ddlZddlZddlZddlZddlZddlmZddljj	Z	ddl
mZddlm
Z
mZddlmZmZmZmZmZmZmZmZmZmZddlmZmZddlmZddlm Z dd	l!m"Z"m#Z#m$Z$m%Z%dd
l&m'Z'ddl(m)Z)ddl*m+Z+d
�Z,de-fd��YZ.de+fd��YZ/de+fd��YZ0de fd��YZ1dS(i����N(tdefaultdict(tconf(tget_supported_feature_by_nametSupportedFeatureNames(
tEVENTS_DIRECTORYtTELEMETRY_LOG_EVENT_IDtTELEMETRY_LOG_PROVIDER_IDt	add_eventtWALAEventOperationt
add_log_eventtget_event_loggertCollectOrReportEventDebugInfotEVENT_FILE_REGEXtparse_event(tInvalidExtensionEventErrortServiceStoppedError(tustr(tThreadHandlerInterface(tTelemetryEventtTelemetryEventParamtGuestAgentGenericLogsSchematGuestAgentExtensionEventsSchema(ttextutil(tHANDLER_NAME_PATTERN(tPeriodicOperationcCs
t|�S(N(tCollectTelemetryEventsHandler(tsend_telemetry_events_handler((sO/usr/lib/python2.7/site-packages/azurelinuxagent/ga/collect_telemetry_events.pyt$get_collect_telemetry_events_handler*stExtensionEventSchemacBs>eZdZdZdZdZdZdZdZdZ	dZ
RS(	sD
    Class for defining the schema for Extension Events.

    Sample Extension Event Example:
        {
           "Version":"1.0.0.23",
           "Timestamp":"2018-01-02T22:08:12.510696Z"    //(time in UTC (ISO-8601 standard),
           "TaskName":"TestRun"                         //Open for publishers,
           "EventLevel":"Critical/Error/Warning/Verbose/Informational/LogAlways",
           "Message": "Successful test"                //(max 3K, 3072 characters),
           "EventPid":"1",
           "EventTid":"2",
           "OperationId":"Guid (str)"
        }
    tVersiont	TimestamptTaskNamet
EventLeveltMessagetEventPidtEventTidtOperationId(t__name__t
__module__t__doc__RRRR R!R"R#R$(((sO/usr/lib/python2.7/site-packages/azurelinuxagent/ga/collect_telemetry_events.pyR.st_ProcessExtensionEventscBs
eZdZejdej��Zej	dej
�ZdZdZ
dZdZgee�D]8Zeeee��r^ejd�r^ej�^q^Zd	�Zd
�Zed��Zd�Zd
�Zed��Zd�Zd�Z d�Z!ed��Z"RS(s
    Periodic operation for collecting extension telemetry events and enqueueing them for the SendTelemetryHandler thread.
    tsecondss
^(\d+)\.json$i,iiiit__cCs&tt|�jtj�||_dS(N(tsuperR(t__init__t"_EXTENSION_EVENT_COLLECTION_PERIODt_send_telemetry_events_handler(tselfR((sO/usr/lib/python2.7/site-packages/azurelinuxagent/ga/collect_telemetry_events.pyR,YscCs%|jj�r2tjdj|jj���dSt}g}z�ye|jtj	��}|sptj
d�dSx2|D]*}|d}|d}|j||�qwWWn]tk
r�t
}nGtk
r}djtj|��}tdtjd|dt
�nXWd|r |j|�nXdS(	Ns6{0} service is not running, skipping current iterations#No Extension events directory existiisBUnknown error occurred when trying to collect extension events:{0}toptmessaget
is_success(R.tstoppedtloggertwarntformattget_thread_nametTruet+_get_extension_events_dir_with_handler_nameRtget_ext_log_dirtverboset_capture_extension_eventsRtFalset	ExceptionRtformat_exceptionRRt!ExtensionTelemetryEventProcessingt$_ensure_all_events_directories_empty(R/tdelete_all_event_filest!extension_handler_with_event_dirst extension_handler_with_event_dirthandler_namethandler_event_dir_pathterrortmsg((sO/usr/lib/python2.7/site-packages/azurelinuxagent/ga/collect_telemetry_events.pyt
_operation]s0




	$cCs�g}x�tj|�D]�}tjjtjj||��stjt|�dkr\qntjj||t	�}tjj
|�r|j||f�qqW|S(s�
        Get the full path to events directory for all extension handlers that have one
        :param extension_log_dir: Base log directory for all extensions
        :return: A list of full paths of existing events directory for all handlers
        N(tostlistdirtpathtisdirtjointretmatchRtNoneRtexiststappend(textension_log_dirRCtext_handler_nametextension_event_dir((sO/usr/lib/python2.7/site-packages/azurelinuxagent/ga/collect_telemetry_events.pyR9�s"cCs�tj|�j}||jkr~d�}dj|||�||j��}tj|�tdtjj	d|dt
�tSt
S(NcSsd|dS(Ng�?i�i@B((tx((sO/usr/lib/python2.7/site-packages/azurelinuxagent/ga/collect_telemetry_events.pyt<lambda>�ssJSkipping file: {0} as its size is {1:.2f} Mb > Max size allowed {2:.1f} MbtlevelR1tforced(RJtstattst_sizet_EXTENSION_EVENT_FILE_MAX_SIZER6R4R5R	tLogLeveltWARNINGR8R=(R/tevent_file_pathtevent_file_sizet
convert_to_mbRH((sO/usr/lib/python2.7/site-packages/azurelinuxagent/ga/collect_telemetry_events.pyt_event_file_size_allowed�s	
cCsNgtj|�D]'}tj|j|�d	k	r|^q}|jdt�d}tt	�}zDx=|D]5}tj
j||�}z	y�tj
d|�|j|�s�win|j||||�}||jkrdj||j�}tj|�tdtjjd|dt�PnWnmtk
r2�nZtk
r�}	dj|tj|	��}tj|�tdtjjd|dt�nXWd	tj|�XqiWWd	|r!d
j|djg|j�D]\}
}dj|
|�^q���}tj|�tdtjjd|dt�n|dkrItjd
j||��nXd	S(s
        Capture Extension events and add them to the events_list
        :param handler_name: Complete Handler Name. Eg: Microsoft.CPlat.Core.RunCommandLinux
        :param handler_event_dir_path: Full path. Eg: '/var/log/azure/Microsoft.CPlat.Core.RunCommandLinux/events'
        treverseisProcessing event file: {0}sLReached max count for the extension: {0}; Max Limit: {1}. Skipping the rest.RYR1RZs$Failed to process event file {0}:{1}Ns0Dropped events for Extension: {0}; Details:
	{1}s
	sReason: {0}; Dropped Count: {1}s'Collected {0} events for extension: {1}(RJRKRORPt _EXTENSION_EVENT_FILE_NAME_REGEXRQtsortR8RtintRLRNR4R;Rct_enqueue_events_and_get_countt._MAX_NUMBER_OF_EVENTS_PER_EXTENSION_PER_PERIODR6R5R	R^R_RR>RR?tremovetitemstinfo(R/RERFt
event_filetevent_filestcaptured_extension_events_counttdropped_events_with_error_countR`RHRGtktv((sO/usr/lib/python2.7/site-packages/azurelinuxagent/ga/collect_telemetry_events.pyR<�sJ'
	

	
'7
"cCs�|s
dSx�|D]�}|d}tjj|�s7dSt}xutj|�D]d}y tjtjj||��WqMtk
r�}|r�tj	d|t
|��t}q�qMXqMWqWdS(Nis<Failed to completely clear the {0} directory. Exception: {1}(RJRLRRR8RKRjRNR>R4RGRR=(textension_events_directoriesRDtevent_dir_pathtlog_errtresidue_fileRG((sO/usr/lib/python2.7/site-packages/azurelinuxagent/ga/collect_telemetry_events.pyRA�s

 
c
CsOtjjtjj|��}t|d��}|j�jd�}WdQXtj	|�}t
|t�su|g}nx�|D]�}	y-|jj
|j||	|��|d7}Wn�tk
r�}
|t|
�cd7<nZtk
r}tjdjt|����n)tk
r3}tjdj|��nX||jkr|Pq|q|W|S(Ntrbsutf-8isVUnable to enqueue events as service stopped: {0}. Stopping collecting extension eventss.Unable to parse and transmit event, error: {0}(tdatetimet
fromtimestampRJRLtgetmtimetopentreadtdecodetjsontloadst
isinstancetlistR.t
enqueue_eventt_parse_telemetry_eventRRRR4RGR6R>R5Ri(
R/RER`tcaptured_events_countRptevent_file_timetevent_file_descriptort
event_datateventsteventt
invalid_errort
stopped_errorRG((sO/usr/lib/python2.7/site-packages/azurelinuxagent/ga/collect_telemetry_events.pyRh�s.
	cCs|j|�}ttt�}d|_tj||�idj||tj	j
��tj6|tj
j
�tj6|tjj
�tj6|tjj
�tj6|tjj
�tj6|tjj
�tj6|tjj
�tj6|tjj
�tj6}|j||�|S(s�
        Parse the Json event file and convert it to TelemetryEvent object with the required data.
        :return: Complete TelemetryEvent with all required fields filled up properly. Raises if event breaches contract.
        R~s{0}-{1}(t#_parse_event_and_ensure_it_is_validRRRt	file_typeRt$add_common_params_to_telemetry_eventR6RRtlowerRt	EventNameR tCapabilityUsedRR!tContext1RtContext2R$tContext3R"R#t_replace_or_add_param_in_event(R/REtextension_unparsed_eventR�textension_eventR�treplace_or_add_params((sO/usr/lib/python2.7/site-packages/azurelinuxagent/ga/collect_telemetry_events.pyR�#s 	cs<d��d}d}t��fd�|j�D��}tjj�}||krm||�j ||<nt|jtjtj���||s�tdjtj	tj���nx�j
D]t}||kr�t|jtj|���n|�jkr tdjtj�j���n|t
||�7}q�W|S(s�
        Parse the Json event from file. Raise InvalidExtensionEventError if the event breaches pre-set contract.
        :param extension_event: The json event from file
        :return: Verified Json event that qualifies the contract.
        cSs|dk	r|j�S|S(N(RQtstrip(RW((sO/usr/lib/python2.7/site-packages/azurelinuxagent/ga/collect_telemetry_events.pyRXGsis{0}: {1} not foundc3sB|]8\}}|j��jkr|j��|�fVqdS(N(R�t _EXTENSION_EVENT_REQUIRED_FIELDS(t.0RqRr(tclean_stringR/(sO/usr/lib/python2.7/site-packages/azurelinuxagent/ga/collect_telemetry_events.pys	<genexpr>Ns	s{0}: {1} should not be emptys {0}: max event size allowed: {1}(tdictRkRR!R�t_EXTENSION_EVENT_MAX_MSG_LENRR6tMissingKeyErrortEmptyMessageErrorR�t_EXTENSION_EVENT_MAX_SIZEtOversizeEventErrortlen(R/R�t
event_sizetkey_err_msgR�tmessage_keytrequired_key((R�R/sO/usr/lib/python2.7/site-packages/azurelinuxagent/ga/collect_telemetry_events.pyR�@s.	%
cCswx8|jD]-}|j|kr
|j|j�|_q
q
W|sEdSx+|D]#}|jjt|||��qLWdS(N(t
parameterstnametpoptvalueRSR(R�R�tparamt
param_name((sO/usr/lib/python2.7/site-packages/azurelinuxagent/ga/collect_telemetry_events.pyR�ns
ii@ii(#R%R&R'Rxt	timedeltaRtget_etp_collection_periodR-ROtcompilet
IGNORECASEReRiR]R�R�tdirRtattrtcallabletgetattrt
startswithR�R�R,RItstaticmethodR9RcR<RARhR�R�R�(((sO/usr/lib/python2.7/site-packages/azurelinuxagent/ga/collect_telemetry_events.pyR(Hs&8		#	
	@	*		.t_CollectAndEnqueueEventscBsYeZdZejdd�Zd�Zd�Zd�Ze	d��Z
e	d��ZRS(s�
    Periodic operation to collect telemetry events located in the events folder and enqueue them for the
    SendTelemetryHandler thread.
    tminutesicCs&tt|�jtj�||_dS(N(R+R�R,t_EVENT_COLLECTION_PERIODR.(R/R((sO/usr/lib/python2.7/site-packages/azurelinuxagent/ga/collect_telemetry_events.pyR,�scCs�y@|jj�r5tjdj|jj���dS|j�WnDtk
r�}djt|��}t	dt
jd|dt�nXdS(sK
        Periodically send any events located in the events folder
        s/{0} service is not running, skipping iteration.Ns+Failure in collecting telemetry events: {0}R0R1R2(
R.R3R4R5R6R7tprocess_eventsR>RRRtUnhandledErrorR=(R/RGterr_msg((sO/usr/lib/python2.7/site-packages/azurelinuxagent/ga/collect_telemetry_events.pyRI�scCs�tjjtj�t�}tj|�}tdtj�}x�|D]�}y&t	j
|�}|dkrmwCntjj||�}z�tj
d|�t|d��}|j�jd�}WdQXt|�}	|jd�dk}
|
rLtjj|�}tjj|�}|	j�r9tj|	�tj|	|�qLtj|	|�n|jj|	�Wdtj|�XWqCtk
r�}
tj dj!t"|
���qCt#k
r�}|j$|�qCt%k
r�}|j&|�qCXqCW|j'�dS(s�
        Returns a list of events that need to be sent to the telemetry pipeline and deletes the corresponding files
        from the events directory.
        t	operationsProcessing event file: {0}Rwsutf-8Ntagent_eventsLUnable to enqueue events as service stopped: {0}, skipping events collection((RJRLRNRtget_lib_dirRRKRt
OP_COLLECTRtsearchRQR4R;R{R|R}R
tgroupRzRxRytis_extension_eventR�t'_trim_legacy_extension_event_parametersRR�t_update_legacy_agent_eventR.R�RjRRGR6RtUnicodeErrortupdate_unicode_errorR>tupdate_op_errortreport_debug_info(R/tevent_directory_full_pathRnt
debug_infoRmRPR`tevent_fdR�R�tis_legacy_eventtevent_file_creation_time_epochtevent_file_creation_timeR�tuni_errRG((sO/usr/lib/python2.7/site-packages/azurelinuxagent/ga/collect_telemetry_events.pyR��sF

	
	
c	Cs�t�}g|_tj||�tg|jD]}|j|jf^q/�}tg|jD]}|j|jf^q]�}t|j��j	t|j���}g}x(|D] }|j
t|||��q�W|jj|�dS(N(
RR�RR�R�R�R�tsettkeyst
differenceRSRtextend(	R�tevent_creation_timet	new_eventR�tevent_paramstnew_event_paramstmissing_paramst
params_to_addR�((sO/usr/lib/python2.7/site-packages/azurelinuxagent/ga/collect_telemetry_events.pyR��s		..'
cCs|t�jtjtjtjtjtjtjg�}g}x0|j	D]%}|j
|krF|j|�qFqFW||_	dS(s�
        This method is called for extension events before they are sent out. Per the agreement with extension
        publishers, the parameters that belong to extensions and will be reported intact are Name, Version, Operation,
        OperationSuccess, Message, and Duration. Since there is nothing preventing extensions to instantiate other
        fields (which belong to the agent), we call this method to ensure the rest of the parameters are trimmed since
        they will be replaced with values coming from the agent.
        :param event: Extension event to trim.
        :return: Trimmed extension event; containing only extension-specific parameters.
        N(R�tfromkeysRtNameRt	OperationtOperationSuccessR!tDurationR�R�RS(R�tparams_to_keepttrimmed_paramsR�((sO/usr/lib/python2.7/site-packages/azurelinuxagent/ga/collect_telemetry_events.pyR��s	(R%R&R'RxR�R�R,RIR�R�R�R�(((sO/usr/lib/python2.7/site-packages/azurelinuxagent/ga/collect_telemetry_events.pyR�}s			;RcBsqeZdZdZd�Zed��Zd�Zd�Zd�Z	d�Z
d�Zd	�Zed
��Z
RS(s�
    This Handler takes care of fetching the Extension Telemetry events from the {extension_events_dir} and sends it to
    Kusto for advanced debuggability.
    tTelemetryEventsCollectorcCst|_d|_||_dS(N(R8t
should_runRQtthreadR.(R/R((sO/usr/lib/python2.7/site-packages/azurelinuxagent/ga/collect_telemetry_events.pyR,s		cCstjS(N(Rt_THREAD_NAME(((sO/usr/lib/python2.7/site-packages/azurelinuxagent/ga/collect_telemetry_events.pyR7
scCstjd�|j�dS(Ns"Start Extension Telemetry service.(R4Rltstart(R/((sO/usr/lib/python2.7/site-packages/azurelinuxagent/ga/collect_telemetry_events.pytruns
cCs|jdk	o|jj�S(N(R�RQtis_alive(R/((sO/usr/lib/python2.7/site-packages/azurelinuxagent/ga/collect_telemetry_events.pyR�scCsOtjd|j�|_|jjt�|jjtj��|jj	�dS(Nttarget(
t	threadingtThreadtdaemonR�t	setDaemonR8tsetNameRR7R�(R/((sO/usr/lib/python2.7/site-packages/azurelinuxagent/ga/collect_telemetry_events.pyR�scCs)t|_|j�r%|jj�ndS(sO
        Stop server communication and join the thread to main thread.
        N(R=R�R�R�RN(R/((sO/usr/lib/python2.7/site-packages/azurelinuxagent/ga/collect_telemetry_events.pytstops	cCs|jS(N(R�(R/((sO/usr/lib/python2.7/site-packages/azurelinuxagent/ga/collect_telemetry_events.pyR3&scCs�t|j�g}ttj�j}tjdj|��|rY|j	t
|j��ntjdj|j���xp|j�s�zOyx|D]}|j
�q�WWn)tk
r�}tjdt|��nXWdtj|�XqxWdS(Ns)Extension Telemetry pipeline enabled: {0}s#Successfully started the {0} threadscAn error occurred in the Telemetry Extension thread main loop; will skip the current iteration.
{0}(R�R.RRtExtensionTelemetryPipelinetis_supportedR4RlR6RSR(R7R3R�R>R5RRtsleep_until_next_operation(R/tperiodic_operationstis_etp_enabledtperiodic_opRG((sO/usr/lib/python2.7/site-packages/azurelinuxagent/ga/collect_telemetry_events.pyR�)s 
cCst�}|j||�dS(N(R
tadd_common_event_parameters(R�t
event_timetreporter((sO/usr/lib/python2.7/site-packages/azurelinuxagent/ga/collect_telemetry_events.pyR�@s	(R%R&R'R�R,R�R7R�R�R�R�R3R�R�(((sO/usr/lib/python2.7/site-packages/azurelinuxagent/ga/collect_telemetry_events.pyRs							(2RxR~RJROR�tcollectionsRtazurelinuxagent.common.loggertcommonR4tazurelinuxagent.commonRt.azurelinuxagent.common.agent_supported_featureRRtazurelinuxagent.common.eventRRRRRR	R
RRR
t azurelinuxagent.common.exceptionRRtazurelinuxagent.common.futureRt!azurelinuxagent.common.interfacesRt%azurelinuxagent.common.telemetryeventRRRRtazurelinuxagent.common.utilsRtazurelinuxagent.ga.exthandlersRt%azurelinuxagent.ga.periodic_operationRRtobjectRR(R�R(((sO/usr/lib/python2.7/site-packages/azurelinuxagent/ga/collect_telemetry_events.pyt<module>s,F"	�6�