调用Kibana _find接口获取saved objects报no handler found错误如何解决
正确获取Kibana指定空间下已保存查询的方法
错误原因梳理
- 端口匹配错误:
/api/saved_objects/_find是Kibana专属接口,不属于Elasticsearch。你最初请求的9200是Elasticsearch默认端口,自然找不到对应路由,返回400错误。 - 调用逻辑错误:直接使用
es.search()是操作Elasticsearch原生索引的接口,Kibana的已保存对象默认存储在.kibana_*系统索引中,普通用户没有该索引的访问权限,所以返回403权限错误,不推荐直接通过ES接口操作Kibana保存对象。 - 5601端口连接断开的常见排查点:
- Kibana实例是否修改了默认端口,未监听5601
- Kibana是否开启了HTTPS,使用HTTP协议请求会被直接断开连接
- 服务器安全组/防火墙是否拦截了你本地到Kibana服务器5601端口的请求
- Kibana是否开启了CSRF校验,缺少指定请求头会被拒绝访问
正确实现代码
首先确认你的Kibana访问地址、端口、协议(HTTP/HTTPS)正确,再参考如下代码请求:
import requests # 替换为你的实际配置 KIBANA_URL = "http://你的Kibana地址:端口" SPACE_ID = "guy-levin" USERNAME = "你的用户名" PASSWORD = "你的密码" # Kibana接口要求的请求头,避免CSRF校验拦截 headers = { "kbn-xsrf": "true" } url = f"{KIBANA_URL}/s/{SPACE_ID}/api/saved_objects/_find?type=search&per_page=1000" # 如果Kibana用的是自签HTTPS证书,可以加verify=False参数忽略校验(仅测试环境使用) r = requests.get(url, auth=(USERNAME, PASSWORD), headers=headers) if r.status_code == 200: saved_searches = r.json()["saved_objects"] # 输出所有已保存查询的名称和ID for item in saved_searches: print(f"查询名称:{item['attributes']['title']}, 查询ID:{item['id']}") else: print(f"请求失败,状态码:{r.status_code},错误信息:{r.text}")
额外说明
如果确认网络连通但还是返回权限错误,需要在Kibana的角色权限配置中,给对应用户授予对应空间的「Saved Objects 读权限」即可。
内容的提问来源于stack exchange,提问作者Guy
相关产品推荐
相关产品推荐

