parent
							
								
									e0cbf716d5
								
							
						
					
					
						commit
						216269d3cb
					
				@ -0,0 +1,3 @@ | 
				
			||||
{ | 
				
			||||
    "search_limit": 15 | 
				
			||||
} | 
				
			||||
@ -0,0 +1,134 @@ | 
				
			||||
#!/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 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 safe_divide(numerator, denominator): | 
				
			||||
    if denominator == 0: | 
				
			||||
        return  | 
				
			||||
    else: | 
				
			||||
        return numerator / denominator | 
				
			||||
#ip维度 | 
				
			||||
def get_ip_data(startTime, endTime,keyword): | 
				
			||||
    """ | 
				
			||||
        IP维度查询 | 
				
			||||
        :param startTime: 开始时间, | 
				
			||||
        :param endTime: 结束时间, | 
				
			||||
    """ | 
				
			||||
    result = [] | 
				
			||||
    sql = """ select ip,jobnum, sum(count) as count from {TABLE_NAME}  | 
				
			||||
                where logdate >= %s and logdate <= %s and data_type = %s and company = %s | 
				
			||||
                group by ip,jobnum order by count desc limit 200""".format(TABLE_NAME=TABLE_NAME) | 
				
			||||
    res = json.loads(CFunction.execute(CPgSqlParam(sql, params=(startTime, endTime, DATA_TYPE["IP"],keyword)))) | 
				
			||||
    if res: | 
				
			||||
        for item in res: | 
				
			||||
            result.append({ | 
				
			||||
                "req_ip": item[0], | 
				
			||||
                "req_jobnum": item[1], | 
				
			||||
                "req_frequency": item[2], | 
				
			||||
            }) | 
				
			||||
    return result | 
				
			||||
#账号维度 | 
				
			||||
def get_account_data(startTime, endTime,keyword): | 
				
			||||
    """ | 
				
			||||
        IP维度查询 | 
				
			||||
        :param startTime: 开始时间, | 
				
			||||
        :param endTime: 结束时间, | 
				
			||||
    """ | 
				
			||||
    result = [] | 
				
			||||
    sql = """ select account,jobnum, sum(count)  as count from {TABLE_NAME}  | 
				
			||||
                where logdate >= %s and logdate <= %s and data_type = %s and company = %s | 
				
			||||
                group by account,jobnum order by count desc limit 200""".format(TABLE_NAME=TABLE_NAME) | 
				
			||||
    res = json.loads(CFunction.execute(CPgSqlParam(sql, params=(startTime, endTime, DATA_TYPE["ACCOUNT"],keyword)))) | 
				
			||||
    if res: | 
				
			||||
        for item in res: | 
				
			||||
            result.append({ | 
				
			||||
                "req_account": item[0], | 
				
			||||
                "req_jobnum": item[1], | 
				
			||||
                "req_frequency": item[2], | 
				
			||||
            }) | 
				
			||||
    return result | 
				
			||||
 | 
				
			||||
#接口维度 | 
				
			||||
def get_interface_data(startTime, endTime,keyword): | 
				
			||||
    """ | 
				
			||||
        IP维度查询 | 
				
			||||
        :param startTime: 开始时间, | 
				
			||||
        :param endTime: 结束时间, | 
				
			||||
    """ | 
				
			||||
    result = [] | 
				
			||||
    sql = """select ip,account,jobnum,sum(count) as count from {TABLE_NAME}  | 
				
			||||
                where logdate >= %s and logdate <= %s and data_type = %s and interface = %s | 
				
			||||
                group by ip,account,jobnum order by count desc limit 200""".format(TABLE_NAME=TABLE_NAME) | 
				
			||||
    res = json.loads(CFunction.execute(CPgSqlParam(sql, params=(startTime, endTime, DATA_TYPE["INTERFACE"],keyword)))) | 
				
			||||
    if res: | 
				
			||||
        for item in res: | 
				
			||||
            result.append({ | 
				
			||||
                "req_ip": item[0], | 
				
			||||
                "req_jobnum": item[2], | 
				
			||||
                "req_account": item[1], | 
				
			||||
                "req_frequency": item[3], | 
				
			||||
                "interface_addr":keyword, | 
				
			||||
            }) | 
				
			||||
     | 
				
			||||
    return result | 
				
			||||
 | 
				
			||||
#菜单维度 | 
				
			||||
