def get_sys_log_data(request, exec_vo):
exec_vo_conf = exec_vo.config
model_vo_conf = exec_vo.model.config
logger.info(model_vo_conf)
fetched_data = dict()
is_hist_syslog_found = '0'
is_live_syslog_found = '0'
hist_syslog_time = 0
live_syslog_time = 0
hist_syslog_lines = 0
live_syslog_lines = 0
model_syslog_lines = 0
sys_log_lines = 0
sys_log_df = None
model_sys_log_df = None
syslog_range_start_time = None
syslog_range_end_time = None
syslog_start_time = None
syslog_end_time = None
sys_log = []
syslog_model_start_time = None
syslog_model_end_time = None
live_min_date = None
live_max_date = None
hist_min_date = None
hist_max_date = None
model_sys_logs = []
errors = []
log_errors = []
try:
no_of_days_logs = model_vo_conf['days_sys_log']
no_of_days_modellogs = model_vo_conf['model_sys_log']
log_start_date, log_end_date = get_logfetch_daterange(request, no_of_days_logs)
logger.info('SysLog startDate:{}, endDate:{}'.format(log_start_date, log_end_date))
# Adding Extracted date
model_start_date, model_end_date = get_model_log_daterange(request, no_of_days_modellogs)
logger.info('SysLog extractstartDate:{}, extractendDate:{}'.format(model_start_date,
model_end_date))
# Adding 23 hrs 59 min 59 sec to the end date in time conversion
log_start_date_time = pd.to_datetime(log_start_date, format=constants.DATE_TIME_FORMAT)
log_end_date_time = pd.to_datetime(log_end_date, format=constants.DATE_TIME_FORMAT)
log_end_date_time += pd.Timedelta(hours=23, minutes=59, seconds=59)
logger.info('SysLog Time startDate:{}, endDate:{}'.format(log_start_date_time, log_end_date_time))
# Adding 23 hrs 59 min 59 sec to the Extract end date in time conversion
model_start_date_time = pd.to_datetime(model_start_date, format=constants.DATE_TIME_FORMAT)
model_end_date_time = pd.to_datetime(model_end_date, format=constants.DATE_TIME_FORMAT)
model_end_date_time += pd.Timedelta(hours=23, minutes=59, seconds=59)
logger.info('SysLog Time extractstartDate:{}, extractendDate:{}'.format(model_start_date_time,
model_end_date_time))
# Set calculated value by default
syslog_range_start_time = log_start_date_time
syslog_range_end_time = log_end_date_time
# when execution id ref taken in consideration
if request.exec_id_ref is not None:
sys_log_df, syslog_metadata = get_sys_log_data_by_execId(request, exec_vo)
is_hist_syslog_found = syslog_metadata['isHistSyslogAvailable']
is_live_syslog_found = syslog_metadata['isLiveSyslogAvailable']
hist_syslog_lines = syslog_metadata['histSyslogLines']
live_syslog_lines = syslog_metadata['liveSyslogLines']
live_min_date = syslog_metadata['liveSyslogStartTime']
live_max_date = syslog_metadata['liveSyslogEndTime']
hist_min_date = syslog_metadata['histSyslogStartTime']
hist_max_date = syslog_metadata['histSyslogEndTime']
if not sys_log_df.empty:
err_logs_df = sys_log_df
err_logs_df[['msg_datetime']] = err_logs_df[['msg_datetime']].astype('datetime64[ns]')
syslog_start_time = min(err_logs_df['msg_datetime']).strftime(
constants.DATE_TIME_FORMAT)
syslog_end_time = max(err_logs_df['msg_datetime']).strftime(
constants.DATE_TIME_FORMAT)
else:
sys_log_df = pd.DataFrame(columns=['msg_code', 'msg_datetime', 'msg_text'])
err_logs_df = sys_log_df
else:
if exec_vo_conf['isSysLogRequired'] is True:
if hasattr(request, 'sr_id'):
logger.info(
'Getting SysLog data for SrId:{}, SystemId:{}, Date:{}'.format(request.sr_id, request.system_id,
request.date))
event_date = log_end_date
else:
logger.info('Getting SysLog data for SystemId:{}'.format(request.system_id, ))
if exec_vo_conf['isLiveSysLogRequired'] is True:
current_date = (datetime.datetime.now()).date()
if current_date-event_date<=datetime.timedelta(days=2):
live_syslog_start = datetime.datetime.now()
live_df = get_live_sys_log_data(request, log_errors)
live_syslog_end = datetime.datetime.now()
live_syslog_time = (live_syslog_end - live_syslog_start).total_seconds() * 1000
logger.info('Getting Live log between model range :{} and {}'.format(model_start_date,model_end_date ))
else:
live_df = pd.DataFrame(columns=['msg_code', 'msg_datetime', 'msg_text'])
hist_syslog_start = datetime.datetime.now()
try:
hist_df, time_taken = db_util.query_frame(db_type.PG, constants.GET_SYSLOG_QUERY
.format(exec_vo_conf['sysLogTable'], request.system_id,
log_end_date, log_start_date))
logger.info(
'Got HistSysLog data for SystemId:{}. Time taken:{} ms.'.format(request.system_id, time_taken))
if hist_df.empty:
log_errors.append("No historical logs present")
except MDLException as e:
logger.error('Historical logs Fetch Failed from Onwatch DB!')
log_errors.append('Historical logs Fetch Failed from Onwatch DB! {}'.format(str(e)))
except Exception as e:
logger.exception('Historical logs Fetch Failed from Onwatch DB!')
log_errors.append('Historical logs Fetch Failed from Onwatch DB! {}'.format(str(e)))
live_syslog_lines = len(live_df.index)
hist_syslog_lines = len(hist_df.index)
logger.info('liveLength:{}, histLength:{}'.format(live_syslog_lines, hist_syslog_lines))
# calculating min max hist and live dates
if not hist_df.empty:
hist_df[['msg_datetime']] = hist_df[['msg_datetime']].astype('datetime64[ns]')
hist_df[['msg_code']] = hist_df[['msg_code']].astype(str)
hist_min_date = min(hist_df['msg_datetime']).strftime(
constants.DATE_TIME_FORMAT)
hist_max_date = max(hist_df['msg_datetime']).strftime(
constants.DATE_TIME_FORMAT)
if not live_df.empty:
live_df[['msg_datetime']] = live_df[['msg_datetime']].astype('datetime64[ns]')
live_df[['msg_code']] = live_df[['msg_code']].astype(str)
live_min_date = min(live_df['msg_datetime']).strftime(
constants.DATE_TIME_FORMAT)
live_max_date = max(live_df['msg_datetime']).strftime(
constants.DATE_TIME_FORMAT)
# merging and filtering data
try:
# Getting history data within the live df range
hist_live_range_df = hist_df[(hist_df['msg_datetime'] <= live_max_date) &
(hist_df['msg_datetime'] >= live_min_date)]
# Left Merge live + hist_live_range => if both has same(duplicate), then tar_systemid is not null
live_hist_left_merge_df = live_df.merge(hist_live_range_df,
on=['msg_datetime', 'msg_code', 'msg_text'],
how='left', indicator=True)
# Filtering only row with tar_systemid is NULL -> live not present in history
live_wo_hist_df = live_hist_left_merge_df[live_hist_left_merge_df.tar_systemid.isnull()]
# Merge history + live without history (no duplicate)
live_hist_df = pd.concat([hist_df, live_wo_hist_df]).reset_index(drop=True)
logger.info('liveWithoutHistLength:{}, totalLength:{}'.format(len(live_wo_hist_df.index),
len(live_hist_df.index)))
except MDLException as e:
logger.error('Failed to Filter the logs!')
log_errors.append('Failed to Filter the logs! {}'.format(str(e)))
except Exception as e:
logger.exception('Failed to Filter the logs!')
log_errors.append('Failed to Filter the logs! {}'.format(str(e)))
else:
live_hist_df = hist_df
logger.info('totalLength:{}'.format(len(live_hist_df.index)))
sys_log_df = live_hist_df
if len(hist_df.index) > 0:
is_hist_syslog_found = '1'
if len(live_df.index) > 0:
is_live_syslog_found = '1'
hist_syslog_end = datetime.datetime.now()
hist_syslog_time = (hist_syslog_end - hist_syslog_start).total_seconds() * 1000
if not live_hist_df.empty:
err_logs_df = live_hist_df[(live_hist_df.msg_datetime.dt.date <= log_end_date) &
(live_hist_df.msg_datetime.dt.date >= log_start_date)]
if not err_logs_df.empty:
filtered_syslog_start_time = min(err_logs_df['msg_datetime'])
filtered_syslog_end_time = max(err_logs_df['msg_datetime'])
syslog_start_time = max(log_start_date_time, filtered_syslog_start_time).strftime(
constants.DATE_TIME_FORMAT)
syslog_end_time = min(log_end_date_time, filtered_syslog_end_time).strftime(
constants.DATE_TIME_FORMAT)
logger.info('SysLog Filtered startDate:{}, endDate:{}'.format(filtered_syslog_start_time,
filtered_syslog_end_time))
logger.info('SysLog Final startDate:{}, endDate:{}'.format(syslog_start_time, syslog_end_time))
sys_log_df = err_logs_df[['msg_code', 'msg_datetime', 'msg_text']].copy()
if (not live_df.empty or not hist_df.empty) and sys_log_df.empty:
log_errors.append("No Logs present after filtering live logs and historical logs")
else:
sys_log_df = pd.DataFrame(columns=['msg_code', 'msg_datetime', 'msg_text'])
err_logs_df = sys_log_df
else:
logger.info('SysLog NOT required.')
if not err_logs_df.empty:
err_model_logs_df = err_logs_df[(err_logs_df.msg_datetime <= model_end_date_time) & (
err_logs_df.msg_datetime >= model_start_date_time)]
if not err_model_logs_df.empty:
if exec_vo_conf['isExamNoFiltered'] is True:
err_model_logs_df = filter_syslog_exam(request, exec_vo, err_model_logs_df)
if exec_vo_conf['isLogDtFiltered'] is True:
err_model_logs_df = filter_syslog_time(request, exec_vo, err_model_logs_df)
# null check is added if filtered data came as null(err_model_logs_df) the we get json serializable error while performing aggregations(min and max) on null fields.
if not err_model_logs_df.empty:
syslog_model_start_time = min(err_model_logs_df['msg_datetime']).strftime(
constants.DATE_TIME_FORMAT)
syslog_model_end_time = max(err_model_logs_df['msg_datetime']).strftime(
constants.DATE_TIME_FORMAT)
logger.info(
'SysLog Model extract startDate:{}, endDate:{}'.format(syslog_model_start_time,
syslog_model_end_time))
model_sys_log_df = err_model_logs_df[['msg_code', 'msg_datetime', 'msg_text']].copy()
try:
model_sys_log_df['msg_datetime'] = model_sys_log_df.msg_datetime.astype(str)
extract_out_sys_log = model_sys_log_df.rename(columns={'msg_code': 'code',
'msg_datetime': 'time',
'msg_text': 'message'})
model_sys_logs = json.loads(extract_out_sys_log.to_json(orient='records'))
model_syslog_lines = len(model_sys_log_df.index)
except Exception as e:
logger.exception('Extrated SysLog to Json conversion failed!')
errors.append(' Extracted SysLog to Json conversion failed! {}'.format(str(e)))
try:
sys_log_df['msg_datetime'] = sys_log_df.msg_datetime.astype(str)
out_sys_log = sys_log_df.rename(columns={'msg_code': 'code',
'msg_datetime': 'time',
'msg_text': 'message'})
sys_log = json.loads(out_sys_log.to_json(orient='records'))
except Exception as e:
logger.exception('SysLog to Json conversion failed!')
errors.append('SysLog to Json conversion failed! {}'.format(str(e)))
syslog_range_start_time = syslog_range_start_time.strftime(constants.DATE_TIME_FORMAT)
syslog_range_end_time = syslog_range_end_time.strftime(constants.DATE_TIME_FORMAT)
sys_log_lines = len(sys_log_df.index)
logger.info('sys_log_df length:{}, sys_log length:{}, is_hist_syslog_found:{}, is_live_syslog_found:{}'
.format(len(sys_log_df), len(sys_log), is_hist_syslog_found, is_live_syslog_found))
except MDLException as e:
logger.error('SysLog Fetch Failed!')
errors.append('SysLog Fetch Failed! {}'.format(str(e)))
except Exception as e:
logger.exception('SysLog Fetch Failed!')
errors.append('SysLog Fetch Failed! {}'.format(str(e)))
fetched_data['is_hist_syslog_found'] = is_hist_syslog_found
fetched_data['is_live_syslog_found'] = is_live_syslog_found
fetched_data['hist_syslog_lines'] = hist_syslog_lines
fetched_data['live_syslog_lines'] = live_syslog_lines
fetched_data['sys_log_lines'] = sys_log_lines
fetched_data['model_syslog_lines'] = model_syslog_lines
fetched_data['hist_syslog_time'] = hist_syslog_time
fetched_data['live_syslog_time'] = live_syslog_time
fetched_data['syslog_start_time'] = syslog_start_time
fetched_data['syslog_end_time'] = syslog_end_time
fetched_data['syslog_range_start_time'] = syslog_range_start_time
fetched_data['syslog_range_end_time'] = syslog_range_end_time
fetched_data['model_start_time'] = syslog_model_start_time
fetched_data['model_end_time'] = syslog_model_end_time
fetched_data['sys_log'] = sys_log
fetched_data['model_sys_logs'] = model_sys_logs
fetched_data['liveSyslogStartTime'] = live_min_date
fetched_data['liveSyslogEndTime'] = live_max_date
fetched_data['histSyslogStartTime'] = hist_min_date
fetched_data['histSyslogEndTime'] = hist_max_date
if sys_log_df is None:
sys_log_df = pd.DataFrame(columns=['msg_code', 'msg_datetime', 'msg_text'])
fetched_data['sys_log_df'] = sys_log_df
fetched_data['errors'] = errors
fetched_data['log_errors'] = log_errors
if model_sys_log_df is None:
model_sys_log_df = pd.DataFrame(columns=['msg_code', 'msg_datetime', 'msg_text'])
fetched_data['model_sys_log_df'] = model_sys_log_df
return fetched_data