内容提要
本文介绍如何将Kibana仪表板嵌入JavaScript Web应用。通过HTML iframe实现基本嵌入,使用Kibana分享选项生成代码,并配置认证(如匿名认证)确保自动登录。高级用法通过自定义控件(如日期选择器、下拉列表)更新URL参数(_g和_a)来动态筛选数据。文章强调安全策略、性能考量及Rison编码注意事项,提供代码示例和GitHub资源。
延伸解读
嵌入方式选择
嵌入Kibana仪表板时,需根据需求选择快照或已保存对象URL。快照固定当前状态,适合静态展示;已保存对象则动态反映后续修改,适合需要频繁更新的场景。若仪表板可能变化,建议使用已保存对象,确保用户看到最新数据。
认证配置要点
实现自动登录需配置匿名认证或SAML SSO。匿名认证需在kibana.yml中设置用户凭据,并在iframe URL中添加auth_provider_hint参数。同时,需确保用户权限最小化,并配置sameSiteCookies为None,以解决浏览器同源策略导致的会话Cookie问题。
自定义控件与URL参数
通过自定义控件更新仪表板,需操作URL中的_g和_a参数。_g控制全局状态(如时间范围),_a控制应用内状态(如查询)。更新时需使用Rison编码和URI编码,避免格式错误。注意Kibana版本更新可能改变URL结构,需定期回归测试。
Q&A
如何将Kibana仪表板嵌入到JavaScript Web应用中?
可以使用HTML iframe标签嵌入Kibana仪表板。通过Kibana的分享选项生成iframe代码,粘贴到HTML中即可。基本嵌入示例:<iframe src="https://my-deployment:9243/app/dashboards#/view/7adfa750-4c81-11e8-b3d7-01146121b73d?embed=true&_g=(refreshInterval%3A(pause%3A!t%2Cvalue%3A0)%2Ctime%3A(from%3Anow-1y%2Fd%2Cto%3Anow))&show-top-menu=true&show-query-input=true&show-time-filter=true" height="600" width="800"></iframe>。
Kibana仪表板嵌入时如何实现自动登录?
可以通过启用匿名身份验证或SAML SSO实现自动登录。匿名身份验证需要在kibana.yml中配置匿名提供程序,并在iframe URL中添加auth_provider_hint参数。例如:在kibana.yml中添加xpack.security.authc.providers: anonymous.anonymous1: order: 0 credentials: username: "my_anonymous_user" password: "password",然后在iframe URL中指定auth_provider_hint=anonymous1。
嵌入Kibana仪表板时,如何通过自定义控件(如下拉列表)动态筛选数据?
通过更新iframe的URL参数来实现。全局状态(_g)用于传递时间范围等,应用状态(_a)用于传递查询。例如,当下拉列表选择变化时,使用JavaScript更新URL中的_a参数,包含KQL查询。代码示例:function updateWithCarrier() { const carrierSelect = document.getElementById('carrier-select'); selectedCarrier = carrierSelect.value || ''; dashboardUri=getDashboardUri(); iframe.setAttribute('src', dashboardUri); },其中getDashboardUri()生成包含_a参数的URL。
Kibana仪表板嵌入时,如何避免浏览器同源策略导致的刷新问题?
需要在kibana.yml中配置sameSiteCookies为"None",以允许跨域传递会话Cookie。配置示例:xpack.security.sameSiteCookies: "None"。
Kibana仪表板嵌入时,有哪些安全注意事项?
确保嵌入的是可信数据源,使用内容安全策略和iframe沙箱属性限制权限。另外,匿名身份验证时,应限制匿名用户的权限为最低必需权限,因为未经身份验证的用户也能访问。
Kibana仪表板嵌入时,如何选择快照URL还是已保存对象URL?
快照URL包含仪表板当前完整状态的编码,后续更改不会反映在嵌入版本中;已保存对象URL使用仪表板ID,后续更改会反映。建议使用已保存对象URL,因为仪表板可能会变化,这样能确保更新生效。
Kibana仪表板嵌入时,如何调整iframe尺寸以适应响应式设计?
建议使用视口尺寸属性(如vw和vh)或媒体查询来调整iframe大小,而不是固定像素值。例如,设置iframe宽度为100vw,高度为100vh,或使用CSS媒体查询根据屏幕尺寸调整。
Kibana仪表板嵌入时,如何处理Rison编码问题?
Kibana使用Rison和URI编码,在传递查询参数时需要先进行Rison编码。例如,使用rison.encode_object({Carrier : encodeURIComponent(selectedCarrier)})生成查询。注意Rison格式错误可能难以排查,需仔细检查。