@@ -213,13 +213,9 @@ def parse_json_event(data_str):
213
213
214
214
def parse_event (data_str ):
215
215
try :
216
- try :
217
- return parse_json_event (data_str )
218
- except ValueError :
219
- return parse_xml_event (data_str )
220
- except Exception as e :
221
- raise EventError ("Error parsing event: {0}" .format (ustr (e )))
222
-
216
+ return parse_json_event (data_str )
217
+ except ValueError :
218
+ return parse_xml_event (data_str )
223
219
224
220
def parse_xml_param (param_node ):
225
221
name = getattrib (param_node , "Name" )
@@ -344,11 +340,15 @@ def update_unicode_error(self, unicode_err):
344
340
def update_op_error (self , op_err ):
345
341
self .__op_error_count = self ._update_errors_and_get_count (self .__op_error_count , self .__op_errors , op_err )
346
342
343
+ def get_error_count (self ):
344
+ return self .__op_error_count + self .__unicode_error_count
345
+
347
346
348
347
class EventLogger (object ):
349
348
def __init__ (self ):
350
349
self .event_dir = None
351
350
self .periodic_events = {}
351
+ self .protocol = None
352
352
353
353
#
354
354
# All events should have these parameters.
@@ -494,7 +494,10 @@ def add_periodic(self, delta, name, op=WALAEventOperation.Unknown, is_success=Tr
494
494
self .periodic_events [h ] = datetime .now ()
495
495
496
496
def add_event (self , name , op = WALAEventOperation .Unknown , is_success = True , duration = 0 , version = str (CURRENT_VERSION ),
497
- message = "" , log_event = True ):
497
+ message = "" , log_event = True , flush = False ):
498
+ """
499
+ :param flush: Flush the event immediately to the wire server
500
+ """
498
501
499
502
if (not is_success ) and log_event :
500
503
_log_event (name , op , message , duration , is_success = is_success )
@@ -508,12 +511,7 @@ def add_event(self, name, op=WALAEventOperation.Unknown, is_success=True, durati
508
511
event .parameters .append (TelemetryEventParam (GuestAgentExtensionEventsSchema .Duration , int (duration )))
509
512
self .add_common_event_parameters (event , datetime .utcnow ())
510
513
511
- data = get_properties (event )
512
-
513
- try :
514
- self .save_event (json .dumps (data ))
515
- except EventError as e :
516
- logger .periodic_error (logger .EVERY_FIFTEEN_MINUTES , "[PERIODIC] {0}" .format (ustr (e )))
514
+ self .report_or_save_event (event , flush )
517
515
518
516
def add_log_event (self , level , message ):
519
517
event = TelemetryEvent (TELEMETRY_LOG_EVENT_ID , TELEMETRY_LOG_PROVIDER_ID )
@@ -524,11 +522,7 @@ def add_log_event(self, level, message):
524
522
event .parameters .append (TelemetryEventParam (GuestAgentGenericLogsSchema .Context3 , '' ))
525
523
self .add_common_event_parameters (event , datetime .utcnow ())
526
524
527
- data = get_properties (event )
528
- try :
529
- self .save_event (json .dumps (data ))
530
- except EventError :
531
- pass
525
+ self .report_or_save_event (event )
532
526
533
527
def add_metric (self , category , counter , instance , value , log_event = False ):
534
528
"""
@@ -551,11 +545,25 @@ def add_metric(self, category, counter, instance, value, log_event=False):
551
545
event .parameters .append (TelemetryEventParam (GuestAgentPerfCounterEventsSchema .Value , float (value )))
552
546
self .add_common_event_parameters (event , datetime .utcnow ())
553
547
554
- data = get_properties (event )
555
- try :
556
- self .save_event (json .dumps (data ))
557
- except EventError as e :
558
- logger .periodic_error (logger .EVERY_FIFTEEN_MINUTES , "[PERIODIC] {0}" .format (ustr (e )))
548
+ self .report_or_save_event (event )
549
+
550
+ def report_or_save_event (self , event , flush = False ):
551
+ """
552
+ Flush the event to wireserver if flush to set to true, else
553
+ save it disk if we fail to send or not required to flush immediately.
554
+ TODO: pickup as many events as possible and send them in one go.
555
+ """
556
+ report_success = False
557
+ if flush and self .protocol is not None :
558
+ report_success = self .protocol .report_event ([event ], flush )
559
+
560
+ if not report_success :
561
+ try :
562
+ data = get_properties (event )
563
+ self .save_event (json .dumps (data ))
564
+ except EventError as e :
565
+ logger .periodic_error (logger .EVERY_FIFTEEN_MINUTES , "[PERIODIC] {0}" .format (ustr (e )))
566
+
559
567
560
568
@staticmethod
561
569
def _clean_up_message (message ):
@@ -636,13 +644,16 @@ def elapsed_milliseconds(utc_start):
636
644
(d .microseconds / 1000.0 ))
637
645
638
646
639
- def report_event (op , is_success = True , message = '' , log_event = True ):
647
+ def report_event (op , is_success = True , message = '' , log_event = True , flush = False ):
648
+ """
649
+ :param flush: if true, flush the event immediately to the wire server
650
+ """
640
651
add_event (AGENT_NAME ,
641
652
version = str (CURRENT_VERSION ),
642
653
is_success = is_success ,
643
654
message = message ,
644
655
op = op ,
645
- log_event = log_event )
656
+ log_event = log_event , flush = flush )
646
657
647
658
648
659
def report_periodic (delta , op , is_success = True , message = '' ):
@@ -675,12 +686,17 @@ def report_metric(category, counter, instance, value, log_event=False, reporter=
675
686
"{0}/{1} [{2}] = {3}" .format (category , counter , instance , value ))
676
687
677
688
678
- def initialize_event_logger_vminfo_common_parameters (protocol , reporter = __event_logger__ ):
689
+ def initialize_event_logger_vminfo_common_parameters_and_protocol (protocol , reporter = __event_logger__ ):
690
+ # Initialize protocal for event logger to directly send events to wireserver
691
+ reporter .protocol = protocol
679
692
reporter .initialize_vminfo_common_parameters (protocol )
680
693
681
694
682
695
def add_event (name = AGENT_NAME , op = WALAEventOperation .Unknown , is_success = True , duration = 0 , version = str (CURRENT_VERSION ),
683
- message = "" , log_event = True , reporter = __event_logger__ ):
696
+ message = "" , log_event = True , flush = False , reporter = __event_logger__ ):
697
+ """
698
+ :param flush: if true, flush the event immediately to the wire server
699
+ """
684
700
if reporter .event_dir is None :
685
701
logger .warn ("Cannot add event -- Event reporter is not initialized." )
686
702
_log_event (name , op , message , duration , is_success = is_success )
@@ -690,7 +706,7 @@ def add_event(name=AGENT_NAME, op=WALAEventOperation.Unknown, is_success=True, d
690
706
mark_event_status (name , version , op , is_success )
691
707
reporter .add_event (name , op = op , is_success = is_success , duration = duration , version = str (version ),
692
708
message = message ,
693
- log_event = log_event )
709
+ log_event = log_event , flush = flush )
694
710
695
711
696
712
def info (op , fmt , * args ):
@@ -723,7 +739,7 @@ def add_log_event(level, message, forced=False, reporter=__event_logger__):
723
739
:param message: Message
724
740
:param forced: Force write the event even if send_logs_to_telemetry() is disabled
725
741
(NOTE: Remove this flag once send_logs_to_telemetry() is enabled for all events)
726
- :param reporter:
742
+ :param reporter: The EventLogger instance to which metric events should be sent
727
743
:return:
728
744
"""
729
745
if reporter .event_dir is None :
0 commit comments