python学习-获取上一分钟时间

一、需求

计算业务日志内一个接口请求的响应时间和超过1.5秒的数量,这里需要两个结果,因为有时间戳,打算每分钟运行一次脚本,计算上一分钟的日志信息。结果会传到falcon后由grafana展示

下面就是展示的结果,这是一个汇总图,三个节点,每个节点2个值,一共展示6个监控指标的数据,左侧是响应时间,右侧是超过1.5秒的数量
grafana

二、分享脚本内容如下
#!/usr/bin/env python
import os
import time
import commands
import requests
import json
import sys
import datetime

Time = time.strftime("%Y-%m-%d", time.localtime())
logtime = (datetime.datetime.now()+datetime.timedelta(minutes=-1)).strftime("%Y-%m-%d %H:%M")
Hosts = ['node01','node02','node02']

var = sys.argv[1]
for host in Hosts:
    str1 = "grep \"{logtime}\" /home/xxx.log.{Time}|grep {host}|awk -F = '{str}'".format(logtime=logtime,Time=Time,host=host,str="{sum+=$NF}END{print sum/NR}")
    str2 = "grep \"{logtime}\" /home/xxx.log.{Time}|awk -F = '$1~\"{host}\" && $NF>1500'|wc -l".format(logtime=logtime,Time=Time,host=host)

    if var == "restime":
        str = str1
    elif var == "timeoutnum":
        str = str2
    print str

    class Monitor():
        def __url(self):
            value1 = commands.getoutput(str)
            value = value1.split(".")[0]
            if value.isdigit():
                value = value
            else:
                value = int(0)
            return value
               
        def __falcon(self,value):
            payload_list = []
            ts = int(time.time())
            temp_dict = {
                "endpoint": host,
                "metric": "requestPay"+"_"+var,
                "timestamp": ts,
                "step": 60,
                "value":value,
                "counterType": "GAUGE",
                "tags": "requestPay",
            }
            payload_list.append(temp_dict)
            print temp_dict
            requests.post("http://192.168.xx.xx:1988/v1/push", data=json.dumps(payload_list))
    
        def go(self):
            result = self.__url()
            self.__falcon(result)
    
    value = Monitor()
    value.go()
三、说明
Time = time.strftime("%Y-%m-%d", time.localtime())

这行是使用服务器本地时间,格式为2019-01-01这样的格式,用于匹配文件名后缀,如xxx.log.2019-01-01

logtime = (datetime.datetime.now()+datetime.timedelta(minutes=-1)).strftime("%Y-%m-%d %H:%M")

这行是取当前时间上一分钟的时间,格式是2019-01-01 12:00,用于后面匹配日志时间戳,写shell使用的是下面的方法实现

# date --date="-1 minute" +%Y-%m-%d
2019-01-17

上面的时间函数是最近接触的,后面很多运维工作需要这样的方法

Hosts = ['node01','node02','node02']

这行是Hosts列表,假设现在有三个节点,那么我需要知道每个节点的监控数据,后面采用for循环读取列表内容

var = sys.argv[1]

读取脚本的第一个参数,这里针对两个监控指标分别设置一个参数,分别是restime、timeoutnum,代表响应时间和超时数量。

for host in Hosts:
    str1 = "grep \"{logtime}\" /home/xxx.log.{Time}|grep {host}|awk -F = '{str}'".format(logtime=logtime,Time=Time,host=host,str="{sum+=$NF}END{print sum/NR}")
    str2 = "grep \"{logtime}\" /home/xxx.log.{Time}|awk -F = '$1~\"{host}\" && $NF>1500'|wc -l".format(logtime=logtime,Time=Time,host=host)

使用for循环读取Hosts列表,因为后面上报数据的时候要带着节点信息,所以每次处理日志的时候需要搜索日志内的节点信息和监控数据,下面就是两个命令,目前分析日志只会这么用,囧!

    if var == "restime":
        str = str1
    elif var == "timeoutnum":
        str = str2
    print str

判断参数,如果restime就用str1分析日志,如果是timeoutnum就用str2分析日志

            value1 = commands.getoutput(str)
            value = value1.split(".")[0]

第一行是使用系统的命令,返回处理的结果
第二行是对取出的值进行分割,由于值是浮点数,所以用“.”分割取第一部分内容就是整数,这是split函数的用法,第一列[0],第二列[1],以此类推,当然如果不符合格式取出来有可能是其它信息,后面会进行判断

            if value.isdigit():
                value = value
            else:
                value = int(0)
            return value

