使用Python统计时间窗内请求数量

本文使用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)

参看文献

  • 使用Python解析nginx日志文件

本文作者: seawish
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 3.0 许可协议。转载请注明出处!

你可能感兴趣的:(使用Python统计时间窗内请求数量)