使用Python统计时间窗内请求数量
2019-01-03 本文已影响15人
seawish
本文使用Python2.7解析时间戳文件,统计时间窗内请求数量,并存入相关文件中。
时间戳文件内容如下:
804528001
804528001
804528006
采集Nginx时间戳方法可参看博文:使用Python解析nginx日志文件
正文
获取所有时间戳文件
import glob
def readfile(path):
return glob.glob(path + '*')
获取日志中所有行
模块linecache允许从任何文件里得到任何的行,并且使用缓存进行优化,常见的情况是从单个文件读取多行。
import linecache
def readline(path):
return linecache.getlines(path)
该方法获取的每一个时间戳结尾会携带换行符\n
, 转换为整形时需要先去掉。
统计时间戳内请求数
def calc_reqs(out_file, secs, win_size):
"""
统计一定范围内的请求数
--------
path : str
文件路径,存储每个请求的时间戳。
secs: str
时间戳元组,秒级
win_size: int
统计区间,为[start_time, start_time + win_size)
"""
zone_id = 0 #每个时间区间的id
cnt = 0 #当前区间的请求数量
max_sec = int(secs[0].strip('\n')) + win_size # 统计区间为[start_time, start_time + range)
req_idx = 0 #每个请求的索引
# print "lens %d" % len(secs)
while req_idx < len(secs):
# print(req_idx, max_sec, zone_id, cnt)
sec = int(secs[req_idx].strip('\n'))
if sec < max_sec:
cnt += 1
req_idx += 1
else:
write_line(out_file, str(cnt))
if cnt <= 0:
print(req_idx, sec, max_sec, zone_id, cnt)
zone_id += 1
cnt = 0
max_sec += win_size
代码
#!/usr/bin/python
# -*- coding:utf8 -*-
import re
import time
import glob
import linecache
def read_file(path):
return glob.glob(path)
def read_lines(path):
"""读取文件中每一个时间"""
return linecache.getlines(path)
def write_line(file, str):
file.write(str + "\n")
def calc_reqs(out_file, secs, win_size):
"""
统计一定范围内的请求数
--------
path : str
文件路径,存储每个请求的时间戳。
secs: str
时间戳元组,秒级
win_size: int
统计区间,为[start_time, start_time + win_size)
"""
zone_id = 0 #每个时间区间的id
cnt = 0 #当前区间的请求数量
max_sec = int(secs[0].strip('\n')) + win_size # 统计区间为[start_time, start_time + range)
req_idx = 0 #每个请求的索引
# print "lens %d" % len(secs)
while req_idx < len(secs):
# print(req_idx, max_sec, zone_id, cnt)
sec = int(secs[req_idx].strip('\n'))
if sec < max_sec:
cnt += 1
req_idx += 1
else:
write_line(out_file, str(cnt))
if cnt <= 0:
print(req_idx, sec, max_sec, zone_id, cnt)
zone_id += 1
cnt = 0
max_sec += win_size
if __name__ == '__main__':
win_sizes = (60, 60*5, 60*10, 60*20, 60*30, 60*60) # 时间窗,统计多少秒内的数据
# win_sizes = (60,) # 时间窗,统计多少秒内的数据
for win_size in win_sizes:
file_name = "NASA_reqs_num_%s.log" % win_size
out_file = open(file_name, "a")
log_path = read_file("./NASA_time.log")[0]
# log_path = read_file("./test.log")[0]
secs = read_lines(log_path)
# print secs
calc_reqs(out_file, secs, win_size)
参看文献
本文作者: seawish
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 3.0 许可协议。转载请注明出处!