这是一个if判断,看结果是否是整数。如果是整数value就不变,如果不是整数,那么赋值为0,由于接口不是每分钟都调用,所以一很多时候使用awk是报错了,那么这时候就认为没有值,所以是0

            temp_dict = {
                "endpoint": host,
                "metric": "requestPay"+"_"+var,
                "timestamp": ts,
                "step": 60,
                "value":value,
                "counterType": "GAUGE",
                "tags": "requestPay",
            }

注意这里endpoint的后面的host是个变量,就是上面for循环里面取到的Hosts值,这样在falcon就可以区分出来各个节点的监控数据了

下面的内容就是falcon上报的方法,网上很多介绍就是照葫芦画瓢,这里就不做介绍了

四、结果展示

cron里面的配置,每分钟一次上报到falcon

* * * * * cd /home/shell;python xxx.py restime;python xxx.py timeoutnum
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python中,我们可以使用time模块和datetime模块来进行时间转换。 要将时间转换为时间元组,我们可以使用time模块的localtime()函数。例如,如果我们想获取当前时间时间元组,可以使用以下代码: ``` import time t = time.localtime() ``` 这将返回一个表示当前时间时间元组。 要将时间元组转换为时间戳,我们可以使用time模块的mktime()函数。例如,如果我们有一个时间元组t,并想将其转换为时间戳,可以使用以下代码: ``` timestamp = time.mktime(t) ``` 这将返回一个表示时间元组对应的时间戳。 另外,我们还可以使用time模块的time()函数来获取当前时间时间戳。例如: ``` ts = time.time() ``` 这将返回当前时间时间戳。 要将时间戳转换为时间元组,我们可以使用time模块的localtime()函数或gmtime()函数。例如,如果我们有一个时间戳ts,并想将其转换为时间元组,可以使用以下代码: ``` # 方法一 time_tuple1 = time.localtime(ts) # 方法二 time_tuple2 = time.gmtime(ts) ``` 方法一返回的时间元组是基于本地时区的,方法二返回的时间元组是基于GMT(格林尼治标准时间)的。这两种方法的区别仅仅在于小时的输出不同,方法一的小时是24小时制的,方法二是12小时制的。 另外,如果我们想进行时间的加减运算,时间元组是不能直接进行加减操作的。我们需要使用datetime模块来进行时间的加减运算。 首先,我们可以使用datetime模块的strptime()函数将字符串转换为datetime格式的时间。例如,如果我们有一个字符串start表示开始时间,有一个字符串end表示结束时间,我们可以使用以下代码将其转换为datetime格式的时间: ``` import datetime start = '2019-07-28 00:00:08' end = '2019-07-29 00:50:03' a = datetime.datetime.strptime(start, "%Y-%m-%d %H:%M:%S") b = datetime.datetime.strptime(end, "%Y-%m-%d %H:%M:%S") ``` 这将返回表示开始时间和结束时间的datetime对象。 要计算两个时间之间的时间差,我们可以直接使用加减操作。例如,如果我们想计算两个时间之间的秒数差,可以使用以下代码: ``` seconds_diff = (b - a).seconds ``` 这将返回表示两个时间之间的秒数差。 如果我们想获得准确的时间差并将其转换为秒数,可以使用total_seconds()函数。例如: ``` total_seconds_diff = (b - a).total_seconds() ``` 这将返回表示两个时间之间的准确时间差,并将其转换为秒数。 另外,我们还可以使用datetime模块的timedelta()函数进行时间的加减运算。例如,如果我们有一个datetime对象a,并想在此基础上加上5小时零68秒,可以使用以下代码: ``` c = a + datetime.timedelta(hours=5, seconds=68) ``` 这将返回一个新的datetime对象c,表示a加上5小时零68秒后的时间。 同样地,我们也可以使用timedelta()函数进行时间的减法运算。例如,如果我们有一个datetime对象a,并想在此基础上减去69天和89分钟,可以使用以下代码: ``` d = a - datetime.timedelta(days=69, minutes=89) ``` 这将返回一个新的datetime对象d,表示a减去69天和89分钟后的时间。 总结来说,要在Python中进行时间转换,我们可以使用time模块和datetime模块。time模块适用于时间元组和时间戳之间的转换,而datetime模块适用于字符串和datetime对象之间的转换以及时间的加减运算。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [Python中三种时间格式转换的方法](https://blog.csdn.net/qdPython/article/details/127937547)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [python机器学习案例-时间序列分析5](https://download.csdn.net/download/woshiyuyanjia/88269080)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值