nginx-amplify-agent/amplify/agent/data/eventd.py

92 lines
2.3 KiB
Python

# -*- coding: utf-8 -*-
import copy
import hashlib
import time
from amplify.agent.data.abstract import CommonDataClient
__author__ = "Mike Belov"
__copyright__ = "Copyright (C) Nginx, Inc. All rights reserved."
__license__ = ""
__maintainer__ = "Mike Belov"
__email__ = "dedm@nginx.com"
DEBUG = 0
INFO = 1
WARNING = 2
ERROR = 3
CRITICAL = 4
class Event(object):
"""
Event representation
"""
def __init__(self, level, message):
self.level = level
self.message = message
self.stamp = int(time.time())
self.category = 'agent'
self.string_id = '%s_%s' % (self.message, self.level)
self.id = hashlib.sha256(self.string_id.encode('utf-8')).hexdigest()
self.counter = 1
def inc(self):
self.counter += 1
def dict(self):
return {
'level': self.level,
'message': self.message,
'ctime': self.stamp,
'category': self.category,
'counter': self.counter
}
class EventdClient(CommonDataClient):
def __init__(self, *args, **kwargs):
# Import context as a class object to avoid circular import on statsd. This could be refactored later.
from amplify.agent.common.context import context
self.context = context
super(EventdClient, self).__init__(*args, **kwargs)
self.onetimers = {}
def event(self, level=DEBUG, message=None, onetime=False, ctime=None):
event = Event(level, message)
if ctime: # Override the event timestamp.
event.stamp = ctime
if onetime and event.id in self.onetimers:
return
else:
self.onetimers[event.id] = True
if event.id in self.current:
stored_event = self.current[event.id]
stored_event.inc()
else:
self.current[event.id] = event
def flush(self):
"""
Compresses equal events to one record with count
:return: dict of payload
"""
if not self.current:
return {'object': self.object.definition}
delivery = copy.deepcopy(self.current)
self.current = {}
return {
'object': self.object.definition,
'events': [event.dict() for event in delivery.values()]
}