|
|
|
#!/usr/bin/python
|
|
|
|
# encoding=utf-8
|
|
|
|
# author: tangwy
|
|
|
|
from __future__ import division
|
|
|
|
import json
|
|
|
|
import os, re
|
|
|
|
import codecs
|
|
|
|
import traceback
|
|
|
|
from datetime import datetime, timedelta
|
|
|
|
from collections import defaultdict
|
|
|
|
from dashboard_data_conversion import ip_summary_data_format, account_summary_data_format, \
|
|
|
|
interface_summary_data_format, menu_summary_data_format, adjust_times, jobnum_region_dict,find_region_by_code
|
|
|
|
from dataInterface.functions import CFunction
|
|
|
|
from dataInterface.db.params import CPgSqlParam
|
|
|
|
from ext_logging import logger
|
|
|
|
|
|
|
|
TABLE_NAME = "ueba_analysis_schema.logs"
|
|
|
|
|
|
|
|
DATA_TYPE = {
|
|
|
|
"IP": 1,
|
|
|
|
"ACCOUNT": 2,
|
|
|
|
"INTERFACE": 3,
|
|
|
|
"MENU": 4,
|
|
|
|
}
|
|
|
|
|
|
|
|
def pg_get_ip_group_data(startTime, endTime):
|
|
|
|
"""
|
|
|
|
IP维度查询
|
|
|
|
:param startTime: 开始时间,
|
|
|
|
:param endTime: 结束时间,
|
|
|
|
"""
|
|
|
|
result = []
|
|
|
|
sql = """ select ip, jobnum, sum(count) from {TABLE_NAME}
|
|
|
|
where logdate >= %s and logdate <= %s and data_type = %s
|
|
|
|
group by ip, jobnum""".format(TABLE_NAME=TABLE_NAME)
|
|
|
|
res = json.loads(CFunction.execute(CPgSqlParam(sql, params=(startTime, endTime, DATA_TYPE["IP"]))))
|
|
|
|
if res:
|
|
|
|
for item in res:
|
|
|
|
result.append({
|
|
|
|
"ip": item[0],
|
|
|
|
"jobnum": item[1],
|
|
|
|
"count": item[2],
|
|
|
|
})
|
|
|
|
return result
|
|
|
|
|
|
|
|
|
|
|
|
def pg_get_account_group_data(startTime, endTime):
|
|
|
|
"""
|
|
|
|
账号维度查询
|
|
|
|
:param startTime: 开始时间,
|
|
|
|
:param endTime: 结束时间,
|
|
|
|
"""
|
|
|
|
result = []
|
|
|
|
sql = """ select account, jobnum, sum(count) from {TABLE_NAME}
|
|
|
|
where logdate >= %s and logdate <= %s and data_type = %s
|
|
|
|
group by account, jobnum""".format(TABLE_NAME=TABLE_NAME)
|
|
|
|
res = json.loads(CFunction.execute(CPgSqlParam(sql, params=(startTime, endTime, DATA_TYPE["ACCOUNT"]))))
|
|
|
|
if res:
|
|
|
|
for item in res:
|
|
|
|
# print("items:"+json.dumps(item))
|
|
|
|
# print("pg_get_account_group_data维度data:"+json.dumps(item[0]))
|
|
|
|
result.append({
|
|
|
|
"account": item[0],
|
|
|
|
"jobnum": item[1],
|
|
|
|
"count": item[2],
|
|
|
|
})
|
|
|
|
return result
|
|
|
|
|
|
|
|
|
|
|
|
def pg_get_interface_group_data(startTime, endTime):
|
|
|
|
"""
|
|
|
|
接口维度查询
|
|
|
|
:param startTime: 开始时间,
|
|
|
|
:param endTime: 结束时间,
|
|
|
|
"""
|
|
|
|
result = []
|
|
|
|
sql = """ select interface, ip, jobnum,account, sum(count) from {TABLE_NAME}
|
|
|
|
where logdate >= %s and logdate <= %s and data_type = %s
|
|
|
|
group by interface, ip, jobnum,account""".format(TABLE_NAME=TABLE_NAME)
|
|
|
|
res = json.loads(CFunction.execute(CPgSqlParam(sql, params=(startTime, endTime, DATA_TYPE["INTERFACE"]))))
|
|
|
|
if res:
|
|
|
|
for item in res:
|
|
|
|
result.append({
|
|
|
|
"interface": item[0],
|
|
|
|
"ip": item[1],
|
|
|
|
"jobnum": item[2],
|
|
|
|
"account": item[3],
|
|
|
|
"count": item[4],
|
|
|
|
})
|
|
|
|
return result
|
|
|
|
|
|
|
|
|
|
|
|
def pg_get_menu_group_data(startTime, endTime):
|
|
|
|
"""
|
|
|
|
菜单维度查询
|
|
|
|
:param startTime: 开始时间,
|
|
|
|
:param endTime: 结束时间,
|
|
|
|
"""
|
|
|
|
result = []
|
|
|
|
sql = """ select menu, ip,jobnum,account,sum(count) from {TABLE_NAME}
|
|
|
|
where logdate >= %s and logdate <= %s and data_type = %s
|
|
|
|
group by menu, ip, jobnum ,account""".format(TABLE_NAME=TABLE_NAME)
|
|
|
|
res = json.loads(CFunction.execute(CPgSqlParam(sql, params=(startTime, endTime, DATA_TYPE["MENU"]))))
|
|
|
|
if res:
|
|
|
|
for item in res:
|
|
|
|
result.append({
|
|
|
|
"menu": item[0],
|
|
|
|
"ip": item[1],
|
|
|
|
"jobnum": item[2],
|
|
|
|
"account": item[3],
|
|
|
|
"count": item[4],
|
|
|
|
})
|
|
|
|
return result
|
|
|
|
|
|
|
|
|
|
|
|
def pg_get_account_previous_company_count(startTime, endTime, data_type):
|
|
|
|
"""
|
|
|
|
账号维度查询菜请求次数
|
|
|
|
:param startTime: 开始时间,
|
|
|
|
:param endTime: 结束时间,
|
|
|
|
:param data_type: 公司聚合类型 ACCOUNT or IP ,
|
|
|
|
"""
|
|
|
|
result = defaultdict(int)
|
|
|
|
if data_type in DATA_TYPE:
|
|
|
|
data_type = DATA_TYPE[data_type]
|
|
|
|
sql = """ select jobnum, account,sum(count) from {TABLE_NAME}
|
|
|
|
where logdate >= %s and logdate <= %s and data_type = %s
|
|
|
|
group by jobnum,account""".format(TABLE_NAME=TABLE_NAME)
|
|
|
|
res = json.loads(CFunction.execute(CPgSqlParam(sql, params=(startTime, endTime, data_type))))
|
|
|
|
if res:
|
|
|
|
for item in res:
|
|
|
|
company = find_region_by_code(item[0], jobnum_region_dict)
|
|
|
|
result[company] += item[2]
|
|
|
|
return result
|
|
|
|
|
|
|
|
def pg_get_ip_previous_company_count(startTime, endTime, data_type):
|
|
|
|
"""
|
|
|
|
账号维度查询菜请求次数
|
|
|
|
:param startTime: 开始时间,
|
|
|
|
:param endTime: 结束时间,
|
|
|
|
:param data_type: 公司聚合类型 ACCOUNT or IP ,
|
|
|
|
"""
|
|
|
|
result = defaultdict(int)
|
|
|
|
if data_type in DATA_TYPE:
|
|
|
|
data_type = DATA_TYPE[data_type]
|
|
|
|
sql = """ select jobnum,ip, sum(count) from {TABLE_NAME}
|
|
|
|
where logdate >= %s and logdate <= %s and data_type = %s
|
|
|
|
group by jobnum,ip """.format(TABLE_NAME=TABLE_NAME)
|
|
|
|
res = json.loads(CFunction.execute(CPgSqlParam(sql, params=(startTime, endTime, data_type))))
|
|
|
|
if res:
|
|
|
|
for item in res:
|
|
|
|
company = find_region_by_code(item[0], jobnum_region_dict)
|
|
|
|
result[company] += item[2]
|
|
|
|
return result
|
|
|
|
|
|
|
|
def pg_get_previous_interface_count(startTime, endTime):
|
|
|
|
"""
|
|
|
|
接口维度查询请求总次数
|
|
|
|
:param startTime: 开始时间,
|
|
|
|
:param endTime: 结束时间,
|
|
|
|
"""
|
|
|
|
result = defaultdict(int)
|
|
|
|
sql = """ select interface, ip, jobnum,account, sum(count) from {TABLE_NAME}
|
|
|
|
where logdate >= %s and logdate <= %s and data_type = %s
|
|
|
|
group by interface, ip, jobnum,account""".format(TABLE_NAME=TABLE_NAME)
|
|
|
|
res = json.loads(CFunction.execute(CPgSqlParam(sql, params=(startTime, endTime, DATA_TYPE["INTERFACE"]))))
|
|
|
|
if res:
|
|
|
|
for item in res:
|
|
|
|
result[item[0]] += item[4]
|
|
|
|
return result
|
|
|
|
|
|
|
|
|
|
|
|
def pg_get_previous_menu_count(startTime, endTime):
|
|
|
|
"""
|
|
|
|
菜单维度查询请求总次数
|
|
|
|
:param startTime: 开始时间,
|
|
|
|
:param endTime: 结束时间,
|
|
|
|
"""
|
|
|
|
result = defaultdict(int)
|
|
|
|
sql = """ select menu, ip,jobnum,account, sum(count) from {TABLE_NAME}
|
|
|
|
where logdate >= %s and logdate <= %s and data_type = %s
|
|
|
|
group by menu, ip,jobnum,account""".format(TABLE_NAME=TABLE_NAME)
|
|
|
|
res = json.loads(CFunction.execute(CPgSqlParam(sql, params=(startTime, endTime, DATA_TYPE["MENU"]))))
|
|
|
|
if res:
|
|
|
|
for item in res:
|
|
|
|
result[item[0]] += item[4]
|
|
|
|
return result
|
|
|
|
|
|
|
|
def entry(data_type, start, end):
|
|
|
|
# 前一段开始时间
|
|
|
|
date_format = "%Y-%m-%d %H:%M:%S"
|
|
|
|
|
|
|
|
start = datetime.strptime(start, date_format)
|
|
|
|
end = datetime.strptime(end, date_format)
|
|
|
|
|
|
|
|
start = start.strftime('%Y-%m-%d')
|
|
|
|
end = end.strftime('%Y-%m-%d')
|
|
|
|
old_start,old_end = adjust_times(start, end)
|
|
|
|
# print (old_start)
|
|
|
|
# print (old_end)
|
|
|
|
data = {}
|
|
|
|
if data_type == "1":
|
|
|
|
ip_summary_data = pg_get_ip_group_data(start, end)
|
|
|
|
data = ip_summary_data_format(ip_summary_data)
|
|
|
|
previous_company_dict = pg_get_ip_previous_company_count(old_start, old_end, "IP")
|
|
|
|
|
|
|
|
for d in data["summary"]["ip"]:
|
|
|
|
if previous_company_dict.get(d["company"], 0) == 0:
|
|
|
|
d["trend"] = 0
|
|
|
|
# print("xxx")
|
|
|
|
else:
|
|
|
|
# print("dddd:"+str(d["req_frequency"]))
|
|
|
|
# print(previous_company_dict.get(d["company"], 0))
|
|
|
|
d["trend"] = round(
|
|
|
|
(d["req_frequency"] - previous_company_dict.get(d["company"], 0)) / previous_company_dict.get(
|
|
|
|
d["company"], 0), 4)
|
|
|
|
|
|
|
|
if data_type == "2":
|
|
|
|
logger.info("准备获取账号维度数据")
|
|
|
|
account_summary_data = pg_get_account_group_data(start, end)
|
|
|
|
|
|
|
|
logger.info("准备做数据转换")
|
|
|
|
data = account_summary_data_format(account_summary_data)
|
|
|
|
|
|
|
|
logger.info("准备获取前一周期数据")
|
|
|
|
previous_company_dict = pg_get_account_previous_company_count(old_start, old_end, "ACCOUNT")
|
|
|
|
logger.info("完成前一周期数据")
|
|
|
|
for d in data["summary"]["account"]:
|
|
|
|
if previous_company_dict.get(d["company"], 0) == 0:
|
|
|
|
d["trend"] = 0
|
|
|
|
else:
|
|
|
|
# print("dddd:"+str(d["req_frequency"]))
|
|
|
|
# print(previous_company_dict.get(d["company"], 0))
|
|
|
|
d["trend"] = round(
|
|
|
|
(d["req_frequency"] - previous_company_dict.get(d["company"], 0)) / previous_company_dict.get(
|
|
|
|
d["company"], 0), 4)
|
|
|
|
|
|
|
|
if data_type == "3":
|
|
|
|
logger.info("准备获取菜单维度数据")
|
|
|
|
interface_summary_data = pg_get_interface_group_data(start, end)
|
|
|
|
logger.info("准备做数据转换")
|
|
|
|
data = interface_summary_data_format(interface_summary_data)
|
|
|
|
logger.info("准备获取前一周期数据")
|
|
|
|
previous_interface_dict = pg_get_previous_interface_count(old_start, old_end)
|
|
|
|
logger.info("完成前一周期数据")
|
|
|
|
for d in data["summary"]["interface"]:
|
|
|
|
if previous_interface_dict.get(d["interface_addr"], 0) == 0:
|
|
|
|
d["trend"] = 0
|
|
|
|
else:
|
|
|
|
# print("dddd:"+str(d["req_frequency"]))
|
|
|
|
# print(previous_interface_dict.get(d["interface_addr"], 0))
|
|
|
|
d["trend"] = round(
|
|
|
|
(d["req_frequency"] - previous_interface_dict.get(d["interface_addr"], 0)) / previous_interface_dict.get(
|
|
|
|
d["interface_addr"], 0), 4)
|
|
|
|
logger.info("准备数返回")
|
|
|
|
if data_type == "4":
|
|
|
|
logger.info("准备获取菜单维度数据")
|
|
|
|
menu_summary_data = pg_get_menu_group_data(start, end)
|
|
|
|
logger.info("准备做数据转换")
|
|
|
|
data = menu_summary_data_format(menu_summary_data)
|
|
|
|
|
|
|
|
logger.info("准备获取前一周期数据")
|
|
|
|
previous_menu_dict = pg_get_previous_menu_count(old_start, old_end)
|
|
|
|
logger.info("完成前一周期数据")
|
|
|
|
|
|
|
|
for d in data["summary"]["menu"]:
|
|
|
|
if previous_menu_dict.get(d["menu_name"], 0) == 0:
|
|
|
|
d["trend"] = 0
|
|
|
|
else:
|
|
|
|
# print("dddd:"+str(d["req_frequency"]))
|
|
|
|
# print(previous_menu_dict.get(d["menu_name"], 0))
|
|
|
|
d["trend"] = round(
|
|
|
|
(d["req_frequency"] - previous_menu_dict.get(d["menu_name"], 0)) / previous_menu_dict.get(
|
|
|
|
d["menu_name"], 0), 4)
|
|
|
|
|
|
|
|
logger.info("准备数返回")
|
|
|
|
return data
|
|
|
|
|
|
|
|
# res = entry("1","2024-07-01 00:00:00","2024-07-20 23:59:59")
|
|
|
|
# # print res
|
|
|
|
# logger.info(json.dumps(res))
|
|
|
|
# res = entry("2","2024-07-01 00:00:00","2024-07-20 23:59:59")
|
|
|
|
# logger.info(json.dumps(res))
|
|
|
|
# res = entry("3","2024-07-01 00:00:00","2024-07-20 23:59:59")
|
|
|
|
# logger.info(json.dumps(res))
|
|
|
|
# res = entry("4","2024-07-01 00:00:00","2024-07-20 23:59:59")
|
|
|
|
# logger.info(json.dumps(res))
|