通过时间戳对es进行时间范围查询

2023年 7月 16日 84.1k 0

前言

今天对公司对一个报警脚本进行改造,遇到了一个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)

相关文章

对接alertmanager创建钉钉卡片(1)
手把手教你搭建OpenFalcon监控系统
无需任何魔法即可使用 Ansible 的神奇变量“hostvars”
openobseve HA本地单集群模式
基于k8s上loggie/vector/openobserve日志收集
openobseve单节点和查询语法

发布评论