前言
今天对公司对一个报警脚本进行改造,遇到了一个ES查询问题,在此进行记录,已做备忘。
报警脚本逻辑,通过查询es中对访问日志,判断微服务接口的错误信息和微服务接口响应延迟进行报警,报警内容包含48小时内此微服务的错误信息和响应延迟出现次数,供运维和研发判断重要性。
但是由于晚上服务器会跑一些计算数据,导致磁盘和网络IO进行大量占用,就会导致凌晨的一些响应延迟报警频发,对此我们设置了凌晨维护时间,这个时间段不会进行报警。
但还是会导致48小时内的延迟信息统计不够精准,将凌晨出现但延迟请求也算入进行,所以需要修改监控脚本不统计凌晨0~6点的数据。
脚本部分代码
from elasticsearch import Elasticsearch import datetime import time import json # 获取48小时的时间戳 today=datetime.datetime.now() - datetime.timedelta(days=2) today=time.mktime(time.strptime(today.strftime("%Y-%m-%d %H:%M:%S.%f"),'%Y-%m-%d %H:%M:%S.%f')) # 获取一天0~5点的时间戳 current_time = datetime.datetime.now() current_time_zero=time.mktime(time.strptime(current_time.replace(hour=0, minute=0, second=0, microsecond=0).strftime("%Y-%m-%d %H:%M:%S.%f"),'%Y-%m-%d %H:%M:%S.%f')) current_time_six=time.mktime(time.strptime(current_time.replace(hour=6, minute=0, second=0, microsecond=0).strftime("%Y-%m-%d %H:%M:%S.%f"),'%Y-%m-%d %H:%M:%S.%f')) # 获取二天0~5点点时间戳 yesterday_time = datetime.datetime.now() - datetime.timedelta(days=1) yesterday_time_zero = time.mktime(time.strptime(yesterday_time.replace(hour=0, minute=0, second=0, microsecond=0).strftime("%Y-%m-%d %H:%M:%S.%f"),'%Y-%m-%d %H:%M:%S.%f')) yesterday_time_six = time.mktime(time.strptime(yesterday_time.replace(hour=6, minute=0, second=0, microsecond=0).strftime("%Y-%m-%d %H:%M:%S.%f"),'%Y-%m-%d %H:%M:%S.%f')) # 拼接ES查询语句 query = { "query": { "bool": { "must": [ { "range": { "@timestamp": { "gt": "now-30m", "lt": "now" } } }, { "regexp": { "request": ".*" } }, { "wildcard": { "path": "*" } }, { "range": { "upstream_response_time": { "gt": 2 } } } ] } }, "size": "10" } timerang = { "query_string":{ "query":" +@timestamp:[%d TO *] -@timestamp:[%d TO %d ] -@timestamp:[%d TO %d ] " } } timerang['query_string']['query'] = " +@timestamp:[%d TO *] -@timestamp:[%d TO %d ] -@timestamp:[%d TO %d ] " % (int(today * 1000),int(yesterday_time_zero * 1000 ),int(yesterday_time_six * 1000),int(current_time_zero * 1000),int(current_time_six * 1000)) query['query']['bool']['must'][0] = timerang query = json.dumps(query) # ES查询建立连接并开始查询 ESHOSTPORT = ['192.168.201.7:9200'] es = Elasticsearch(ESHOSTPORT) res = es.search(index="api-log-*", body=query) count = es.count(index="api-log-*", body=query)
转载请注明:西门飞冰的博客 » 通过时间戳对es进行时间范围查询