Skip to content

Commit 271a306

Browse files
authored
Merge pull request #78 from supriyopaul/bug_fixes
Bug fixes
2 parents 64d21d6 + 80fe9d7 commit 271a306

7 files changed

Lines changed: 40 additions & 40 deletions

File tree

.travis.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,8 @@ deploy:
1818
skip_cleanup: true
1919
api-key:
2020
secure: Rxl45qbTHWIbOhst3PS60ETfW5wDByxp0xv4ZbtgRGe4SPvHtOLHRNGiajsQX37pgUFF9ALcCseY2cTk46jNEA1jOzFx4DDSKyH+Wu4H5F4M8JDBBlIsvsgezumLsYMqOL18caZA8J84N9UyuzgdPBDb0B0mMclRa9xRaxWncrUZgXwW9r3N2zU1LvGtd0Su4zLXXP6HC6mKHdOOaNSDONqaesx1njYTGr5fbWy7IXrjSg75wWCtHW1dKDPXmyyWZomwpmhURYfYXn/o9lRaXSDpLWx4xTsbJQdG9EiSPm5fLjfv9tZTxIF7jB0tTrOB63gGAgrLu0zC5Z5MJ1Y0+sbotI8eySI4w0GTffhi4WQjTTyO02vgPuSCm9JV5aW+YeNJtSncEgaVgsuUmZUiWdqMsvPG+bqOjh/i0eIkHr/v7cyf3HndFieZH9H3XdlEDtyr4SRExQSjG+be6mcGOJMWMrXervcW6kGP3pcX7EWgrFxnkz9lSgx/0meNMP4JDo8pZWg50b0xpni3zUcweTgCIeYUBd5aIKUvPaCqSHC1BAyZI5z3Cvdlq0tjCS726drQcV4OJNjrnmb301/K6MBbXhAsyhbkB1NpUZ0k0ZwmGxQ7iE4N1pod2BQbTPxjNUL1KNQJXFvjr9Clrw9Arqo6X9S9t//GP2DDl5Ke5KQ=
21-
name: logagg-0.3.0
22-
tag_name: 0.3.0
21+
name: logagg-0.3.1
22+
tag_name: 0.3.1
2323
on:
2424
branch: master
2525
repo: deep-compute/logagg

Dockerfile

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,10 @@ FROM ubuntu:16.04
33
RUN apt-get -y update
44

55
WORKDIR /logagg
6-
76
ADD . /logagg
87

8+
RUN apt-get update
99
RUN apt-get install python-pip -y
10-
RUN pip install --upgrade pip
1110
RUN pip install .
1211

1312
RUN easy_install https://github.com/deep-compute/pygtail/tarball/master/#egg=pygtail-0.6.1

logagg/collector.py

Lines changed: 19 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -86,17 +86,21 @@ def collect_log_lines(self, log_file):
8686
freader = Pygtail(fpath)
8787
for line_info in freader:
8888
line = line_info['line'][:-1] # remove new line char at the end
89+
90+
# assign default values
8991
log = dict(
9092
id=None,
9193
file=fpath,
9294
host=self.HOST,
9395
formatter=L['formatter'],
9496
event='event',
97+
data={},
9598
raw=line,
9699
timestamp=datetime.datetime.utcnow().isoformat(),
97100
type='log',
98101
level='debug',
99102
error= False,
103+
error_tb='',
100104
)
101105

102106
try:
@@ -108,15 +112,17 @@ def collect_log_lines(self, log_file):
108112
_log = util.load_object(formatter)(raw_log)
109113

110114
log.update(_log)
111-
if log['id'] == None:
112-
log['id'] = uuid.uuid1().hex
113-
log = self._remove_redundancy(log)
114-
self.validate_log_format(log)
115115
except (SystemExit, KeyboardInterrupt) as e: raise
116116
except:
117-
self.log.exception('Error during handling log line', log=log)
118117
log['error'] = True
119118
log['error_tb'] = traceback.format_exc()
119+
self.log.exception('error_during_handling_log_line', log=log['raw'])
120+
121+
if log['id'] == None:
122+
log['id'] = uuid.uuid1().hex
123+
124+
log = self._remove_redundancy(log)
125+
self.validate_log_format(log)
120126

