
    p
f7                     4   d dl Z d dlZd dlZd dlZd dlZd dlmZmZ d dlm	c m
Z
 d dlmZ d dlmZ d dlmZmZmZmZ d dl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  d dl!m"Z" d dl#m$Z$m%Z%m&Z&m'Z' dZ(d Z)d Z* G d de      Z+d Z, G d de      Z-y)    N)cgroupconfiguratorlogcollector)logger)MetricsCounter)elapsed_milliseconds	add_eventWALAEventOperationreport_metric)ustr)ThreadHandlerInterface)COMPRESSED_ARCHIVE_PATHGRACEFUL_KILL_ERRCODE)CGroupConfiguratorLOGCOLLECTOR_MEMORY_LIMIT)get_protocol_util)	shellutil)CommandError)PY_VERSION_MAJORPY_VERSION_MINOR
AGENT_NAMECURRENT_VERSIONi,  c                      t               S N)CollectLogsHandler     A/usr/lib/python3/dist-packages/azurelinuxagent/ga/collect_logs.pyget_collect_logs_handlerr   *   s    r   c                  \   t        j                         } t        j                         j	                         }t
        dk(  r	t        dk\  nt
        dk(  }| xr |xr |}dj                  || ||      }t        j                  |       t        t        t        t        j                  ||d       |S )N         zChecking if log collection is allowed at this time [{0}]. All three conditions must be met: configuration enabled [{1}], cgroups enabled [{2}], python supported: [{3}]Fnameversionop
is_successmessage	log_event)confget_collect_logsr   get_instanceenabledr   r   formatr   infor   r   r   r	   LogCollection)conf_enabledcgroups_enabledsupported_python
is_allowedmsgs        r   is_log_collection_allowedr6   .   s    
 ((*L(557??AO0@A0E'1,K[_`K`F/F6FJXX^X^_i_k_n_oYq 
 KK++ r   c                       e Zd ZdZd ZdZed        Zed        Zed        Z	e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y)r   zI
    Periodically collects and uploads logs from the VM to the host.
    1_AZURE_GUEST_AGENT_LOG_COLLECTOR_MONITOR_CGROUPS_c                  "    t         j                  S r   )r   _THREAD_NAMEr   r   r   get_thread_namez"CollectLogsHandler.get_thread_nameQ   s    !...r   c                  F    dt         j                  t        j                  <   y )N1)osenvironr   ._CollectLogsHandler__CGROUPS_FLAG_ENV_VARIABLEr   r   r   enable_cgroups_validationz,CollectLogsHandler.enable_cgroups_validationU   s    EH

%AABr   c                      t         j                  t        j                  v r t        j                  t         j                  = y y r   r   r@   r>   r?   r   r   r   disable_cgroups_validationz-CollectLogsHandler.disable_cgroups_validationY   s-    99RZZG

-IIJ Hr   c                      t         j                  t        j                  v r$t        j                  t         j                     dk(  S y)Nr=   FrC   r   r   r   should_validate_cgroupsz*CollectLogsHandler.should_validate_cgroups^   s3    99RZZG::0LLMQTTTr   c                 |    d | _         d | _        d | _        d| _        d | _        t        j                         | _        y )NT)protocolprotocol_utilevent_thread
should_run
last_stater*   get_collect_logs_periodperiodselfs    r   __init__zCollectLogsHandler.__init__d   s7    ! 224r   c                 $    | j                          y r   startrO   s    r   runzCollectLogsHandler.runl       

r   c                     | j                   S r   rK   rO   s    r   
keep_alivezCollectLogsHandler.keep_aliveo   s    r   c                 6    | j                   j                         S r   rJ   is_aliverO   s    r   r\   zCollectLogsHandler.is_aliver   s      ))++r   c                 
   t        j                  | j                        | _        | j                  j	                  d       | j                  j                  | j                                | j                  j                          y N)targetT	threadingThreaddaemonrJ   	setDaemonsetNamer;   rT   rO   s    r   rT   zCollectLogsHandler.startu   \    %,,DKK@##D)!!$"6"6"89!r   c                 8    | j                   j                          y r   rJ   joinrO   s    r   ri   zCollectLogsHandler.join{        r   c                     | j                    S r   rX   rO   s    r   stoppedzCollectLogsHandler.stopped~       ??""r   c                 t    d| _         | j                         r	 | j                          y y # t        $ r Y y w xY wNF)rK   r\   ri   RuntimeErrorrO   s    r   stopzCollectLogsHandler.stop   s9    ==?		    s   + 	77c                 `    t               | _        | j                  j                         | _        y r   )r   rI   get_protocolrH   rO   s    r   init_protocolsz!CollectLogsHandler.init_protocols   s%     /0**779r   c                    t        j                  t               	 t        j	                          | j
                  | j                  | j                          | j                         sA	 | j                          t        j                  | j                         | j                         sAt        j                          y # t        $ r)}t        j                  dt        |             Y d }~rd }~ww xY w# t        j                  | j                         w xY w# t        $ r)}t        j                  dt        |             Y d }~d }~ww xY w# t        j                          w xY w)Nz^An error occurred in the log collection thread main loop; will skip the current iteration.
{0}zIAn error occurred in the log collection thread; will exit the thread.
{0})timesleep_INITIAL_LOG_COLLECTION_DELAYr   rA   rI   rH   rt   rl   collect_and_send_logs	Exceptionr   errorr   rN   rD   )rP   es     r   rc   zCollectLogsHandler.daemon   s    	

