起因
filebeat采集nginx的日志,以json格式解析后传入elasticsearch,全部字段都是text格式,我们需要把request_time变成double格式才能使用聚合搜索request_time的最大值.
但是elasticsearch的index一旦建立好之后,字段只能新增,不能修改,所以要修改request_time的数据类型,只能重建索引。
我们的步骤是:1.获得老索引的mapping信息,2.用这个mapping信息新建一个索引 3.用reindex方法,把老索引的数据迁移到新索引 4.确认新索引数据迁移成功,5.删除老索引 6.获得出新索引的mapping,7.使用新索引的mapping创建老索引。8.把新索引的数据倒回老索引 9.删除老索引
假设老索引:V1
临时索引:V2
nginx统计接口路径:path字段
nginx统计响应时间:request_time字段
流程图与说明
python代码
根据path,聚合查询出响应最大时间和平均时间,保留最大响应时间前500个到csv文件里
# # created by zhenwei.Li at 2020/11/3 17:50 # # filename : example4.py # description : import csv import json import requests if __name__ == '__main__': send_json = { "query": { "bool": { "must": [ { "range": { "@timestamp": { "gte": 1533556800000, "lte": 1604470685934 } } } ] } }, "size": 0, "aggs": { "Job_gender_stats": { "terms": { "field": "path.keyword", "size": 500, "order": { "max_request_time": "desc" } }, "aggs": { "max_request_time": { "max": { "field": "request_time" } }, "avg_request_time": { "avg": { "field": "request_time" } } } } } } res = requests.post(url="http://192.168.0.174:32164/192.168.0.67-eiop-frontend/_search", json=send_json) print(json.dumps(res.json()['aggregations']['Job_gender_stats']['buckets'], sort_keys=True, indent=4)) buckets = res.json()['aggregations']['Job_gender_stats']['buckets'] file_handle = open('research.csv', 'w', encoding='utf-8', newline='' "") # 2. 基于文件对象构建 csv写入对象 csv_writer = csv.writer(file_handle) # 3. 构建列表头 csv_writer.writerow(["路径", "出现次数", "平均响应时间(秒)", "最大响应时间(秒)"]) for item in buckets: csv_writer.writerow( [item['key'], item['doc_count'], item['avg_request_time']['value'], item['max_request_time']['value']]) # 5. 关闭文件 file_handle.close()
效果图