暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Python 通过 kibana 调用 Elasticsearch

IT那活儿 2023-02-13
2557

点击上方“IT那活儿”公众号,关注后了解更多内容,不管IT什么活儿,干就完了!!!




前  言



工作中经常用到 Elasticsearch,结合 kibana 便可以方便进行数据查询以及聚合分析进行可视化操作等,下面是我在工作遇到的一次经验分析,先来谈谈事情的开始吧!

由于工作需要短时间内对四五百万条不同的数据存入数据 ES,对kibana 来说是可以存入少量数据并且非常方便,但是数据量稍微大一些的时候,就需要进行分批次存入,操作的过程越多,出错的可能越大,那你可能会问为什么不直接操作 ES 了,数据库在内网中,一般情况是不能直接操作并且在服务器上非常不方便,于是利用自己的环境进行调试如下,最后实践生产。




接口请求分析



1. 查看索引为例 
打开浏览器 kibana 页面点击运行按钮,可以发现请求真实url 如下:
http://192.168.XXX.128:5601/api/console/proxy?path=_cat%2Findices%3Fpretty&method=GET; 
GET _cat/indices?pretty 可以查看相应的索引并进行格式化数据内容。
2. 由于需求是批量存入数据,利用_bulk 方法进行调试并多次传数据请求进行观察
1)请求网址如下箭头所示
2)对上述图片观察可知请求的接口可利用动态传参的方法进行构造
url:http:// IP:5601/api/console/proxy?path=index%2F_bulk&method=POST
#上述 index 为数据库索引名称,IP 替换成相应的 IP 地址即可。
3)请求接口找到了,接下来就是如何进行传值 POST
通过观察上述页面Payload 可发现此处就是我们需要存入的数据。




Apifox 模拟请求



通过上述分析后,基本原理已经搞清楚了。

上述的环境是在 kibana 内,我们肯定最终要脱离这个环境利用编程的方式实现我们的数据大批量存入,此时模拟请求我们就想到 postman 这类工具,在这里介绍一个功能比较强大的应用软件:Apifox(做一个简单的介绍:Apifox=Postman+Swagger+Mock+JMeter),传入上面的 url 及请求参数如下,这里有个容易忘记的地方就是第二张图一定要回车到第三行才可以算作一条完整数据,还有就是要构造一定的请求头参数,需要输入用户名和密码需要在 Hearders 添加参数 Authorization。




自动生成相应 API 通用接口



上述构造请求成功后,可以根据需要生成相应与语言的 API.

下面是生成python 的代码:

import requests

url= "192.168.XXX.128:5601/api/console/proxy?path=<path>&method=<method>" payload = "<body data here>" #需要以\n 换行的形式才可以,并且对内容大小有限制

headers = {

'kbn-version': '<kbn-version>',#kbn 版本号

'User-Agent': 'apifox/1.0.0 (https://www.apifox.cn)',#一般使用浏览器请求头即可

'Content-Type': '<Content-Type>'} # 一般使用这个即可 application/json response = requests.request("POST", url, headers=headers, data=payload) print(response.text)




python 存入数据



实例测试如下代码:

import requests,json,time #pip install requests
def es_function(url,body):
 headers = {"Content-Type": 'application/json',
 'kbn-version': '7.0.0',
 # 'kbn-version':'6.7.0',#'Authorization':'Basic
YWRtaW46c2hzbmMyMDE5Zmxpbms=',
 }
 session = requests.session()
 result = session.post(url,data=body, headers=headers)
 return result
url="http://192.168.XXX.128:5601/api/console/proxy?path=20220601test%2
F_bulk&method=POST"
body='
{"index": {"_index": "20220601test","_type": "_doc"}}' \
'
\n{"op_time": "2022-05-03T23:01:00.130Z","raw_message": "message1"}' \
'
\n{"index": {"_index": "20220601test","_type": "_doc"}}' \
\n{"op_time": "2022-06-03T23:01:00.130Z","raw_message": "message2"}\n'

bulk =es_function(url=url, body=body)
print('是否存入成功',bulk.status_code)




数据查询



进行查询:

query={"query":{'match_all':{},}}
url_query="http://192.168.XXX.128:5601/api/console/proxy?path=20220601
test/_search&method=POST"
response =es_function(url=url_query, body=json.dumps(query))
print("请求状态:",response)
items = response.json()
print(items)




百万数据量测试



利用循环构造数据量的方式,经单机测试的情况下,批量存入一百万数据所需要花费的时间在 90 秒左右。

总 结:

由于工作需求存入大批量数据到 ES,条件限制不能直接连接,利用现有的kibana 接口进行多次请求分析 url 构造及参数传递方式,然后利用 Apifox 模拟请求便可生成相应语言的接口,选择熟悉的编程语言对千万级别数据进行分批自动存入,减少操作次数以及提高准确率和工作效率。

相关操作资料:
https://mp.weixin.qq.com/s/YFoWM6fyP9EQpc8IDmmCMA
python 操作 Elasticsearch7.x:https://www.cnblogs.com/lshan/p/15510018.html

END


本文作者:IT那活儿(上海新炬中北团队)

本文来源:“IT那活儿”公众号

文章转载自IT那活儿,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论