Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions src/core/src/CoreMain.py
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,7 @@ def __init__(self, argv):
composite_logger.log_debug("Obtaining execution configuration...")
execution_config = container.get('execution_config')
telemetry_writer.set_operation_id(execution_config.activity_id)
telemetry_writer.set_task_name(Constants.TelemetryTaskName.AUTO_ASSESSMENT if execution_config.exec_auto_assess_only else Constants.TelemetryTaskName.EXEC)
patch_operation_requested = execution_config.operation.lower()

patch_assessor = container.get('patch_assessor')
Expand Down
7 changes: 6 additions & 1 deletion src/core/src/bootstrap/Constants.py
Original file line number Diff line number Diff line change
Expand Up @@ -258,7 +258,12 @@ class TelemetryEventLevel(EnumBackport):
Informational = "Informational"
LogAlways = "LogAlways"

TELEMETRY_TASK_NAME = "ExtensionCoreLog"
# Telemetry Task Names for disambiguation
class TelemetryTaskName(EnumBackport):
UNKNOWN = "Core.Unknown" # function parameter default
STARTUP = "Core.Startup" # initial value until execution mode is determined
EXEC = "Core.Exec" # mainline execution triggered from handler
AUTO_ASSESSMENT = "Core.AutoAssessment" # auto-assessment triggered from scheduler

TELEMETRY_AT_AGENT_NOT_COMPATIBLE_ERROR_MSG = "Unsupported older Azure Linux Agent version. To resolve: http://aka.ms/UpdateLinuxAgent"
TELEMETRY_AT_AGENT_COMPATIBLE_MSG = "Minimum Azure Linux Agent version prerequisite met"
Expand Down
8 changes: 7 additions & 1 deletion src/core/src/service_interfaces/TelemetryWriter.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,8 @@ def __init__(self, env_layer, composite_logger, events_folder_path):
self.composite_logger = composite_logger
self.__is_agent_compatible = False
self.__operation_id = str(datetime.datetime.utcnow())
self.__task_name_watermark = "." + str(datetime.datetime.utcnow().hour) + "." + str(datetime.datetime.utcnow().minute) + "." + str(datetime.datetime.utcnow().second) + "." + str(os.getpid())
self.__task_name = Constants.TelemetryTaskName.STARTUP + self.__task_name_watermark
self.events_folder_path = None
self.__telemetry_event_counter = 1 # will be added at the end of each event sent to telemetry to assist in tracing and identifying event/message loss in telemetry
self.start_time_for_event_count_throttle_check = datetime.datetime.utcnow()
Expand Down Expand Up @@ -259,7 +261,7 @@ def __ensure_message_restriction_compliance(self, full_message):
self.composite_logger.log_telemetry_module_error("Error occurred while formatting message for a telemetry event. [Error={0}]".format(repr(e)))
raise

def write_event(self, message, event_level=Constants.TelemetryEventLevel.Informational, task_name=Constants.TELEMETRY_TASK_NAME, is_event_file_throttling_needed=True):
def write_event(self, message, event_level=Constants.TelemetryEventLevel.Informational, task_name=Constants.TelemetryTaskName.UNKNOWN, is_event_file_throttling_needed=True):
""" Creates and writes event to event file after validating none of the telemetry size restrictions are breached
NOTE: is_event_file_throttling_needed is used to determine if event file throttling is required and as such should always be True.
The only scenario where this is False is when throttling is taking place and we write to telemetry about it. i.e. only from within __throttle_telemetry_writes_if_required()"""
Expand Down Expand Up @@ -420,6 +422,10 @@ def __fetch_events_from_previous_file(self, file_path):
def set_operation_id(self, operation_id):
self.__operation_id = operation_id

def set_task_name(self, task_name):
# sets a disambiguating task name and watermark (timestamp and process id)
self.__task_name = task_name + self.__task_name_watermark

def is_agent_compatible(self):
""" Verifies if telemetry is available. Stops execution if not available. """
return self.__is_agent_compatible
Expand Down
2 changes: 1 addition & 1 deletion src/core/tests/Test_ConfigurePatchingProcessor.py
Original file line number Diff line number Diff line change
Expand Up @@ -266,7 +266,7 @@ def __check_telemetry_events(self, runtime):
with open(os.path.join(runtime.telemetry_writer.events_folder_path, latest_event_file), 'r+') as f:
events = json.load(f)
self.assertTrue(events is not None)
self.assertTrue('ExtensionCoreLog' in events[0]['TaskName'])
self.assertTrue('Core' in events[0]['TaskName'])
f.close()


Expand Down
2 changes: 1 addition & 1 deletion src/core/tests/Test_CoreMain.py
Original file line number Diff line number Diff line change
Expand Up @@ -895,7 +895,7 @@ def __check_telemetry_events(self, runtime):
with open(os.path.join(runtime.telemetry_writer.events_folder_path, latest_event_file), 'r+') as f:
events = json.load(f)
self.assertTrue(events is not None)
self.assertTrue('ExtensionCoreLog' in events[0]['TaskName'])
self.assertTrue('Core' in events[0]['TaskName'])
f.close()


Expand Down
2 changes: 1 addition & 1 deletion src/extension/src/Constants.py
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,7 @@ class TelemetryEventLevel(EnumBackport):
Informational = "Informational"
LogAlways = "LogAlways"

TELEMETRY_TASK_NAME = "HandlerLog"
TELEMETRY_TASK_NAME = "Handler"

UTC_DATETIME_FORMAT = "%Y-%m-%dT%H:%M:%SZ"

Expand Down
3 changes: 3 additions & 0 deletions src/extension/src/TelemetryWriter.py
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,8 @@ def __init__(self, logger, env_layer):
self.agent_env_var_code = Constants.AgentEnvVarStatusCode.AGENT_ENABLED
self.__operation_id = ""
self.__agent_is_compatible = self.__get_agent_supports_telemetry_from_env_var()
self.__task_name_watermark = "." + str(datetime.datetime.utcnow().hour) + "." + str(datetime.datetime.utcnow().minute) + "." + str(datetime.datetime.utcnow().second) + "." + str(os.getpid())
self.__task_name = Constants.TELEMETRY_TASK_NAME + self.__task_name_watermark

def __new_event_json(self, event_level, message, task_name):
return {
Expand Down Expand Up @@ -96,6 +98,7 @@ def write_event(self, message, event_level=Constants.TelemetryEventLevel.Informa

self.__delete_older_events()

task_name = self.__task_name if task_name == Constants.TELEMETRY_TASK_NAME else task_name
event = self.__new_event_json(event_level, message, task_name)
if len(json.dumps(event)) > Constants.TELEMETRY_EVENT_SIZE_LIMIT_IN_CHARS:
self.logger.log_telemetry_module_error("Cannot send data to telemetry as it exceeded the acceptable data size. [Data not sent={0}]".format(json.dumps(message)))
Expand Down