01	<88:!!)T]]-B##%lln,..0
 JJt{{+ lln 99; ! SLL "IJNq'S SS JJt{{+ 	pLLegklmgnoo	p 99;s`   AD (B= 8/D =	C/C*%C2 *C//C2 2!DD 	EE>E EE E!c                 F    | j                         r| j                          y y r   )_collect_logs
_send_logsrO   s    r   ry   z(CollectLogsHandler.collect_and_send_logs   s    OO  r   c                 $    t        j                  d       dddddj                  t        j                        dj                  t
        j                        dg}t        j                  d	t        j                  d
   dg}||z    fd} |       S )NzStarting log collection...zsystemd-runz--property=CPUAccounting=yesz--property=CPUWeight=100z--property=MemoryAccounting=yesz
--unit={0}z--slice={0}z--scopez-ur   z-collect-logsc            
      :   t         j                   j                         } d}d }	 t        j                  d       t	        |       }t
        j                  j                  t              }dj                  ||      }t        j                  |       d}	 t        t        t        t        j                   ||d       y# t"        $ r(}t	        |       }t%        |      }t'        |t(              rt%        d      j                  |j*                        }|j*                  t,        j.                  k(  r&t        j                  d       j1                          nX|j*                  t,        j2                  k(  r&t        j                  d       j1                          nt        j                  |       d	j                  ||      }Y d }~t        t        t        t        j                   ||d       yd }~ww xY w# t        t        t        t        j                   ||d       w xY w)