def get_menu_data(startTime, endTime,keyword): | 
				
			||||
    """ | 
				
			||||
        IP维度查询 | 
				
			||||
        :param startTime: 开始时间, | 
				
			||||
        :param endTime: 结束时间, | 
				
			||||
    """ | 
				
			||||
    result = [] | 
				
			||||
    sql = """select ip,jobnum,account,sum(count) as count from {TABLE_NAME}  | 
				
			||||
                where logdate >= %s and logdate <= %s and data_type = %s and menu = %s | 
				
			||||
                group by ip,jobnum,account order by count desc limit 200""".format(TABLE_NAME=TABLE_NAME) | 
				
			||||
    logger.info(sql) | 
				
			||||
    res = json.loads(CFunction.execute(CPgSqlParam(sql, params=(startTime, endTime, DATA_TYPE["MENU"],keyword)))) | 
				
			||||
    if res: | 
				
			||||
        logger.info(str(len(res))) | 
				
			||||
        for item in res: | 
				
			||||
            result.append({ | 
				
			||||
                "req_ip": item[0], | 
				
			||||
                "req_jobnum": item[1], | 
				
			||||
                "req_account": item[2], | 
				
			||||
                "req_frequency": item[3], | 
				
			||||
                "menu_name":keyword, | 
				
			||||
            }) | 
				
			||||
    return result | 
				
			||||
 | 
				
			||||
#入口 | 
				
			||||
def detail_data_entry(startTime, endTime,data_type,keyWord): | 
				
			||||
    data = {} | 
				
			||||
    if data_type == "1": | 
				
			||||
        data=get_ip_data(startTime=startTime,endTime=endTime,keyword=keyWord) | 
				
			||||
    if data_type == "2": | 
				
			||||
        data=get_account_data(startTime=startTime,endTime=endTime,keyword=keyWord) | 
				
			||||
    if data_type == "3": | 
				
			||||
        data=get_interface_data(startTime=startTime,endTime=endTime,keyword=keyWord) | 
				
			||||
    if data_type == "4": | 
				
			||||
        data=get_menu_data(startTime=startTime,endTime=endTime,keyword=keyWord) | 
				
			||||
     | 
				
			||||
    return data | 
				
			||||
     | 
				
			||||
@ -0,0 +1,247 @@ | 
				
			||||
#!/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 adjust_times | 
				
			||||
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 safe_divide(numerator, denominator): | 
				
			||||
    if denominator == 0: | 
				
			||||
        return  | 
				
			||||
    else: | 
				
			||||
        return numerator / denominator | 
				
			||||
#ip维度 | 
				
			||||
def get_ip_summary_data(startTime, endTime): | 
				
			||||
    """ | 
				
			||||
        IP维度查询 | 
				
			||||
        :param startTime: 开始时间, | 
				
			||||
        :param endTime: 结束时间, | 
				
			||||
    """ | 
				
			||||
    result = {} | 
				
			||||
    sql = """ select company, sum(count) as count from {TABLE_NAME}  | 
				
			||||
                where logdate >= %s and logdate <= %s and data_type = %s  | 
				
			||||
                group by company""".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[item[0]]=item[1] | 
				
			||||
    return result | 
				
			||||
#账号维度 | 
				
			||||
def get_account_summary_data(startTime, endTime): | 
				
			||||
    """ | 
				
			||||
        IP维度查询 | 
				
			||||
        :param startTime: 开始时间, | 
				
			||||
        :param endTime: 结束时间, | 
				
			||||
    """ | 
				
			||||
    result = {} | 
				
			||||
    sql = """ select company, sum(count) as count from {TABLE_NAME}  | 
				
			||||
                where logdate >= %s and logdate <= %s and data_type = %s  | 
				
			||||
                group by company""".format(TABLE_NAME=TABLE_NAME) | 
				
			||||
    res = json.loads(CFunction.execute(CPgSqlParam(sql, params=(startTime, endTime, DATA_TYPE["ACCOUNT"])))) | 
				
			||||
    if res: | 
				
			||||
        for item in res: | 
				
			||||
            result[item[0]]=item[1] | 
				
			||||
    return result | 
				
			||||
 | 
				
			||||
#接口维度 | 
				
			||||
def get_interface_summary_data(startTime, endTime): | 
				
			||||
    """ | 
				
			||||
        IP维度查询 | 
				
			||||
        :param startTime: 开始时间, | 
				
			||||
        :param endTime: 结束时间, | 
				
			||||
    """ | 
				
			||||
    result = {} | 
				
			||||
    sql = """select interface, sum(count) as count from {TABLE_NAME}  | 
				
			||||
                where logdate >= %s and logdate <= %s and data_type = %s  | 
				
			||||
                group by interface order by count desc limit 20""".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[1] | 
				
			||||
    return result | 
				
			||||
 | 
				
			||||
#菜单维度 | 
				
			||||
def get_menu_summary_data(startTime, endTime): | 
				
			||||
    """ | 
				
			||||
        IP维度查询 | 
				
			||||
        :param startTime: 开始时间, | 
				
			||||
        :param endTime: 结束时间, | 
				
			||||
    """ | 
				
			||||
    result = {} | 
				
			||||
    sql = """select menu, sum(count) as count from {TABLE_NAME}  | 
				
			||||
                where logdate >= %s and logdate <= %s and data_type = %s  | 
				
			||||
                group by menu""".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[1] | 
				
			||||
    return result | 
				
			||||
 | 
				
			||||
