Kibana 会跟踪每个仪表板的查看次数,但这些数据不会在任何内置仪表板中直接显示。在本文中,我们将使用 Elastic 工作流每 30 分钟自动收集这些数据,并将其索引到 Elasticsearch 中,这样我们就可以在此基础上构建自己的分析。
Elastic 工作流是 Kibana 内置的自动化引擎,允许您通过简单的 YAML 配置定义多步流程。每个工作流都可以按计划或事件触发,也可以作为 Elastic Agent Builder 中的工具触发,并且每个步骤都可以调用 Kibana API、查询 Elasticsearch 或转换数据。
我们将使用仪表板查看计数作为具体示例,但同样的模式也适用于通过 Kibana 已保存对象 API 公开的任何指标。
准备工作
- 运行 9.3 的 Elastic Cloud 或自管型集群
- 已启用工作流(高级设置)
在开始构建之前,我们先了解目前有哪些数据。Kibana 将其大部分配置和元数据作为已保存对象存储在专用的内部索引中。Kibana 通过这种方式跟踪的事项之一是仪表板查看次数,它使用一种名为“使用计数器”的特殊保存对象类型来实现。您可以在开发工具中直接查询它们:
响应类似如下:
counterName 字段是仪表板 ID,而 count 是该仪表板在特定日期的累计查看次数。Kibana 每天会为每个仪表板创建一个计数器对象;您可以在对象 ID 中看到日期后缀 (...viewed:server:20260310)。随着用户打开仪表板,计数在一天中不断增长。
我们不会在索引中复制这种每日文档模型,而是为每个工作流执行创建一个文档。每份文档都记录了该仪表板在捕获时当天的累计浏览量。
步骤 2:创建目标索引
我们需要一个索引来存储仪表板视图快照。以下命令创建了明确的映射,以便我们稍后进行聚合和可视化。在开发工具中运行此命令:
对 ID 和名称使用 keyword 映射可以进行聚合。使用 integer 来表示 view_count 是一个安全的默认设置,因为 Kibana 每天都会重置计数器,所以达到 32 位限制(一天内超过 20 亿次查看)并非实际需要担心的问题。它仍然支持数值运算,例如 max、avg 和 min 等。
步骤 3:创建工作流
前往 Stack Management > 工作流 > 新建工作流,然后粘贴以下工作流 YAML 配置:
在下一节中,我们将逐步分解工作流。
工作流如何运作
触发

工作流每 30 分钟按计划触发运行一次。这样我们就能获得时序数据,而不会对 API 造成过多压力。
fetch_dashboard_views

使用 kibana.request 调用 Kibana 已保存对象 API。无需进行身份验证设置:工作流引擎会根据执行上下文自动附加正确的标头。
index_each_dashboard(循环)

遍历由上一步返回的 saved_objects 数组。每次迭代中的当前项目均可作为 foreach.item。在循环内部,我们为每个仪表板运行两个嵌套步骤。
1. fetch_dashboard_name:

通过调用 GET /api/saved_objects/dashboard/{id} 来解决人类可读的仪表板标题。我们添加了 on-failure: continue: true,以便如果仪表板被删除但仍有浏览计数器,循环就会继续,而不是导致整个执行失败。
2. index_doc:

使用 POST /dashboard-views/_doc(无显式 ID)为每个文档建立索引,这样 Elasticsearch 就能自动生成 ID。这样,每次运行时都会创建一个新文档,从而随着时间推移构建浏览次数的历史记录,而不是覆盖之前的快照。
有两点值得注意:
captured_at字段使用日期筛选器将时间戳格式化为 ISO 8601。如果没有它,值就会显示为 JavaScript 日期字符串,例如Tue Mar 10 2026 05:03:47 GMT+0000,Elasticsearch 不会将其映射为日期。view_count使用${{ }}语法和| plus: 0来保留数值类型。使用{{ }}会将其显示为字符串,这将阻止在仪表板中进行数学运算。

UI 允许您可以很好地对每个工作流步骤进行故障排查。
第 4 步:构建统计仪表板
一旦工作流运行了几次并收集了数据,使用 dashboard-views Data view在 Kibana 中创建一个新的仪表板。
一些入门面板:
- 按浏览量排列的顶级仪表板:使用柱形图,X 轴为
dashboard_name,Y 轴为last_value(view_count)。这将显示每个仪表板当前的每日浏览量。 - 随时间变化的浏览量:使用折线图,X 轴为
captured_at,Y 轴为last_value(view_count),按dashboard_name细分。由于每次运行都会添加一个新文档,因此使用最后一个值来获取每个时间分桶的峰值计数,而不是重复计数的总和。 - 当前快照:使用数据表和最新的
captured_at来显示所有仪表板上最新的浏览量。

由于每个工作流都会创建一个新文档,因此您可以按时间范围进行筛选,以分析特定时段的活动、比较周与周之间的差异,或在仪表板低于浏览量阈值时发出警报。
结论
Elastic 工作流非常适合这种定期数据收集,因为源 (Kibana API) 和目标 (Elasticsearch) 都是原生的,这意味着无需管理任何凭据。工作流引擎会自动处理 kibana.request 和 elasticsearch.request 步骤的身份验证,因此您只需编写逻辑即可。




