92 lines
2.3 KiB
Python
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()]
|
|
}
|