121127
self.queue.put(dict(log=json.dumps(log),
122128
freader=freader, line_info=line_info))
@@ -144,7 +150,7 @@ def _get_msgs_from_queue(self, msgs, timeout):
144150
_msgs_nbytes = msgs_nbytes + len(msg['log'])
145151
_msgs_nbytes += 1 # for newline char
146152

147-
if _msgs_nbytes > self.MAX_NBYTES_TO_SEND:
153+
if _msgs_nbytes > self.MAX_NBYTES_TO_SEND:
148154
msgs_pending.append(msg)
149155
self.log.debug('msg_bytes_read_mem_queue_exceeded')
150156
break
@@ -216,7 +222,7 @@ def confirm_success(self, msgs):
216222
ack_fnames.add(fname)
217223
freader.update_offset_file(msg['line_info'])
218224

219-
@keeprunning(SCAN_FPATTERNS_INTERVAL,on_error=util.log_exception)
225+
@keeprunning(SCAN_FPATTERNS_INTERVAL, on_error=util.log_exception)
220226
def _scan_fpatterns(self, state):
221227
'''
222228
fpaths = 'file=/var/log/nginx/access.log:formatter=logagg.formatters.nginx_access'
@@ -246,9 +252,9 @@ def _scan_fpatterns(self, state):
246252
log_key = (fpath, fpattern, formatter)
247253
if log_key not in self.log_reader_threads:
248254
self.log.info('starting_collect_log_lines_thread', log_key=log_key)
249-
#self.collect_log_lines(log_f)
250255
# There is no existing thread tracking this log file. Start one
251-
self.log_reader_threads[log_key] = util.start_daemon_thread(self.collect_log_lines, (log_f,))
256+
log_reader_thread = util.start_daemon_thread(self.collect_log_lines, (log_f,))
257+
self.log_reader_threads[log_key] = log_reader_thread
252258
state.files_tracked.append(fpath)
253259
time.sleep(self.SCAN_FPATTERNS_INTERVAL)
254260

@@ -265,12 +271,14 @@ def send_heartbeat(self, state):
265271

266272
def start(self):
267273
state = AttrDict(files_tracked=list())
268-
#self._scan_fpatterns(state)
269274
util.start_daemon_thread(self._scan_fpatterns, (state,))
270275

271276
state = AttrDict(last_push_ts=time.time())
272277
util.start_daemon_thread(self.send_to_nsq, (state,))
273278

274279
state = AttrDict(heartbeat_number=0)
275-
util.start_daemon_thread(self.send_heartbeat, (state,)).join()
280+
th_heartbeat = util.start_daemon_thread(self.send_heartbeat, (state,))
276281

282+
while True:
283+
th_heartbeat.join(1)
284+
if not th_heartbeat.isAlive(): break

logagg/formatters.py

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
class RawLog(dict): pass
66

77
#FIXME: cannot do both returns .. should it?
8-
def docker_log_file_driver(line):
8+
def docker_file_log_driver(line):
99
log = json.loads(json.loads(line)['msg'])
1010
if 'formatter' in log.get('extra'):
1111
return RawLog(dict(formatter=log.get('extra').get('formatter'),
@@ -38,7 +38,7 @@ def nginx_access(line):
3838
u'status': u'200',
3939
u'timestamp': '2018-01-05T09:31:39.201000',
4040
u'upstream_response_time': 0.0},
41-
'event': u'GET_request',
41+
'event': 'nginx_event',
4242
'timestamp': '2018-01-05T09:31:39.201000',
4343
'type': 'metric'}
4444
@@ -61,7 +61,7 @@ def nginx_access(line):
6161
u'status': u'404',
6262
u'timestamp': '2018-01-05T09:14:46.415000',
6363
u'upstream_response_time': 0.0},
64-
'event': u'POST_request',
64+
'event': 'nginx_event',
6565
'timestamp': '2018-01-05T09:14:46.415000',
6666
'type': 'metric'}
6767
'''
@@ -74,14 +74,12 @@ def nginx_access(line):
7474
log['body_bytes_sent'] = float(log['body_bytes_sent'])
7575
log['request_time'] = float(log['request_time'])
7676
log['upstream_response_time'] = float(log['upstream_response_time'])
77-
78-
event = log['request'].split(' ')[0] + '_request'
7977