#获取IP count | 
				
			||||
def get_ip_count(startTime, endTime): | 
				
			||||
    result = {} | 
				
			||||
    sql = """select company, count(distinct ip) as count from {TABLE_NAME}  | 
				
			||||
                where logdate >= %s and logdate <= %s and data_type = %s  | 
				
			||||
                group by company """.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[item[0]]=item[1] | 
				
			||||
    return result | 
				
			||||
 | 
				
			||||
#获取account count | 
				
			||||
def get_account_count(startTime, endTime): | 
				
			||||
    result = {} | 
				
			||||
    sql = """select  company ,count(distinct account) as count from {TABLE_NAME}  | 
				
			||||
                where logdate >= %s and logdate <= %s and data_type = %s  | 
				
			||||
                group by company """.format(TABLE_NAME=TABLE_NAME) | 
				
			||||
    res = json.loads(CFunction.execute(CPgSqlParam(sql, params=(startTime, endTime, DATA_TYPE["ACCOUNT"])))) | 
				
			||||
    if res: | 
				
			||||
        for item in res: | 
				
			||||
            result[item[0]]=item[1] | 
				
			||||
    return result | 
				
			||||
 | 
				
			||||
#获取前一个周期数据 | 
				
			||||
def get_pre_date(startTime,endTime): | 
				
			||||
    date_format = "%Y-%m-%d %H:%M:%S" | 
				
			||||
    start = datetime.strptime(startTime, date_format) | 
				
			||||
    end = datetime.strptime(endTime, date_format) | 
				
			||||
    start = start.strftime('%Y-%m-%d') | 
				
			||||
    end = end.strftime('%Y-%m-%d') | 
				
			||||
    old_start,old_end = adjust_times(start, end) | 
				
			||||
    return old_start,old_end | 
				
			||||
 | 
				
			||||
#ip维度汇总数据计算 | 
				
			||||
def ip_summary_calcule(startTime, endTime): | 
				
			||||
    logger.info("begin") | 
				
			||||
    old_start,old_end = get_pre_date(startTime,endTime) | 
				
			||||
    pre_data = get_ip_summary_data(startTime=old_start,endTime=old_end) | 
				
			||||
    logger.info("完成pre_data查询") | 
				
			||||
    res_data = [] | 
				
			||||
    data = get_ip_summary_data(startTime=startTime,endTime=endTime) | 
				
			||||
    ip_count_data = get_ip_count(startTime, endTime) | 
				
			||||
    total_ip_count = sum(ip_count_data.itervalues())  | 
				
			||||
    total_frequency = sum(data.itervalues()) | 
				
			||||
     | 
				
			||||
    for key, value in data.iteritems(): | 
				
			||||
        tmp={} | 
				
			||||
        tmp["company"]=key | 
				
			||||
        tmp["req_frequency"]=value | 
				
			||||
        tmp["frequency_rate"]=round(safe_divide(value,total_frequency),4) | 
				
			||||
        tmp["ip_rate"]=round(safe_divide(ip_count_data[key],total_ip_count),4) | 
				
			||||
        tmp["ip_count"]=ip_count_data[key] | 
				
			||||
        tmp["ip_avg"]=round(safe_divide(value,ip_count_data[key]),4) | 
				
			||||
        if key in pre_data: | 
				
			||||
            tmp["trend"]= round(safe_divide((value-pre_data[key]),pre_data[key]),4) | 
				
			||||
        else: | 
				
			||||
            tmp["trend"]=0 | 
				
			||||
        res_data.append(tmp) | 
				
			||||
    result = {"summary": {"ip": res_data}, "detail": {"ip": {}}} | 
				
			||||
    return result | 
				
			||||
 | 
				
			||||
#account维度汇总数据计算 | 
				
			||||
