summaryrefslogtreecommitdiff
path: root/azurelinuxagent/common/event.py
diff options
context:
space:
mode:
Diffstat (limited to 'azurelinuxagent/common/event.py')
-rw-r--r--azurelinuxagent/common/event.py92
1 files changed, 72 insertions, 20 deletions
diff --git a/azurelinuxagent/common/event.py b/azurelinuxagent/common/event.py
index e62a925..84a439f 100644
--- a/azurelinuxagent/common/event.py
+++ b/azurelinuxagent/common/event.py
@@ -15,51 +15,58 @@
# Requires Python 2.4+ and Openssl 1.0+
#
-import os
-import sys
-import traceback
import atexit
+import datetime
import json
+import os
+import sys
import time
-import datetime
-import threading
-import platform
+import traceback
-from datetime import datetime, timedelta
+from datetime import datetime
import azurelinuxagent.common.conf as conf
import azurelinuxagent.common.logger as logger
-from azurelinuxagent.common.exception import EventError, ProtocolError
+from azurelinuxagent.common.exception import EventError
from azurelinuxagent.common.future import ustr
from azurelinuxagent.common.protocol.restapi import TelemetryEventParam, \
- TelemetryEventList, \
TelemetryEvent, \
- set_properties, get_properties
-from azurelinuxagent.common.version import DISTRO_NAME, DISTRO_VERSION, \
- DISTRO_CODE_NAME, AGENT_VERSION, \
- CURRENT_AGENT, CURRENT_VERSION
+ get_properties
+from azurelinuxagent.common.version import CURRENT_VERSION
_EVENT_MSG = "Event: name={0}, op={1}, message={2}, duration={3}"
+
class WALAEventOperation:
ActivateResourceDisk = "ActivateResourceDisk"
+ AgentBlacklisted = "AgentBlacklisted"
+ AgentEnabled = "AgentEnabled"
AutoUpdate = "AutoUpdate"
+ CustomData = "CustomData"
+ Deploy = "Deploy"
Disable = "Disable"
Download = "Download"
Enable = "Enable"
+ ExtensionProcessing = "ExtensionProcessing"
Firewall = "Firewall"
HealthCheck = "HealthCheck"
HeartBeat = "HeartBeat"
HostPlugin = "HostPlugin"
+ HttpErrors = "HttpErrors"
Install = "Install"
InitializeHostPlugin = "InitializeHostPlugin"
+ Log = "Log"
+ Partition = "Partition"
ProcessGoalState = "ProcessGoalState"
Provision = "Provision"
+ GuestState = "GuestState"
ReportStatus = "ReportStatus"
Restart = "Restart"
+ SkipUpdate = "SkipUpdate"
UnhandledError = "UnhandledError"
UnInstall = "UnInstall"
+ Unknown = "Unknown"
Upgrade = "Upgrade"
Update = "Update"
@@ -67,7 +74,7 @@ class WALAEventOperation:
class EventStatus(object):
EVENT_STATUS_FILE = "event_status.json"
- def __init__(self, status_dir=conf.get_lib_dir()):
+ def __init__(self):
self._path = None
self._status = {}
@@ -82,7 +89,7 @@ class EventStatus(object):
event = self._event_name(name, version, op)
if event not in self._status:
return True
- return self._status[event] == True
+ return self._status[event] is True
def initialize(self, status_dir=conf.get_lib_dir()):
self._path = os.path.join(status_dir, EventStatus.EVENT_STATUS_FILE)
@@ -90,7 +97,7 @@ class EventStatus(object):
def mark_event_status(self, name, version, op, status):
event = self._event_name(name, version, op)
- self._status[event] = (status == True)
+ self._status[event] = (status is True)
self._save()
def _event_name(self, name, version, op):
@@ -113,6 +120,7 @@ class EventStatus(object):
except Exception as e:
logger.warn("Exception occurred saving event status: {0}".format(e))
+
__event_status__ = EventStatus()
__event_status_operations__ = [
WALAEventOperation.AutoUpdate,
@@ -171,7 +179,7 @@ class EventLogger(object):
(self.periodic_events[h] + delta) <= datetime.now()
def add_periodic(self,
- delta, name, op="", is_success=True, duration=0,
+ delta, name, op=WALAEventOperation.Unknown, is_success=True, duration=0,
version=CURRENT_VERSION, message="", evt_type="",
is_internal=False, log_event=True, force=False):
@@ -186,7 +194,7 @@ class EventLogger(object):
def add_event(self,
name,
- op="",
+ op=WALAEventOperation.Unknown,
is_success=True,
duration=0,
version=CURRENT_VERSION,
@@ -215,6 +223,32 @@ class EventLogger(object):
except EventError as e:
logger.error("{0}", e)
+ def add_log_event(self, level, message):
+ # By the time the message has gotten to this point it is formatted as
+ #
+ # YYYY/MM/DD HH:mm:ss.fffffff LEVEL <text>.
+ #
+ # The timestamp and the level are redundant, and should be stripped.
+ # The logging library does not schematize this data, so I am forced
+ # to parse the message. The format is regular, so the burden is low.
+
+ parts = message.split(' ', 3)
+ msg = parts[3] if len(parts) == 4 \
+ else message
+
+ event = TelemetryEvent(7, "FFF0196F-EE4C-4EAF-9AA5-776F622DEB4F")
+ event.parameters.append(TelemetryEventParam('EventName', WALAEventOperation.Log))
+ event.parameters.append(TelemetryEventParam('CapabilityUsed', logger.LogLevel.STRINGS[level]))
+ event.parameters.append(TelemetryEventParam('Context1', msg))
+ event.parameters.append(TelemetryEventParam('Context2', ''))
+ event.parameters.append(TelemetryEventParam('Context3', ''))
+
+ data = get_properties(event)
+ try:
+ self.save_event(json.dumps(data))
+ except EventError:
+ pass
+
__event_logger__ = EventLogger()
@@ -224,6 +258,7 @@ def elapsed_milliseconds(utc_start):
return int(((d.days * 24 * 60 * 60 + d.seconds) * 1000) + \
(d.microseconds / 1000.0))
+
def report_event(op, is_success=True, message=''):
from azurelinuxagent.common.version import AGENT_NAME, CURRENT_VERSION
add_event(AGENT_NAME,
@@ -232,6 +267,7 @@ def report_event(op, is_success=True, message=''):
message=message,
op=op)
+
def report_periodic(delta, op, is_success=True, message=''):
from azurelinuxagent.common.version import AGENT_NAME, CURRENT_VERSION
add_periodic(delta, AGENT_NAME,
@@ -240,7 +276,9 @@ def report_periodic(delta, op, is_success=True, message=''):
message=message,
op=op)
-def add_event(name, op="", is_success=True, duration=0, version=CURRENT_VERSION,
+
+def add_event(name, op=WALAEventOperation.Unknown, is_success=True, duration=0,
+ version=CURRENT_VERSION,
message="", evt_type="", is_internal=False, log_event=True,
reporter=__event_logger__):
if reporter.event_dir is None:
@@ -255,8 +293,17 @@ def add_event(name, op="", is_success=True, duration=0, version=CURRENT_VERSION,
version=str(version), message=message, evt_type=evt_type,
is_internal=is_internal, log_event=log_event)
+
+def add_log_event(level, message, reporter=__event_logger__):
+ if reporter.event_dir is None:
+ return
+
+ reporter.add_log_event(level, message)
+
+
def add_periodic(
- delta, name, op="", is_success=True, duration=0, version=CURRENT_VERSION,
+ delta, name, op=WALAEventOperation.Unknown, is_success=True, duration=0,
+ version=CURRENT_VERSION,
message="", evt_type="", is_internal=False, log_event=True, force=False,
reporter=__event_logger__):
if reporter.event_dir is None:
@@ -269,10 +316,12 @@ def add_periodic(
version=str(version), message=message, evt_type=evt_type,
is_internal=is_internal, log_event=log_event, force=force)
+
def mark_event_status(name, version, op, status):
if op in __event_status_operations__:
__event_status__.mark_event_status(name, version, op, status)
+
def should_emit_event(name, version, op, status):
return \
op not in __event_status_operations__ or \
@@ -280,12 +329,15 @@ def should_emit_event(name, version, op, status):
not __event_status__.event_marked(name, version, op) or \
__event_status__.event_succeeded(name, version, op) != status
+
def init_event_logger(event_dir):
__event_logger__.event_dir = event_dir
+
def init_event_status(status_dir):
__event_status__.initialize(status_dir)
+
def dump_unhandled_err(name):
if hasattr(sys, 'last_type') and hasattr(sys, 'last_value') and \
hasattr(sys, 'last_traceback'):