8078
return dict(
8179
timestamp=log.get('timestamp',' '),
8280
data=log,
8381
type='metric',
84-
event=event
82+
event='nginx_event',
8583
)
8684

8785
def mongodb(line):
@@ -192,7 +190,7 @@ def django(line):
192190
else:
193191
return dict(
194192
timestamp=datetime.datetime.isoformat(datetime.datetime.utcnow()),
195-
data=line
193+
data={raw:line}
196194
)
197195

198196
def basescript(line):
@@ -281,7 +279,7 @@ def elasticsearch(line):
281279
event = data['message']
282280
level=values[1]
283281
timestamp=values[0]
284-
282+
285283
return dict(
286284
timestamp=timestamp,
287285
level=level,
@@ -293,5 +291,5 @@ def elasticsearch(line):
293291
else:
294292
return dict(
295293
timestamp=datetime.datetime.isoformat(datetime.datetime.now()),
296-
data=line
294+
data={'raw': line}
297295
)

logagg/forwarder.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ class LogForwarder(object):
2121
MAX_SECONDS_TO_PUSH = 1
2222
MAX_MESSAGES_TO_PUSH = 200
2323

24-
WAIT_TIME_TARGET_FAILURE = 10
24+
WAIT_TIME_TARGET_FAILURE = 2
2525

2626
def __init__(self, message_source, targets, log=DUMMY_LOGGER):
2727

@@ -102,8 +102,7 @@ def _send_msgs_to_target(self, target, msgs):
102102
except (SystemExit, KeyboardInterrupt): raise
103103
except:
104104
# FIXME: do we log the failed messages themselves somewhere?
105-
self.log.exception('_send_msgs_to_target_failed',
106-
target=target, num_msgs=len(msgs))
105+
self.log.exception('_send_msgs_to_target_failed', target=target)
107106
time.sleep(self.WAIT_TIME_TARGET_FAILURE)
108107
# FIXME: also implement some sort of backoff sleep
109108

logagg/forwarders.py

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -63,19 +63,13 @@ def _ensure_connection(self):
6363
def _parse_msg_for_mongodb(self, msgs):
6464
msgs_list = []
6565
for msg in msgs:
66-
msg['_id'] = msg.pop('id')
66+
try:
67+
msg['_id'] = msg.pop('id')
68+
except KeyError:
69+
self.log.exception('collector_failure_id_not_found', log=msg)
6770
msgs_list.append(msg)
6871
return msgs_list
6972

70-
def _insert_1by1(self, records):
71-
for r in records:
72-
try:
73-
self.collection.update({'_id': r['_id']}, r, upsert=True)
74-
except pymongo.errors.OperationFailure as opfail:
75-
self.log.exception('failed_to_insert_record_in_mongodb',
76-
record=r, tb=opfail.details,
77-
num_records=1, type='metric')
78-
7973
def handle_logs(self, msgs):
8074
msgs_list = self._parse_msg_for_mongodb(msgs)
8175
try:
@@ -86,8 +80,10 @@ def handle_logs(self, msgs):
8680
except pymongo.errors.AutoReconnect(message='connection_to_mongodb_failed'):
8781
self._ensure_connection()
8882
except pymongo.errors.BulkWriteError as bwe:
89-
self.log.exception('bulk_write_to_mongodb_failed')
90-
self._insert_1by1(msgs_list)
83+
self.log.info('logs_inserted_into_mongodb',
84+
num_records=bwe.details['nInserted'], type='metric',
85+
records_not_inserted = bwe.details['writeErrors'],
86+
num_records_missed= len(bwe.details['writeErrors']))
9187

9288

9389
from influxdb import InfluxDBClient

setup.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33

44
setup(
55
name="logagg",
6-
version="0.3.0",
6+
version="0.3.1",
77
description="logs aggregation framework",
88
keywords="logagg",
99
author="Deep Compute, LLC",

0 commit comments

Comments
 (0)