def account_summary_calcule(startTime, endTime): | 
				
			||||
    old_start,old_end = get_pre_date(startTime,endTime) | 
				
			||||
    pre_data = get_account_summary_data(startTime=old_start,endTime=old_end) | 
				
			||||
 | 
				
			||||
    res_data = [] | 
				
			||||
    data = get_account_summary_data(startTime=startTime,endTime=endTime) | 
				
			||||
    account_count_data = get_account_count(startTime, endTime) | 
				
			||||
    total_account_count = sum(account_count_data.itervalues())  | 
				
			||||
    total_frequency = sum(data.itervalues()) | 
				
			||||
     | 
				
			||||
    for key, value in data.iteritems(): | 
				
			||||
        tmp={} | 
				
			||||
        tmp["company"]=key | 
				
			||||
        tmp["req_frequency"]=value | 
				
			||||
        tmp["frequency_rate"]=round(safe_divide(value,total_frequency),4) | 
				
			||||
        tmp["account_rate"]=round(safe_divide(account_count_data[key],total_account_count),4) | 
				
			||||
        tmp["account_count"]=account_count_data[key] | 
				
			||||
        tmp["account_avg"]=round(safe_divide(value,account_count_data[key]),4) | 
				
			||||
        if key in pre_data: | 
				
			||||
            tmp["trend"]= round(safe_divide((value-pre_data[key]),pre_data[key]),4) | 
				
			||||
        else: | 
				
			||||
            tmp["trend"]=0 | 
				
			||||
        res_data.append(tmp) | 
				
			||||
    result = {"summary": {"account": res_data}, "detail": {"account": {}}} | 
				
			||||
    return result | 
				
			||||
 | 
				
			||||
#接口维度汇总数据计算 | 
				
			||||
def interface_summary_calcule(startTime, endTime): | 
				
			||||
    old_start,old_end = get_pre_date(startTime,endTime) | 
				
			||||
    pre_data = get_interface_summary_data(startTime=old_start,endTime=old_end) | 
				
			||||
 | 
				
			||||
    res_data = [] | 
				
			||||
    data = get_interface_summary_data(startTime=startTime,endTime=endTime) | 
				
			||||
    total_frequency = sum(data.itervalues()) | 
				
			||||
    for key, value in data.iteritems(): | 
				
			||||
        tmp={} | 
				
			||||
        tmp["interface_addr"]=key | 
				
			||||
        tmp["req_frequency"]=value | 
				
			||||
        tmp["frequency_rate"]=round(safe_divide(value,total_frequency),4) | 
				
			||||
        tmp["frequency_avg"]=round(safe_divide(value,20),4) | 
				
			||||
        if key in pre_data: | 
				
			||||
            tmp["trend"]= round(safe_divide((value-pre_data[key]),pre_data[key]),4) | 
				
			||||
        else: | 
				
			||||
            tmp["trend"]=0 | 
				
			||||
        res_data.append(tmp) | 
				
			||||
    result = {"summary": {"interface": res_data}, "detail": {"interface": {}}} | 
				
			||||
    return result | 
				
			||||
 | 
				
			||||
#菜单维度汇总数据计算 | 
				
			||||
def menu_summary_calcule(startTime, endTime): | 
				
			||||
    logger.info("begin") | 
				
			||||
    old_start,old_end = get_pre_date(startTime,endTime) | 
				
			||||
    pre_data = get_menu_summary_data(startTime=old_start,endTime=old_end) | 
				
			||||
    logger.info("完成pre_data查询") | 
				
			||||
    res_data = [] | 
				
			||||
    data = get_menu_summary_data(startTime=startTime,endTime=endTime) | 
				
			||||
    logger.info("完成data查询") | 
				
			||||
    total_frequency = sum(data.itervalues()) | 
				
			||||
    logger.info("完成合计计算") | 
				
			||||
    for key, value in data.iteritems(): | 
				
			||||
        tmp={} | 
				
			||||
        tmp["menu_name"]=key | 
				
			||||
        tmp["req_frequency"]=value | 
				
			||||
        tmp["frequency_rate"]=round(safe_divide(value,total_frequency),4) | 
				
			||||
        tmp["frequency_avg"]=round(safe_divide(value,len(data)),4) | 
				
			||||
        if key in pre_data: | 
				
			||||
            tmp["trend"]= round(safe_divide((value-pre_data[key]),pre_data[key]),4) | 
				
			||||
        else: | 
				
			||||
            tmp["trend"]=0 | 
				
			||||
        res_data.append(tmp) | 
				
			||||
    logger.info("完成数据处理") | 
				
			||||
    result = {"summary": {"menu": res_data}, "detail": {"menu": {}}} | 
				
			||||
    return result | 
				
			||||
 | 
				
			||||
#入口 | 
				
			||||
def summary_data_entry(startTime, endTime,data_type): | 
				
			||||
    data = {} | 
				
			||||
    if data_type == "1": | 
				
			||||
        data=ip_summary_calcule(startTime=startTime,endTime=endTime) | 
				
			||||
    if data_type == "2": | 
				
			||||
        data=account_summary_calcule(startTime=startTime,endTime=endTime) | 
				
			||||
    if data_type == "3": | 
				
			||||
        data=interface_summary_calcule(startTime=startTime,endTime=endTime) | 
				
			||||
    if data_type == "4": | 
				
			||||
        data=menu_summary_calcule(startTime=startTime,endTime=endTime) | 
				
			||||
     | 
				
			||||
    return data | 
				
			||||
					Loading…
					
					
				
		Reference in new issue