作者:来自 Elastic Teresa Alvarez Soler, Rudolf Meijering

Kibana 现在会记录谁查看、编辑或删除了每个仪表板、耗时多久以及哪些操作失败了,这样你就可以在任何人报告之前发现出现故障的仪表板。
通过单一解决方案观察、保护和搜索你的数据。从应用监控到威胁检测,Kibana 都是满足关键使用场景的多功能平台。立即开始你的14 天免费试用。
Kibana 会记录每次仪表板查看、编辑、创建、删除和刷新操作,以及执行每项操作的用户。在 kibana.yml 中添加两行配置即可启用此日志记录功能。当你在 Discover 中打开对应索引后,就可以找到 30 天内无人打开的仪表板,并按照加载时间对它们进行排名,或者查看今天早上导致故障的仪表板是谁编辑的。仪表板活动日志目前可在自管理集群上运行,Elastic Cloud 支持即将推出。
仪表板活动日志与 Kibana 审计日志有何不同
仪表板活动日志和 Kibana 审计日志都会记录关于用户操作的结构化日志,但它们回答的是不同的问题。
| Kibana 审计日志 | 仪表板活动日志 | |
|---|---|---|
| 回答的问题 | 谁访问了什么内容,以及什么时候访问的 | 哪些仪表板被使用,以及它们的性能如何 |
| 面向对象 | 安全和合规团队 | Kibana 管理员和仪表板所有者 |
| 跟踪内容 | Kibana 中与安全相关的事件 | 五种仪表板操作:创建、更新、删除、查看、刷新 |
| 启用方式 | 在 kibana.yml 中使用其自身的设置 |
在 kibana.yml 中设置 user_activity.enabled: true |
仪表板活动日志记录了哪些内容
用户活动服务会在用户每次与仪表板交互时记录结构化事件。每个事件都会记录_发生了什么_、针对哪个仪表板_以及_谁执行了该操作。系统会跟踪以下五种操作:
| 操作 | 触发时机 | 是否包含耗时 |
|---|---|---|
dashboard_create |
创建仪表板时 | 否 |
dashboard_update |
保存编辑内容时 | 否 |
dashboard_delete |
删除仪表板时 | 否 |
dashboard_view |
用户打开仪表板时 | 是,从打开仪表板到离开仪表板期间的停留时间 |
dashboard_refresh |
用户更改筛选条件或时间范围,或者运行自动刷新时 | 是,刷新耗时 |
dashboard_view 事件通常也会触发刷新。
每个事件都包含相同的核心字段,其中有两个字段会根据条件出现:
| 字段 | 包含的内容 | 出现于 |
|---|---|---|
user.name |
执行操作的用户名称 | 每个事件 |
user.email |
用户的电子邮件地址 | 每个事件 |
user.roles |
分配给用户的角色 | 每个事件 |
object.name |
仪表板名称 | 每个事件 |
object.id |
仪表板 ID | 每个事件 |
kibana.space |
仪表板所属的 Kibana 空间 | 每个事件 |
client.ip |
请求来源的 IP 地址 | 每个事件 |
event.action |
发生的五种操作中的哪一种 | 每个事件 |
event.outcome |
操作成功还是失败 | 每个事件 |
event.duration |
操作耗时,单位为纳秒 | dashboard_view 和 dashboard_refresh |
error.type / error.message |
发生故障时的错误类型和错误消息 | event.outcome 为 failure 的事件 |
Kibana 如何记录仪表板活动
在底层,Kibana 插件会通过核心客户端从浏览器或服务器报告事件,经过验证的事件会被写入专用日志记录器。不会向第三方发送任何数据;由于事件采用标准 JSON 日志格式,因此你可以控制它们发送到哪里以及如何进行摄取。
你可以利用仪表板使用数据做什么
仪表板活动数据可以回答以下五个运营问题,否则就需要进一步调查:
-
清理未使用的仪表板 。筛选出没有任何
dashboard_view事件的仪表板。如果没人查看它,就将其归档。对于管理数千个仪表板的客户来说,这一点至关重要。 -
排查性能问题。
event.duration字段会准确告诉你每次仪表板加载或刷新的耗时。按照耗时排序,就可以找到加载最慢的仪表板。 -
编辑历史记录。每次创建、更新和删除操作都会记录执行修改的用户。你不再需要猜测是谁修改了关键仪表板,也不必寻找修改发生的时间。
-
规划容量。找出在高峰时段运行重量级查询的用户。如果某个用户的自动刷新每 10 秒就对集群发起一次高负载请求,你会看到这一情况。
-
主动监控错误 。通过
error.type和error.message字段,可以立即发现产生错误的仪表板,因此你不需要等待用户报告问题。
如何在 Kibana 中启用仪表板活动日志
在 kibana.yml 中添加两行配置(该服务默认处于禁用状态):
yaml
`
1. user_activity:
2. enabled: true
`Lobster AI
事件会立即开始流动,并使用默认的 JSON 控制台输出器。你可以使用 Kibana 已经采用的相同日志记录配置架构来自定义输出器,并筛选特定操作:
yaml
`
1. user_activity:
2. enabled: true
3. appenders:
4. console_json_default_appender:
5. type: console
6. layout:
7. type: json
8. filters:
9. - policy: keep
10. actions: [dashboard_view, dashboard_refresh]
`Lobster AI
将这些日志发送到 Elasticsearch 索引中(例如通过 Filebeat),你就拥有了一个可以完全查询的仪表板使用情况数据集。
如何在 Discover 中查询仪表板活动
活动日志建立索引后,打开 Discover,并将其指向你的用户活动索引模式。你会立即看到每次仪表板交互对应的结构化事件,并且可以按照操作类型、用户、仪表板名称和时间范围进行筛选。