NF)	log_errorzGSuccessfully collected logs. Archive size: {0} b, elapsed time: {1} ms.Tr#   z"Log Collector exited with code {0}zMDisabling periodic log collection until service restart due to process error.z]Disabling periodic log collection until service restart due to exceeded process memory limit.z8Failed to collect logs. Elapsed time: {0} ms. Error: {1})datetimeutcnowr   run_commandr   r>   pathgetsizer   r.   r   r/   r   r   r   r	   r0   rz   r   
isinstancer   
returncoder   INVALID_CGROUPS_ERRCODErq   r   )	
start_timesuccessr5   durationarchive_sizer|   err_msgfinal_commandrP   s	          r   exec_commandz6CollectLogsHandler._collect_logs.<locals>.exec_command   s   !**113JGC-%%%muE/
;!ww/FG_ffgsgoqC : #+)77&#%9  /
;q'a. ##GHOO&G |||'K'KK$st		 )K)KK  %D  E		G,PWWX`bij #+)77&#%98 #+)77&#%s+   A.B< <
G.C7G)=G1 )G..G1 1)H)
r   r/   r.   r   CGROUPS_UNITr   LOGCOLLECTOR_SLICEsys
executableargv)rP   systemd_cmdcollect_logs_cmdr   r   s   `   @r   r~   z CollectLogsHandler._collect_logs   s    01 9;UWx 9 9:  !3!F!FG
  NND#((1+O#&661	%f ~r   c           
         d }d}	 t        t        d      5 }|j                         }| j                  j	                  |       d}t        j                  |       d d d        d}t        t        t        t        j                  ||d       y # 1 sw Y   3xY w# t        $ r9}dj                  t        |            }t        j                  |       Y d }~qd }~ww xY w# t        t        t        t        j                  ||d       w xY w)NFrbzSuccessfully uploaded logs.Tz!Failed to upload logs. Error: {0}r#   )openr   readrH   upload_logsr   r/   rz   r.   r   warnr   r   r   r	   r0   )rP   r5   r   fharchive_contentr|   s         r   r   zCollectLogsHandler._send_logs   s    	!-t4 !"$'')))/:3C 	! G
 '%33"!! !  	5<<T!WECKK	 '%33"!sA   B AB
B BB 	C /CC CC )DN)__name__
__module____qualname____doc__r:   r@   staticmethodr;   rA   rD   rF   rQ   rU   rY   r\   rT   ri   rl   rq   rt   rc   ry   r~   r   r   r   r   r   r   I   s     (L"U/ / I I K K  
5,"!#:<.CJ!r   r   c                     t        |       S r   )LogCollectorMonitorHandler)cgroupss    r   !get_log_collector_monitor_handlerr     s    %g..r   c                   f    e Zd ZdZd Zed        Zd Zd Zd Z	d Z
d Zd Zd	 Zd
 Zd Zd Zd Zy)r   za
    Periodically monitor and checks the Log collector Cgroups and sends telemetry to Kusto.
    c                  "    t         j                  S r   )r   r:   r   r   r   r;   z*LogCollectorMonitorHandler.get_thread_name  s    )666r   c                 n    d | _         d| _        d| _        || _        t	        j
                         | _        y )NTr    )rJ   rK   rN   r   r*   get_cgroup_log_metrics(_LogCollectorMonitorHandler__log_metrics)rP   r   s     r   rQ   z#LogCollectorMonitorHandler.__init__  s0     !88:r   c                 $    | j                          y r   rS   rO   s    r   rU   zLogCollectorMonitorHandler.run  rV   r   c                 T    d| _         | j                         r| j                          y y ro   )rK   r\   ri   rO   s    r   rq   zLogCollectorMonitorHandler.stop!  s     ==?IIK r   c                 8    | j                   j                          y r   rh   rO   s    r   ri   zLogCollectorMonitorHandler.join&  rj   r   c                     | j                    S r   rX   rO   s    r   rl   z"LogCollectorMonitorHandler.stopped)  rm   r   c                 V    | j                   d uxr | j                   j                         S r   r[   rO   s    r   r\   z#LogCollectorMonitorHandler.is_alive,  s'      ,M1B1B1K1K1MMr   c                 
   t        j                  | j                        | _        | j                  j	                  d       | j                  j                  | j                                | j                  j                          y r^   r`   rO   s    r   rT   z LogCollectorMonitorHandler.start/  rf   r   c                 
   	 | j                         sd	 | j                         }| j                  |       | j                  |       t        j                  | j                         | j                         scy y # t        $ r)}t        j                  dt        |             Y d }~_d }~ww xY w# t        j                  | j                         w xY w# t        $ r)}t        j                  dt        |             Y d }~y d }~ww xY w)NzaAn error occurred in the log collection monitor thread loop; will skip the current iteration.
{0}z\An error occurred in the MonitorLogCollectorCgroupsHandler thread; will exit the thread.
{0})rl   _poll_resource_usage_send_telemetry_verify_memory_limitrz   r   r{   r   rv   rw   rN   )rP   metricsr|   s      r   rc   z!LogCollectorMonitorHandler.daemon5  s    	lln,"779G((1--g6
 JJt{{+ lln
 ! SLL "IJNq'S SS JJt{{+ 	LLoQ 	sL   C 2A7 /C 7	B) B$B, $B))B, ,!CC 	DC==Dc                 n    g }| j                   D ]#  }|j                  |j                  d             % |S )NT)track_throttled_time)r   extendget_tracked_metrics)rP   r   cgroups      r   r   z/LogCollectorMonitorHandler._poll_resource_usageF  s;    ll 	RFNN65545PQ	Rr   c                     |D ]D  }t        |j                  |j                  |j                  |j                  | j
                         F y )N)r)   )r
   categorycounterinstancevaluer   )rP   r   metrics      r   r   z*LogCollectorMonitorHandler._send_telemetryL  s:     	xF&//6>>6??FLLdhdvdvw	xr   c                    d}|D ]\  }|j                   t        j                  k(  r||j                  z  }0|j                   t        j                  k(  sN||j                  z  }^ |t
        kD  rjdj                  t
        |      }t        j                  |       t        t        t        t        j                  |       t        j                  t                y y )Nr   zSLog collector memory limit {0} bytes exceeded. The max reported usage is {1} bytes.)r$   r%   r&   r(   )r   r   TOTAL_MEM_USAGEr   SWAP_MEM_USAGEr   r.   r   r/   r   r   r   r	   r0   r>   _exitr   )rP   r   current_usager   r5   s        r   r   z/LogCollectorMonitorHandler._verify_memory_limitP  s     	.F~~!?!??->#@#@@-		. 44gnn  pI  KX  YCKK'%33	
 HH*+ 5r   N)r   r   r   r   r:   r   r;   rQ   rU   rq   ri   rl   r\   rT   rc   r   r   r   r   r   r   r   r     sY     0L7 7;
!#N""x,r   r   ).r   r>   r   ra   rv   azurelinuxagent.commonr   r   azurelinuxagent.common.confcommonr*   r   azurelinuxagent.common.cgroupr   azurelinuxagent.common.eventr   r   r	   r
   azurelinuxagent.common.futurer   !azurelinuxagent.common.interfacesr   #azurelinuxagent.common.logcollectorr   r   )azurelinuxagent.common.cgroupconfiguratorr   r   $azurelinuxagent.common.protocol.utilr   azurelinuxagent.common.utilsr   &azurelinuxagent.common.utils.shellutilr   azurelinuxagent.common.versionr   r   r   r   rx   r   r6   r   r   r   r   r   r   <module>r      sz   &  	 
   C * * ) 8 k k . D ^ c B 2 ? j j &  6|!/ |!~/T,!7 T,r   