通过时间戳对es进行时间范围查询
前言
今天对公司对一个报警脚本进行改造,遇到了一个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)