从这里开始,你可以快速回答下面示例中的具体问题。
一个仪表板被查看了多少次?
在 Discover 查询编辑器中用自然语言输入你的问题,然后按下 Cmd+J,即可自动生成 Elasticsearch 查询语言(ES|QL)查询,如下所示:
sql
`
1. FROM user-activity-logs
2. | WHERE object.name == "OTel Host Metrics Overview" AND event.action == "dashboard_view"
3. | STATS COUNT(*)
`Lobster AI

最近 30 天哪些仪表板的查看次数为零?
没有任何活动的仪表板不会出现在日志中,因此你无法直接筛选查看次数为零的仪表板。相反,这个查询采用反向方式,提取过去一年中创建且尚未删除的所有仪表板,然后检查其中哪些仪表板在最近 30 天内没有任何查看记录。
less
`
1. FROM user-activity-logs
2. | WHERE event.action IN ("dashboard_create", "dashboard_delete")
3. OR (event.action == "dashboard_view" AND @timestamp > NOW() - 30 days)
4. | STATS
5. creates = COUNT_DISTINCT(CASE(event.action == "dashboard_create", 1, NULL)),
6. deletes = COUNT_DISTINCT(CASE(event.action == "dashboard_delete", 1, NULL)),
7. recent_views = COUNT_DISTINCT(CASE(event.action == "dashboard_view", 1, NULL))
8. BY object.id, object.name
9. | WHERE creates > 0 AND deletes == 0 AND recent_views == 0
10. | SORT object.name ASC
`Lobster AI

哪些仪表板加载时间超过 10 秒?
注意 ,event.duration 以纳秒为单位记录,因此查询会先将其转换为秒,然后再进行筛选:
vbnet
`
1. FROM user-activity-logs
2. | WHERE event.action == "dashboard_refresh"
3. | EVAL duration_seconds = event.duration / 1000000000
4. | STATS max_duration_secs = MAX(duration_seconds) BY object.name
5. | WHERE max_duration_secs >10
6. | SORT max_duration_secs DESC
`Lobster AI

哪些仪表板正在产生错误,以及具体哪里出现了故障?
此查询会显示在 dashboard_refresh 事件期间有一个或多个面板产生错误的仪表板,这样你就可以快速发现重复出现的问题,并确定修复工作的优先级:
vbnet
`
1. FROM user-activity-logs
2. | WHERE event.outcome == "failure"
3. | STATS errors = COUNT(*) BY object.name, metadata.errors.error
`Lobster AI

使用 AI 聊天构建仪表板使用情况概览
我们计划在活动日志中同时提供开箱即用的仪表板,但与此同时,你可以在 Kibana 中打开 AI 聊天,让它根据你的用户活动数据创建一个仪表板,而不必手动构建可视化内容。
生成的仪表板可以让你一目了然地了解查看次数最多的仪表板、使用最频繁的用户、性能最慢的面板以及最近的错误;也就是说,这正是大规模部署所需要的运营视图。

开始使用仪表板活动日志
用户活动日志已在 Kibana 9.5 中提供。首先启用该服务。然后将日志发送到一个索引中,并开始构建团队一直需要的运营可见性。有关完整的配置详情和完整的事件架构,请参阅用户活动文档。
原文:Dashboard activity logs: Find unused Kibana dashboards | Elasticsearch Labs